博客说明
HTTP Referer是 header 的一部分,当浏览器向web 服务器 发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
假如在 www.google.com 里有一个 www.baidu.com 链接,那么点击进入这个 www.baidu.com ,它的header信息里就有:Referer= http://www.google.com
只允许我本身的网站访问本身的图片服务器,假如域是 www.google.com ,那么图片服务器每次取到Referer来判断一下域名是不是 www.google.com ,如果是就继续访问,不是就拦截。
将这个http请求发给服务器后,如果服务器要求必须是某个地址或者某几个地址才能访问,而你发送的referer不符合他的要求,就会拦截或者跳转到他要求的地址,然后再通过这个地址进行访问。
比如静态请求是 *.html 结尾的,动态请求是 *.shtml ,那么由此可以这么用,所有的 *.shtml 请求,必须Referer为我自己的网站。
定义 :Referer头部的内容为空,或者,一个HTTP请求中根本不包含Referer头部(一个请求并不是由链接触发产生的)
直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是一个“凭空产生”的HTTP请求,并不是从一个地方链接过去的。
那么在防盗链设置中,允许空Referer和不允许空Referer有什么区别?
允许Referer为空,意味着你允许比如浏览器直接访问。
比对HTTP 请求的来源地址,如果Referer中的地址是安全可信任的地址,那么就放行
感谢
刚好把手机银行嵌入办事通的项目写完,该项目http请求较多,期间遇到了不少坑,也学到了不少东西,趁这个机会,简单梳理下!
图为http常见的请求方式,经常使用的,就是POST和GET,二者的区别,这里也不多做介绍。项目大致是这样的,提供接口给手机银行,获取请求参数:
request.getQueryString()方法即可取得参数相关信息,随机访问办事通提供的三个接口,最初定的接口,使用https协议,但办事通无法提供CA证书,后放弃(上一篇有提到过,无法绕过ssl验证)
随后办事通提供了另外接口,采用http协议:
采用Http发个简单Post请求,即可获取相应数据,测试环境很快调试完毕上线,上了生产,发现无论怎么都取不到数据。联系了办事通技术人员,打印了http请求头header,说请求头得有Referer,以前只是知道有这么个东西,但不知道具体有什么用,今天就简单说说。
加了这么一句话,请求OK了。那么,Referer是什么东西?
Referer是HTTP请求Header的一部分,当浏览器向Web服务器发送请求的时候,请求头信息一般需要包含Referer。该Referer会告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
Referer作用是什么?
1)防盗链
比如办事通服务器只允许网站访问自己的静态资源,那服务器每次都需要判断Referer的值是否是zwfw.yn.gov.cn,如果是就继续访问,不是就拦截。
2)防止恶意请求
比如静态请求是 .html结尾的,动态请求是 .shtml,那么所有的*.shtml请求,必须 Referer为我自己的网站才可以访问,这就是Referer的作用。
空Referer是怎么回事?
空Referer是指Referer头部的内容为空,或者,一个HTTP 请求头中根本不包含Referer,那么什么时候HTTP请求会不包含Referer字段呢?
根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。
比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是一个“凭空产生”的HTTP请求,并不是从一个地方链接过去的。
在防盗链设置中,允许空Referer和不允许空Referer有什么区别?
允许Referer为空,意味着你允许比如浏览器直接访问,就是空。
页面添加Referer元素需要使用meta referrer标签:
补充说明: Referer的正确英语拼法是 referrer 。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一,还有它第一个字母是大写。
描述请求将被发送的目的地,包括且仅仅包括域名和端口号。 HTTP/1.1 的所有请求报文中必须包含一个Host头字段,且只能设置一个。
请求头origin表明了请求来自于哪个站点。包括且仅仅包括协议、域名和端口,并不包含任何路径信息。经常用于CORS请求或者POST请求,可以看到response有对应的header:Access-Control-Allow-Origin。
@CrossOrigin(origins="http://wx.xxxx.com:80")
@RequestMapping(value = "list", method = RequestMethod.POST)
public String list(HttpServletRequest request, HttpServletResponse response) {
}
告知服务器请求的原始资源的URI,其用于所有类型的请求,并且包括协议、域名、路径和查询参数。
在以下几种情况Referer不会被发送:
1)来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI;
2)当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS);
3)直接输入网址或通过浏览器书签访问;
4)使用 JavaScript 的 Location.href 或者是 Location.replace();
5)使用html5中noreferrer;
6)使用iframe的hack写法去除referer。
请求头中referer与origin功能相似,但有如下几点不同:
1、只有跨域请求,或者同域时发送post请求,才会携带origin请求头,而referer不论何种情况下,只要浏览器能获取到请求源都会携带,除了上面提到的几种情况。
2、如果浏览器不能获取请求源,那么origin满足上面情况也会携带,不过其值为null。referer则不同,浏览器如果不能获取请求源,那么请求头中不会携带referer。
3、origin的值只包括协议、域名和端口,而erferer不但包括协议、域名、端口,还包括路径和参数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)