• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > JavaWeb之Filter过滤器详解

JavaWeb之Filter过滤器详解

作者:社会主义接班人 字体:[增加 减小] 来源:互联网 时间:2017-05-28

社会主义接班人 通过本文主要向大家介绍了javaweb开发详解,javaweb开发详解pdf,javaweb开发技术详解,javaweb 过滤器,javaweb中的过滤器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

原本计划这一篇来总结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 
</div>

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 {
    
  }
}

</div>

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>
</div>

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>
</div>

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

四、遇到的问题

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

五、总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • javaWeb项目部署到阿里云服务器步骤详解
  • javaweb分页原理详解
  • JavaWeb之Filter过滤器详解
  • javaWeb项目部署到阿里云服务器步骤详解
  • javaweb分页原理详解

相关文章

  • 2017-05-28Java HelloWorld原理分析_动力节点Java学院整理
  • 2017-05-28springboot注入servlet的方法
  • 2017-05-28springboot + mybatis配置多数据源示例
  • 2017-05-28Java创建内部类对象实例详解
  • 2017-05-28Spring Boot启动过程完全解析(二)
  • 2017-05-28java 请求跨域问题解决方法实例详解
  • 2017-05-28Java SpringMVC实现国际化整合案例分析(i18n)
  • 2017-05-28详解Java中接口的定义与实例代码
  • 2017-05-28java 整型数与Integer的缓存深入理解
  • 2017-09-23Java类中各部分的执行顺序

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • java服务端微信APP支付接口详解
    • 详解spring中使用solr的代码实现
    • jvm对象存储机制
    • 详解Spring框架之基于Restful风格实现的SpringMVC
    • SpringMVC + servlet3.0 文件上传的配置和实现代码
    • JAVA读取PDF、WORD文档实例代码
    • Java二分法查找_动力节点Java学院整理
    • RandomAccessFile简介_动力节点Java学院整理
    • 通过JDBC连接oracle数据库的十大技巧
    • Spring实现一个简单的SpringIOC容器

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有