1、拦截器的重要性
Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
是AOP编程思想的一种应用形式。
2、拦截器的执行时机:
3、自定义拦截器
3.1、拦截器的类试图(初级版本):
3.2、编写步骤:
a、编写一个类,继承AbstractInterceptor类或者实现Interceptor接口。重写intercept方法。
b、配置拦截器:注意拦截器必须先声明再使用
<interceptor-ref name="demo1Interceptor"></interceptor-ref>
一定要写,不然不执行拦截器
3.3、执行顺序
3.4、多个拦截器的执行顺序
3.5、intercept方法的返回值
4、拦截器的应用:
4.1、检查登录的拦截器案例
public class CheckLoginInterceptor extends MethodFilterInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
if (ServletActionContext.getRequest().getSession().getAttribute(sessionName) == null) {
System.out.println("会话中无用户,返回登录页面");
return "nouser";
}
return invocation.invoke();
}
private String sessionName;
public String getSessionName() {
return sessionName;
}
public void setSessionName(String sessionName) {
this.sessionName = sessionName;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<struts>
<package name="struts-user" extends="global-package" namespace="/user">
<interceptors>
<interceptor name="checkLogin"
class="net.seehope.ssh.struts.web.interceptor.CheckLoginInterceptor">
</interceptor>
<interceptors>
<action name="*" class="net.seehope.ssh.struts.web.action.UserAction"
method="{1}">
<interceptor-ref name="checkLogin">
<param name="sessionName">USER_IN_SESSION</param>
<param name="checkLogin.excludeMethods">userRegist</param>
</interceptor-ref>
<result name="nouser">/login.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
4.2、案例中的问题
问题:由于我们写了自己的拦截器,默认的拦截器不起作用了。
解决办法:
a、把默认拦截器加入到配置文件中
b、a中暴露的问题:当有多个拦截器时,需要改写的地方非常多。
解决办法:抽取公共的包,把全局配置放入公共包中。
c、b中的问题:还要再每个动作方法中引入拦截器。能不能不写呢?
思路:我们在设置【开发模式】时,覆盖掉了一个default.properties中的常量,能不能把struts-default.xml中的默认拦截器栈的设置给覆盖掉呢?答案是可以的。