拦截器是Struts2中非常核心的功能,有很多常用的拦截器如:staticParam、params、servletConfig、modelDriven、conversionError、validation 等
struts-default.xml文档中有一个package叫做struts-default,其中定义了很多的拦截器,我们使用的默认是defaultStack中定义的那些。
明确:过滤器和拦截器。过滤器和拦截器实现的功能是类似的,只是概念上不同。一个是Servlet规范中,一个是Struts2框架中的。使用它们可以实现AOP的变成思想。
1. 拦截器的编码步骤
1.1 编写一个类,继承AbstractInterceptor或者实现Interceptor接口
public class Demo1Action extends AbstractInterceptor{
public String interceptor(ActionInvocation invocation)throws Exception{
System.out.println("Demo1拦截前")
String rtValue = invocation.invoke();
System.out.println("Demo1拦截后");
return trValue;
}
}
1.2 声明拦截器后才能使用
在struts.xml文件中
<package name="p1" extends = "struts-default">
<!-- 声明自定义的拦截器 -->
<interceptor name="demo1Interceptor" class="com.zzxb.Demo1Interceptor">
</interceptor>
<action name="action1" class="com.zzxb.action.Demo1Action">
<!-- 使用拦截器:一旦在动作标签中使用了interceptor-ref标签,默认的拦截器将失效 -->
<interceptor-ref name="demo1Interceptor"></interceptor-ref>
</action>
</package>
2. 过滤拦截器:能够指定拦截哪些动作,不拦截哪些动作
//检测用户是否登陆的拦截器
public class LoginCheckInterceptor extends MethodFilterInterceptor{
public String doInterceptor(ActionInvocation invocation){
//判断有没有登陆
HttpSession session = ServletActionContext.getRequest().getSession();
Object obj = session.getAttribute("user");
if(obj == null){
//没有登陆
return "login";
}else{
return invocation.invoke();
}
}
}
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="loginCheck" class="com.zzxb.interceptors.LoginCheckInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="loginCheck"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 把自己的mydefault搞成默认拦截器栈 -->
<default-interceptor-ref name="mydefault"/>
</package>
<package name="user" extends="default">
<action name="login" class="com.zzxb.action.UserAction" method="login">
<interceptor-ref name="mydefault">
<!-- 让loginCheck拦截器不要拦截的方法:多个值用逗号分隔 -->
<param name="loginCheck.excludeMethods">login</param>
</interceptor-ref>
<result name="login">/login.jsp</result>
<result type="redirect">/index.jsp</result>
</action>
</package>