Struts2拦截器实现用户访问控制

拦截器 Interceptor

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

自定义拦截器

自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

在struts.xml中注册上一步中定义的拦截器。

在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

与过滤器的区别

过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。

拦截器是基于java反射机制的,而过滤器是基于函数回调的。

过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。

拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。

拦截器可以访问action上下文、值栈里的对象,而过滤器不能。

在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation actionInvocation) throws Exception {
//得到session key为users 的数据
Object users = actionInvocation.getInvocationContext().getSession().get("users");
String name = actionInvocation.getInvocationContext().getName();
//得到访问action 的名字 login.action 得到 login
System.out.println(name);
//第一次登录时users 肯定为空,如果登录时找不到users 应该给它通过拦截器
if (null != users || "login".equals(name))
//继续执行剩余的拦截器和action
return actionInvocation.invoke();
return "login";
}
}

struts.xml 拦截器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<struts>
<package name="default" extends="struts-default">
<interceptors>
<!--定义权限验证拦截器-->
<interceptor name="sessionUser" class="com.interceptor.LoginInterceptor"></interceptor>
<interceptor-stack name="LoginFlag">
<interceptor-ref name="sessionUser"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!--定义默认拦截器-->
<default-interceptor-ref name="LoginFlag"/>
</package>
</struts>

其中可以看到有一行配置 <interceptor-ref name="defaultStack"/> defaultStack该拦截器用于实现数据的传输,如果不写的话会出现数据提取不到