您好,欢迎来到乌哈旅游。
搜索
您的当前位置:首页拦截器

拦截器

来源:乌哈旅游
Struts 2拦截器

一、拦截器及其作用

早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低

Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦。为Action提供附加功能时,无需修改Action代码,使用拦截器来提供。

Struts 2大多数核心功能是通过拦截器实现的,比如表单组装、表单验证、类型转换、模型驱动、Servlet对象注入、文件上传等,每个拦截器完成某项功能 拦截器方法在Action执行之前或者之后执行 拦截器栈

从结构上看,拦截器栈相当于多个拦截器的组合 在功能上看,拦截器栈也是拦截器

拦截器与过滤器原理很相似

二、拦截器原理

1、拦截器示例:计算Action执行时间

public class FirstInterceptor implements Interceptor { public void destroy() { } public void init() { } public String intercept(ActionInvocation invocation) throws Exception { //1、预处理工作:获取开始执行时间 long startTime = System.currentTimeMillis(); System.out.println(\"startTime=\"+startTime); //2、执行后续拦截器或Action String result =invocation.invoke(); //3、后续处理工作:获取结束时间,并计算执行时间 long endTime =System.currentTimeMillis(); System.out.println(\"endTime=\"+endTime); System.out.println(\"executeTime=\"+(endTime-startTime));/ } } /4、返回结果字符串 //System.out.println(\"first:result=\"+result); return result;

三阶段执行周期:

1、做一些Action执行前的预处理

2、将控制交给后续拦截器或返回结果字符串 3、做一些Action执行后的处理

2、拦截器配置

class=\"com.aptech.struts2.interceptor.FirstInterceptor\"/>

interceptor-ref name=\"defaultStack\"/>

class=\"com.aptech.struts2.action.LoginAction\">

/success.jsp

/error.jsp

3、自定义拦截器的方法

实现Interceptor接口

void init():初始化拦截器所需资源

void destroy():释放在init()中分配的资源

String intercept(ActionInvocation ai) throws Exception

实现拦截器功能

利用ActionInvocation参数获取Action状态 返回结果码(result)字符串

继承AbstractInterceptor类

提供了init()和destroy()方法的空实现,只需要实现intercept方法即可 推荐使用

继承MethodFilterInterceptor

指定拦截的方法:includeMethods 指定不拦截的方法:excludeMethods

input,back,cancel

4、拦截器执行过程:递归过程

5、Struts2自带拦截器:在struts-default.xml中定义

params拦截器

负责将请求参数设置为Action属性

servletConfig拦截器

将源于Servlet API的各种对象注入到Action

fileUpload拦截器

对文件上传提供支持

modelDriven拦截器

如果Action实现了ModelDriven接口,则把getModel()方法返回的结果压入值栈

exception拦截器

捕获异常,并且将异常映射到用户自定义的错误页面

validation拦截器

调用验证框架进行数据验证

workflow拦截器

调用Action类的validate(),执行编码验证

三、开发权限验证拦截器

1、开发拦截器

public class AuthInterceptor extends MethodFilterInterceptor { protected String doIntercept(ActionInvocation invocation) } throws Exception { //获取session中的username Map session =invocation.getInvocationContext().getSession(); String username =(String)session.get(\"username\"); if(username==null){//如果没有登录,跳转到登录页面 return Action.LOGIN; }else{ //如果登录,继续执行后续操作 return invocation.invoke(); } }

2、注意事项

只对需要保护的action设置auth拦截器;对于LoginAction,本身就是用来登录的,不能设置auth拦截器引用。 把一个JSP文件映射为action

/WEB-INF/security/security.jsp

WEB-INF目录下的内容不能通过客户端直接访问

四、拦截器和过滤器的区别

1、过滤器是web项目的普遍概念,而拦截器是struts2中的特有概念 2、过滤器可以过滤所有请求,拦截器只拦截action请求

3、自定义过滤器需要实现Filter接口,而自定义拦截器可以实现Interceptor接口 4、在web.xml中配置过滤器,在struts.xml中配置拦截器 5、拦截器可以访问Servlet API、ActionContext、值栈,而过滤器只能访问Servlet API

6、使用通配符来定义过滤器的过滤路径,过滤的是地址。通过为Action指定拦截器来调用拦截器,拦截器可以细化到方法层次。

7、在Struts2项目中如果使用过滤器,一般应该将过滤器置于Struts2总控制器之前 8、执行顺序:过滤器---拦截器---Action---拦截器---过滤器(过滤器靠前)

9、拦截器是基于java的反射机制的,而过滤器是基于函数回调

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- wuhaninfo.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务