过滤器

filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能。

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

一个过滤器是一个可以传送请求或修改响应的对象。过滤器并不是servlet,他们并不实际创建一个请求。他们是请求到达一个servlet前的预处理程序,和/或响应离开servlet后的后处理程序。一个过滤器能够:
·在一个servlet被调用前截获该调用
·在一个servlet被调用前检查请求
·修改在实际请求中提供了可定制请求对象的请求头和请求数据
·修改在实际响应中提供了可定制响应对象的响应头和响应数据
·在一个servlet被调用之后截获该调用
 
    一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤一个或多个servlet。一个过滤器需要实现java.servlet.Filter接口,并定义它的三个方法:
1.              void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。
2.              void destroy();在过滤器执行service后被调用。
3.              Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;执行实际的过滤工作。
 
服务器调用一次init(FilterConfig)以为服务准备过滤器,然后在请求需要使用过滤器的任何时候调用doFilter()。FilterConfig接口检索过滤器名、初始化参数以及活动的servlet上下文。服务器调用destory()以指出过滤器已结束服务。过滤器的生命周期和servelt的生命周期非常相似 ——在Servlet API 2.3 最终发布稿2号 中最近改变的。先前得用setFilterConfig(FilterConfig)方法来设置生命周期。
 
在doFilter()方法中,每个过滤器都接受当前的请求和响应,而FilterChain包含的过滤器则仍然必须被处理。doFilter()方法中,过滤器可以对请求和响应做它想做的一切。(就如我将在后面讨论的那样,通过调用他们的方法收集数据,或者给对象添加新的行为。)过滤器调用
chain.doFilter()将控制权传送给下一个过滤器。当这个调用返回后,过滤器可以在它的doFilter()方法的最后对响应做些其他的工作;例如,它能记录响应的信息。如果过滤器想要终止请求的处理或得对响应的完全控制,则他可以不调用下一个过滤器。
 

常见用法

处理全站中文乱码问题

实现自动登录

过滤敏感词汇

压缩网页

选择性让浏览器缓存

这几种功能的实现采用同样的原理,那就是使用包装模式或动态代理增强request或response对象的功能。

Servlet和filter的区别

1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.
2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等。

demo演示

步骤一:新建comment.jsp页面

  1. <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <html>
  3. <head>
  4. <title>评论</title>
  5. </head>
  6. <body>
  7. <form action="comment" method="post">
  8. <fieldset>
  9. <legend>评论</legend>
  10. 请输入评论:<textarea name="comment"
  11. style="vertical-align:middle;
  12. width:140px;height:55px"></textarea><Br>
  13. <input type="submit" value="发表评论" />
  14. </fieldset>
  15. </form>
  16. </body>
  17. </html>

步骤二:新建CommentServlet.java文件

  1. package web;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class CommentServlet extends HttpServlet {
  9. public void service(HttpServletRequest request,
  10. HttpServletResponse response)
  11. throws ServletException, IOException {
  12. request.setCharacterEncoding("UTF-8");
  13. response.setContentType("text/html;charset=UTF-8");
  14. PrintWriter out = response.getWriter();
  15. //获取评论内容
  16. String str = request.getParameter("comment");
  17. //显示评论内容
  18. out.println("<h3>评论内容:" + str + "</h3>");
  19. out.close();
  20. }
  21. }

步骤三:新建CommentFilter类

  1. package web;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class CommentFilter1 implements Filter{
  13. private String illegalWord;
  14. /**
  15. * 容器删除过滤器实例之前调用,只执行一次
  16. */
  17. public void destroy() {
  18. }
  19. /**
  20. * 用于处理请求的主要方法
  21. */
  22. public void doFilter(ServletRequest request, ServletResponse response,
  23. FilterChain chain) throws IOException, ServletException {
  24. HttpServletRequest req = (HttpServletRequest)request;
  25. HttpServletResponse resp = (HttpServletResponse)response;
  26. req.setCharacterEncoding("UTF-8");
  27. resp.setContentType("text/html;charset=UTF-8");
  28. PrintWriter out = resp.getWriter();
  29. String comment = req.getParameter("comment");
  30. if(comment.indexOf("damn")!=-1){
  31. //有敏感词汇
  32. out.print("<h3>评论内容已关闭</h3>");
  33. }else{
  34. //没有敏感词汇则向后处理,交给其他过滤器或Servlet
  35. chain.doFilter(req, resp);
  36. }
  37. }
  38. /**
  39. * 容器启动之后,创建过滤器实例
  40. * 然后调用init方法,只会调用一次
  41. * 容器会将已经创建好的FilterConfig对象作为参数传入
  42. * 可以从该参数中获取初始化的配置信息
  43. */
  44. public void init(FilterConfig filterConfig) throws ServletException {
  45. illegalWord = filterConfig.getInitParameter("illegalWord");
  46. System.out.println("Filter1:init is runnming... " + illegalWord);
  47. }
  48. }

