在做OA的登陆的时候,学习了Struts2的拦截器,感觉非常的好,正好里边有一些不懂得地方,所以记录一下这段时间的所学。
如上图,拦截器的工作原理其实挺简单的,就是在咱们操作每一个action之间都要经过拦截器来进行一下拦截,例如我们登陆的时候,我们如果配置了拦截器,那么就会如上图一样,框架会在你登陆之间去经过拦截器,如果我们的拦截里的代码没有通过,当然及不会去实现登陆的功能。
如何自定义一个拦截器?
自定义一个拦截器需要三步:
1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
2 在strutx.xml中注册上一步中定义的拦截器。
3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
Interceptor接口声明了三个方法:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
下边我们写一个拦截器一个Login的方法,当然我们这里因为不需要init和destory方法,所以我们就直接继承AbstractInterceptor的方法。而继承这个方法会只实现intercept方法。方法如下:
拦截器
public String intercept(ActionInvocation invocation) throws Exception {
// 获取信息
User user = (User) ActionContext.getContext().getSession().get("user"); // 当前登录用户
String namespace = invocation.getProxy().getNamespace();
String actionName = invocation.getProxy().getActionName();
String privUrl = namespace + actionName; // 对应的权限URL
// 如果未登录
if (user == null) {
if (privUrl.startsWith("/user_login")) { // "/user_loginUI", "/user_login"
// 如果是去登录,就放行
return invocation.invoke();
} else {
// 如果不是去登录,就转到登录页面
return "loginUI";
}
}
// 如果已登 录,就判断权限
else {
if (user.hasPrivilegeByUrl(privUrl)) {
// 如果有权限,就放行
return invocation.invoke();
} else {
// 如果没有权限,就转到提示页面
return "noPrivilegeError";
}
}
}
登陆方法
public String login() throws Exception {
User user = userService.findByLoginNameAndPassworkd(model.getLoginName(),model.getPassword());
if(user == null){
addFieldError("login","用户名和密码不正确!");
return "loginUI";
}else{
//放入session
ActionContext.getContext().getSession().put("user", user);
return "toIndex";
}
}
struts2配置文件
<!-- 重新定义默认的定义拦截器栈 -->
<interceptors>
<interceptor name="checkPrivilege" class="cn.itcast.oa.util.CheckPrivilegeInterceptor"></interceptor>
<interceptor-stack name="defaultStack">
<interceptor-ref name="checkPrivilege"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
这样一个拦截器就配置好了,这样我们在执行任何Action中的方法的时候都会执行这个拦截器,例如我们每个用户登录的时候都会去判断这个用户是否有权限。
是不是非常的简单,当然如果大家有需要的话,可以看这篇博客,总结的非常的好。
http://blog.youkuaiyun.com/struts2/article/details/1730465