Struts2 拦截器: 拦截器与过滤器区别
1、首先要明确什么是拦截器、什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。 谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈 Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。 1.2. 拦截器的实现原理: 大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。1.3 什么是过滤器过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:①以常规的方式调用资源(即,调用servlet或JSP页面)。②利用修改过的请求信息调用资源。③调用资源,但在发送响应到客户机前对其进行修改。④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。 1.4 Servlet过滤器的基本原理在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。 2、拦截器与过滤器的区别 : 1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。 2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器的代码实现(以struts2为例):1、在xml文件中如何定义拦截器<interceptors> <interceptor name="filterIPInterceptor" class="com.xxxx.web.FilterIPActionInterceptor" /><interceptor-stack name="filterIPStack"><interceptor-ref name="defaultStack" /> <interceptor-ref name="filterIPInterceptor" /></interceptor-stack></interceptors> 2、怎么遍别写自定义拦截器 public class FilterIPActionInterceptor extends AbstractInterceptor{ /** 日志控制. */ private final Log log = LogFactory.getLog(getClass()); /** * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) */ @Override @SuppressWarnings("unchecked") public String intercept(ActionInvocation invocation) throws Exception { String result = null; // 获得当前方法名. String methodName = invocation.getInvocationContext().getName(); String currIp = null; try { if (invocation.getAction() instanceof PortletAction) { PortletAction action = (PortletAction) invocation.getAction(); currIp = action.getRequest().getRemoteAddr(); } String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP"); if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp)) { log.error("允许刷新的IP不存在或当前请求的IP非法."); throw new NoAllowIPException(); } else { String[] ips = ip.split(","); boolean errorIp = true; for (String s : ips) { if (s.equals(currIp)) errorIp = false; } // 判断IP if (errorIp) throw new NoAllowIPException(); } result = invocation.invoke();//调用被拦截的方法 } catch (Exception e) { log.error("异常类名:" + invocation.getAction().getClass()); log.error("异常方法:" + methodName, e); throw e; } return result; } } 3、怎么编写过滤器 1、在web.xml里面配置自定义的拦截器 <filter><filter-name>Redirect Filter</filter-name><filter-class>com.xx.filter.RedirectFilter</filter-class></filter> <filter-mapping><filter-name>Redirect Filter</filter-name><url-pattern>/xx/xx/*</url-pattern> </filter-mapping> 2、如何编写自定义的拦截器public class RedirectFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // 获取URL Long startTime = null; if (log.isDebugEnabled()) { startTime = System.currentTimeMillis(); } HttpServletRequest httpRequest = (HttpServletRequest) request; String url = httpRequest.getRequestURL().toString(); if (url == null || url.trim().length() == 0) { return; } if (url.indexOf(luceneCreateMapping) != -1 || url.indexOf(luceneSearchMapping) != -1) { doFilterForxxx(request, response, url); } else { doxxxx(request, response, url); } if (log.isDebugEnabled()) { long endTime = System.currentTimeMillis(); Thread currentThread = Thread.currentThread(); String threadName = currentThread.getName(); log.debug("[" + threadName + "]" + "< " + this.getClass().getName() + " " + url + " " + (endTime - startTime) + " ms"); }// 激活下一个Filter filterChain.doFilter(request, response); }} 转载自https://zhidao.baidu.com/question/583953960492530045.html
转载于:https://www.cnblogs.com/sobright/p/6618859.html
Struts2 拦截器: 拦截器与过滤器区别相关推荐
- Springmvc中的拦截器interceptor及与过滤器filter的区别
一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...
- 什么是拦截器?什么是过滤器?
原文链接:https://www.longkui.site/program/frontend/pipe/4408/ 0.背景 写项目的时候用到了拦截器,会决定哪些接口拦截,哪些接口不拦截.偶尔一次等保 ...
- Struts2框架之拦截器
1:拦截器类似web过滤器,在action执行之前或者执行之后去取一些操作 2:拦截器栈就是递归调用 strust2的工作流程: 客户端通过HttpServletRequest向Tomcat容器发送请 ...
- Struts2内置拦截器的简要介绍
http://www.th7.cn/Program/java/201405/195296.shtml 标记有(*)要着重了解: (1)alias(别名拦截器):允许参数在跨越多个请求时使用不同别名,该 ...
- struts2如何使用拦截器进行用户权限控制
大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...
- Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈
工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX
- Vue << 拦截器(interceptors ) 过滤器(filter)
拦截器(interceptors) 在axios 请求或响应被 then 或 catch 处理前拦截它们. 设置请求拦截器 // 设置请求头axios.defaults.headers = {'Con ...
- Struts2学习三拦截器
JAVA Struts2 DAY05 拦截器HelloWorld 扩展拦截器HelloWorld NetCTOSS登录检查 上传文件 1 拦截器HelloWorld 1.1 问题 写一个拦截器的Hel ...
- struts2控制器及拦截器返回JSON格式数据
1. JSON插件 想要使用json必定会用到jquery. 1.1 导入相关的Ajax-jar包-01资料中ajax文件中. commons-beanutils-1.8.0.j ...
最新文章
- h.264的POC计算
- leetcode算法题--摆动序列★
- android 字符串,textview
- 送人玫瑰,手留余香,如果本博客帮助到你了,帮忙点开本篇投上一票
- Windows使用筛选器来处理异常
- C语言入门经验:零基础如何学习C语言?
- 牛X,试用了下GitHub上22万Star的第一抢票神器,3秒钟抢到!
- windows部署免安装版python
- 跨编程语言平台的通信
- python 分词及语义识别
- fiddler手机模拟器抓包_fiddler抓取手机模拟器数据
- 天梯赛座位 分配分数 20作者 陈越单位 浙江大学
- infercnv报错Error in base::rowMeans(x, na.rm = na.rm, dims = dims, ...) : ‘x‘ must be an array of a
- 设计模式 - 创建型模式_工厂方法模式
- 回答华为公司面试题一头牛重800公斤一座桥承重700公斤问牛怎么过桥?
- linux串口termios
- 数据安全技术体系建设的思考
- Pandas 如何保存较大文件。‘ValueError: This sheet is too large! Your sheet size is: 16388602, 3 Max sheet size
- checkbox选中和不选中 jqu_JQuery控制radio选中和不选中方法总结
- 在SAP中使用标准表维护SM30说明
热门文章
- javascript --- XHR(XMLHttpRequet)对象
- javascript --- 使用对象关联简化整体设计
- ES5-拓展 this指向的总结
- API网关如何实现对服务下线实时感知
- 大数据和人工智能的关系是什么?
- 为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
- Linux运维系统工程师系列---13
- 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
- a与a:link、a:visited、a:hover、a:active
- Ubuntu12 10下安装JDK7