步骤四:配置CommentFilter过滤器

web.xml文件代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <display-name></display-name>
  8. <!-- 过滤器 -->
  9. <filter>
  10. <filter-name>filter1</filter-name>
  11. <filter-class>web.CommentFilter1</filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>filter1</filter-name>
  15. <url-pattern>/comment</url-pattern>
  16. </filter-mapping>
  17. <!-- Servlet -->
  18. <servlet>
  19. <servlet-name>CommentServlet</servlet-name>
  20. <servlet-class>web.CommentServlet</servlet-class>
  21. </servlet>
  22. <servlet-mapping>
  23. <servlet-name>CommentServlet</servlet-name>
  24. <url-pattern>/comment</url-pattern>
  25. </servlet-mapping>
  26. </web-app>

步骤五:部署应用,输入评论查看结果

      

filter 作用的更多相关文章

  1. spring security 4 filter 顺序及作用

    Spring Security 有两个作用:认证和授权 一.Srping security 4 filter 别名及顺序 spring security 4 标准filter别名和顺序,因为经常要用就 ...

  2. Spring Security Filter详解

    Spring Security Filter详解 汇总 Filter 作用 DelegatingFilterProxy Spring Security基于这个Filter建立拦截机制 Abstract ...

  3. .NET Core开发日志——Filter

    ASP.NET Core MVC中的Filter作用是在请求处理管道的某些阶段之前或之后可以运行特定的代码. Filter特性在之前的ASP.NET MVC中已经出现,但过去只有Authorizati ...

  4. [JavaWeb] Servlet Filter

    作用: Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servle ...

  5. java过滤器filter使用

    一:filter:过滤器,拦截servlet的请求和响应. 1. package jd.com.filter; import javax.servlet.*; import java.io.IOExc ...

  6. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  7. Java基础ArrayList、Servlet与Filter

    一.技术分享 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因 ...

  8. map、filter、reduce函数的使用

    1.filter() 作用:过滤 // 1.筛选出大于30的数. const array = [10, 20, 30, 40, 50, 60, 70, 80] // 普通写法 // let newar ...

  9. Vue--使用watch、computed、filter方法来监控

    watch与computed.filter: watch:监控已有属性,一旦属性发生了改变就去自动调用对应的方法 computed:监控已有的属性,一旦属性的依赖发生了改变,就去自动调用对应的方法 f ...

随机推荐

  1. [摘录]全面学习GFW

    转载自:https://cokebar.info/archives/253 GFW会是一个长期的存在.要学会与之共存,必须先了解GFW是什么.做为局外人,学习GFW有六个角度.渐进的来看分别是: 首先 ...

  2. Spring中统一相同版本的api请求路径的一些思考

    Spring中统一相同版本的api请求路径的一些思考 问题场景 当我们在实际开发中,可能会遇到开发相同同版本的api, 假设相同版本的api请求路径为/v1/functionA,/v1/functio ...

  3. HTML5 JSDOM

    1,HTML5 新语义化标签 - nav -- 表示导航 - header -- 表示页眉 -- 头部 - section -- 表示区块 -- 类似于div - main -- 文档主要内容 - a ...

  4. PHPStorm2017.1.3永久激活方法之本地破解激活

    是时候升级你的phpstorm了,咱们马上行动! 下载 1.phpstorm https://www.jetbrains.com/phpstorm/download/ 2.破解包 破解补丁无需使用注册 ...

  5. JavaScript笔记4-数组

    一.概述: 1.数组是无类型的:同一数组的各元素可以是任意类型,也可以是数组或对象; 2.索引从0开始,最大到2^32-2=4294967294;最多容纳4294967295个元素; 3.数组是动态的 ...

  6. hdfs校验和

    hdfs完整性:用户希望储存和处理数据的时候,不会有任何损失或者损坏.所以提供了两种校验: 1.校验和(常用循环冗余校验CRC-32). 2.运行后台进程来检测数据块. 校验和: a.写入数据节点验证 ...

  7. cv2.bilateralFilter 双边滤波

    双边滤波bilateralFilter 双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单.非迭代.局部处 ...

  8. python 遍历list

    #!/usr/bin/env python# -*- coding: utf-8 -*-if __name__ == '__main__':    list = ['html', 'js', 'css ...

  9. 面向对象OO第一单元三次作业总结

    (一)第一单元的作业围绕着多项式的求导,从简单到复杂,主要的要求是 作业一:只有两种格式的因子:带符号整数(+02)和幂函数(x^+02). 作业二:在作业一的基础上添加了:sin(x)和cos(x) ...

  10. Map集合应用 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...

    package com.swift; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import ...