19-过滤器

一、过滤器入门

1. 概念:

    Filter 过滤器,又称拦截器

    实现 Filter 接口的类我们称之为 Filter (过滤器或拦截器)

    Filter能对用户访问的资源进行拦截

   

    在Filter里面可以只用 request获得请求消息  用response写入响应消息

    chain.doFilter(request, response) 方法放行  目标Servlet使用的是同一个请求和响应

    doFilter 方法后面的代码会执行,在目标Servlet 返回响应后执行, 也可以使用同一个请求和响应

 

2. 实现:

    1) 写一个类实现 Filter 接口 , 在doFilter 方法中写功能代码

    public class Filter1 implements Filter {

           public void doFilter(ServletRequest request, ServletResponse response,

           FilterChain chain) throws IOException, ServletException {

           System.out.println("before");

           chain.doFilter(request, response);

           System.out.println("after");

    }

    2) 在web.xml中配置Filter拦截的资源路径

    <filter>

       <filter-name>filter1</filter-name>

       <filter-class>cn.itcast.filter.Filter1</filter-class>

    </filter>

    <filter-mapping>

       <filter-name>filter1</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

 

3. Filter 链

    可以针对某一个url配置多个Filter, 这些Filter就会组成一个Filter链, 用FilterChain对象表示

    FilterChain对象的doFilter方法作用就是让Filter链上的当前拦截器放行,请求进入下一个Filter

 

    response 的中文编码问题, 只能在response.getWriter() 第一次被调用之前指定编码才有效

    一旦指定了编码,当前Filter链和目标Servlet使用的response都是同一个编码,因为用的本来就是一个

    response

 

4. Filter 与 Servlet

    Filter 就像一个特殊的Servlet

    Filter 在web容器启动是就初始化

    Filter 可以实现拦截功能,因为有个 FilterChain 对象,有个 doFilter方法可以实现对访问资源的放行

二、 Filter细节

1. Filter 的生命周期

    实现Filter的init和destroy方法就可以观察Filter的声明周期

    web容器启动时,会读web.xml文件,将所有的Filter都初始化

    Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁

 

Filter链中所有的Filter的拦截顺序   按照 在 web.xml 文件中的配置的先后顺序来进行拦截

 

2. 获得 Filter
的初始化参数

    在 web.xml 文件中为Filter 配置初始化参数

    <init-param>

       <param-name>name</param-name>

       <param-value>xxxx</param-value>

    </init-param>

    在 init 方法中读取配置文件

    public void init(FilterConfig filterConfig) throws ServletException {

       String name = filterConfig.getInitParameter("name");

      

    }

 

3. 拦截 html
页面

1) 文件缓存

 由于html页面的url是没有在 web.xml 文件中配置的 服务器会调用DefaultServlet

在DefaultServlet 中会检查文件的修改时间, 如果没有修改则发送 304头

这样就会导致过滤器也被缓存

可以通过发送 200 状态码,但是 html 页面的数据仍然得不到读取

 

2) html 页面乱码

在 Filter 和 Html 中指定编码为 utf-8 , 这样会导致 html 页面中文乱码

原因是 html 页面数据会通过 DefaultServlet 发送

查看 web.xml 文件 发现DefaultServlet默认使用 gbk编码

修改配置 加初始化参数

<init-param>

      <param-name>fileEncoding</param-name>

      <param-value>utf-8</param-value>

 </init-param>

 

4. Filter拦截方式

Filter的dispatcher元素有4种取值, 分别代表四种拦截方式

REQUEST 拦截直接的请求方式

INCLUDE 拦截页面包含的访问方式

FORWARD 拦截请求转发访问方式

ERROR 拦截出错页面的访问方式

 

5. filter-mapping元素配置

