Java Web_第7章_过滤器
servlet过滤器工作原理

servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。
其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。
当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。
2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。
3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。
4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。
5. 最后,Servlet容器将处理后的响应发送到客户端。
总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。
通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。
java 中filter过滤器使用方法

Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。
它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。
Filters 有许多的应用场合。
Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构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;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
JavaWeb过滤器详解

JavaWeb过滤器详解过滤器是什么玩意?所谓过滤器,其实就是⼀个服务端组件,⽤来截取⽤户端的请求与响应信息。
过滤器的应⽤场景:1.对⽤户请求进⾏统⼀认证,保证不会出现⽤户账户安全性问题2.编码转换,可在服务端的过滤器中设置统⼀的编码格式,避免出现乱码3.对⽤户发送的数据进⾏过滤替换4.转换图像格式5.对响应的内容进⾏压缩其中,第1,2场景经常涉及。
login.jsp<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="<%=path %>/servlet/LoginServlet" method="post" >⽤户名:<input type="text" name="username" />密码:<input type="password" name="password" /><input type="submit" value="登录" /></form></body></html>success.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body></body></html>failure.jsp<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>登录失败,请检查⽤户名或密码!</body></html>LoginFilter.javapackage com.cityhuntshou.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;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {private FilterConfig config;public void destroy() {}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) arg0;HttpServletResponse response = (HttpServletResponse) arg1;HttpSession session = request.getSession();//过滤器实际应⽤场景之⼆-----编码转换String charset = config.getInitParameter("charset");if(charset == null){charset = "UTF-8";request.setCharacterEncoding(charset);String noLoginPaths = config.getInitParameter("noLoginPaths");if(noLoginPaths != null){String[] strArray = noLoginPaths.split(";");for(int i = 0; i < strArray.length; i++){//空元素,放⾏if(strArray[i] == null || "".equals(strArray[i]))continue;if(request.getRequestURI().indexOf(strArray[i]) != -1){arg2.doFilter(arg0, arg1);return;}}}if(request.getRequestURI().indexOf("login.jsp") != -1|| request.getRequestURI().indexOf("LoginServlet") != -1){arg2.doFilter(arg0, arg1);return;}if(session.getAttribute("username") != null){arg2.doFilter(arg0, arg1);}else{response.sendRedirect("login.jsp");}}public void init(FilterConfig arg0) throws ServletException {config = arg0;}}LoginServlet.javapackage com.cityhuntshou.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {/*** Constructor of the object.*/public LoginServlet() {super();}/*** Destruction of the servlet. <br>*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}/*** The doGet method of the servlet. <br>** This method is called when a form has its tag value method equals to get. ** @param request the request send by the client to the server* @param response the response send by the server to the client* @throws ServletException if an error occurred* @throws IOException if an error occurred*/}/*** The doPost method of the servlet. <br>** This method is called when a form has its tag value method equals to post.** @param request the request send by the client to the server* @param response the response send by the server to the client* @throws ServletException if an error occurred* @throws IOException if an error occurred*/public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");//new String(username.getBytes("ISO-8859-1"),"UTF-8")System.out.println(username);if("admin".equals(username) && "admin".equals(password)){//校验通过HttpSession session = request.getSession();session.setAttribute("username", username);response.sendRedirect(request.getContextPath()+"/success.jsp");}else{//校验失败response.sendRedirect(request.getContextPath()+"/failure.jsp");}}/*** Initialization of the servlet. <br>** @throws ServletException if an error occurs*/public void init() throws ServletException {// Put your code here}}web.xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name> <servlet-name>LoginServlet</servlet-name><servlet-class>com.cityhuntshou.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/servlet/LoginServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name>LoginFilter</filter-name><filter-class>com.cityhuntshou.filter.LoginFilter</filter-class><init-param><param-name>noLoginPaths</param-name><param-value>login.jsp;failure.jsp;loginServlet</param-value></init-param><init-param><param-name>charset</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>LoginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>访问结果:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java的filter方法(一)

