1、拦截器:拦截器和过滤器很相似。在 action 执行的前后执行。Struts2 的核心功能都是通 过拦截器来实现。
2、拦截器栈:由多个拦截器组成。
3、作用:对于 action 的一些公共处理代码可以放到拦截器中来实现。如:权限控制,日志 等等。
4、多个拦截器之间的执行是采用责任链设计模式来实现。
5、拦截器的执行流程
1、拦截器:拦截器和过滤器很相似。在 action 执行的前后执行。Struts2 的核心功能都是通 过拦截器来实现。
2、拦截器栈:由多个拦截器组成。
3、作用:对于 action 的一些公共处理代码可以放到拦截器中来实现。如:权限控制,日志 等等。
4、多个拦截器之间的执行是采用责任链设计模式来实现。
5、拦截器的执行流程

6、拦截器的实现步骤:
a) 编写拦截器(实现 Interceptor 接口或者继承 AbstractInterceptor 类)
b) 在 struts.xml 中 配置拦截器
c) 在 action 中引用拦截器
7、案例: 定义拦截器
/*** *计算 action 执行时间 */
public class TimeInterceptor extends AbstractInterceptor{
@Override public String intercept(ActionInvocation invocation) throws Exception {
long start=System.currentTimeMillis();
//执行下一个拦截器,当拦截器执行完后执行
String result= invocation.invoke();
long end=System.currentTimeMillis();
System.out.println("执行该 Action 所用时间为: "+(end-start)+"ms");
return result;
}}}
在 struts.xml 中 配置拦截器,以及引用拦截器
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="time"class="cn.sxt.interceptor.TimeInterceptor"/>
</interceptors>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/index.jsp</result>
<!-- 应用拦截器 -->
<interceptor-ref name="time"/>
</action> </package>
</struts>
、拦截器的配置详解
a) 当引用了自定义拦截器时,默认拦截器将不起作用
b) 默认拦截器:在 struts-default.xml 中,配置了默认拦截器。当配置默认拦截器以后,
如果不引用拦截器,那么默认的拦截器将起作用。
<default-interceptor-ref name="defaultStack"/>
c) 当引用自定义拦截器后,又想使用 struts2 提供的拦截器功能,那么需要手动引用
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/index.jsp</result>
<!-- 引用拦截器 --> <interceptor-ref name="time"/>
<!-- 引用默认的拦截器栈 ;引用拦截器和引用拦截器栈的方式一 样-->
<interceptor-ref name="defaultStack"/> </action>
当 action 引用的拦截器个数比较多时,可以将多个拦截器放入一个拦截器栈中
<!-- 一个拦截器栈中,可以包含多个拦截器的引用 拦截器栈的引用和拦截器一致 -->
<interceptor-stack name="myStack">
<!-- 引用拦截器 --> <interceptor-ref name="time"/>
<!-- 引用默认的拦截器栈 ;引用拦截器和引用拦截器栈的方式一样-->
<interceptor-ref name="defaultStack"/>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/index.jsp</result> <interceptor-ref name="myStack"/> </action>
当自定义拦截器栈在这个包下的所有 action 都使用的时,可以定义为默认的拦截器 栈,或默认的拦截器
<!-- 定义默认的拦截器/栈 -->
<default-interceptor-ref name="myStack"/>
<action name="hello" class="cn.sxt.action.HelloAction">
<result>/index.jsp</result>
</action>
拦截器的运用案例:
对于登录权限的控制: 拦截器的实现:
public class LoginInterceptor extends AbstractInterceptor{
@Override public String intercept(ActionInvocation invocation) throws Exception {
//判断是否是 login.action 如果是则直接执行下一个拦截器
//如果不是 则判断是否登录,如果登录执行下一个拦截器
//如果没有则返回登录页面 //actionName 没有扩展名
String actionName=invocation.getProxy().getActionName();
if("login".equals(actionName)){
return invocation.invoke();
}
Object obj = invocation.getInvocationContext().getSession().get("user");
if(obj==null){//没有登录 return Action.LOGIN; }
return invocation.invoke();
}
}
}
}
}
Struts.xml 的配置
<struts> <package name="default" extends="struts-default" namespace="/">
<!-- 配置拦截器 --> <interceptors> <interceptor name="time" class="cn.sxt.interceptor.TimeInterceptor"/>
<interceptor name="loginInterceptor" class="cn.sxt.interceptor.LoginInterceptor"/>
<!-- 一个拦截器栈中,可以包含多个拦截器的引用 拦截器栈的引用和拦截器一致 -->
<interceptor-stack name="myStack"> <interceptor-ref name="loginInterceptor"/>
<!-- 引用拦截器 -->
<interceptor-ref name="time"/>
<!-- 引用默认的拦截器栈 ;引用拦截器和引用拦截器栈的方 式一样-->
<interceptor-ref name="defaultStack"/>
</interceptor-stack> </interceptors>
<!-- 定义默认的拦截器/栈 --> <default-interceptor-ref name="myStack"/>
<global-results> <result name="login">/login.jsp</result>
</global-results> <action name="hello" class="cn.sxt.action.HelloAction">
<result>/WEB-INF/index.jsp</result> </action>
<action name="login" class="cn.sxt.action.LoginAction">
<result>/success.jsp</result>
</action> </package>
</struts>
页面
<body>
<form action="user/login.action" method="post">
用户名:<input type="text" name="name"/><br>
密码:<input type="password" name="pwd"/><br>
<input type="submit" value=" 登 录 "/>
</form>
</body>
Action 代码
public class LoginAction {
private String name; private String pwd;
//处理方法
public String execute(){
System.out.println(name+"---"+pwd);
if("siggy".equals(name)&&"1111".equals(pwd)){
ActionContext.getContext().getSession().put("user", name);
return "success"; }else{ return "login"; }
}
public String logout(){ System.out.println("退出"); return"success"; }
public String getName() { return name; } public void setName(String name) { this.name = name; }
public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; }
}
10、方法拦截器:方法拦截器时比 Action 拦截器更加细粒度的控制,主体实现和 Action 拦 截器一致。但是方法拦截器时继承 MethodFilterInterceptor 类,重写 doIntercept()方法。 引用方法拦截器配置会发生改变:
<interceptor-ref name="methodInterceptor">
<!-- 配置被拦截的方法 -->
<param name="includeMethods">list,add</param>
<!-- 配置不被拦截的方法 -->
<param name="excludeMethods">login</param> </interceptor-ref>
|
|
|
|
|
|
|
|
|
|