[原创]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: [email protected]
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)都要采取可配置的方式

时间: 2024-10-17 13:32:59

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

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

[原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记42:带标签体的自定义标签

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

[原创]java WEB学习笔记41:简单标签之带属性的自定义标签

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

[原创]java WEB学习笔记10:GenericServlet

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------