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

发布时间:2020-11-11 17:12:00

来源:亿速云

阅读:79

作者:Leah

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

一、由来

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

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 {

}

}

4.Filter配置

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

MyFilter

com.test.cyw.MyFilter

MyFilter

/Images/*

5.测试

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

pageEncoding="UTF-8"%>

Insert title here

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

四、遇到的问题

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

五、总结

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

上述就是小编为大家分享的在JavaWeb项目中如何正确的使用Filter过滤器了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

java项目配置过滤器_在JavaWeb项目中如何正确的使用Filter过滤器相关推荐

  1. 1)Java web项目配置(最简单的javaweb项目)

    Java web示例一 1.创建一个简单的Maven 项目 2.在webapp/WEB-INF下创建两个文件夹classes和lib,classes用来存放编译后输出的classes文件,lib用于存 ...

  2. java动态拼接请求_在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案...

    在开发网站时候我们会遇到下面问题? - 在引用网页中引用js和css或者动态的Servlet的时候我们是写绝对路径还是相对路径? - 如果写相对路径吧,上线偶尔会报404,还要手动去拼接绝对路径 - ...

  3. java源代码众筹网站_【JavaWeb项目】一个众筹网站的开发(三)第一个网页

    一.bootstrap 本项目采用bootstrap3 使用bootstrap三步: 1.导入jQuery 2.导入bootstrap自己的css样式 3.导入bootstrap自己的js文件 boo ...

  4. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  5. java 博客系统_讲解开源项目:5分钟搭建私人Java博客系统

    本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和运行 Tale 项目.示例均在 Windows 操作系统下演示 本文作者:HelloGitHub-秦人 HelloGitHub 推出的< ...

  6. java web 连接linux_如何将javaweb项目部署到linux下

    以下是对将javaweb项目部署到linux下的方法进行了详细的分析介绍 一般都在windows下开发的现在部署到linux下 将项目达成war包(用eclipse项目右键>Export> ...

  7. java获取项目绝对路径_如何获取项目绝对路径?

    展开全部 用Jsp获取.用Java类获取或用servlet获取项目绝对32313133353236313431303231363533e4b893e5b19e31333363396465路径. 一.用 ...

  8. java web不用框架_初学javaweb,远离各自框架

    OSCHINA 软件库有一个分类--Web框架,该分类中包含多种编程语言的将近500个项目. Web框架是开发者在使用某种语言编写Web应用服务端时关于架构的最佳实践.很多Web框架是从实际的Web项 ...

  9. java自定义jsp标签_深入浅出javaWeb实战第17讲自定义JSP标签(上)

    <JavaWeb开发>课程计划表 Web的概念及其演变 课程内容: ? Web的概念.特点 ? HTTP协议简介 ? Web技术的发展:静态文档,Web应用,Web服务 JavaWeb应用 ...

最新文章

  1. I2C原理及特性总结
  2. method initializationerror not found:JUnit4单元测试报错问题
  3. Flickr30k图像标注数据集下载及使用方法(转载的,备忘)
  4. 微软亚太区资料科学总监:R 语言是 VS 生态第一顺位
  5. web.xml.jsf_看一下即将发布的JSF 2.3 Push支持
  6. [react] 你有使用过React Intl吗?
  7. docker如何部署python项目_Docker如何部署Python项目的实现详解
  8. ucc编译器(入门)
  9. [Silverlight 4 RC]WebBrowserBrush概览
  10. linux 命令 — cut
  11. h5 移动端电子签名
  12. python 购物车总额_python之购物车
  13. JAVA爬虫--编写第一个网络爬虫程序
  14. Java使用蔡勒公式快速计算某一天是星期几
  15. Windows进程管理
  16. Jsonviewer2 for Notepad++ 64 bit/位
  17. WRF输入数据fnl批量下载
  18. cad能整体比例缩小吗_cad调整比例(cad整体比例调整)
  19. 智能电动车骑行头盔安全帽方案/APP/PCBA/小程序/开发
  20. macOS Mojave 10.14.2 原版镜像

热门文章

  1. YOLOv5s的模型训练与使用(纯小白入门)
  2. Android实现PDF预览打印
  3. 删除数据库中重复数据的方法
  4. ruoyi中生成的代码表单,如果添加上传功能-模板下载功能
  5. E/DMOS倒相器工作原理详解及分析
  6. 【半监督图像分类】 2017-Mean-Teacher NIPS
  7. 我要做大屏-数据可视化应用特点分析
  8. 未注册老域名扫描软件-免费未注册老域名挖掘
  9. PHP跨域处理 图片跨域 接口跨域 后端nginx的cors设置
  10. c语言课时设计猜坐标游戏,c语言小游戏课程设计报告.docx