在JavaWeb项目中如何正确的使用滤过滤器

  介绍

这期内容当中小编将会给大家带来有关在JavaWeb项目中如何正确的使用滤过滤器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>一、由来

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

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

<强> 1.公共空init (FilterConfig FilterConfig)抛出ServletException

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

<强> 2。公共空间的doFilter (ServletRequest请求,ServletResponse响应FilterChain链)抛出io。IOException, ServletException

每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用过滤器的doFilter方法。传入此方法的FilterChain允许过滤器将请求和响应传递到链中的下一个实体。
此方法的典型实现遵循以下模式:

1。检查请求

2。有选择地将带有自定义实现的请求对象包装到用于输入过滤的过滤器内容或头中

3。有选择地将带有自定义实现的响应对象包装到用于输出过滤的过滤器内容或头中

4。一)既可以使用FilterChain对象(chain.doFilter())调用链中的下一个实体,

4。b)也可以不将请求/响应对传递给过滤器链中的下一个实体,从而阻塞请求处理

5。在调用过滤器链中的下一个实体之后直接设置响应上的头。

<强> 3。公共空间摧毁()

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

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

1。准备

在HelloWolrd项目中新增一个文件夹,在文件夹中放入两个图片一个犯错。png一个测试。png,两个图如下

在JavaWeb项目中如何正确的使用滤过滤器

2。创建过滤器

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

公共类MyFilter实现滤波器

3。doFilter中在实现防盗链

包com.test.cyw;
  
  进口java.io.IOException;
  进口javax.servlet.Filter;
  进口javax.servlet.FilterChain;
  进口javax.servlet.FilterConfig;
  进口javax.servlet.ServletException;
  与javax . servlet . servletrequest进口;
  进口javax.servlet.ServletResponse;
  进口javax.servlet.annotation.WebFilter;
  进口javax.servlet.http。*;/* @WebFilter (“/MyFilter") */公共类MyFilter实现滤波器{
  
  公共MyFilter () {
  
  }
  
  公共空间摧毁(){
  
  }
  
  公共空间的doFilter (ServletRequest请求,ServletResponse响应FilterChain链)抛出IOException, ServletException {
  
  HttpServletRequest点播=(HttpServletRequest)请求;
  HttpServletResponse res=(HttpServletResponse)反应;
  字符串引用页=req.getHeader (“referer");//链接来源地址
  如果推荐人==null | | ! referer.contains (req.getServerName ()))
  {
  req.getRequestDispatcher(“/图片/err.png")。提出(请求,res);
  返回;
  }
  链。doFilter(点播,res);
  }
  
  公共空init (FilterConfig fConfig)抛出ServletException {
  
  }
  }

在JavaWeb项目中如何正确的使用滤过滤器