java web 过滤器
servlet过滤器工作原理

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

javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解java web三⼤器:过滤器、拦截器、监听器(spring框架)spring、springMVC与springBoot的关系详见:⼀、启动顺序监听器---》过滤器---》拦截器案例理解:接到上级命令,要求对电话进去监听,过滤出恐怖分⼦,然后,拦截他们的恐怖袭击⾏动。
配置位置:监听器、过滤器⼀般配置在web.xml中,拦截器⼀般配置在springmvc.xml配置⽂件中⼆、概念监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接⼝的服务器端程序,它也是随web应⽤的启动⽽启动,只初始化⼀次,随web应⽤的停⽌⽽销毁。
主要作⽤是:做⼀些初始化的内容添加⼯作、设置⼀些基本的内容、⽐如⼀些参数或者是⼀些固定的对象等等Filter过滤器:过滤器拦截web访问url地址。
严格意义上讲,filter只是适⽤于web中,依赖于Servlet容器,利⽤Java的回调机制进⾏实现。
Filter过滤器:和框架⽆关,可以控制最初的http请求,但是更细⼀点的类和⽅法控制不了。
过滤器可以拦截到⽅法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出像响应的过滤操作,⽐如设置字符编码,鉴权操作等⽐如:(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者struts的action前统⼀设置字符集,或者去除掉⼀些⾮法字符。
主要为了减轻服务器负载,减少压⼒。
Interceptor拦截器:拦截器拦截以 .action结尾的url,拦截Action的访问。
Interfactor是基于Java的反射机制(APO思想)进⾏实现,不依赖Servlet容器。
拦截器可以在⽅法执⾏之前(preHandle)和⽅法执⾏之后(afterCompletion)进⾏操作,回调操作(postHandle),可以获取执⾏的⽅法的名称,请求(HttpServletRequest)Interceptor:可以控制请求的控制器和⽅法,但控制不了请求⽅法⾥的参数(只能获取参数的名称,不能获取到参数的值)(⽤于处理页⾯提交的请求响应并进⾏处理,例如做国际化,做主题更换,过滤等)。
java使用过滤器实现登录拦截处理

java使⽤过滤器实现登录拦截处理⽬录滤器实现登录拦截处理⼀、什么是过滤器⼆、⼯作原理及⽣命周期三、过滤器使⽤filter简易实现登录功能拦截LoginFlitercontroller结果图滤器实现登录拦截处理⼀、什么是过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹(驻留在服务器端的Web组件),在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应⼆、⼯作原理及⽣命周期举个例⼦当我们登录系统可以访问到页⾯,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作⽤。
当我们访问某个接⼝时,过滤器会拦截请求,判断当前⽤户是否是登录状态,若登录则放⾏访问,若未登录则返回指定页⾯(通常为登录页或⼀个客户友好的提⽰页)这个过程包含了过滤器的⽣命周期:1.实例化2.初始化3.执⾏过滤操作(包括访问前对request操作和返回时对response的操作处理)4.销毁三、过滤器使⽤在springboot项⽬简单使⽤过滤器进⾏登录拦截处理1.实现过滤器public class MyFilter implements Filter {private static final String CURRENT_USER = "current_user";//配置⽩名单protected static List<Pattern> patterns = new ArrayList<Pattern>();//静态代码块,在虚拟机加载类的时候就会加载执⾏,⽽且只执⾏⼀次static {patterns.add(pile("/index"));patterns.add(pile("/login"));patterns.add(pile("/register"));}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse);String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());if (isInclude(url)) {//在⽩名单中的url,放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;}if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) {//若为登录状态放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;} else {//否则默认访问index接⼝wrapper.sendRedirect("/index");}}@Overridepublic void destroy() {}//判断当前请求是否在⽩名单private boolean isInclude(String url) {for (Pattern pattern : patterns) {Matcher matcher = pattern.matcher(url);if (matcher.matches()) {return true;}}return false;}}2.注册过滤器@Configurationpublic class WebConfig {/*** 配置过滤器* @return*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(myFilter());//拦截/*的访问多级匹配(springboot 过滤器/*以及匹配 /**多级匹配)registration.addUrlPatterns("/*");registration.setName("myFilter");return registration;}/*** 创建⼀个bean* @return*/@Bean(name = "myFilter")public Filter myFilter() {return new MyFilter();}}3.运⾏项⽬访问/index,会发现没有被拦截,返回正确结果在未登录状态,访问/update接⼝,会被拦截跳转⾄/index页在登录状态,访问/update接⼝,可以访问这⾥也可以在程序debug看下。
java过滤器的作用和工作原理

java过滤器的作⽤和⼯作原理对于⼀个web应⽤程序来说,过滤器是处于web容器内的⼀个组件,它会过滤特定请求资源请求信息和响应信息。
⼀个请求来到时,web容器会判断是否有过滤器与该信息资源相关联,如果有则交给过滤器处理,然后再交给⽬标资源,响应的时候则以相反的顺序交给过滤器处理,最后再返回给⽤户浏览器。
过滤器类需要实现javax.servlet.Filter,该接⼝的doFilter()⽅法是业务处理的核⼼代码区,类似于servlet的service()⽅法。
doFilter()⽅法的参数列表有⼀个FilterChain接⼝的实现对象,它只有⼀个⽅法doFilter(),在调⽤该⽅法之前的代码会在达到⽬标资源前执⾏,之后的代码会在⽬标资源已经响应后执⾏,例如:public class MyFilter implements Filter{//过滤器的逻辑业务⽅法public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletException{//达到⽬标资源前的代码...//该⽅法的调⽤会将请求转发给下⼀个过滤器或⽬标资源chain.doFilter(req,res);//⽬标资源响应后的代码...}public void init(FilterConfig f)throws ServletException{}public void destroy(){}}web.xml配置:<filter><filter-name>MyFilter</filter-name><filter-class>MyFilter</filter-class>Filter完整类名</filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*Servlet</url-pattern></filter-mapping>凡是请求以“Servlet”结尾的URL资源时,该过滤器都会起到过滤作⽤。
urlrewritefilter 用法

URL重写过滤器(URLRewriteFilter)是一个用于在Java Web应用程序中实现URL重写的过滤器。
它允许您在请求到达Servlet之前修改或重写URL。
使用URL重写过滤器可以为您的Web应用程序提供以下功能:URL重写:通过使用正则表达式和替换规则,您可以重写URL以实现更友好的URL结构、修改查询参数、添加特定标识符等。
URL映射:您可以映射多个URL路径到相同的Servlet,或者将不同的URL路径映射到不同的Servlet。
请求参数处理:您可以提取、修改或添加请求参数,以便在将请求传递给目标Servlet之前进行处理。
请求头处理:您可以添加、修改或删除请求头信息,以实现更高级的请求处理逻辑。
会话管理和重定向:您可以使用URL重写过滤器管理会话状态,并执行HTTP重定向。
要使用URL重写过滤器,您需要完成以下步骤:添加依赖项:将URL重写过滤器添加到您的项目中。
您可以通过下载JAR文件并将其添加到项目的类路径中,或者通过Maven或Gradle等构建工具添加依赖项。
配置过滤器:在您的Web应用程序的部署描述符(web.xml)中配置URL重写过滤器。
您需要指定过滤器的名称、过滤器映射和要执行的规则。
编写规则文件:根据您的需求编写规则文件,以指定要执行的重写规则和映射规则。
规则文件可以使用简单的正则表达式和映射规则来定义URL的重写逻辑。
配置Servlet:在您的Web应用程序中配置目标Servlet,以处理经过URL重写过滤器修改的请求。
测试和调试:测试和调试您的Web应用程序以确保URL重写过滤器按预期工作。
总之,URL重写过滤器是一个强大的工具,可用于在Java Web应用程序中实现URL重写、映射、参数处理和请求头处理等功能。
通过使用URL重写过滤器,您可以改善您的Web 应用程序的用户体验、可维护性和可扩展性。
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开发中的重要性和作用,掌握过滤器的使用方法。
二、实验原理1.过滤器的概念过滤器是Java Web开发中一种重要的组件,用于在请求到达目标资源之前或者响应返回给客户端之前对请求和响应进行预处理或者后处理。
过滤器可以拦截HTTP请求和响应,对其进行处理和转换,实现一些公共的功能。
2.过滤器的工作原理当客户端发起一个请求时,请求将经过过滤器链进行处理。
过滤器链由多个过滤器组成,每个过滤器按照顺序对请求进行处理,并可以决定是否将请求传递给下一个过滤器或者目标资源。
过滤器链的最后一个过滤器负责将请求传递给目标资源进行处理,再将处理结果返回给客户端。
3.过滤器的应用过滤器广泛应用于Web开发中,可以用于以下方面:-请求过滤:可以对请求进行验证、安全检查等操作,对非法请求进行拦截和处理。
-响应过滤:可以对响应进行处理,如添加自定义的HTTP头、页面字符编码等操作。
- 资源过滤:可以对一些特定资源进行处理和过滤,如压缩HTML、CSS、JavaScript等静态文件,提高网页加载速度。
三、实验内容1.过滤器的编写根据实验要求,编写一个自定义的过滤器,实现对请求和响应的处理功能。
2.过滤器的配置在web.xml文件中配置过滤器,指定过滤器的名称、URL模式和顺序。
3.过滤器的测试启动Web服务器,通过浏览器发起请求,观察过滤器的效果。
四、实验步骤1. 创建一个Java类,实现javax.servlet.Filter接口,重写doFilter方法,编写过滤器的业务逻辑。
2. 在web.xml文件中添加过滤器配置信息,包括过滤器名称、URL模式、过滤器类名等。
3. 部署并启动Web服务器。
4. 使用浏览器访问Web应用程序中的资源,观察过滤器的效果。
五、实验结果与分析经过实验测试,自定义的过滤器成功拦截到所有请求,并在请求到达目标资源之前对请求进行了处理。
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应用程序的功能扩展。
最新精品JAVA WEB开发实战经典P电子教案过滤器

E-MAIL:mldnqa@
定义一个简单的过滤器 —— SimpleFilter.java
package org.lxh.filterdemo; 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 SimpleFilter implements Filter { public void init(FilterConfig config) throws ServletException { // 初始化过滤器 String initParam = config.getInitParameter("ref"); // 取得初始化参数 System.out.println("** 过滤器初始化,初始化参数 = " + initParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 执行过滤 System.out.println("** 执行doFilter()方法之前。"); chain.doFilter(request, response); // 将请求继续传递 System.out.println("** 执行doFilter()方法之后。"); } public void destroy() { // 销毁过滤 System.out.println("** 过滤器销毁。"); } }
onceperrequestfilter的使用

一、概述onceperrequestfilteronceperrequestfilter是Java Web开发中常用的过滤器,主要用于在每个HTTP请求到达Web应用程序时执行一些特定的操作。
它可以用于执行一些与请求相关的初始化操作,例如设置字符编码、验证用户身份、记录日志等。
通常情况下,开发人员可以继承javax.servlet.Filter接口,并实现其doFilter方法来自定义过滤器的行为。
二、onceperrequestfilter的使用场景1. 字符编码处理:在Web应用程序中,我们经常需要对请求的参数进行字符编码处理,以防止乱吗和安全漏洞。
onceperrequestfilter可以在每个请求到达时对请求参数进行统一的编码处理,确保Web应用程序的安全性。
2. 用户身份验证:在大多数Web应用程序中,都需要对用户的身份进行验证和权限控制。
onceperrequestfilter可以在每个请求到达时对用户的身份进行验证,并根据不同的权限进行相应的处理。
3. 日志记录:Web应用程序的日志记录是非常重要的,它可以帮助开发人员排查问题并监控应用程序的运行状态。
onceperrequestfilter 可以在每个请求到达时记录请求相关的日志,包括请求参数、请求位置区域、用户身份等信息。
4. 请求包装:有时候我们需要对请求进行一些包装操作,例如对请求参数进行统一处理、添加一些额外的参数等。
onceperrequestfilter可以在每个请求到达时对请求进行包装操作,以便后续的业务逻辑处理。
5. 性能监控:一些特殊的应用程序需要对每个请求的性能进行监控,以便及时发现性能问题并进行优化。
onceperrequestfilter可以在每个请求到达时记录请求的处理时间、内存占用情况等信息。
三、onceperrequestfilter的使用方法1. 创建自定义过滤器类:我们需要创建一个自定义的过滤器类,通常情况下,该类需要继承javax.servlet.Filter接口,并实现其doFilter方法。
Filter(过滤器)简介和工作原理

2022-10-27 12:40Filter(过滤器)简介Filter 的基本功能是对Servlet 容器调用Servlet 的过程进行拦截,从而在Servlet 进行响应处理的先后实现一些特殊的功能。
在Servlet API 中定义了三个接口类来开供开辟人员编写Filter 程序:Filter, FilterChain, FilterConfigFilter 程序是一个实现了Filter 接口的Java 类,与Servlet 程序相似,它由Servlet 容器进行调用和执行Filter 程序需要在web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截Jsp, Servlet, 静态图片文件和静态Filter 的基本工作原理当在web.xml 中注册了一个Filter 来对某个Servlet 程序进行拦截处理时,这个Filter 就成为了Servlet 容器与该Servlet 程序vlet 容器发送给Servlet 程序的请求和Servlet 程序回送给Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给Se在一个web 应用程序中可以注册多个Filter 程序,每一个Filter 程序都可以对一个或者一组Servlet 程序进行拦截。
若有多个Filter 程序对某个Servlet 程序的访问过程进行拦截,当针对该Servlet 的访问请求到达时,web 容器将把这多个F 链中各个Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺序一致Filter 接口init(FilterConfig filterConfig)throws ServletException:在web 应用程序启动时,web 服务器将根据web.xml 文件中的配置信存在服务器的内存中。
Web 容器创建Filter 对象实例后,将即将调用该Filter 对象的init 方法。
webfilter注解用法

webfilter注解用法WebFilter是JavaEE中的一种注解,用于过滤和处理网页请求。
它通过在Servlet中添加注解来实现对特定的URL模式或请求方式的过滤和拦截。
本文将介绍WebFilter注解的用法和相关注意事项。
一、WebFilter注解的基本语法WebFilter注解的基本语法如下所示:```@WebFilter(filterName = "FilterName", urlPatterns = {"/pattern"}, dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})public class SampleFilter implements Filter {// Filter methods implementation}```其中,注解`@WebFilter`表示这是一个过滤器,并可通过`filterName`参数指定过滤器的名称。
`urlPatterns`参数用于指定要过滤的URL模式,可以使用通配符进行模糊匹配。
`dispatcherTypes`参数用于指定过滤器的触发类型,如仅对请求类型为`REQUEST`和`FORWARD`的请求进行过滤。
二、例子:过滤敏感词汇下面通过一个例子来演示WebFilter注解的用法。
假设我们需要过滤输入内容中的敏感词汇,在发现敏感词汇时将其替换为星号。
首先,我们创建一个名为`SensitiveWordsFilter`的过滤器类,实现Filter接口,并为其添加`@WebFilter`注解:```java@WebFilter(filterName = "SensitiveWordsFilter", urlPatterns = {"/post"}, dispatcherTypes = {DispatcherType.REQUEST})public class SensitiveWordsFilter implements Filter {public void init(FilterConfig config) throws ServletException {// 初始化操作}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 过滤逻辑String content = request.getParameter("content");if (content != null) {// 进行敏感词过滤,并替换为星号String filteredContent = sensitiveWordsFilter(content);request.setAttribute("filteredContent", filteredContent);}chain.doFilter(request, response);}public void destroy() {// 销毁操作}private String sensitiveWordsFilter(String content) {// 敏感词过滤逻辑实现// ...return filteredContent;}}```上述代码中,过滤器类`SensitiveWordsFilter`通过`@WebFilter`注解指定了过滤器的名称为`SensitiveWordsFilter`,并指定了过滤的URL模式为`/post`,仅对`REQUEST`类型的请求进行过滤。
java中filter用法

在Java中,"filter" 一词通常与集合数据和Stream API相关联。
Java提供了一种称
为过滤器(Filter)的机制,它允许你通过指定条件来筛选集合中的元素。
在Java 中,过滤器通常与Lambda表达式和Stream API一起使用,以便更轻松地编写简洁、可读的代码。
以下是在Java中使用过滤器的一些常见场景和示例:
1. 使用 Stream 的filter方法:
假设有一个包含整数的列表,我们想要过滤出所有偶数:
2. 使用 Stream 的filter和map方法:
在这个例子中,我们筛选出长度大于3的字符串,并将它们转换为大写:
这里的filter方法用于筛选长度大于3的字符串,而map方法用于将它们转换为大写。
3. 使用Predicate自定义过滤条件:
有时候,我们可能想要定义一个自定义的过滤条件,这时可以使用Predicate接口:
这里的customFilter是一个自定义的Predicate,它筛选以字母 "a" 开头的字符串。
总体来说,Java中的过滤器主要使用Stream API中的filter方法,结合Lambda表达式来实现集合元素的条件筛选。
Web事件处理与过滤器

ServletContextAttributeEvent类是ServletContextEvent类 的子类,它除了继承了getServletContext()方法外,还定 义了下面两个方法: · public String getName()
– 返回发生改变的属性名。
· public Object getValue()
ServletRequest
ServletRequestListener
ServletRequestAttributeEvent
ServletRequestAttributeListene
11.1.2 监听Servlet上下文事件
在ServletContext对象上可能发生2种事件,对这些事件 可使用2个事件监听器处理。 表11.1 ServletContext事件类与监听器接口
• public void requestInitialized(ServletRequestEvent sce) • public void requestDestroyed(ServletRequestEvent sce)
ServletRequestEvent类定义了下面两个方法:
• public ServletContext getServletContext() • public ServletRequest getServletRequest()
JSP页面 访问JSP页面
12.1.4 监听会话事件
在HttpSession对象上可能发生2种事件,对这些事件可使 用4个事件监听器处理。 表11.3 HttpSession事件类与监听器接口
监听对象 事件 HttpSessionEvent HttpSession HttpSessionBindingEvent 监听器接口 HttpSessionListener HttpSessionActivationListen er HttpSessionAttributeListene r HttpSessionBindingListener
java过滤器的工作原理

java过滤器的工作原理
过滤器是Java Web应用程序中的组件,用于对请求和响应进行预处理和后处理。
它的工作原理如下:
1. 客户端发起请求到服务器,请求首先会经过过滤器。
2. 过滤器对请求进行拦截,并可以在请求到达目标资源之前进行预处理操作,如验证用户身份、检查请求参数等。
3. 过滤器可以修改请求的内容,比如添加、修改或删除请求头信息。
4. 过滤器将处理后的请求传递给下一个过滤器或目标资源。
5. 目标资源处理请求并生成响应。
6. 响应首先会经过与请求相反的过滤器链,过滤器可以在响应返回客户端之前进行后处理操作,如对响应内容进行压缩、加密等。
7. 过滤器可以修改响应的内容,比如修改响应头信息、添加新的响应内容等。
8. 经过所有的过滤器链后,响应将返回给客户端。
通过这个过程,过滤器可以对请求和响应进行拦截、加工和修改,实现对Web应用程序的统一处理和控制。
过滤器的工作
原理使得开发者可以在不修改目标资源的情况下,对请求和响应进行控制,提高代码的复用性和可维护性。
10Filter(过滤器)笔记

Web中的过滤器:本质:过滤器是一个程序,Web组件.(就是一个特殊的类,类似于Servlet).特点:1.它先于与之相关的Servlet或JSP页面运行在服务器上。
(请求某一个资源之前,要先经过过滤器)2.可附加到一个或多个Servlet或JSP页面上。
(一个过滤器可以对多个资源起作用)3.可以检查进入这些资源的请求信息。
(要获取资源的请求信息,得找HttpServletRequest,Filter中存在着HttpServletReq --------------------------------------------------------------------------完成过滤之后,过滤器可以作如下的选择(过滤的职责,功能):①以常规的方式调用资源。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户端前对其进行修改。
过滤器在WEB应用开发中的常见应用----------------------------------------------------1.可以对客户提交的数据进行重新编码2.使浏览器不缓存页面的过滤器3.可以过滤掉客户的屏蔽非法文字(作业)3.可以过滤掉客户的屏蔽非法文字(作业)4.可以验证客户是否已经登录(AOP):面向切面编程:Spring IoC/DI3.1.<filter/>3.2.<filter-mapping/>----------------------------------------Filter中生命周期方法:init:初始化方法,在服务器启动的时候执行.从功能上讲,字符编码过滤器对POST请求有效.但是:从设计上,存在硬编码.request.setCharacterEncoding("utf-8");把设置的编码放入配置文件.给过滤器配置初始化参数--->解耦合. -------------------------1.硬编码:2.如果应用已经有了编码, 就不使用自己设置的编码.3.如果应用已经有了编码,但是还是想强制使用自己设置的编码.小结etRequest对象)学习:类比学习:-------------------------------------------------ServletConfig:Servlet的配置信息对象--------------------------------------------------FilterConfig: Filter的配置信息对象方法和ServletConfig相同:1.获取初始化参数:String getInitParameter(String name):Enumeration<String> getInitParameterNames() 2.获取上下文:FilterChain是多个Filter所组成的有序列表:而多个Filter 的拦截顺序由谁来决定?在应用程序的web.xml 中映射的先后顺序决定.------------------<filte </filt------------------上述的Filter 的mappFilterDemo1过滤器分析代码:硬编码很严重:耦合性太强,侵入性很强;------------------------------------解耦合: 使用初始化参数---------------filter-mapping><filter-name>FilterDemo1</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>ERROR</dispatcher>/filter-mapping>---------------mapping配置表示:滤器,会对请求,请求转发,请求包含,到错误页面做拦截.。
Filter过滤器的使用详解

Filter过滤器的使⽤详解⼀.Filter 什么是过滤器1、Filter 过滤器它是 JavaWeb 的三⼤组件之⼀。
三⼤组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器2、Filter 过滤器它是 JavaEE 的规范。
也就是接⼝3、Filter 过滤器它的作⽤是:拦截请求,过滤响应。
拦截请求常见的应⽤场景有:权限检查、⽇记操作、事务管理……等等⼆.Filter 的初体验要求:在你的 web ⼯程下,有⼀个 admin ⽬录。
这个 admin ⽬录下的所有资源(html 页⾯、jpg 图⽚、jsp ⽂件、等等)都必须是⽤户登录之后才允许访问。
思考:根据之前我们学过内容。
我们知道,⽤户登录之后都会把⽤户登录的信息保存到 Session 域中。
所以要检查⽤户是否登录,可以判断 Session 中是否包含有⽤户登录的信息即可Object user = session.getAttribute("user");// 如果等于 null,说明还没有登录if (user == null) {request.getRequestDispatcher("/login.jsp").forward(request,response);return;}Filter 的⼯作流程图:Filter 的代码:package com.atguigu.filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.io.IOException;public class AdminFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/*** 专门⽤于拦截请求,过滤响应。
sessionmanagementfilter详解

一、sessionmanagementfilter的作用sessionmanagementfilter是一个在Java Web应用中进行会话管理的过滤器,它的作用是对用户的会话进行监控和管理,确保用户的会话状态符合预期,并且在需要时进行相应的处理。
它可以帮助开发者有效地管理用户的会话,防止会话劫持和恶意登录等安全问题,同时也能够提升用户体验,保障系统的稳定性。
二、sessionmanagementfilter的常见用法sessionmanagementfilter通常用于以下场景:1. 会话超时管理:通过sessionmanagementfilter可以设置会话的超时时限,当用户长时间未操作时,会话将被自动失效,从而避免资源的浪费和安全风险。
2. 并发登录控制:对于某些敏感操作或重要数据的访问,sessionmanagementfilter可以限制用户同时只能在一个地点登录,防止账号被恶意盗用。
3. 会话过期处理:当用户的会话过期时,sessionmanagementfilter 可以进行相应的处理,如重新登录或跳转到指定页面,提醒用户重新验证身份。
4. 异地登录提醒:当用户在其他地点登录时,sessionmanagementfilter可以发送提醒消息给用户,以确保账号安全。
三、sessionmanagementfilter的配置sessionmanagementfilter的配置一般需要在web.xml文件中进行,具体配置方式如下:```xml<filter><filter-name>SessionManagementFilter</filter-name><filter-class.example.SessionManagementFilter</filter-class> <init-param><param-name>timeout</param-name><param-value>1800</param-value></init-param></filter><filter-mapping><filter-name>SessionManagementFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>```在上面的配置中,我们首先定义了一个名为SessionManagementFilter的过滤器,并指定了其类名.example.SessionManagementFilter。
简述过滤器的基本编写过程 -回复

简述过滤器的基本编写过程-回复过滤器是Web开发中常用的一种技术,用于处理HTTP请求和响应。
它可以修改请求的参数、验证输入数据的合法性、对返回的结果进行处理等。
在本文中,我们将一步一步介绍过滤器的基本编写过程,并以中括号内的内容为主题进行讨论。
一、什么是过滤器?过滤器是Servlet规范提供的一种扩展机制,用于在HTTP请求和响应之间进行处理。
它能够截获请求和响应,并对其进行预处理或后处理。
过滤器的主要目的是在不改变原有请求和响应的情况下,对其进行增强或修改。
过滤器可以在Web应用程序的整个生命周期内起作用,并且可以应用于多个Servlet或JSP页面。
二、过滤器的分类根据其作用的对象,过滤器可以分为请求过滤器和响应过滤器。
请求过滤器用于处理HTTP请求,响应过滤器用于处理HTTP响应。
三、过滤器的基本编写步骤1. 创建一个Java类,实现javax.servlet.Filter接口。
这个接口定义了三个方法:init()、doFilter()和destroy()。
我们需要实现这些方法来处理请求和响应。
2. 实现init()方法,在这个方法中可以进行一些初始化操作。
这个方法在过滤器被加载时执行,并且只执行一次。
3. 实现doFilter()方法,在这个方法中实现过滤逻辑。
这个方法会被容器调用来处理请求和响应。
我们可以在这个方法中修改请求参数、验证输入数据、过滤敏感信息等操作。
如果需要将请求传递给下一个过滤器或Servlet,则需要调用FilterChain对象的doFilter()方法。
4. 实现destroy()方法,在这个方法中进行一些资源释放操作。
这个方法在过滤器被销毁时执行,并且只执行一次。
4. 在web.xml配置文件中配置过滤器。
在<filter>元素中配置过滤器的名称和完全限定类名。
在<filter-mapping>元素中配置过滤器的映射路径和调用顺序。
可以根据具体需求配置多个过滤器。
springboot@WebFilter注解过滤器的实现

springboot@WebFilter注解过滤器的实现@WebFilter注解过滤器@WebFilter加在过滤器的注解上使⽤import lombok.extern.slf4j.Slf4j;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.annotation.WebFilter;import java.io.IOException;@WebFilter(urlPatterns = "/*")@Slf4jpublic class WebFilterTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {("WebFilterTest --- init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ("WebFilterTest --- doFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {("WebFilterTest --- destroy");}}@WebFilter源码:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface WebFilter {String description() default "";/**Filter显⽰名*/String displayName() default "";/**配置参数*/WebInitParam[] initParams() default {};/**Filter名称*/String filterName() default "";String smallIcon() default "";String largeIcon() default "";/**指定对哪些Servlet进⾏过滤*/String[] servletNames() default {};/**指定拦截的路径*/String[] value() default {};/**指定拦截的路径*/String[] urlPatterns() default {};/**指定Filter对哪种⽅式的请求进⾏过滤*/DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};/**指定Filter是否⽀持异步模式*/boolean asyncSupported() default false;}在springBoot的启动类中加⼊注解:import org.springframework.boot.web.servlet.ServletComponentScan;@ServletComponentScan多个@WebFilter注解的过滤器可以配合@Order()注解实现执⾏过滤的顺序import org.springframework.core.annotation.Order;@WebFilter(urlPatterns = "/*")@Slf4j@Order(1)public class WebFilterTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {("WebFilterTest --- init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ("WebFilterTest --- doFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {("WebFilterTest --- destroy");}}@WebFilter(urlPatterns = "/*")@Slf4j@Order(2)public class WebFilterTest2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {("2---WebFilterTest2 --- init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ("2 --- WebFilterTest2 --- doFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {("WebFilterTest2 --- destroy");}}执⾏结果WebFilterTest --- doFilter2 --- WebFilterTest2 --- doFilter不使⽤注解的⽅式使⽤过滤器创建过滤器类public class WebFilterTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {("WebFilterTest --- init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ("WebFilterTest --- doFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {("WebFilterTest --- destroy");}}注册过滤器@Configurationpublic class FilterConfig {@Beanpublic WebFilterTest webFilterTest(){return new WebFilterTest();}@Beanpublic FilterRegistrationBean filterRegist(){FilterRegistrationBean frBean = new FilterRegistrationBean();frBean.setFilter(webFilterTest());frBean.setOrder(1);frBean.addUrlPatterns("/*");return frBean;}}多个过滤器注册再添加⼀个过滤器:@Slf4jpublic class WebFilterTest2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {("2---WebFilterTest2 --- init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ("2 --- WebFilterTest2 --- doFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {("WebFilterTest2 --- destroy");}}修改配置类:@Configurationpublic class FilterConfig {@Beanpublic WebFilterTest webFilterTest(){return new WebFilterTest();}@Beanpublic WebFilterTest2 webFilterTest2(){return new WebFilterTest2();}@Beanpublic FilterRegistrationBean filterRegist(){FilterRegistrationBean frBean = new FilterRegistrationBean();frBean.setFilter(webFilterTest());frBean.setOrder(1);frBean.addUrlPatterns("/*");return frBean;}@Beanpublic FilterRegistrationBean filterRegist2(){FilterRegistrationBean frBean = new FilterRegistrationBean();frBean.setFilter(webFilterTest2());frBean.setOrder(2);frBean.addUrlPatterns("/*");return frBean;}}到此这篇关于springboot @WebFilter注解过滤器的实现的⽂章就介绍到这了,更多相关springboot @WebFilter注解过滤器内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
传智播客java web 过滤器今日学习Servlet的过滤器部分,百闻不如一见。
以后我在课后做练习时,发现多个Servlet 之间转发容易产生问题。
详细出处参考:/article/21017.htm根本不利于使用,Servlet应该本是为简化工作而创造的啊!我当时觉得是我的设计框架产生了问题。
第二天我便问方老师,确实是使用上有些问题。
比如,显示访问计数,我把它单独写成了一个Servlet,什么地方需要它时,便由那个Servlet.include引用计数的Servlet。
但这样总会产生一些问题和使用上的不便。
比如include的Servlet必须使用相同的流,如果使用forward后任何输出都无效了。
方老师当时建议,把有些功能写到一起。
但最后提到了过滤器,那时我便对过滤器产生了兴趣,今日也终于一睹芳容!让人十分喜欢!ServletFilter,Servlet过滤器:Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter 技术可以对web服务器管理的所有web资源:Jsp, Servlet, 静态图片文件或静态html 文件等进行拦截,从而实现一些特殊的功能。
例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
ServletAPI提供了一个Filter接口,实现这个接口的Servlet就是一个过虑器。
过虑器在WEB 应用访问流程中如下:由图可见,只要我们编写了过滤器,可以对一切访问WEB应用的连接进行过滤。
比如,用户访问权限、统一WEB编码…Filter是如何实现拦截的?实现了Filter接口的Servlet是过滤器,因为Filter接口有一个doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,只要用户访问我们在web.xml中配置的映射目录,服务器便会调用过滤器的doFilter方法。
我们在这里实现过虑功能代码,当我们调用chain.doFilter(request, response);方法时,将请求反给服务器服务器再去调用相当的Servlet。
如果我们不调用此方法,说明拒绝了用户的请求。
Filter开发入门:在WEB应用中添加一个过滤器,有两步工作需要完成:1.编写实现了Filter接口的Servlet——过滤器。
2.在web.xml中配置过滤器:(1). <filter>标签添加器(2). <filter-mapping>注册过滤器的映射目录(过滤目录),与注册Servlet一样。
在实际WEB应用中,我们可能需要编写多个过虑器,比如:1.统一WEB编码的过滤器(过虑所有访问)2.用户访问权限管理。
这样,用户的访问需要选经过过滤器1过滤然后再经过过滤器2过滤。
doFilter中有一个FilterChain参数,这个参数是服务器根据web.xml中配置的过滤器,按照先后顺序生成的过滤器链。
当我们在doFilter方法中调用chain.doFilter(request, response);方法时,服务器会查找过滤链中是否还有过滤器,如果有继续调用下一个过滤器,如果没有将调用相应的Servlet处理用户请求。
Filter接口的其他细节:1.Filter的Init(FilterConfig filterConfig)方法:与Servlet的Init方法一样,在创建时被调用,之后被保存在内存中直至服务器重启或关闭时Filter实例才会被销毁。
与Servlet不同之处在于,服务器启动时就会实例化所有Filter,而Servlet中有当用户第一次访问它时才会被实例化。
我们通过在web.xml使用<init-param>对Filter配置的初始化参数,可以通过FilterConfig来获得。
FilterConfig的方法有:String getFilterName():得到filter的名称。
String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。
如果不存在返回null.Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
2.Filter的destroy()方法:当服务器重启或关闭时,在销毁Filter之前调用此方法。
编写配置Filter练习程序:1. 编写一个用于统一WEB字符编码的Filter:复制代码代码如下:package .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;public class Encoding implements Filter {public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {//参数转换,因为我们已经它肯定是Http协议的请求。
HttpServletRequest request = (HttpServletRequest)arg0;HttpServletResponse response = (HttpServletResponse)arg1;//设置request和response使用的编码均为UTF-8。
request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//设置完成后,交回给服务器。
arg2.doFilter(arg0, arg1);}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}2. 配置web.xml文件,添加下面部分:复制代码代码如下:<filter><filter-name>encoding</filter-name><filter-class>.filter.Encoding</filter-class></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping>3. 上面是Filter的简单使用方式,后面会讲到高级应用。
Filter高级开发://参数转换,因为我们已经它肯定是Http协议的请求。
HttpServletRequest request = (HttpServletRequest)arg0;HttpServletResponse response = (HttpServletResponse)arg1;上面的两片段代码,是因为我们已经知道了request和response是服务器给我们封装好了的两个Http请求对象。
我们对它进行了功能上的扩充。
如果我们不知道request和response是谁创建的具体内容是什么,我们应该如何对它们的功能进行扩充?我们有两种方式可以扩充:1. 编写一个子类,覆盖需要覆盖的方法。
2. 使用Decorator设计模式,来扩充我们想要的功能。
Decorator设计模式:我们有时无法使用方法1,因为我们不知道一个对象的具休类,比如它是一个接口对象,实现类是谁?。
所以我们最好使用方法2,之前我们有接触过工厂设计模式和单例设计模式,Java 真是高级应用的完美体现。
什么是Decorator设计模式?中文名称是“装饰”模式,下面我们使用此模式为request做一下功能上的扩充:1.我们实现继承request接口类型ServletRequest。
哦天哪,ServletRequest有太多的方法,难道我们要实现每一个方法?Servlet设计者们想到了这一点,并给我们提供了一个包装类——HttpServletRequestWrapper。
我们就使用它做为父类吧!2.在我们自定义类内部添加一个HttpServletRequest类型成员,因为我们就要装饰它。
3.编写我样想覆盖的方法,也就是我们想提供特殊功能的方法。
举例,上边我们编写的统一WEB编码的filter是存在问题的,如果我们提交一个表单,表单的提交方式为GET,那么我们设置request的编码是不起作用的。
所以在这里我们就使用Decorator设计模式来完善统一编码的功能:编写自定义类MyServletRequest.java类:复制代码代码如下:class MyServletRequest extends HttpServletRequestWrapper {// 我们要装饰的对象HttpServletRequest myrequest;public MyServletRequest(HttpServletRequest request) {super(request);this.myrequest = request;}// 我们要增强的功能方法@Overridepublic String getParameter(String name) {// 使用被装饰的成员,获取数据String value = this.myrequest.getParameter(name);if (value == null)return null;// 将数据转码后返回try {value = new String(value.getBytes("ISO8859-1"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return value;}}我们修改Encoding.java过滤器的代码如下:复制代码代码如下:public class Encoding implements Filter {public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {arg2.doFilter(new MyServletRequest((HttpServletRequest)request), arg1);}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}呵呵,看到Decorator设计模式的强大了吧!这一部分属于Filter的高级应用,明天还有一天的课程会讲解Filter的高级应用。