request.getHeader("Referer")理解【转载】

request.getHeader("Referer")用于获取来源页地址,但有时却为空值,这是怎么回事。原因如下:

    getHeader("Referer")要走http协议时才有值,也就是说要通过<a href="url">a</a>标记才能获得那个值,而通过改变location或是<a href="javascript:location=‘url‘">a</a>都是得不到那个值的。 

request.getHeader("Referer")返回的是一个Enumeration 玫举

Enumeration e =request.getHeaders("Referer");
String a;
if(e.hasMoreElements()){
a=(String)e.nextElement();
}else{
a="直接访问";
}

使用request.getHeaders("Referer")返回的Enumeration 玫举本身就只有一个元素,也就是request.getHeader("Referer")的返回值。


以前有这样一个帖子目的是如何获取上一级页面的地址

如果发送页面以POST方式提交,这个request.getHeader("referer") 完全没有问题。但是如果发送页面以get方式提交 ,或许还带有参数,request.getHeader("referer") 会返回空值(可以防止用户在地址里粘贴链接,因为在地址栏里贴地址是数据get提交方式)。那么该如何解决呢?
说下我的具体情况吧

比如在每个JSP页面都包含    如果出现任<% page errorPages="../error.jsp"%>

何问题 ,都会跳到error.jsp页面。error.jsp 有一个back的按钮 要求实现返回上一级页面

其实利用history.back() 就可以实现 ,但是由于代理服务器原因 去掉了缓存的原因所以需要另一种方式来实现此功能。
referer是浏览器在用户提交请求当前页面中的一个链接时,将当前页面的URL放在头域中提交给服务端的,如当前页面为a.html,它里面有一个b.html的链接,当用户要访问b.html时浏览器就会把a.html作为referer发给服务端.
errorpage 根本不是用户去访问的,绝对大多数errorPage是forwaord,由服务端直接调用http连接访问errorpage将结果发给用户.用户根本没有访问errorPage.
对于location="aaa.jsp"这样用js访问没有referer,是因为当执行location="aaa.jsp"时,当前页面的URL已经是aaa.jsp,真的要取上一级当然可以从history中取到发给服务端,但那已经不是Referer的本意了.可以以如下代码来代替:

function jump(url){
var e = document.createElement_x("a");
e.href = url;
document.body.appendChild(e);
e.click();
}

然后你调用:
jump("http://host/aaa.jsp");看看肯定能取到.

referer的意图是判断访问来源,比如你想知道用户是通过google还是baidu找到你的页面的,就可以判断referer。很多下载站点也用它防止盗链,所以flash get之类的软件会自动把当前页作为referer字段发给下载地址以伪装成站内点击

时间: 2024-10-12 12:49:26

request.getHeader("Referer")理解【转载】的相关文章

web页面防盗链功能使用--request.getHeader(&quot;Referer&quot;)

使用Request对象设置页面的防盗链 所谓的防盗链就是当你以一个非正常渠道去访问某一个Web资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有通过该页面中的相关操作去访问想要请求的最终资源. 例如,你有一个访问某资源的网址,但是你事先不知道这个网址是有防盗链的,那么当你输入该网址时你可能会发现,并没有马上跳转到你想要的资源页面而是一些无关的信息页面,但是就是在这些信息页面中你发现有一个超链接或是其他操作可以跳转到你所访问的最终资源页面.

request.getHeader("referer")的作用

在开发web程序的时候,有时我们需要得到用户是从什么页面连过来的,这就用到了referer. 它是http协议,所以任何能开发web程序的语言都可以实现,比如jsp中是: request.getHeader("referer");response.sendRedirect(ref); js的话就是这样做:javascript:document.referrer 那它能干什么用呢?我举两个例子: 1,防止盗连,比如我是个下载软件的网站,在下载页面我先用referer来判断上一页面是不是自

C#中Thread类中Join方法的理解(转载)

指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行      比如 Java代码   using System; namespace TestThreadJoin { class Program { static void Main() { System.Threading.Thread x = new System.Threading.Thread(new System.Threading.ThreadStart(f1)); x.Start(); Console

获取客户端真实IP——request.getHeader(&quot;x-forwarded-for&quot;)

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP. 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过

servlet request getHeader(“x-forwarded-for”) 获取真实IP

request方法客户端IP: request.getRemoteAddr() 输出:192.168.0.106 客户端主机名:request.getRemoteHost()输出:abc request.getHeader("Host") 输出:192.168.0.1:8080 Web服务器名字:request.getServerName()输出:192.168.0.1 服务器监听的端口:request.getServerPort()输出:8080 在JSP里,获取客户端的IP地址的方

对Lucene PhraseQuery的slop的理解[转载]

所谓PhraseQuery,就是通过短语来检索,比如我想查“big car”这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语,这个document就算匹配成功.可如果待匹配的句子里包含的是“big black car”,那么就无法匹配成功了,如果也想让这个匹配,就需要设定slop,先给出slop的概念:slop是指两个项的位置之间允许的最大间隔距离,下面我举例来解释: 我的待匹配的句子是:the quick brown fox jumped over

Oracle中B-TREE索引的深入理解(转载)

索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书,其中书的内容就相当于表里的数据,而书前面的目录就相当于该表的索引.同时,通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性.但是,索引作为一种可选的数据结构,你可以选择为某个表里的创建索引,也可以不创建.这是因为一旦创建了索引,就意味着o

servlet request getHeader x-forwarded-for 获取真实IP

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP. 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过

关于${pageContext.request.contextPath}的理解 (转载)

${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> . 也就是取出部署的应用程序名或者是当前的项目名称 比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp ${pageContext.request.contextPath}或<%=request.getContextPath()%>取出来的就是/demo1,而&q