Struts拦截器是struts最强大的功能之一,也是他的核心
它可以在Action前后做一些事情,比如用户登录验证,这里主要针对用户登录配置详细说明
一 首先自定义一个用户拦截类,必须实现Interceptor接口或者继承他的实现类
因为我们是要拦截用户登录的,这里继承MethodFilterInterceptor类,此类可以针对方法进行拦截或方向
struts2拦截器原理就是AOP(面向切面)编程
package com.raylu.intercepter;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.raylu.domain.User;
/**
* 自定义用户拦截器
* 如果没有登录,自动跳转至登录页面
* 如果已经登录,则放行
* 自定义拦截器必须实现Intercepter接口或继承他的实现类
* @author RayLu
*
*/
public class UserInterceptor extends MethodFilterInterceptor{
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
if(user==null){
return "login";
}
//如果用户存在,则放行
return arg0.invoke();
}
}
二,进行struts.xml配置拦截器,原则上哪个模块需要被拦截则在哪个模块进行配置
另外拦截器可以设定针对特定方法 放行,也就是不拦截,这里设定针对login方法不进行拦截
自定义拦截器配置需要注意: 如果配置了自定义拦截器栈,则Struts2原有的拦截器栈会失效,此时需引入struts2原有的拦截器栈defaultStack;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="crm" namespace="/" extends="struts-default">
<!-- 配置自定义拦截器 -->
<interceptors>
<interceptor name="UserInterceptor" class="com.raylu.intercepter.UserInterceptor"></interceptor>
<!-- 配置自定义拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 引入自定义拦截器 -->
<interceptor-ref name="UserInterceptor">
<!--表示对login这个方法不拦截,重要。。 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 使用自定义拦截器必须引入defaultStack,否则只有自己的拦截器生效 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置全局返回值 -->
<global-results>
<result name="success">/jsp/success.jsp</result>
<result name="login">/login.htm</result>
<result name="customerList">/jsp/customer/list.jsp</result>
</global-results>
<!-- User模块 -->
<action name="user_*" class="com.raylu.web.UserAction" method="{1}">
<!-- User模块中加入myStack拦截器 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
<!-- Customer模块 -->
<action name="customer_*" class="com.raylu.web.CustomerAction"
method="{1}">
<!-- Customer模块中加入拦截器 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
</struts>