zoukankan      html  css  js  c++  java
  • [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

    内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

    本人互联网技术爱好者,互联网技术发烧友

    微博:伊直都在0221

    QQ:951226918

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.为了方便使用,我们自定义处理 Http 的 HttpFilter

     1 package com.jason.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 
    14 import com.sun.org.apache.xml.internal.security.Init;
    15 
    16 
    17 
    18 /**
    19  * 
    20  * @ClassName:HttpFilter
    21  * @Description:TODO
    22  * @author: jason_zhangz@163.com
    23  * @date:2016年7月13日下午10:50:00
    24  * 
    25  *
    26  */
    27 public abstract class HttpFilter implements Filter {
    28 
    29     /**
    30      * 用于保存FilterConfig 对象
    31      */
    32     private FilterConfig filterConfig;
    33     
    34     /**
    35      * 不建议直接覆盖,若直接覆盖,将导致FilterConfig 成员变量初始化失败
    36      */
    37     
    38     @Override
    39     public void init(FilterConfig filterConfig) throws ServletException {
    40             this.filterConfig = filterConfig;
    41             init();
    42     }
    43     
    44     /**
    45      * @description:提供继承的初始化方式,可以通过getFilterConfig() 获取FilterConfig 对象
    46      */
    47     protected void init() {
    48         
    49     }
    50     
    51     /**
    52      * 
    53     * @Title: getFilterConfig 
    54     * @Description: 直接返回init(FilterConfig)的 FilterConfig 对象
    55     * @param @return    
    56     * @return FilterConfig   
    57     * @throws
    58      */
    59      public FilterConfig getFilterConfig() {
    60         return filterConfig;
    61     }
    62 
    63      /**
    64       * 原生的doFilter 方法,在方法内把ServletRequest,ServletResponse    转化为 HttpServletRequest HttpServletResponse,并且调用了doFilter()方式
    65       * 若编写Filter 的过滤方法不建议直接继承该方法,而是继承
    66       *  doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    67       */
    68     
    69     @Override    
    70     public void doFilter(ServletRequest req, ServletResponse res,
    71             FilterChain chain) throws IOException, ServletException {
    72         HttpServletRequest request = (HttpServletRequest) req;
    73         HttpServletResponse response = (HttpServletResponse) res;
    74         doFilter(request, response, chain);
    75 
    76     }
    77     /**
    78      * 
    79      * @param request
    80      * @param response
    81      * @param filterChain
    82      * @description: 抽象方法,为Http 请求必须实现的方法
    83      */
    84 
    85     public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain);
    86     
    87     /**
    88      * 空的destroy 方法
    89      */
    90     
    91     @Override
    92     public void destroy() {
    93         // TODO Auto-generated method stub
    94 
    95     }
    96 
    97 }

    2.多个Filter 执行的顺序

     

    3.demo1:使浏览器不缓存页面的过滤器

      有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

        response.setDateHeader("Expires",-1);

         response.setHeader("Cache-Control","no-cache"); 

              response.setHeader("Pragma","no-cache"); 

    注意:并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头

     1 package com.jason.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.annotation.WebFilter;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletResponse;
    14 
    15 /**
    16  * Servlet Filter implementation class NoCacheFilter
    17  */
    18 @WebFilter("/cache/*")
    19 public class NoCacheFilter extends HttpFilter{
    20 
    21     @Override
    22     public void doFilter(HttpServletRequest request,
    23             HttpServletResponse response, FilterChain filterChain) {
    24         
    25         response.setDateHeader("Expires",-1);
    26         response.setHeader("Cache-Control","no-cache");
    27         response.setHeader("Pragma","no-cache");
    28         
    29         try {
    30             filterChain.doFilter(request, response);
    31         } catch (IOException e) {
    32             // TODO Auto-generated catch block
    33             e.printStackTrace();
    34         } catch (ServletException e) {
    35             // TODO Auto-generated catch block
    36             e.printStackTrace();
    37         }
    38         
    39     }
    40 
    41     
    42 }

    4.demo2:字符编码过滤器 。即,所有的链接都得通过字符编码过滤器进行字符编码

      1.在 web.xml 文件中配置初始化参数  encoding

    1  <context-param>
    2     <param-name>encoding</param-name>
    3     <param-value>UTF-8</param-value>
    4   </context-param>
    5   <filter>

     

      2.创建一个Filter 继承 HttpFilter 且 映射到所有访问路径

     1 package com.jason.filter;
     2 
     3 import java.io.IOException;
     4 import java.io.UnsupportedEncodingException;
     5 
     6 import javax.servlet.Filter;
     7 import javax.servlet.FilterChain;
     8 import javax.servlet.FilterConfig;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.ServletRequest;
    11 import javax.servlet.ServletResponse;
    12 import javax.servlet.annotation.WebFilter;
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 
    16 /**
    17  * Servlet Filter implementation class EncodingFilter
    18  */
    19 @WebFilter("/*")
    20 public class EncodingFilter extends HttpFilter {
    21 
    22     private String encoding;
    23 
    24     @Override
    25     protected void init() {
    26         encoding = getFilterConfig().getServletContext().getInitParameter("encoding");
    27     }
    28 
    29     @Override
    30     public void doFilter(HttpServletRequest request,
    31             HttpServletResponse response, FilterChain filterChain) {
    32 
    33         try {
    34             request.setCharacterEncoding(encoding);
    35             filterChain.doFilter(request, response);
    36         } catch (Exception e) {
    37             e.printStackTrace();
    38         }
    39     }
    40 
    41 }

    5.demo3:检查用户是否登录过的过滤器

        1) 情景:系统中的某些页面只有在正常登陆后才可以使用,用户请求这些页面时要检查 session 中有无该用户信息,但在所有必要的页面加上session的判断相当麻烦的事情

        2) 解决方案:编写一个用于检测用户是否登陆的过滤器,如果用户未登录,则重定向到指的登录页面

            3) 要求:需检查的在 Session 中保存的关键字; 如果用户未登录,需重定向到指定的页面(URL不包括 ContextPath); 不做检查的URL列表(以分号分开,并且 URL 中不包括 ContextPath)都要采取可配置的方式

  • 相关阅读:
    LeetCode 368Largest Divisible Subset
    macbook 源码安装 redis6.2.6
    macbook 源码安装 nginx1.20.1
    MySQL总结
    DataWork之 MaxComputer的使用
    Spring的IOC源码分析
    Spring Bean的生命周期
    SpringMVC工作原理
    Spring全家桶(二)之SpringMVC总结
    (已经成功部署)配置vue+nginx+uwsgi luffy项目
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5668661.html
Copyright © 2011-2022 走看看