自己不编写拦截器 struts在struts-default.xml(struts2-core-2.5.26.jar!\struts-default.xml)配置了默认的拦截器

<default-interceptor-ref name="defaultStack"/>

如果自定义了拦截器 默认的拦截器就不再起作用

struts编写的默认拦截器里边的很多功能不再使用

拦截器问题优化_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实现过滤

拦截器问题优化_拦截器优化_02

  • 编写继承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>