struts2拦截问题对大家有些帮助
caleb_520
2010-06-28
例如,做一个登录验证的拦截器。只有用户在登录页面login.jsp提交正确的信息,才能看见view.jsp页面。
(1)触发登录的Action名称为:login.action (2)触发查看view.jsp页面的Action名称为:view.action 那么我们在使用的时候一般会这样子做: (1)先登录在看view.jsp (2)如果不登录,用户输入http://localhost:8888/ssh/view.action,那么会让拦截器进行拦截,然后拦截器则会转向到login.jsp页面,让用户登录才行 但是,有一种情况拦截器不会起作用,就是你先登录成功,然后在地址栏中输入触发查看view.jsp页面的view.action,如:http://localhost:8888/ssh/view.action,你们会发现拦截器又直接调转到登录页面,程序根本不会查看到view.jsp中的信息 希望大家一起来讨论这个问题。个人觉得刚开始接触struts2的有比较好的帮助,thanks |
|
wolferill
2010-06-30
会出现这种情况吗?
拦截器中的拦截条件是怎样的呢? 个人觉得登录后给session中加一个标识,拦截器就根据这个标识判断用户是否已登录,登录了就继续,没登陆就转到登录页面。 而且在地址栏输入和直接点击链接有区别吗? |
|
caleb_520
2010-06-30
就“wolferill”提问,我将我的xml配置文件给出
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="GBK"></constant> <package name="filedownload" extends="struts-default" namespace="/filedownload"> <interceptors> <interceptor name="authority" class="com.gxa.edu.interceptor.AuthorityInterceptor"></interceptor> </interceptors> <action name="fileList" class="com.gxa.edu.action.FileDownloadAction" method="fileList"> <result name="success">/ch2/download.jsp</result> </action> <action name="download" class="com.gxa.edu.action.FileDownloadAction" method="download"> <result name="fail">/ch1/index.html</result> <result name="success" type="stream"> <param name="contentType">application/x-download</param> <!-- inputName指定了Action中有个属性名称为fileStream,其类型为InputStream --> <param name="inputName">inputStream</param> <!-- 定义下载文件的名称 --> <param name="contentDisposition">attachment;filename=${fileContentDisposition}</param> <param name="bufferSize">4096</param> </result> <interceptor-ref name="authority" /> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts> 该配置文件的作用是当用户需要下载资源的时候,拦截器会先判断该用户是否登录。 拦截器的代码如下: package com.gxa.edu.interceptor; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthorityInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 8467964417422830310L; @Override public String intercept(ActionInvocation arg0) throws Exception { // TODO Auto-generated method stub ActionContext ac = arg0.getInvocationContext(); Map session = ac.getSession(); String user = (String) session.get("username"); System.out.println("======== authorityInterceptor ========="); if (user != null && !user.equals("")) { return arg0.invoke(); } return "fail"; } } 请注意,我在测试我的程序的时候。 第1次点击下载超链接,拦截器会正常执行进行拦截,然后拦截器会给没有登录用户将页面跳转到登录页面。 第2次再进入下载资源的页面,点击下载超链接又让拦截器把页面转向到登录页面。非常奇怪。按照常理来说现在用户已经登录了,就可以下载资源了。 |
|
zivpiggy
2010-07-01
那只可能第二次点超链接,session是空的,打印看下。我也感觉正常情况下不会出现这问题。
|
|
caleb_520
2010-07-01
zivpiggy 写道
那只可能第二次点超链接,session是空的,打印看下。我也感觉正常情况下不会出现这问题。
|
|
yangfuchao418
2010-07-01
一步步调试,看看有何不同。绝对不会出现这种情况的。
|
|
wolferill
2010-07-05
个人对此问题的分析如下:
首先,应该不是Action的问题,应该是拦截器或者jsp的问题 其次,不知是不是拦截器代码的问题,打印sesion的值出来看看,username有没有空(直接看上去貌似配置也没错误) 再次,检查下是不是页面跳转几次之后,网页中Action的相对路径出错了(感觉这种可能性应该不大) 最后,说老实话,最好的方法还是单步执行一下,看看是哪里的参数出了问题吧 其实,我自己也试了下,应该没问题才对~ 我拦截器的写法和你有点不同: 第一、传说中Interceptor()方法里边一定要有一个参数invocation,不过我改成了你的arg0好像也正常; 第二、我之前获取session的方法是 Map session=ActionContext.getContext().getSession(); 不过好像换成你的也没问题 我是在自己之前的一个练习程序上改的,好像没找出问题来,要是楼主找出答案了,麻烦告知一下~~~ |
|
lsf171028
2010-07-06
之前获取session的方法是 Map session=ActionContext.getContext().getSession(); 不过好像换成你的也没问题
|