今天我们来聊聊Java防盗链,多说无用,直接上应用案例。

这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页面权限。

浏览器中直接输入报表URL的时候,它的头文件是空的,因此,可以在访问的时候做两个判断:头文件是否为空以及以什么页面进行跳转,如果不符合跳到错误页面即可。

什么是Referer?

这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer),用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着 HTTP Referer 头部网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

什么是空Referer,什么时候会出现空Referer?

首先,我们对空Referer的定义为,Referer 头部的内容为空,或者,一个HTTP请求中根本不包含Referer头部。

那么什么时候HTTP请求会不包含Referer字段呢?根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是一个“凭空产生”的HTTP请求,并不是从一个地方链接过去的。

在防盗链设置中,允许空Referer和不允许空Referer有什么区别?

在防盗链中,如果允许包含空的Referer,那么通过浏览器地址栏直接访问该资源URL是可以访问到的;

但如果不允许包含空的Referer,那么通过浏览器直接访问也是被禁止的。

操作步骤

1、添加class文件

编写一个类文件,用来判断头文件是否为空,代码如下:

package com.fr.test;

import java.io.IOException;
import java.io.PrintWriter;

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

public  class Dodo implements Filter {
    public void destroy() {
        // TODO Auto-generated method stub

    }

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

    throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    String referer = req.getHeader("referer");
    //下面的IP地址是正常页面请求
    if(null != referer && (referer.trim().startsWith("http://localhost:8033")||referer.trim().startsWith("http://www.finereporthelp.com/test/hello.html"))){
         System.out.println("正常页面请求"+referer);
         chain.doFilter(req, resp);
   //下面的就是出现不是正常页面请求的时候跳转
    }else{
         System.out.println("盗链"+referer);
         req.getRequestDispatcher("/LdapLogin.jsp").forward(req, resp);
    }
}
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }
} 

将Dodo.java编译成class文件,并放在%TOMCAT_HOME%\WebReport\WEB-INF\classes\com\fr\test目录下。

2、修改web.xml文件

打开%TOMCAT_HOME%\webapps\WebReport\WEB-INF下的web.xml文件,配置一个过滤filter,在出现ReportServer的时候执行过滤,代码如下:

<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.fr.test.Dodo</filter-class></filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/ReportServer</url-pattern>
</filter-mapping>
 

两步就可以搞定,如果属于盗链,则跳转至上述的LdapLogin错误页面,这里没有LdapLoign页面,所以直接跳转404。如果还想实现数据权限,则可以通过单点登录或者session注入的方式。

效果测试

准备两个html文件

假设hello.html是正确的网址

<html>
<body>
<p>测试</p>

<a href="http://localhost:8033/WebReport/ReportServer?reportlet=demo%2Fnewchart%2Fothers%2FLogarithmic_axis.cpt&op=write">防盗链测试</a>
</body>
<html> 

假设steal.html是盗链的网址

<html>
<body>
<p>测试,错误的链接地址</p>

<a href="http://localhost:8033/WebReport/ReportServer?reportlet=demo%2Fnewchart%2Fothers%2FLogarithmic_axis.cpt&op=write">防盗链测试</a>
</body>
</html> 

情况一

通过hello.html跳转,跳转链接正确,即referer不为空且正确

情况二

通过steal.html跳转,跳转链接错误,即referer不为空且错误

情况三

直接访问URL地址,即referer为空

JAVA防盗链在报表中的应用实例的更多相关文章

  1. Java防盗链机制

    对于防盗链技术,网上提供了很多很多的相关技术,但是不是特别复杂就是效果不好. 这里在网上找到一种思路,就是关于HTTP协议响应头中包含的Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可 ...

  2. nginx做反向代理并防盗链

    nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...

  3. Apache服务器如何通过.htaccess文件设置防盗链?

    Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...

  4. apache 防盗链

    方法1:Apache防盗链的第一种实现方法,可以用rewrite实现 (1.)首先要确认Apache的rewrite module可用,打开 httpd.conf 文件,如果前面有注释去掉 LoadM ...

  5. .htaccess防盗链方法(文件、图片)

    http标准协议中有专门的字段记录referer,一来可以追溯上一个入站地址是什么,二来对于资源文件,可以跟踪到包含显示他的网页地址是什么. 因此所有防盗链方法都是基于这个Referer字段两种方法: ...

  6. Java破解图片防盗链

    前言 今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额.然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念.哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们 ...

  7. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  8. php笔记05:http协议中防盗链技术

    倘若我们自己在电脑上写了一个网站文件(可以是html,php文件等等),但是只希望本机可以访问这个文件,不希望别的电脑访问就需要这里的防盗链技术 1.我们在本地写了一个import.php文件: 而且 ...

  9. 什么是防盗链设置中的空Referer

    设置防盗链时候指明和不指明空Referer的差别及实现后的效果? 什么是Referer? 这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer).用来 ...

随机推荐

  1. TeamCity : 安装 Agent

    笔者在前文中介绍了 TeamCity Server 的安装过程,本文介绍在 Ubuntu Server 14.04 中安装 TeamCity Agent.Ubuntu Server 上已经创建了用户 ...

  2. 企业 SOA 设计(1)–ESB 设计

    最近为公司完成了一个 ESB 的设计.下面简要说明一下具体的设计方案.   企业 SOA 整体方案 在前一篇<SOA.ESB.NServiceBus.云计算 总结>中说到,SOA 是面向服 ...

  3. jQuery页面滚动右侧浮动导航切换

    体验效果:http://hovertree.com/texiao/jquery/49/ 效果图: 代码如下: <!DOCTYPE html> <html> <head&g ...

  4. de4dot3.14更新文件打包下载

    刚发现de4dot更新了,虽然只是10月份的文件更新,并未发布新的release,但好多人还不会编译... 关于de4dot有何功能就不再讲了. 本文主要提供编译通过后的打包文件下载. 首先下载de4 ...

  5. 使用jenkins配置.net mvc网站进行持续集成二

    上一篇使用jenkins配置.net mvc网站进行持续集成一只是简单介绍了jenkins构建站点到本地服务器,这一篇,就来讲解如何部署站点到指定的服务器上面. 1.IIS远程发布配置 1.在服务器管 ...

  6. javascript随笔20160808

    var jsondata=$.parseJSON(@ViewBag.x); //转换为Json数据 var fruits = ["Banana", "Orange&quo ...

  7. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  8. SharePoint 2013 自定义扩展菜单

    在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...

  9. win7显示不是正版系统的解决方法

    十一长假回来,打开电脑就变成这样了.现在的我已经学会了不再逃避问题,要学着解决问题,就在网上搜集了有关这方面的信息.说是下载一个激活工具就可以了.我就试着下载了,但是不知道为什么下了几个激活工具都不管 ...

  10. Android http Request / Response ContentType

    客户端在进行http请求服务器的时候,需要告诉服务器请求的类型,服务器在返回给客户端的数据的时候,也需要告诉客户端返回数据的类型. 这个类型就是  ContentType  ,不同的ContentTy ...