原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼。言归正传,过滤器从字面理解她的话有拦网、过滤的功能,可以算是JavaWeb的拦精灵。

一、由来

客户端发起请求,那服务器不能什么请求都做出响应,做拦截处理,不仅能减轻服务器的压力,还能保护数据的安全,同样服务端做出响应给客户端时有时也需要进行过滤,比如我们常见的图片添加水印。为了处理这些问题,于是过滤器出现了。有时不仅仅对请求与响应进行一层的过滤,可能会过滤多层,所以提出了滤镜链(FilterChain)的概念.

二、使用

在使用它之前先熟悉下它的作用的地方。过滤器作用在请求Request到达Servlet之前以及响应Response到达浏览器之前会依次经过过虑链。有些类似asp.net中的httpmodule.使用Filter主要是实现javax.servlet.filter接口。查看API可看到有3个方法。

1.public void init(FilterConfig filterConfig) throws ServletException

由 Web 容器调用,指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。在要求过滤器做任何过滤工作之前,init 方法必须成功完成。如果 init 方法抛出 ServletException或没有在 Web 容器定义的时间段内返回,则 Web 容器无法将过滤器放入服务中。这个和Servlet的生命周期有点类似,也是只初始化一次,destroy()也是执行一次。

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException

每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许 Filter 将请求和响应传递到链中的下一个实体。
此方法的典型实现遵循以下模式:
1. 检查请求
2. 有选择地将带有自定义实现的请求对象包装到用于输入过滤的过滤器内容或头中
3. 有选择地将带有自定义实现的响应对象包装到用于输出过滤的过滤器内容或头中
4. a) 既可以使用 FilterChain 对象 (chain.doFilter()) 调用链中的下一个实体,
4. b) 也可以不将请求/响应对传递给过滤器链中的下一个实体,从而阻塞请求处理
5. 在调用过滤器链中的下一个实体之后直接设置响应上的头。

3.public void destroy()

由 Web 容器调用,指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次,或者在过了超时期之后调用。在调用此方法之后,Web 容器不会再对此过滤器实例调用 doFilter 方法。此方法为过滤器提供了一个清除持有的所有资源(比如内存、文件句柄和线程)的机会,并确保任何持久状态都与内存中该过滤器的当前状态保持同步。

三、案例

使用过滤器的地方有很多,这里就不一一举例,下面的demo在上篇博客中HelloWorld项目的基础上实现防盗链的功能,以此体会Filter的使用。

1.准备

在HelloWolrd项目中新增一个文件夹,在文件夹中放入两个图片一个err.png 一个test.png,两个图如下

2.创建Filter

这里也没新建Filter包,直接在上一博客中的com.test.cyw包中创建Filter文件MyFilter,应该是创建一个包专门管理Filter类的额,这里只是做测试。创建完成之后可以看到MyFilter继承Filter。

public class MyFilter implements Filter 

View Code

3.在doFilter中实现防盗链

package com.test.cyw;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.*;/*@WebFilter("/MyFilter")*/
public class MyFilter implements Filter {public MyFilter() {}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse res=(HttpServletResponse)response;String referer=req.getHeader("referer");//链接来源地址if(referer==null||!referer.contains(req.getServerName())){req.getRequestDispatcher("/Images/err.png").forward(req, res);return;}chain.doFilter(req, res);}public void init(FilterConfig fConfig) throws ServletException {}
}

View Code

4.Filter配置

