1.在不修改action源码的基础上,对action进行增强,AOP的思想。
2.自定义拦截器
单例
(1)方式一:实现Interceptor接口
(2)方式二:继承AbstractInterceptor抽象类【常用】
定义拦截器类
在struts.xml中声明拦截器
使用拦截器
如果在拦截器中没有调用invoke方法,而是直接返回一个字符串,那么会依据拦截器返回值直接匹配结果视图。如果调用了invoke方法,则拦截器的返回值没有意义。
拦截器1 interception.invoke(); ->进入:拦截器2 ->拦截器3...->action ->结果视图
拦截器1 return "";直接返回字符串-->结果视图
多个拦截器执行顺序:
配置自定义拦截器:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!--拦截器--> <package name="my-default" extends="struts-default" abstract="true"> <interceptors> <interceptor name="loginInterceptor" class="cn.getword.interceptor.LoginInterceptor" /> <interceptor-stack name="my_intercept_stack"> <interceptor-ref name="loginInterceptor" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="my_intercept_stack" /> <global-results> <result name="login" type="redirect">/login2</result> </global-results> </package> <package name="user" extends="json-default,my-default" namespace="/user"> </package>
拦截器:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext context = invocation.getInvocationContext(); HttpServletRequest request = (HttpServletRequest)context.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest"); HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if(user == null){ //没有登录直接返回登录页面 return "login"; } //拦截器的放行 return invocation.invoke(); } }
end