拦截是每个项目安全必有的一样东西,一般的过滤器无法拦截ACTION,在这里我们就要用到ACTION拦截器栈,ACTION拦截器栈并不难,一起来看。
推荐过滤器和拦截器栈一起使用效果非常好。
首先第一步,先写一个继承AbstractInterceptor的JAVA类,获取登陆状态,判断其是否为空。
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class LoginInterceptor extends AbstractInterceptor {
- public String intercept(ActionInvocation invocation) throws Exception {
- String statte = (String) ServletActionContext.getRequest().getSession().getAttribute("login_state"); //获取登陆状态
- if (statte != null) { //判断是否为空
- return invocation.invoke(); //如果为是,继续执行ACTION方法
- } else {
- return "backerror"; //如果为否,弹出
- }
- }
- }
在这里 我判断是否为空
不为空时 继续执行所请求的ACTION
为空时 我则返回backerror
下面请看我Struts.xml
- <interceptors>
- <interceptor name="authority" class="org.yzsoft.examdemo.action.LoginInterceptor"></interceptor>
- <!-- 拦截器栈 -->
- <interceptor-stack name="myDefault">
- <interceptor-ref name="defaultStack"></interceptor-ref>
- <interceptor-ref name="authority"></interceptor-ref>
- </interceptor-stack>
- </interceptors>
- <global-results>
- <!-- 当返回error视图名时,转入/error.jsp页面 -->
- <result name="backerror">error.jsp</result>
- <result name="fronterror">login.jsp</result>
- </global-results>
如果ACTION返回的是backerror 跳转error.jsp 其实在这里可以直接跳回登陆页面
但是为了安全 还是要注销SESSION 不管有没有
下面是我error.jsp代码
- <script type="text/javascript">
- function load() {
- alert('请重新登录!');
- session.removeAttribute("examusers_name");
- session.removeAttribute("login_state");
- session.removeAttribute("adminusers_usersname");
- session.removeAttribute("adminusers_role");
- parent.parent.location.href = "login.jsp";
- }
- </script>
- <body onload="load()">
- </body>
可以看到,我调用 load的方法 注销了登陆的时候激发的SESSION
然后执行了跳转 而那个parent方法 由于用的是框架 一般的跳转只有right(内容)跳转 而left (左边栏目)和 top(页头) 不执行跳转 在这里我们就要用到parent这个方法他可以让整个框架跳转,好了。现在来说ACTION调用拦截器栈。
ACTION调用拦截器栈,很简单。一句话就OK了 注意: 需要上面的拦截器栈代码 myDefault 是调用拦截器栈代码的 myDefault
j
- <interceptor-ref name="myDefault" />
将这句话加在需要拦截的ACTION 格式如下:
- <action name="adminusers_*" class="adminusersaction" method="{1}" >
- <result name="insert_false">back/users/users_insert.jsp</result>
- <result name="update_false">back/users/users_update.jsp</result>
- <result name="findall_true">back/users/users_list.jsp</result>
- <result name="findbyid_true">back/users/users_update.jsp</result>
- <result name="wrong">back/right.jsp</result>
- <result name="logout">backlogin.jsp</result>
- <interceptor-ref name="myDefault" />
- </action>
必须包含在ACTION里
在这里有个问题 就是登陆不进去。 为什么呢?
因为你的登陆也被拦截了 拦截器栈所判断的是登陆成功所激活的值
如果你的值一直为空 必然一直被拦截 那怎么解决呢。
只有将登陆的方法独立出去 独立一个新的且不包含拦截的ACTION 就OK了 试试吧。
--------------------------------------------------------------------------------------------
谢谢观看 小弟新手 有什么不足 麻烦指出 在此谢谢了
chenwei51制作 请尊重作者 转帖 需注明原地址