拦截器问题优化
原创
©著作权归作者所有:来自51CTO博客作者请你打开电视看看的原创作品,请联系作者获取转载授权,否则将追究法律责任
自己不编写拦截器 struts在struts-default.xml(struts2-core-2.5.26.jar!\struts-default.xml)配置了默认的拦截器
<default-interceptor-ref name="defaultStack"/>
如果自定义了拦截器 默认的拦截器就不再起作用
struts编写的默认拦截器里边的很多功能不再使用
解决方案:
1,把默认拦截器添加到配置中在action中添加默认的拦截器
例:
<action name="studentlist" class="org.ccit.com.web.action.student" method="list">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checklogin"></interceptor-ref>
<result name="success">/studentlist.jsp</result>
<result name="error">/index.jsp</result>
</action>
2,抽取拦截器分组
对于1中我们编写的每个action都配置struts中默认的拦截器 代码重复度太高
例:将自己编写的登陆验证的拦截器 和struts默认的拦截器组抽取到到一个分组中 action中引用时 只需要引用myDefaultStack
<package name="U1" extends="struts-default">
<interceptors>
<interceptor name="checklogin" class="org.ccit.com.web.intercept.checkLoginInterceptor"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checklogin"></interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
3,修改默认的拦截器
虽然2中简化了拦截器引用问题 但是还是避免不了每次都要引用
可以在package中修改struts默认的拦截器
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
这样配合2中抽取的拦截器分组就可以不用每次再应用一些常用的拦截器
<package name="U1" extends="struts-default">
<interceptors>
<interceptor name="checklogin" class="org.ccit.com.web.intercept.checkLoginInterceptor"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checklogin"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
</package>
4,过滤不需要拦截器拦截的方法
使用3中方法后 所有的Action方法都会被拦截 但是一些方法并不需要拦截
AbstractInterceptor类还有一个子类MethodFileterInterceptor是抽的的,
通过变量excludeMethods控制那些方法不被过滤器过滤
通过变量includeMethods控制那些方法被拦截
可以方法MthodFilter实现过滤
- 编写继承MethodFileterInterceptor类的拦截器 重新MethodFilter方法
/**
* @program: struts2_05
* @description
* @author: LIANG
* @create: 2021-01-26 18:22
**/
public class checkLoginInterceptor2 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
User user= (User) session.getAttribute("user");
if (user!=null){
return actionInvocation.invoke();
}else{
return "backlogin";
}
}
}
<package name="U1" extends="struts-default">
<interceptors>
<interceptor name="checklogin2" class="org.ccit.com.web.intercept.checkLoginInterceptor2">
<!-- 这里配置的是方法名 并不是Action标签的name属性-->
<param name="excludeMethods">login,register</param>
</interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checklogin2"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
</package>
除了在配置拦截器的时候规定那些方法不经过拦截器 我们也可以在action中配置参数
<action name="login" class="org.ccit.com.web.action.UserAction" method="login">
<interceptor-ref name="myDefaultStack">
<!-- 这里的login也是方法名 并不是Action中的name属性-->
<param name="checklogin2.excludeMethods">login</param>
</interceptor-ref>
<result name="success">/index.jsp</result>
<result name="error">/login.jsp</result>
</action>