java的filter方法(一)Java的Filter什么是FilterFilter,即过滤器,是Java Servlet规范中的一部分。
它可以在请求被发送到Servlet之前或响应被发送回客户端之前,对请求和响应进行预处理和后处理。
Filter的作用Filter可以实现以下功能:•记录日志信息•对请求进行认证和授权•对请求和响应进行编码和解码•进行数据转换和过滤•在请求被发送到Servlet之前对其进行预处理•在响应被发送回客户端之前对其进行后处理Filter使用方法Filter的使用需要创建一个实现接口的类,并在配置文件中进行相应的配置。
具体步骤如下:1.创建一个Filter类,该类实现接口,并实现它的三个方法:init,doFilter和destroy。
2.在init方法中进行一些初始化操作,可以获取Filter的配置信息。
3.在doFilter方法中实现对请求和响应的处理逻辑。
4.在destroy方法中进行一些资源的释放操作。
5.在配置文件中添加Filter的配置信息,包括Filter的名称、要拦截的URL模式以及Filter的顺序等。
Filter的相关方法init方法init方法在Filter被初始化时调用,可以在该方法中进行一些初始化操作,如获取配置信息。
@Overridepublic void init(FilterConfig filterConfig) throws Servl etException {// 在这里进行一些初始化操作// 可以获取Filter的配置信息String param = ("param");}doFilter方法doFilter方法是Filter的核心方法,用于对请求和响应进行处理。
在该方法中,可以实现一些对请求和响应的处理逻辑。
@Overridepublic void doFilter(ServletRequest request, ServletResp onse response, FilterChain chain) throws IOException, Se rvletException {// 在这里对请求和响应进行处理// 可以进行数据转换、编码解码等操作// 执行下一个Filter或Servlet(request, response);}destroy方法destroy方法在Filter被销毁时调用,可以在该方法中进行一些资源的释放操作。
java-过滤器Filter_多个Filter的执行顺序

java-过滤器Filter_多个Filter的执⾏顺序【Filter链】*在⼀个web应⽤中,可以开发编写多个Filter,这些Filter组合起来称为⼀个Filter链。
*web服务器根据Filter在web.xml中的注册顺序,决定先调⽤哪个Filter,当第⼀个Filter的doFilter⽅法被调⽤时,web服务器会创建⼀个代表Filter链的FilterChain对象传递给该⽅法,在doFilter⽅法中,开发⼈员如果调⽤了FilterChain对象的doFilter⽅法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调⽤第⼆个filter,如果没有,则调⽤⽬标资源。
【⼯程截图】设计了两个Filter和⼀个Servlet,访问Servlet时,查看Filter的执⾏顺序。
【web.xml】<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" <display-name>FilterDemo01</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 过滤顺序:谁的写在上⾯,谁先被过滤 --><filter><filter-name>FilterTest01</filter-name><filter-class>com.Higgin.web.filter.FilterTest01</filter-class></filter><filter-mapping><filter-name>FilterTest01</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping><filter><filter-name>FilterTest02</filter-name><filter-class>com.Higgin.web.filter.FilterTest02</filter-class></filter><filter-mapping><filter-name>FilterTest02</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping></web-app>【FilterTest01.java】package com.Higgin.web.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;public class FilterTest01 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest01 执⾏前---");chain.doFilter(request, response);//让⽬标资源执⾏,即:放⾏System.out.println("FilterTest01 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【FilterTest02.java】package com.Higgin.web.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;public class FilterTest02 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest02 执⾏前---");chain.doFilter(request, response); //放⾏System.out.println("FilterTest02 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【ServletTest01.java】package com.Higgin.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class ServletTest01*/@WebServlet("/ServletTest01")public class ServletTest01 extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest01() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().write("中国加油!China Come on!");System.out.println("执⾏ServletTest01---");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response);}}【运⾏结果】在浏览器中输⼊:http://localhost:8080/FilterDemo01/ServletTest01查看控制台输出结果⾃⼰可以尝试分别注释FilterTest01和FilterTest02中的chain.doFilter⽅法,⽤Junit查看具体的执⾏过程。
web filter处理流程

Web过滤器的处理流程通常包括以下几个关键步骤:
1.初始化阶段:当Web容器启动时,过滤器会被创建并初始化。
在
这个阶段,过滤器可以读取配置参数,获取`FilterConfig`对象,并进行一些初始化操作。
2.请求预处理阶段:在请求到达Servlet之前,过滤器可以对请求进
行预处理。
这个环节常用于执行如日志记录、权限验证、字符编码设置等操作。
3.Servlet执行阶段:经过过滤器预处理后,请求会被传递给目标
Servlet进行处理。
如果存在多个过滤器,那么这些过滤器会按照它们在配置文件中的顺序依次执行。
4.响应后处理阶段:在Servlet生成响应之后,过滤器还可以对服务
器的响应进行后处理。
例如,可以对输出的内容进行压缩或者添加额外的头部信息。
5.销毁阶段:在Web容器关闭时,过滤器会被销毁。
在这个阶段,
可以进行资源的清理工作。
需要注意的是,在编写过滤器时,需要实现`javax.servlet.Filter`接口,并重写其中的`doFilter`方法。
该方法接收`ServletRequest`、`ServletResponse`和`FilterChain`三个参数,分别代表请求、响应和过滤器链。
在`doFilter`方法中,可以编写预处理和后处理的逻辑代码。
此外,还需要通过注解`@WebFilter`或者在`web.xml`文件中配置过滤器的映射信息,以指定过滤器应用于哪些URL模式。
filter过滤器原理

filter过滤器原理Filter过滤器是Java Servlet规范中的一个重要组成部分,它主要用于Web应用程序中对请求或响应进行一些处理或修改。
Filter过滤器能够拦截客户端请求和响应,并对其进行一些预处理或后处理,同时不对底层资源进行任何的改变。
在Web应用程序中,客户端的请求会按照一定的顺序被多个过滤器拦截,最后才会到达目标Servlet或JSP页面。
过滤器的拦截顺序是由web.xml文件中的顺序决定的,顺序越靠前的过滤器越先拦截请求。
Filter过滤器的工作过程可以用下面的流程来描述:1、当客户端发起请求时,服务器会根据客户端请求的URL找到相应的Servlet或JSP 页面。
2、在Servlet或JSP页面被执行之前,在过滤器链中的第一个过滤器会被调用。
这个过滤器可以实现一些真正的过滤操作,比如验证用户身份等。
3、当第一个过滤器完成处理后,请求会按照web.xml文件中定义的顺序,依次经过它后面的过滤器。
4、如果过滤器链中有多个过滤器,请求将根据它们的顺序进行处理。
当请求到达最后一个过滤器时,如果没有被任何一个过滤器拦截,则将请求传递给目标Servlet或JSP 页面。
5、在Servlet或JSP页面处理请求并生成响应后,响应会按照相反的顺序经过过滤器链中的过滤器进行处理或修改,最终响应到达客户端。
通过使用Filter过滤器,可以有效的将Web应用程序的功能模块拆分成多个独立的模块,这些模块可以按照一定的顺序调用,扩展或修改Web应用程序的行为。
具体的优点包括:1、实现模块可复用性:在一个应用程序中,多个模块可能会需要进行相同或相似的过滤操作,而使用Filter可以将这些操作独立出来,易于重复使用。
2、抽象控制流:通过使用Filter可以抽象出整个请求和响应的控制流,实现更细粒度的控制。
3、有效的处理URL:通过Filter可以有效的处理URL,实现URL的解析和路由处理。
4、可扩展性:在Web应用程序中,Filter可以很方便的进行增加、删除或修改,从而实现Web应用程序的功能扩展。
dofilter过滤器的原理

dofilter过滤器的原理dofilter过滤器是指在JavaEE中Servlet规范中的一种过滤器,它可以拦截客户端请求,修改请求和响应,或者执行一些特定的任务。
它的原理主要是基于责任链模式和回调函数机制。
首先,dofilter过滤器是通过实现javax.servlet.Filter接口来实现的,该接口定义了三个方法,init、doFilter和destroy。
init方法在过滤器被初始化时调用,可以用来进行一些初始化操作;doFilter方法是过滤器的核心,它接收客户端请求和响应对象,并可以在请求到达Servlet之前对请求进行预处理,也可以在响应返回客户端之前对响应进行后处理;destroy方法在过滤器被销毁时调用,可以用来进行一些资源的释放操作。
其次,dofilter过滤器的原理是基于责任链模式。
当一个请求到达Servlet容器时,容器会按照过滤器在web.xml文件中的配置顺序依次调用各个过滤器的doFilter方法,然后再调用Servlet的service方法。
这样就形成了一个责任链,每个过滤器都可以对请求进行处理,然后将请求传递给下一个过滤器,或者传递给Servlet。
另外,dofilter过滤器的原理还涉及到回调函数机制。
当容器调用过滤器的doFilter方法时,实际上是在调用过滤器中的回调函数,这些回调函数可以在特定的时机对请求和响应进行处理,比如在请求到达时进行身份验证、日志记录等操作,或者在响应返回时进行数据加工、页面重定向等操作。
总的来说,dofilter过滤器的原理是基于责任链模式和回调函数机制,它可以对客户端请求和响应进行拦截和处理,实现一些特定的功能,比如日志记录、身份验证、字符编码转换等。
希望这个回答能够全面地解释dofilter过滤器的原理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过滤器示例
所有的过滤器必须实现javax.servlet.Filter接口
public class HelloWorldFilter implements Filter { Servlet的代码类 private FilterConfig filterConfig; 似 ,也体现了过 public void init(FilterConfig filterConfig) { 滤器的生命周期 this.filterConfig = filterConfig; } public void doFilter( ServletRequest request, ServletResponse response, FilterChain filterChain ) throws ServletException, IOException { PrintWriter pw = response.getWriter(); …… } public void destroy() { } }
代码与实现
过滤器部署
将编译好的class文件放置在Web应用程序的classes目录 下 在部署文件web.xml中添加过滤器的注册与映射
<!—指定过滤器名和过滤器类--> <filter> <filter-name>HelloWorldFilter</filter-name> <filter-class> 发出请求: 发出请求 com.lovobook.HelloWorldFilter</filter-class> http://localhost:8080/ </filter> lovobook/ <!-- 将过滤器与URL模式关联--> 输入任意路径过滤器都会 <filter-mapping> 执行 <filter-name>HelloWorldFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
过滤器API
由容器实现的接口
javax.servlet.Filter javax.servlet.FilterChain javax.servlet.FilterConfig
在请求送到过滤器链的 下一个组件之前更改请 求的内容或者改变从前 一个组件接收的响应
四个包装器类
javax.servlet.ServletRequestWrapper javax.servlet.ServletResponseWrapper javax.servlet.http.HttpServletRequestWrapper javax.servlet.http.HttpServletResponseWrapper
这个组件可能是另一个过 滤器,如果过滤器是过滤 器链中最后一个过滤器, 那么这个组件就是目标的 资源
配置Filter
<filter>元素
与Servlet的初始化参 数相同
<filter> <filter-name>ValidatorFilter</filter-name> <filter- class> com.lovobook.filters.ValidatorFilter</filter-class> <init-param> <param-name>locale</param-name> <param-value>USA</param-value> </init-param> </filter>
总结
过滤器是驻留在Web服务器上的Web组件,它可以过滤 从客户端传递到服务器端的请求和响应 可以部署多个过滤器,这些过滤器组成一个过滤器链 过滤器API包括Filter、FilterConfig、FilterChain三个 接口 过滤器的包装器类可以更改请求和响应的内容 过滤器生命周期包括初始化、过滤、销毁三个阶段 部署描述文件中使用<filter>和<filter-mapping>元素 进行配置 过滤器链中容器会先调用匹配请求URI的过滤器,然后才 是匹配servlet名的过滤器
终在FilterA之前调用 <filter-mapping> <filter-name>FilterB</filter-name> <url-pattern>*.red</url-pattern> </filter-mapping> <servlet-mapping> <servlet-name>RedServlet</servlet-name> <url-pattern>*.red</url-pattern> </servlet-mapping>
Filter接口 Filter接口
Filter接口是过滤器APonfig) 描述 在应用程序启动时,由容器调用
void doFilter(ServletRequest, 对于每个URL映射到该过滤器的请求,由容 ServletResponse, 器调用该方法。 FilterChain) void destroy() 在应用程序关闭时,由容器调用。
Servlet 过滤器
回顾
三个作用域对象:ServletContext、ServletRequest和HttpSession ServletContext、ServletRequest HttpSession ServletContext 接口 对于同一个客户的多个请求,Session Session会跨这些请求持久存储 Session 设置在上下文和会话作用域中的对象,会非常消耗系统资源 请求作用域范围仅仅作用在与一个请求相关的两个资源之间 ServletContext监听器用于管理应用程序JVM级别保存的资源或状态 ServletContext HTTP会话监听器用于管理从同一客户端或用户发送的一系列请求的资 HTTP 源或状态。 Request请求监听器用于管理Request Request请求生命周期内的状态 Request Request
目标
过滤器的基本概念 过滤器API 开发和配置过滤器的步骤 过滤器链
过滤器概述
一个中间组件,用于拦截源数据和目的数据之间的消息 过滤二者之间传递的数据
Web应用上的过滤器 Web应用上的过滤器
驻留在Web服务器上的Web组件 过滤从客户端传递到服务器端的请求和响应
过滤请求 和响应
可以更改请求的内 容,或者重新设置 请求头,然后再将 请求传递给目标资 源
1.过滤器的生命周期方法 ,过滤器API不提供Filter接口的任何实现 自定义的过滤器必须明确地实现所有三个方法 2.容器仅调用过滤器实例的 容器仅调用过滤器实例的init()方法一次。在init()方法没有执行完前, 方法一次。 方法没有执行完前, 容器仅调用过滤器实例的 方法一次 方法没有执行完前 容器不会转发任何请求到过滤器 3.doFilter()方法给过滤器对象一个机会来处理请求,转发请求到过滤器链 方法给过滤器对象一个机会来处理请求, 方法给过滤器对象一个机会来处理请求 中的下一个组件, 中的下一个组件,或者自己回复客户端
可以对响应的内容 进行更改,然后再 将响应发送回客户 端
在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的, 他们并不需要知道过滤器的存在。
Web应用上部署多个过滤器 Web应用上部署多个过滤器
过滤器可以组成一个过滤器链。链中的每个过滤器负责特 定的操作和任务,客户端的请求和响应在这些过滤器之间 传递 过滤器的一些常见应用: :
FilterChain接口
由容器实现 将请求传递到过滤器链的下一个组件
方法 描述
void doFilter( ServletRequest, ServletResponse)
我们从一个过滤器对象的doFilter() 方法中调用此方法,以继续过滤 器链的传递过程。它会将控制转 到链中的下一个组件。
1:认证过滤:对用户请求进行统一的认证。 2:登录和审核过滤:对用户的访问请求进行记录和审核。 3:图像转换过滤:转换图像格式。 4:数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。 5:加密过滤:对请求和响应进行加密解密处理。 6:令牌过滤 7:资源访问触发事件过滤 8:XSLT过滤 9:MIME-type过滤
Enumeration getInitParameterNames() 返回在部署描述文件中指定的 所有参数的名称。 ServletContext getServletContext() 返回Web应用程序的 ServletContext。过滤器 可以使用ServletContext 设置、获取application范 围内的属性。
配置Filter
<filter-mapping>元素 <filter-mapping>元素
所有匹配到该URL定义的请 求,都要被filter-name中 定义的过滤器过滤。 servlet-name用于定义一 个servlet名,所有对该 servlet的访问都要被 filter-name中定义的过滤 器过滤
<filter-mapping> <filter-name>ValidatorFilter</filter-name> <url-pattern>*.doc</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ValidatorFilter</filter-name> <servlet-name>reportServlet</servlet-name> 过滤器对应的请求方式, </filter-mapping>