zoukankan      html  css  js  c++  java
  • Servlet高级部分Filter(过滤器)

      一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改。它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterChain的概念,称之为"过滤器链"。一个FilterChain包含了多个Filter,一个请求到达Servlet或者一个响应到达客户端都要经过FilterChain串联起来的所有Filter。Filter的处理流程如下【Filter于Servlet的耦合性不高,可以随意装装载和卸载】:

      

    *:一个web应用中可以配置多个Filter,Filter的执行顺序,由web.xml文件中配置的<filter-mapping>的先后顺序决定,配置在最前面的最先执行。从上面的图中可以看出,请求的时候先访问的是Filter1,响应的时候先执行的Filter2。请求时候执行Filter的顺序刚好和响应的时候相反。

      二:Filter常见的使用场景

        权限验证、日志记录、数据压缩、数据加密、格式转换、图像处理(如:添加水印)等......

      三:实现Filter的方式是实现 javax.servlet.Filter接口,需要实现3个方法,这3个方法,刚好就是Filter的生命周期。

    【代码演示<编码Filter>:有时候请求响应的时候会出现编码格式错误的问题,之前是在每个Servlet中进行处理,这样做造成了代码的重复。可以将这一操作放置在Filter中,只需配置好Filter的url规则,让客户端在访问每个Servlet的时候都会经过这个设置编码的Filter。是的代码更加清晰。】

    TestFilter.java

     1 package cn.woo.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 
    12 /**
    13  * @Description:TODO 演示Filter的使用15  * @version: V1.0  
    16  * @Date: 2018年8月18日 下午7:17:16 
    17  */
    18 public class TestFilter implements Filter{
    19     
    20     private String encoding;
    21     
    22     /**
    23      * web应用关闭时,调用该方法[该方法只会执行一次]
    24      */
    25     @Override
    26     public void destroy() {
    27         System.out.println("销毁Filter");
    28     }
    29 
    30     @Override
    31     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    32             throws IOException, ServletException {
    33         System.out.println("处理之前,request到达目标Servlet之前");
    34         //设置请求和响应的编码格式
    35         request.setCharacterEncoding(encoding);
    36         response.setCharacterEncoding(encoding);
    37         //执行该行会将请求传递至下一个Filter或者Servlet[这句话是必须执行的,不执行的话无法将请求传递至目标Servlet]
    38         chain.doFilter(request, response);
    39         System.out.println("处理之后,response到达客户端之前");
    40     }
    41     
    42     /**
    43      * web应用启动时,调用该方法[该方法只会执行一次]
    44      * @param config 该对象可以获取该Filter的初始化参数,和ServletContext信息
    45      */
    46     @Override
    47     public void init(FilterConfig config) throws ServletException {
    48         //获取初始化参数[存放的为utf-8的编码格式]
    49         encoding = config.getInitParameter("encoding");
    50         System.out.println("加载Filter");
    51     }
    52 }

    web.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     3   <display-name>FilterDemo</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>
    12   
    13   <!-- 配置Filter -->
    14   <filter>
    15       <filter-name>testFilter</filter-name>
    16       <filter-class>cn.woo.filter.TestFilter</filter-class>
    17       <!-- 当然Filter中可以配置初始化参数,可以在Filter的init方法中通过参数config进行获取 -->
    18       <init-param>
    19           <param-name>encoding</param-name>
    20           <param-value>utf-8</param-value>
    21       </init-param>
    22   </filter>
    23   
    24   <filter-mapping>
    25       <filter-name>testFilter</filter-name>
    26       <!-- 配置url匹配规则,只要访问位于/servlet/映射下的Servlet都会触发该Filter -->
    27       <!-- url-pattern和dispatcher需要同时满足才能使用该Filter -->
    28       <url-pattern>/servlet/*</url-pattern>
    29       <!-- 
    30           REQUEST:配置仅当直接访问Servlet的时候才能触发该Filter 
    31           INCLUDE:配置当使用<jsp:include>指令访问Servlet的时候才能触发Filter
    32           FORWARD:表示仅当Servlet(当然JSP也是Servlet)通过forward方式到达另外个Servlet的时候才会触发Filter
    33           ERROR:表示仅当使用<%@ page errorPag = "error.jsp"%>指令指定错误处理页面的时候才会触发该Filter
    34       -->
    35       <dispatcher>REQUEST</dispatcher>
    36   </filter-mapping>
    37   
    38   <!-- 配置Servlet -->
    39   <servlet>
    40       <servlet-name>testServlet</servlet-name>
    41       <servlet-class>cn.woo.servlet.TestServlet</servlet-class>
    42   </servlet>
    43   
    44   <servlet-mapping>
    45       <servlet-name>testServlet</servlet-name>
    46       <url-pattern>/servlet/testServlet</url-pattern>
    47   </servlet-mapping>
    48 </web-app>
    View Code

    TestServlet.java

     1 package cn.woo.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.HttpServlet;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 
    16 public class TestServlet extends HttpServlet{
    17 
    18     /**
    19      * 
    20      */
    21     private static final long serialVersionUID = 1L;
    22 
    23     @Override
    24     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    25         doPost(req, resp);
    26     }
    27 
    28     @Override
    29     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    30         //获取用户名
    31         String name = req.getParameter("name");
    32         System.out.println(name);
    33         resp.getWriter().println("请求成功");
    34     }
    35 }

     结果展示:

    ①:项目启动

    ②:通过http://localhost:8080/FilterDemo/servlet/testServlet访问服务器

    *:因为上面的方式是采用Get的方式进行访问的,设置utf-8编码格式,仍然会乱码,所以需要配置Tomcat的server.xml文件:

    【当然有时候也可能是你的项目本身编码不是utf-8的,所以你要调整统一】

  • 相关阅读:
    面向对象设计的原则里氏代换原则
    阅读源码的一些错误观念
    gdb的一个bug Internal error: 【pc 0xxxxxxx】 in read in psymtab, but not in symtab
    STL中mem_fun和mem_fun_ref的用法
    每天写出好代码的5个建议
    /dev/null /dev/zero/
    SQL Server 2008 对 TSQL 语言的增强
    JQuery 应用JQuery.groupTable.js(二)
    jquery 实现iframe 自适应高度
    JQuery 应用JQuery.groupTable.js
  • 原文地址:https://www.cnblogs.com/wooyoohoo/p/9498385.html
Copyright © 2011-2022 走看看