过滤器(Filter)的概念

  • 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
  • 在请求到达Servlet/JSP之前,过滤器截获请求。
  • 在响应送给客户端之前,过滤器截获响应。
  • 多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定。
  • 最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

源码接口Filter

    public interface Filter {/*** web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。* 容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息。** @param filterConfig* @throws ServletException*/default void init(FilterConfig filterConfig) throws ServletException {}/*** 每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,* 特别需要注意线程同步问题,尽量不用或少用实例变量。 在过滤器的doFilter()方法实现中,任何出现在FilterChain* 的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。** @param var1* @param var2* @param var3* @throws IOException* @throws ServletException*/void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;/*** 容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。*/default void destroy() {}}

自定义实现Filter

public class BTCFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//过滤器的链式结构;可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,// 每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。chain.doFilter(request, response);}
}

自定义一个响应结果包装器,将在这里提供一个基于内存的输出器来存储所有返回给客户端的原始HTML代码。

public class ResponseWrapper extends HttpServletResponseWrapper {private PrintWriter cachedWriter;private CharArrayWriter bufferedWriter;public ResponseWrapper(HttpServletResponse response) {super(response);// 这个是我们保存返回结果的地方bufferedWriter = new CharArrayWriter();// 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中cachedWriter = new PrintWriter(bufferedWriter);}@Overridepublic PrintWriter getWriter(){return cachedWriter;}public String getResult() {//获取原始的HTML页面内容return bufferedWriter.toString();}}

使用自定义的响应包装器

    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 使用我们自定义的响应包装器来包装原始的ServletResponseResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);// 这句话非常重要,注意看到第二个参数是我们的包装器而不是responsechain.doFilter(request, wrapper);// 处理截获的结果并进行处理,比如替换所有的“名称”为“自定义的名字”String result = wrapper.getResult();result = result.replace("名称", "替换后的");// 输出最终的结果PrintWriter out = response.getWriter();out.write(result);out.flush();out.close();}

设置Filter过滤/user/路径的请求

    @Beanpublic FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean registrationBean=new FilterRegistrationBean();registrationBean.setFilter(new BTCFilter());List<String> urlPatterns=new ArrayList<String>();urlPatterns.add("/user/*");registrationBean.setUrlPatterns(urlPatterns);return registrationBean;}

浅谈javax.servlet.Filter相关推荐

  1. 浅谈Listener、Filter、Servlet初始化顺序

    2019独角兽企业重金招聘Python工程师标准>>> Listener.Filter.Servlet都有一个初始化的过程,对应的方法分别为: contextInitialized( ...

  2. spring配置过滤器,报错 com.skynet.filter.GrantFilter cannot be cast to javax.servlet.Filter

    解决方案:GrantFilter 实现Filter 接口并实现接口中的方法即可. import java.io.IOException; import javax.servlet.Filter; im ...

  3. java.lang.ClassNotFoundException: javax.servlet.Filter

    java.lang.ClassNotFoundException: javax.servlet.Filter:有两个原因:(1)在maven中的作用域,不能是provided,需要是compile就是 ...

  4. No qualifying bean of type ‘javax.servlet.Filter‘ available: expected at least 1 bean which qualif

    No qualifying bean of type 'javax.servlet.Filter' available: expected at least 1 bean which qualifie ...

  5. can not be cast to javax.servlet.Filter等问题的解决方法

    问题1:can not be cast to javax.servlet.Filter 一位从测试转开发的同事首次更新代码,并编译在本地启动web项目时,报如下错误: Exception starti ...

  6. cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: jav ...

  7. No qualifying bean of type ‘javax.servlet.Filter‘ available

    eureka启动时报: No qualifying bean of type 'javax.servlet.Filter' available: expected at least 1 bean wh ...

  8. javax.servlet.Filter详解(二) 转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html

    转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html 1.5禁用激活器servlet 在对资源应用过滤器时,可通 ...

  9. 启动过滤器异常 java.lang.AbstractMethodError: ‘void javax.servlet.Filter.init(javax.servlet.FilterConfig)‘

    报错原因 过滤器中没有重写 public void init() 方法,如果直接使用了快速生成代码的重写方法,要把init方法中的super删掉,就可以正常启动了 @Overridepublic vo ...

最新文章

  1. 吴世春:如何找到产品的引爆点
  2. awk的正则表达式提取
  3. 支付二维码php能实现吗_(实用篇)微信支付扫码支付php版
  4. setProperty will trigger ui re-render 南京同事提的问题
  5. LeetCode 1750. 删除字符串两端相同字符后的最短长度(双指针)
  6. XML_CPP_资料_libXml2_01
  7. 分布式数据库中间件–(1) Cobar初始化过程
  8. 【NLP】学不会打我 半小时学会基本操作 13 孪生网络
  9. 麻瓜编程python_麻瓜编程 - 主页
  10. 串级调节系统参数整定方法(串级调节器参数整定)
  11. MBTI职业性格测试
  12. 移动支付模式方面的技术
  13. 【云原生】阿里云容器镜像服务产品ACR EE
  14. ByteBuff常用方法,使用
  15. ionic capacitor 开发APP问题集合
  16. 2020 ArXiv之跨模态ReID:Parameters Sharing Exploration and Hetero-Center based Triplet Loss for Visible-T
  17. OpenCV 矩阵常用操作,比如 addWeighted, flip, hconcat, reduce, merge, norm, repeat, split, sort, mulSpectrum 等
  18. 计算机考研数学用什么教材好,考研数学303,用什么课本?用什么参考书?
  19. layuiAdmin 框架iframe基础常用方法事件文档
  20. Springboot 个性化配置SpringMVC

热门文章

  1. 项目之显示问题和回答问题(12)
  2. 雷蒙德认为在未来计算机,【判断题】雷蒙德·库兹韦尔认为,在未来计算机不仅能变得聪明,而且会比人类还要聪明。...
  3. assert函数--判断表达式是否正确
  4. 【mysql】centos7安装mysql5.7(配置文件取消默认密码)
  5. kafka报错LEADER_NOT_AVAILABLE
  6. 数据的万有引力-帆软数智大会
  7. 判断链表中是否有环链
  8. 链表--判断链表中是否有环
  9. 数学分析第一章第二章知识点概要
  10. 2022施工员-设备方向-通用基础(施工员)操作证考试题及模拟考试