Filter 学习(1) 防盗链 Filter。

原创 2012年03月24日 15:05:48


首先 讲解一下 防盗链的 概念:如果 其他的网站 引用本网站的图片资源 将会显示一个错误图片。只有 本站内的网页引用时,图片才会正常显示。即在 图片显示以前对 request进行验证,看客户的请求 是否 来自本站内。


    request.getHeader("Referer")获取来访者地址。只有通过链接访问当前页的时候,才能获取上一页的地址;

否则request.getHeader("Referer")的值为Null,通过window.open打开当前页或者直接输入地址,也为Null。



(1)过滤器 Filter 的 原理 及 概念:


Servlet过滤器(javax.servlet.Filter)

            

过滤器(Filter)的概念

  • 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
  • 在请求到达Servlet/JSP之前,过滤器截获请求。
  • 在响应送给客户端之前,过滤器截获响应。
  • 多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射<filter-mapping>的顺序决定。
  • 最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

过滤器的链式结构

    可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。

过滤器链式结构

实现过滤器  过滤器的三种方法。

在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法,并在web.xml中部署过滤器。

public class MyFilter implements Filter {

    public void init(FilterConfig fc) {
        //过滤器初始化代码
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        //在这里可以对客户端请求进行检查
        //沿过滤器链将请求传递到下一个过滤器。
        chain.doFilter(request, response);
        //在这里可以对响应进行处理

    }

    public void destroy( ) {
        //过滤器被销毁时执行的代码
    }

}

 

Filter接口

public void init(FilterConfig config)

web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息。

public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)

每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,特别需要注意线程同步问题,尽量不用或少用实例变量。在过滤器的doFilter()方法实现中,任何出现在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。

public void destroy()

容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。

 

部署过滤器

在Web应用的WEB-INF目录下,找到web.xml文件,在其中添加如下代码来声明Filter。

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>
        cn.edu.uibe.webdev.MyFilter
    </filter-class>
    <init-param>
        <param-name>developer</param-name>
        <param-value>TongQiang</param-value>
    </init-param>
</filter>

针对一个Servlet做过滤

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <servlet-name>MyServlet</servlet-name>
</filter-mapping>

针对URL Pattern做过滤

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/book/*</url-pattern>
</filter-mapping>

<filter-mapping>标记是有先后顺序的,它的声明顺序说明容器是如何形成过滤器链的。过滤器应当设计为在部署时很容易配置的形式。通过认真计划和使用初始化参数,可以得到复用性很高的过滤器。 过滤器逻辑与Servlet逻辑不同,它不依赖于任何用户状态信息,因为一个过滤器实例可能同时处理多个完全不同的请求



==========================(一个简单的 防盗链 Filter 实例)====================================


package com.filter;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageRedirectFilter implements Filter {

    @Override
    public void destroy() {
        // TODO 销毁时 不做任何事。

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        
                 HttpServletRequest request = (HttpServletRequest) req;
                 HttpServletResponse response = (HttpServletResponse) res;
                
                 //
                 String referer = request.getHeader("referer");
                 System.out.println("refer is"+ ""+ referer);
                
                 /***********************
                  *
                  * 如果 链接地址来自其他网站,则返回错误图片。
                  *
                  *
                  */
                 if(referer == null || ! referer.contains(request.getServerName())){
                     request.getRequestDispatcher("/error.gif").forward(request, response);
                 }else{
                     chain.doFilter(request, response);
                 }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO 初始化 不做任何事

    }

}

-----------------------------------------------------------------------------------


<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <img width="200" src="images/winter.jpg">
    <a href="${pageContext.request.requestURI }">刷新</a>s
    <a href="javascript:window.open('images/winter.jpg');"
            onclick="window.open('images/winter.jpg'); return false; ">直接访问</a>
    
    <hr>
    
    <hr>
    
    request.getHeader("referer"):   ${header['referer'] }
    
</body>
</html>

------------------------------------------------------------------------------------------------------------


<filter>
        <filter-name>imageRedirectFilter</filter-name>
        <filter-class>com.filter.ImageRedirectFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>imageRedirectFilter</filter-name>
        <url-pattern>/images/*</url-pattern>
        <url-pattern>/upload/images/*</url-pattern>
    </filter-mapping>

=====================================================================================================




JSP 防盗链 过滤器

防盗链
  • One_sir_zeng
  • One_sir_zeng
  • 2017年07月12日 16:23
  • 249

防止其他URL地址直接访问本站资源【防盗链过滤器】

在开发WEB应用时,我们要考虑到我们的网站某些资源(如图片,页面)不应该让用户直接通过其他站点URL访问,想只允许用户从本站点跳转到某些资源。这时候,我们的防盗链过滤器就有用了。 作用:使得访问某个特...
  • L_BestCoder
  • L_BestCoder
  • 2017年02月18日 10:08
  • 972

javaweb使用过滤器防止图片盗链 ------请求头referer的使用

在web.xml文件中如下配置: SimpleFilter cn.SimpleFilter SimpleFilter /images/* 在serv...
  • u014482758
  • u014482758
  • 2015年02月04日 14:21
  • 2130

深入体验JavaWeb开发内幕——使用Request对象设置防盗链

使用Request对象设置页面的防盗链       所谓的防盗链就是当你以一个非正常渠道去访问某一个Web资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的...
  • lijizh1013
  • lijizh1013
  • 2012年10月29日 19:17
  • 6757

Filter 学习(1) 防盗链 Filter。

首先 讲解一下 防盗链的 概念:如果 其他的网站 引用本网站的图片资源 将会显示一个错误图片。只有 本站内的网页引用时,图片才会正常显示。即在 图片显示以前对 request进行验证,看客户的请求 是...
  • itm_hadf
  • itm_hadf
  • 2012年03月24日 15:05
  • 1896

servlet高级应用过滤器、防盗链等一系列技术工具打包

  • 2014年08月25日 20:26
  • 761KB
  • 下载

java web笔记之Filter防盗链

1.防盗链简介   防盗链Filter实现这样一种效果,如果其他网站引用本网站的图片资源,将会显示一个错误图片。只有本站内的网页引用时,图片才会正常显示。即在图片显示之前对request进行验证,看客...
  • wangxuewei111
  • wangxuewei111
  • 2015年03月21日 22:18
  • 418

【Python】学习笔记——-5.1.2、高阶函数之filter

Python内建的filter()函数用于过滤序列。 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返...
  • singit
  • singit
  • 2017年02月13日 22:18
  • 821

如何用Servlet实现防盗链

利用request得到头信息中的referer    通过判断referer是否符合条件来判断是否为防盗链 例如: package requestTest; import java.io...
  • qhwc2009
  • qhwc2009
  • 2015年04月12日 11:58
  • 909

Asp.Net MVC3 简单入门详解过滤器Filter(身份验证、缓存、防盗链、国际化等)

前言在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码,...
  • sven_xu
  • sven_xu
  • 2015年06月02日 09:24
  • 816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Filter 学习(1) 防盗链 Filter。
举报原因:
原因补充:

(最多只允许输入30个字)