struts2 过滤器和拦截器的区别和使用
java web 过滤器和拦截器的区别和使用
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); } }
经本人亲测,此程序完全正确,若有不同意见,请留言
资料来源:http://www.ylzx8.cn/web/web/993988.html
struts2 过滤器和拦截器的区别和使用的更多相关文章
- Struts2之过滤器和拦截器的区别
刚学习Struts2这个框架不久,心中依然有一个疑惑未解那就是过滤器和拦截器的区别,相信也有不少人跟我一样对于这个问题没有太多的深入了解 那么下面我们就一起来探讨探讨 过滤器,是在java web中, ...
- Struts2中过滤器和拦截器的区别
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
- JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结
对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...
- JavaWeb过滤器.监听器.拦截器-原理&区别(转)
1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...
- Struts2 过滤器与拦截器
学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下. 过滤器,是在java web中,你传入的request,re ...
- spring boot 过滤器、拦截器的区别与使用
原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...
- spring过滤器和拦截器的区别和联系
一 简介 (1)过滤器: 依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.在实现上基于函数回调,可 ...
- struts过滤器和拦截器的区别
拦截器的工作原理:当接收到一个httprequest ,a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDisp ...
- Filter—过滤器和拦截器的区别
1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...
随机推荐
- [译]Use Dependency Injection In WebForms Application
怎么在已用的WebForm应用中使用DI 假设有一个电影网站,有个页面会列出最近热门的电影.这个项目中使用了仓储模式来获取数据. public partial class Default : Syst ...
- luogu 2878 贪心
其实这题不难,只是想告诉自己:贪心不全是真的脑残拿最大就AC 此题实际上就是比较x,y优先级利用时间计算得到a[i]t/a[i].d(没错时间在上,并非惯性思维的d在上) t*a[x].d+(t+a[ ...
- [C++]PAT乙级1003. 我要通过!(17/20)
/* 1003. 我要通过!(20) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错 ...
- 转载-HashMap1.7源码分析
原文地址-https://www.cnblogs.com/chengxiao/p/6059914.html HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重 ...
- python 多线程小方法
import time from multiprocessing import Process, Lock, JoinableQueue from multiprocessing import Sem ...
- day 7 - 1 集合、copy及基础数据类型汇总
集合:{},可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复.(不重要)集合的书写 set1 = set({1,2,3}) #set2 = {1,2,3,[2,3],{'name':' ...
- Python 中的比较:is 与 ==
转载: https://www.cnblogs.com/kiko0o0/p/8135184.html 在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? ...
- drawImg、x5浏览器、react
- F - Auxiliary Set HDU - 5927 (dfs判断lca)
题目链接: F - Auxiliary Set HDU - 5927 学习网址:https://blog.csdn.net/yiqzq/article/details/81952369题目大意一棵节点 ...
- SQL SERVER 2008 R2安装的时候提示“该实例名称MSSQLSERVER已在使用
SQL SERVER 2008安装的时候提示“该实例名称已在使用”解决办法._冷雨玫瑰_新浪博客---和这文章描述差不多http://blog.sina.com.cn/s/blog_672b419f0 ...