zoukankan      html  css  js  c++  java
  • filter 作用

     过滤器

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

    步骤四:配置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>

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

          

  • 相关阅读:
    520了,用32做个简单的小程序
    年轻就该多尝试,教你20小时Get一项新技能
    自定义注解!绝对是程序员装逼的利器!!
    vs2015添加ActiveX Control Test Container工具(转载)
    编译MapWinGis
    C#遍历集合与移除元素的方法
    c#winform程序,修改MessageBox提示框中按钮的文本
    java程序员面试答题技巧
    什么是DOM
    uml类关系
  • 原文地址:https://www.cnblogs.com/liaoyanglong/p/6155719.html
Copyright © 2011-2022 走看看