全部评论(2条)
-
- dsw_123 2018-04-18 00:00:00
- 第3点中 1、在web.xml里面配置自定义的 2、如何编写自定义的 应该都是过滤器吧,是写错了吧
-
赞(19)
回复(0)
-
- lushan12207 2018-04-18 14:52:01
- 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),Z后一个一个地调用列表中的。 1.3 什么是过滤器 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择: ①以常规的方式调用资源(即,调用servlet或JSP页面)。 ②利用修改过的请求信息调用资源。 ③调用资源,但在发送响应到客户机前对其进行修改。 ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。 1.4 Servlet过滤器的基本原理 在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到Z终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。 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); } }
-
赞(9)
回复(0)
热门问答
- java web 过滤器跟的区别和使用
2018-04-17 04:54:51
289
2
- java项目和web项目中的过滤器文件怎么使用?
- Filter过滤器文件的设置和使用要注意什么问题??它是基于什么来运行的?越详细越好
2016-07-27 01:46:18
637
1
- web网络控制器跟网络交换机的区别
- web网络控制器跟网络交换机的区别... web网络控制器跟网络交换机的区别 展开
2016-10-11 04:24:56
459
1
- web of science 和sci的区别
2017-11-26 02:48:20
680
1
- java中 过滤器 都有什么区别?尤其是和过滤器
2017-11-24 17:11:13
321
1
- java过滤器的3、include过滤器
2018-11-27 18:29:27
231
0
- 如何搭建java web测试环境
2016-12-17 17:12:36
345
2
- 过滤器和的区别
2016-03-07 05:16:38
405
2
- 过滤器和的区别
2017-10-19 12:00:41
450
1
- Java框架Struts2的和过滤器有什么区别?
2013-11-06 00:38:44
310
2
- java如何创建过滤器
2013-07-10 07:52:23
317
2
- struts2和过滤器的区别
2018-11-12 09:27:01
316
0
- springmvc过滤器和的区别
2017-02-03 13:23:29
321
1
- java中装饰器和过滤器的概念是什么?
2009-06-07 04:09:05
415
2
- java过滤器中的FilterChain对象
- 过滤器的doFilter()里有三个参数,那FilterChain对象是哪里传过来的啊它是像request对象一样是JSP的隐藏对象吗 如果只有一个过滤器的话filterchain.doFilter()是执行要访问的页面吗
2013-04-11 15:03:48
332
2
- spring过滤器和的区别和联系
2018-11-13 06:04:05
343
0
- y型过滤器和t型过滤器的区别
2017-09-28 00:58:37
429
1
- java软件开发工程师和java软件架构师 有啥区别
- 我想知道 java软件开发工程师和java软件架构师 有啥区别 请大家帮忙
2013-05-26 22:31:00
402
2
- 管道单向阀和过滤器的区别
2016-07-10 12:45:44
261
1
- filter过滤器和的区别是什么?
2017-12-30 21:14:57
358
1
5月突出贡献榜
推荐主页
最新话题
-
- #激光粒度仪 #
- 电压击穿试验仪:藏在实验室里的“闪电制造者”...电压击穿试验仪:藏在实验室里的“闪电制造者”硬核真相:这台设备能在几秒内让绝缘材料“原地爆炸”!通过模拟极端高压环境(可达300kV以上),它用一道闪电般的电弧,揭穿材料绝缘性能的极限。魔鬼测试流程:温柔起步:以100V/s缓慢升压死亡凝视:实时监测微小漏电流致命一击:在击穿瞬间记录峰值电压(整个过程比科幻大片更刺激)安全玄机:• 防爆油箱:把击穿爆炸锁在40mm钢化玻璃后• 幽灵电压消除:放电后自动归零,防残余电击• 智能逃逸:检测到有毒气体自动启动排风反常识现象:某些纳米复合材料被击穿后会“自愈合”干燥空气的击穿电压≈3kV/mm,但SF₆气体可达89kV/mm
- 市场中的检测zeta电位的一种技术叫CF-P...市场中的检测zeta电位的一种技术叫CF-PALS,他是真的相位分析光散射吗?这种余弦拟合位相分析法,为什么叫"位相",而不是传统的“相位"?
参与评论
登录后参与评论