应用场景:在请求处理之前拦截请求,做出相关处理。比如在一个网站中,用户尚未登录那么他是无法查看个人信息界面的。这时候我们就可以使用拦截器来拦截他访问个人信息的界面的请求。具体如下(这里主要是struts2自定义拦截器的方法):
struts2自定义拦截器:
1 实现Iterceptor接口或者继承AbstractInterceptor
2 在struts.xml文件配置拦截器
3 在需要使用拦截器的action中引用上述拦截器(部分拦截),也可以将上述拦截器定义为默认拦截器(全局拦截),这样可以拦截所有请求
部分拦截
1 本案例是自定义拦截器是继承AbstractInterceptor:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class LoginInterceptor extends AbstractInterceptor {private static final long serialVersionUID = -4334179734031489644L;@Overridepublic String intercept(ActionInvocation actionInvocation) throws Exception {Object action=actionInvocation.getAction();System.out.println(action.toString()+"========="+action);String user=(String) actionInvocation.getInvocationContext().getSession().get("user");if(user==""||user==null){System.out.println("尚未登录拦截请求,返回登录界面");return "login";}return actionInvocation.invoke();}
}
2 在struts.xml配置拦截器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.devMode" value="true"></constant><package name="student" extends="struts-default" namespace="/"><interceptors><interceptor name="logins" class="com.yc.interceptor.LoginInterceptor"></interceptor></interceptors><global-results> <!--定义全局Result--> <result name="login">/index.jsp</result></global-results><!--登录--><action name="login" class="com.yc.controller.LoginAction" method="login"><result name="success">/success.jsp</result><result name="error">/error.jsp</result></action><action name="add" class="com.yc.controller.AddAction" method="add"> <result name="success">/index.jsp</result><result name="error">/register.jsp</result></action><action name="update" class="com.yc.controller.UpdateAction" method="update"><result name="success">/index.jsp</result><interceptor-ref name="defaultStack"/> <!--在需要拦截的地方引入拦截器--><interceptor-ref name="logins"/></action><action name="del" class="com.yc.controller.DelAction" method="del"><result name="success">/index.jsp</result><interceptor-ref name="defaultStack"/><interceptor-ref name="logins"/></action></package>
全局拦截:
思路如下在一个<package>(假如叫做A)里定义好拦截器,并且通过<default-interceptor-ref>设置成默认拦截器,然后在另一个<package>(假如叫做B)继承它,那么B中的所有action将被拦截到:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><constant name="struts.devMode" value="true"></constant><package name="all" extends="struts-default" namespace="/"><interceptors><interceptor name="global" class="com.yc.interceptor.LoginInterceptor"></interceptor><interceptor-stack name="myglobal"><interceptor-ref name="global"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors><default-interceptor-ref name="myglobal"></default-interceptor-ref> </package><package name="student" extends="all" namespace="/"><global-results><result name="login">/index.jsp</result></global-results><action name="login" class="com.yc.controller.LoginAction" method="login"><result name="success">/success.jsp</result><result name="error">/error.jsp</result></action><action name="add" class="com.yc.controller.AddAction" method="add"> <result name="success">/index.jsp</result><result name="error">/register.jsp</result></action><action name="update" class="com.yc.controller.UpdateAction" method="update"><result name="success">/index.jsp</result> </action><action name="del" class="com.yc.controller.DelAction" method="del"><result name="success">/index.jsp</result> </action></package>
</struts>