拦截的url地址可以使用 /*  *.扩展名

<filter-mapping> 元素中可以配置多个地址 用于拦截多个url或servlet

对于多个条件都符合的url, filter会进行多次拦截

 

三、 过滤器案例

1. 缓存

禁止浏览器缓存所有动态页面

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

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

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

 

强制浏览器缓存所有的静态页面 html jpg css

String uri = request.getRequestURI();

String time = null;

if(uri.endsWith(".html"))

    time = config.getInitParameter("html");

else if(uri.endsWith(".jpg"))

    time = config.getInitParameter("jpg");

long l = Long.parseLong(time);

response.setDateHeader("Expires",System.currentTimeMillis() + l);

 

2. 实现用户自动登陆

1)在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码

2)编写过滤器检查用户是否带名为user的cookie来,如果有,检查用户名和密码做自动登陆

 

核心思路:

用户登陆后找LoginServlet , LoginServlet中做登陆,如果登陆成功, 获得用户选择的自动登陆时间

创建一个新的cookie 将用户名和密码用 “_”连接作为value,autoLogin作为name

设置cookie 的有效路径 request.getContextPath() 作用于整个web应用

设置cookie的有效时间为 autologintime

发送 cookie

 

写一个过滤器,对全站的资源进行拦截, 检查用户发送的cookie有没有一个名为autologin的

如果有 取出用户名和密码 再次做登陆处理 如果登陆成功, 将 user 存入session ,放行

 

出于安全性考虑, cookie 中的密码应该进行 md5 加密

 

3. 统一全站字符编码

response和request的post的方式好办

// 解决全站的乱码问题 
request response

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

request.setCharacterEncoding("utf-8"); 
// 只对 post
方式起作用,对get方式不起作用

 

对于request的get方式需要手工转换,此时就需要用到 包装设计模式decorator

包装 getParameter方法

 

4. 为全站添加页眉和页脚

添加用户模块

 

5. 发送压缩后的响应数据

    给 IE 浏览器会送的数据 需要进行gzip 压缩  访问速度快 省点浏览

    在最后将数据打给浏览器的时候, 将 response 中的数据全部压缩

    在过滤器放行的时候传入一个 假的 response 提供缓冲区, 这样后面的资源都会写入我的缓冲区

    缓冲区满了 或者 请求快结束的时候 将缓冲区的数据压缩后写入 真的 response  

   

    j2se 提供了一个流GZIPOutputStream 用于 gzip压缩

    j2se 提供了一个流 ZIPOutputStream 用于 zip 压缩

 

6. 跟踪用户上次访问时间

 

7. 统计站内各个页面的访问次数

 

8. 实现某些资源只能被某些ip访问

 

9. 实现防盗链功能

    针对所有的下载页面

 

10. 实现html标签转义、过滤敏感词汇

 

时间: 2024-11-13 22:01:07

19-过滤器的相关文章

struts2的文件上传和文件下载

实现使用Struts2文件上传和文件下载: 注意点: (1)对应表单的file1和私有成员变量的名称必须一致  <input type="file" name="file1"/>        private File file1;   (2)限制上传文件大小和类型的格式是定死的,最好记住,记不住知道去哪里查:虽然不做要求,完全懂框架内部的机制,但是找一些东西还是需要能找到的,这样你可以很好的实现一些功能,因为这些关键字都是框架底层定义好的,图一是找到配

彻底解决Tomcat 5.0.19中文乱码(过滤器)

一.Include的页面乱码 现象:include进来的页面出现乱码,其它页面正常. 原因:Tomcat在缺省情况下使用ISO-8859-1编码,但是在include时有时Tomcat不能正确根据外层.jsp文件的编码解析include进来的文件,造成include进来的文件中的中文乱码. 解决:这儿可以有很多解决办法,但是对于我们的中文环境,从根本上的解决办法是将Tomcat 5.0.19的核心缺省编码从ISO-8859-1修改为GBK .可以在下面地址下载修改过的jar文件, jasper-

使用AngularJS创建自定义的过滤器的方法

  这篇文章主要介绍了使用AngularJS创建自定义的过滤器的方法,AngularJS是非常热门的JavaScript库,需要的朋友可以参考下 Angularjs过滤器是 angularjs非常棒的特性之一.有朝一日,你可能需要使用自定义过滤器,幸运的是,你找到了这篇博文. 下面显示的是自定义过滤器长什么样子(请注意myfilter): 我们的自定义过滤器叫做 "myfilter", 它有由 ':'隔开的4个参数. 这是一个将会用到的样本输入: ? 1 2 3 4 5 6 $scop

AngularJS中的过滤器使用详解

  这篇文章主要介绍了AngularJS中的过滤器使用详解,过滤器是AngularJS中处理文本的一个非常有用的功能,需要的朋友可以参考下 过滤器是用来更改修改数据,并且可以在表达式或使用管道符指令将其归入.以下是常用的过滤器的列表. 小写过滤器 添加小写的过滤器,使用管道符的表达式.在这里添加小写过滤器,以小写字母打印学生姓名. ? 1 2 3 Enter first name:<input type="text" ng-model="student.firstNam

js+HTML5基于过滤器从摄像头中捕获视频的方法

  本文实例讲述了js+HTML5基于过滤器从摄像头中捕获视频的方法.分享给大家供大家参考.具体如下: index.html页面: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <div class="warning"> <h2>Native web camera streaming (getUserMedia) is not supported in this browser.</h2> </div>

玩C一定用得到的19款Java开源Web爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 今天将为大家介绍19款Java开源Web爬虫,需要的小伙伴们赶快收藏吧. 一.Heritrix Heritrix 是一个由 java 开发的.开源的网络爬虫,用户可以使用它来从网上抓取想要的资源.其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑. Heritrix 是个"Archi

玩大数据一定用得到的19款 Java 开源 Web 爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 今天将为大家介绍19款Java开源Web爬虫,需要的小伙伴们赶快收藏吧. 一.Heritrix Heritrix 是一个由 java 开发的.开源的网络爬虫,用户可以使用它来从网上抓取想要的资源.其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑. Heritrix 是个"Archi

DJANGO之自定义模板过滤器

我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.iteye.com/blog/1884630 http://www.xxx.com/html/2013/pythonweb_1017/588.html templatetags目录下的deploy_filter.py文件如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

基于cookie使用过滤器实现客户每次访问自登陆一次

相信大家在各大网站都会遇到,登录时,在登录框出现下次免登陆/一个月免登陆的类似选项,本次博文就是讲解如何实现,在这记录一下,也算是做个备忘录合集,如果文中有错,欢迎大家指出 为啥说自登陆一次呢,因为当访问某个页面时,如果第一次自动登录失败时,你下次刷新访问时还再次走自动登录流程,就会出现死循环. 本篇博文代码示例框架为Spring MVC,下面就讲解实现该功能的需要掌握哪些知识:cookies与过滤器 1.cookies 何为Cookies:Cookies为 Web 应用程序保存用户相关信息提供

Servlet JSP 二重修炼:Filter过滤器

前言 好久没写博客了.哈哈~宝刀未老呀,操起笔来准备11.11华华丽丽的来一篇.都说温故知新,这句话绝对正确.按着人的记忆曲线,温故是巩固记忆力的好办法.就像我还是经常翻翻自己写的博客.回头来看看到的是新的东西.那就足够了. 从右到左:人生境界也 过滤器 其实拦截器我在 posted @ 2014-03-20 12:45 写过一篇:<⑧javaWeb之在例子中学习(过滤器Filter)>.会过头来看,发现里面讲的不太细粒.但是其中两个应用小例子是挺不错了.如果喜欢看例子的可以去看看. 什么是过