JAVA过滤器的使用(Filter)

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

这是在Servlet里面设置字符编码的代码,但是通常情况下Servlet不止一个,所以我们需要在每一个Servlet中都写上上面的代码,这样的话,不仅麻烦,而且容易搞混淆。

所以我们对于这类多个Servlet中会执行相同的代码的时候,我们通常可以使用过滤器来帮我们完成操作:



过滤器:

如果想要使用过滤器,首先需要实现Filter类,并重写三个需要的方法:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "TestFilter2",urlPatterns = "/*")
public class TestFilter2 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

init方法:    容器在创建当前过滤器的时候自动调用;

destroy方法:  容器在销毁当前过滤器的时候自动调用

doFilter方法:  过滤器的主要代码写在这个地方

1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*")

这一行代码的意思是添加一个注解,通过这行代码就不需要再去web.xml中注册了

其中 filterName 代表的是这个过滤器的名字,后面那个urlPatterns 代表的是过滤的路径 /* 代表所有路径,意味着访问所有的路径的时候都会先访问这个过滤器

chain.doFilter(req, resp);

这一行代码代表的是如果还有其他的过滤器就调用其它的过滤器,但是需要注意,这一行代码必须写在doFilter方法的最后面

 1 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
 2         //这样在每个Servlet执行的时候都会先进行这个
 3         HttpServletRequest request = (HttpServletRequest) req;
 4         HttpServletResponse response = (HttpServletResponse) resp;
 5
 6         request.setCharacterEncoding("utf-8");
 7         response.setContentType("text/html;charset=utf-8");
 8
 9         //因为有可能不止这一个过滤器,所以需要将所有的过滤器执行
10         //注意 这一行代码一定要写到最后
11         chain.doFilter(req, resp);
12     }

其中3-7行代码就是设置编码

由于doFilter传递进来的默认是ServletRequest对象 而设置字符集的是在HttpServetRequest 所以我们需要强制转换一下

转换过后我们就可以进行设置了。

下面附上我另外一个测试过滤器的代码:

 1 import javax.servlet.*;
 2 import javax.servlet.annotation.WebFilter;
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletRequestWrapper;
 5 import javax.servlet.http.HttpServletResponse;
 6 import java.io.IOException;
 7 import java.io.UnsupportedEncodingException;
 8
 9 /**
10  * urlPatterns代表的是需要将那些路径进行过滤器过滤  这里为* 代表所有的路径都需要进入这个过滤器
11  */
12 @WebFilter(filterName = "TestFilter",urlPatterns = "/*")
13 public class TestFilter implements Filter {
14     public void destroy() {
15     }
16
17     /**
18      * 在这里面写的任何代码  在执行Servlet JSP 等前 都会被执行
19      */
20     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
21         //这样在每个Servlet执行的时候都会先进行这个
22         HttpServletRequest request = (HttpServletRequest) req;
23         HttpServletResponse response = (HttpServletResponse) resp;
24
25         request.setCharacterEncoding("utf-8");
26         response.setContentType("text/html;charset=utf-8");
27
28         //因为有可能不止这一个过滤器,所以需要将所有的过滤器执行
29         //注意 这一行代码一定要写到最后
30         chain.doFilter(req, resp);
31     }
32
33     public void init(FilterConfig config) throws ServletException {
34
35     }
36
37     //通过重写getParameter方法,实现get方法自动转码
38     class MyWrapper extends HttpServletRequestWrapper{
39         private HttpServletRequest request;
40         public MyWrapper(HttpServletRequest request) {
41             super(request);
42             this.request = request;
43         }
44
45         @Override
46         public String getParameter(String name) {
47             String value = this.request.getParameter(name);
48             if(value == null){
49                 return null;
50             }
51
52             //如果是get方法提交过来的
53             if(this.request.getMethod().equalsIgnoreCase("get")){
54                 try {
55                     // 进行转码
56                     value = new String(value.getBytes("ISO-8859-1"),"utf-8");
57                 } catch (UnsupportedEncodingException e) {
58                     e.printStackTrace();
59                 }
60             }
61
62             //屏蔽尖括号 换成 > <
63             value = value.replace(">",">");
64             value = value.replace("<","&lt;");
65
66             return value;
67         }
68     }
69 }
时间: 2024-07-29 19:31:59

JAVA过滤器的使用(Filter)的相关文章

java过滤器Filter笔记

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

java过滤器——filter的使用和配置

在做DRP的过程中用到了filter.前几天昌哥和欢姐在小会议室向我们介绍了AOP的思想,用到filter时觉得它们两者特别相似. 如下图: 在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着"切了一刀".通过配置,它可以对任意代码路径进行过滤. 这里就以转码/设置字符集为例,简单了解一下如何使用filter. 建立Filter CharsetEncodingFilter.java package com.drp.filter; import

java过滤器和监听器详解

 过滤器 1.Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理.请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应.当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回.同样在这个过程中,用户可以修改响应信息,从而完成一定的任务.

Java IO: ByteArray和Filter

作者: Jakob Jenkov 译者: 李璟([email protected]) 本小节会简要概括Java IO中字节数组与过滤器的输入输出流,主要涉及以下4个类型的流:ByteArrayInputStream,ByteArrayOutputStream,FilterInputStream,FilterOutputStream.请注意,为了清晰,这里忽略了必要的异常处理.想了解更多异常处理的信息,请参考Java IO异常处理. ByteArrayInputStream 原文链接 ByteAr

【转载】Servlet Filter(过滤器)、Filter是如何实现拦截的、Filter开发入门

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

Java 过滤器、监听器、拦截器的区别

原文:http://www.360doc.com/content/10/0601/09/495229_30616324.shtml 1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request.Response)统一设置编码,简化操作:同时还可进行逻辑判断,如用户是否

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年8月10日 http://www.cnblogs.com/

java过滤器

过滤器就是在源数据和目的数据之间起过滤作用的中间件. Web应用中,在处理请求时,经常有一些公共的工作,比如设置字符集.这样的工作需要写在每个页面,这样的写法费力且不好修改.使用过滤器就像在这些流程前加了一道拦,将需要进行的操作放到拦里执行,而所有经过这道拦的流程都会“被”执行该操作. 开发一个过滤器必须实现Java定义好的javax.servlet.Filter接口: 这一接口含有三个过滤器必须执行的方法: doFilter(ServletRequest, ServletResponse, F

java 过滤器实现

声明:该文来自红黑联盟网站,先贴上源地址. 1.浏览器不使用缓存设置过滤器 import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 用于的使 Browser 不缓存页面的过滤器 */ public class ForceNoCacheFilter implements Filter { public void doFilter(ServletR