• JAVA过滤器的使用(Filter)


    整理一下今天讲解的java过滤器的使用 

    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 }
  • 相关阅读:
    Windows Live Writer网址缩短插件
    花点时间了解消息,句柄和窗口
    大学生的心声
    CSS,样式选择器
    如何转换非发布网站为发布网站(how to convert nonpublishing sites to publishing sites)
    SharePoint 2010视频演示和培训
    [转]ASP.NET会话(Session)保存模式
    SharePoint查阅项(Lookup)字段多值分隔符
    [转]再看关键链进度计划
    如何通过组策略管理器修改Windows系统设置选项
  • 原文地址:https://www.cnblogs.com/qianqian528/p/8085849.html
Copyright © 2020-2023  润新知