博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防盗链[referer]
阅读量:6967 次
发布时间:2019-06-27

本文共 1543 字,大约阅读时间需要 5 分钟。

原文出处:http://www.cnblogs.com/devilfree/archive/2012/09/11/2680914.html

总结一下今天学习防盗链Filter的一些知识点:

    防盗链要实现的是这样一种效果:比如说其他的网站引用本网站的图片资源,将会显示一个错误图片,只有是本网站内的网页引用时候,图片才可以正常显示。这种应该是比较常见的,例如经常逛论坛的人会看到别人贴的图显示出来是一个错误图片,如百度图片不可以外链等,用到的就是这个Filter。
    首先说下Filter的工作区域是在客户端请求request抵达Servlet之前和服务器响应response在从Servlet抵达客户端浏览器之前。即FilterChain起到了一个过滤网的作用。所以在显示图片之前,先来验证图片的来源,再决定要不要正常显示该图片。

    那么如何判定图片的来源呢?这里涉及到了一个知识点:referer
    什么是referer呢?HTTP协议可能学网络的人更熟悉一点,HTTP headers是HTTP请求和相应的核心模块,它承载了关于客户端浏览器、请求页面、服务器等相关信息。Referer是HTTP头中的一个属性,告诉服务器我是从哪个页面链接过来的,比如说如果我博客上面有友情链接到朋友的博客,那么就可以从referer中统计出来一段时间内有多少点击量是从我的博客链接到朋友的博客。

Java中获取referer的方法是:request.getHeader("referer")
判断盗链:

String referer = request.getHeader("referer");    //getServerName() 返回网站的域名  if(referer==null || !referer.contains(request.getServerName())){    //转到一个错误的图片    request.getRequestDispatcher("/error.gif").forward(request.response);  }else{    chain.doFilter(request,response);  }

 

request.getHeader("referer")可用的情况:

1.<a href="">
2.表单提交
不可用的情况:
1.从收藏夹链接
2.自定义地址
3.浏览器直接输入
...

下面是一个对referer和getServerName()的小测试

新建两个jsp页面,分别命名为srcFilter.jsp 和 testFilter.jsp

srcFilter做一个链接到testFilter.jsp,显示testFilter页面的referer和serverName

srcFilter:

1 点击

 

testFilter:

1 <%2   String referer = request.getHeader("referer");3   String serverName = request.getServerName();4 %>5  
serverName : <%=serverName %>
6
referer : <%=referer %>

 

点击链接后跳转到testFilter页面显示结果为:

serverName : localhost
referer : http://localhost:8080/filter/srcFilter.jsp

转载于:https://www.cnblogs.com/LinkinPark/p/5233053.html

你可能感兴趣的文章
[Leetcode]695. Max Area of Island
查看>>
第一篇博客
查看>>
面向对象程序设计第二次作业
查看>>
Linux 典型应用之缓存服务
查看>>
Docker版本与安装介绍
查看>>
dzzoffice应用如何安装
查看>>
读《构建之法》阅读与思考
查看>>
折线分割平面
查看>>
PLC梯形图设计
查看>>
精简系统绝对不可删除的应用程序
查看>>
GDUFE ACM-1069
查看>>
类的三大特性之一:多态[入门程序示例]
查看>>
c++访问resetful webservice
查看>>
软件概要设计说明书(面向对象)2.0上线~
查看>>
(最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160
查看>>
网购的另一面思考
查看>>
jquery 插件开发及extend
查看>>
在Android工程中导入外部动态连接库(so文件)
查看>>
OpenGL绘图框架(GLFW)
查看>>
mac开启Airdrop的硬件要求
查看>>