java web 过滤器

合集下载

servlet过滤器工作原理

servlet过滤器工作原理

servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。

其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。

当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。

2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。

3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。

4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。

5. 最后,Servlet容器将处理后的响应发送到客户端。

总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。

通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。

javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解

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使用过滤器实现登录拦截处理

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过滤器的作用和工作原理

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 用法

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的执行顺序

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过滤器原理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应用程序的功能扩展。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的高级应用。

相关文档
最新文档