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>

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的,所以你要调整统一】

原文地址:https://www.cnblogs.com/wooyoohoo/p/9498385.html

时间: 2024-11-03 21:39:54

Servlet高级部分Filter(过滤器)的相关文章

Servlet组件之一——Filter过滤器

1 学习目标 1. 能够说出过滤器的生命周期 2. 能够写出过滤器的映射路径 3. 能够说出过滤器的四种过滤类型 4. 能够利用FilterConfig获取过滤器的配置参数 5. 能够说出什么是过滤器链 6. 能够说出过滤器链的执行顺序2 过滤器的入门 Java Web的三大组件( 1)都需要交给web服务器运行  2)在web.xml文件中配置  ) 1. Servlet:  javax.servlet.Servlet 通过HTTP协议接收客户端的请求,并且做出响应的一个Java应用程序. 2

Servlet JSP 二重修炼:Filter过滤器

原网站:http://www.cnblogs.com/Alandre/p/4090491.html 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 真正的朋友就是,当你蒙蔽了所有人的眼睛,也能看穿你真实的样子和心底的痛楚. 前言 好久没写博客了.哈哈~宝刀未老呀,操起笔来准备11.11华华丽丽的来一篇.都说温故知新,这句话绝对正确.按着人的记忆曲线,温故是巩固记忆力的好办法.就像我还是经常翻翻自己写的博客.回头来看看

【Servlet】Java Servet Filter 过滤器

Filter的设计思想Filter是一种AOP的设计思想 : 面向切面 下面这是一个使用filter的登录案例:我们通过一张图片理解理解filer面向切面下面是项目的结构: 下面是jsp文件: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W

Servlet的学习之Filter过滤器技术(1)

本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器,非常简单,只要实现Servlet  API中的Filter接口即可,同时在该web应用[WEB-INF]目录下的web.xml文件中配置<filter>和<filter-mapping>两个标签.其中可以根据配置指定过滤的页面或者Servlet. 也就是说我们在web工程中光光写Fil

关于Servlet中filter过滤器的小问题

刚进入filter的学习,一开始认为这东西也就不过如此了. 但是,我必须得承认,我错了! 刚开始学的时候,老师让我们自己做一个小程序. 就是:输入一串字符,点击发送,在另一个窗口显示.要求是把字符串中的 'a' 字符转换成 '*' 输出.例子:“string”——>"*tring". 我一想,很简单嘛.过一会就写出来了. 但是,就在运行的时候,出了问题.输入一串字符,他并没有立刻转换出来.要后退,再进入才能转换.这就是说,我这一次输入"string"它并不会立

Servlet的尾(yi)巴---filter ( 过滤器 )的小应用

该,该,该.......,继之前说到的 Filter 现在用这个来做一个小小的应用---------->  铛,铛,铛,铛.....  ->_->      <丑逼的留言板> 要求:  ----------没错,就是这样丑逼:                                  然后就是一个代码:(JSP部分)          web.xml 文件部分              Servlet  类:          Filter 类:     1 pack

Java Web总结十九Filter过滤器

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp,Servlet,静态图片文件或静态HTML文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.自动登录.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发Web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter.通过

Filter 过滤器

Filter 过滤器 原文链接:http://tianweili.github.io/blog/2015/01/26/java-filter/ 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处

Filter过滤器(1)

Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 其顺序图如下(Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filt