上面只是创建了一个类实现了Filter接口,如何让Tomcat知道呢,这和Servlet类似,需要在Web.xml中配置。和配置servlet有点相同。

  <filter><filter-name>MyFilter</filter-name><filter-class>com.test.cyw.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/Images/*</url-pattern></filter-mapping>

View Code

5.测试

新建一个test.jsp文件,在jsp中显示img,可以正常显示

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<img alt="防盗链" src="Images/test.png" width="400">
</body>
</html>

View Code

如果直接在浏览器输入test.png的地址,则会显示err.png

四、遇到的问题

开始的时候由于地址错误,导致谷歌浏览器test.jsp中显示的也是err.png的图片,但当我换过来时刷新页面还是没变,这个让我很纳闷。有时候将Tomca重启也不行,试了好几次都是这样,实在不行了用IE试了下没想到显示是正确的,原来谷歌浏览器有缓存,导致显示的不正确。

五、总结

Filter用处很多,网上也有好多的例子,做项目时可以先实现一些常用的例如水印,等用的时候只需配置下xml就能解决,很是方便。

转载于:https://www.cnblogs.com/5ishare/p/6557079.html

JavaWeb之Filter过滤器相关推荐

  1. (JavaWeb)Filter过滤器

    Filter过滤器 Filter:过滤器,用来过滤网站的数据. 自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或serv ...

  2. javaweb项目Filter过滤器详解

    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

  3. java脏字过滤_分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤...

    案例1. 利用Servlet的过滤器Filter进行完成脏话过滤 package cn.javabs.filter; import java.io.IOException; import javax. ...

  4. java脏话模糊对比_分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤...

    案例1. 利用Servlet的过滤器Filter进行完成脏话过滤 package cn.javabs.filter; import java.io.IOException; import javax. ...

  5. javaweb(11) Listener监听器与Filter过滤器

    javaweb(11) Listener监听器与Filter过滤器 Listener监听器 什么是Listener监听器 Listener 监听器它是 JavaWeb 的三大组件之一.JavaWeb ...

  6. JavaWeb三大组件之一——Filter过滤器源码解析(全面手撕Filter源码,需要耐心看完)

    什么是Filter? 本文所说的Filter是JavaWeb中常见常使用的过滤器.Filter的作用是拦截前端发送给后端的请求,一般是用于权限过滤.日志记录.图片转换.加密.数据压缩等操作. 大致流程 ...

  7. java项目配置过滤器_在JavaWeb项目中如何正确的使用Filter过滤器

    在JavaWeb项目中如何正确的使用Filter过滤器 发布时间:2020-11-11 17:12:00 来源:亿速云 阅读:79 作者:Leah 这期内容当中小编将会给大家带来有关在JavaWeb项 ...

  8. (29) JavaWeb中使用filter过滤器拦截请求、权限检查,过滤响应。

    Filter 过滤器 一.Filter 什么是过滤器 二.Filter 过滤器的使用步骤: 三.Filter 的生命周期 四.FilterConfig 类 五.FilterChain 过滤器链 六.F ...

  9. JavaWeb之【过滤器Filter】

    一.Filter概述 1.Filter是过滤器 2.Filter可以在Servlet这个目标程序执行之前添加代码,也可以在目标Servlet执行之后添加代码.之前之后都可以添加过滤规则. 3.一般情况 ...

最新文章

  1. ubuntu安装迅雷软件
  2. form 中Enctype=multipart/form-data 的作用
  3. 用 LaTeX 排版编程技术书籍的一些个人经验
  4. SAP云平台上Redis dashboard提供的功能一览
  5. mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL
  6. 防火墙配置十大任务之十,构建虚拟防火墙
  7. java 通过JLayeredPane实现背景图上添加其他控件
  8. android app报错log,Android studio 解决logcat无过滤工具栏的操作
  9. php按按字符串长度分割,支持中文的PHP按字符串长度分割成数组代码_PHP
  10. 安装SQL server出现“启用windows功能NetFx3”错误
  11. 单片机原理与接口技术期末总复习
  12. 卡巴斯基2009注册机[纯绿色版本]
  13. 【无标题】公众号引流进阶教程(公众号对接电影,影视资源)
  14. Linux系统自动校准时间
  15. 装修行业怎么找精准客户?有那些获客渠道?
  16. 【认证/测试】产品的IP等级防水/防尘解析以及测试方法
  17. 了解源代码管理工具——Github
  18. css百分比跟em的区别_查看CSS单位:像素,EM和百分比
  19. Tableau实现跑道图
  20. 安卓火狐导出书签_firefox火狐浏览器中怎么导出书签备份收藏夹?

热门文章

  1. Collections.min()和Collections.max()的使用
  2. 怎么做圆一圈圈扩散效果_软文推广怎么样做才有效果?
  3. MYSQL中最基础的的聚合函数(avg求平均值及count求和)
  4. 一篇来自前端同学对后端接口的吐槽
  5. 硬件:如何选购适合自己的显示器
  6. 你知道为啥程序员下班后只关显示器从不关电脑?
  7. Jquery一些常见性能的问题
  8. 12c创建为容器数据库_oracle 12c创建可插拔数据库(PDB)与用户详解
  9. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc
  10. 28335接两个spi设备_SPI浅析