zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    命令拷屏之网络工具
    PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 LeetCode 143 重排链表
    Java实现 LeetCode 143 重排链表
  • 原文地址:https://www.cnblogs.com/adversary/p/5983145.html
Copyright © 2011-2022 走看看