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
package cn.woo.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /**
* @Description:TODO 演示Filter的使用 * @version: V1.0
* @Date: 2018年8月18日 下午7:17:16
*/
public class TestFilter implements Filter{ private String encoding; /**
* web应用关闭时,调用该方法[该方法只会执行一次]
*/
@Override
public void destroy() {
System.out.println("销毁Filter");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("处理之前,request到达目标Servlet之前");
//设置请求和响应的编码格式
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
//执行该行会将请求传递至下一个Filter或者Servlet[这句话是必须执行的,不执行的话无法将请求传递至目标Servlet]
chain.doFilter(request, response);
System.out.println("处理之后,response到达客户端之前");
} /**
* web应用启动时,调用该方法[该方法只会执行一次]
* @param config 该对象可以获取该Filter的初始化参数,和ServletContext信息
*/
@Override
public void init(FilterConfig config) throws ServletException {
//获取初始化参数[存放的为utf-8的编码格式]
encoding = config.getInitParameter("encoding");
System.out.println("加载Filter");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>FilterDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- 配置Filter -->
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.woo.filter.TestFilter</filter-class>
<!-- 当然Filter中可以配置初始化参数,可以在Filter的init方法中通过参数config进行获取 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>testFilter</filter-name>
<!-- 配置url匹配规则,只要访问位于/servlet/映射下的Servlet都会触发该Filter -->
<!-- url-pattern和dispatcher需要同时满足才能使用该Filter -->
<url-pattern>/servlet/*</url-pattern>
<!--
REQUEST:配置仅当直接访问Servlet的时候才能触发该Filter
INCLUDE:配置当使用<jsp:include>指令访问Servlet的时候才能触发Filter
FORWARD:表示仅当Servlet(当然JSP也是Servlet)通过forward方式到达另外个Servlet的时候才会触发Filter
ERROR:表示仅当使用<%@ page errorPag = "error.jsp"%>指令指定错误处理页面的时候才会触发该Filter
-->
<dispatcher>REQUEST</dispatcher>
</filter-mapping> <!-- 配置Servlet -->
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>cn.woo.servlet.TestServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/servlet/testServlet</url-pattern>
</servlet-mapping>
</web-app>
TestServlet.java
package cn.woo.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet{ /**
*
*/
private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户名
String name = req.getParameter("name");
System.out.println(name);
resp.getWriter().println("请求成功");
}
}
结果展示:
①:项目启动

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

*:因为上面的方式是采用Get的方式进行访问的,设置utf-8编码格式,仍然会乱码,所以需要配置Tomcat的server.xml文件:
【当然有时候也可能是你的项目本身编码不是utf-8的,所以你要调整统一】

Servlet高级部分Filter(过滤器)的更多相关文章
- Servlet中的Filter 过滤器的简单使用!
package com.aaa.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servle ...
- 【Servlet】Filter过滤器的编写和配置
Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...
- Servlet的学习之Filter过滤器技术(1)
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- Servlet JSP 二重修炼:Filter过滤器
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 真正的朋友就是,当你蒙蔽了所有人的眼睛,也能看穿你真实的样子和心底的痛楚 ...
- [转]Servlet的学习之Filter过滤器技术
本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...
- servlet 高级知识之Filter
Filter叫做拦截器, 对目标资源拦截,拦截HTTP请求和HTTP响应,本质是对url进行拦截. 与serlvet不同的是, Filter的初始化是随着服务器启动而启动. 在Filter接口中定义了 ...
- 【Servlet】Java Serlvet Filter 过滤器
Filter的设计思想Filter是一种AOP(aspect-oriented programming)的设计思想 : 面向切面编程.用于的请求和响应都会走 使用filter的登录案例我们通过一张图片 ...
- EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统
EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...
- Servlet的尾(yi)巴---filter ( 过滤器 )的小应用
该,该,该.......,继之前说到的 Filter 现在用这个来做一个小小的应用----------> 铛,铛,铛,铛..... ->_-> <丑逼的留言板&g ...
随机推荐
- mvn jetty:run 出现PermGen space outofmemeryerror
使用mvn jetty:run跑别人的项目时出现了PermGen space outofmemeryerror异常 http://stackoverflow.com/questions/1451648 ...
- VSCode编写C/C++项目
VSCode编写C/C++项目 1. 下载插件C/C++.C++ Intellisense;2. 新建一个空文件夹,从VSCode打开. (或File-->Open Folder-->新建 ...
- 解决因为终端打印造成的java程序假死
问题状态: java 程序 日志采用 log4j 运行时由另一个管理进程拉起,程序在后台运行. 现象: 程序后台运行时,运行一段时间后假死 分析原因: 尝试打印输出,定位假死的具体位置,发现出现假死的 ...
- C#----接口与抽象类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 接口 { ...
- 微信小程序自学第三课:文件作用域,模块化
一.文件作用域 在 JavaScript 文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响. 通过全局函数 getApp() 可以获取全局的应用实例,如果 ...
- vue打包之后生成一个配置文件修改请求接口
问题描述: 在npm run build 生成dist后,url配置也被固定了,传到运行的前端服务器上后,假设某次,api服务器的ip修改了,改动只是更新下这个url,但是却需要回到前端源码,修改ur ...
- CodeForces 118C 【模拟】
思路: 枚举0-9之间的数,然后判断. 然后一鼓作气打成了大模拟....我日啊... 心疼自己. #include <bits/stdc++.h> using namespace std; ...
- UVA - 12563 Jin Ge Jin Qu hao (01背包)
InputThe first line contains the number of test cases T (T ≤ 100). Each test case begins with two po ...
- heapq模块
该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...
- POJ3696 The Luckiest Number 欧拉定理
昨天终于把欧拉定理的证明看明白了...于是兴冲冲地写了2道题,发现自己啥都不会qwq 题意:给定一个正整数L<=2E+9,求至少多少个8连在一起组成正整数是L的倍数. 这很有意思么... 首先, ...