如何获取url访问历史记录

  在院里的群里,有人问了这么一个问题:

  A页面提交表单到B页面,然后在B页面点了后退,如果在A页面上判断是直接访问的还是后退进去的呢?我不想改B页面。

  于是乎本着热心人的想法,我就帮他搞了搞,首先我想到了window.history,不过很遗憾,其没有提供相应的属性,只是提供了向前和向后跳转的方法。于是乎我找到了document.referrer,这个可以获得页面的上一个url,这样我只要判断一下其上一个url是不是B]不就ok了吗?但是,事与愿违,因为在使用document.referrers时不支持浏览器的前进和后退!首先详细说下document.referrers,下面是网上关于document.referrer及其兼容性的总结:

一、从使用意义上来说document.referrer希望能够追踪到的是浏览器端行为。如果一张页面A被打开,那么浏览器端可能会发生的动作有用户操作、JS代码两种。先来看看用户打开页面A可能会进行的操作:

1 直接在地址栏中输入A的地址
2 从B页面左击link A,跳转至A页面
3 从B页面右击link A,在新窗口中打开
4 从B页面右击link A,在新标签页中打开
5 拖动link A至地址栏
6 拖动link A至标签栏
7 使用浏览器的前进、后退按钮

注意这里的link即指<A>标签,但是如果有事件或者target还要另当别论。

JS打开页面可能的方式:

1 修改window.location
2 使用window.open
3 点击flash

上面列出了客户端打开页面的一些方法,此外,如果通过服务端的重定向技术,也能够使得页面A呈现给访客。

下面来针对具体的浏览器测试,如果是上述的这些情况,document.referrer表现如何:

序号 场景 IE8.0 FF3.6 FF4.0 chrome
1 直接在地址栏中输入A的地址 " " " " " " " "
2 从B页面左击link A,A页面替换B页面(target=‘_self‘)
3 从B页面左击link A,A在新窗口中打开(target=‘_blank‘)
3 从B页面右击link A,在新窗口中打开 " "
4 从B页面右击link A,在新标签页中打开 " "
5 鼠标拖动link A至地址栏 " " " " " "
6 鼠标拖动link A至标签栏 " " " " " " " "
7 使用浏览器的前进、后退按钮 保持 保持 保持 保持
8 修改window.location打开A页面(同域) " "
9 使用window.open打开A页面 " "
10 点击flash打开A页面        
11 服务器重定向至A页面 " " " " " " " "

其中," "表示一个空的字符串,√表示能够正确判断来源页,保持则意味使用前进后退不会改变页面的referrer。从这张表里可以看出document.referrer能覆盖大约一半的case。但是对于一些比较常用的操作,例如利用鼠标拖动link至标签栏、前进后退等情况还不能做出正确的处理。

二、document.referrer的来源

浏览器在向server请求页面A的时候,会发送HTTP请求。这个请求的Header里会带上Referer属性,server接收到该请求后,可以提取出Header里的Referer,用于判断访客是从哪个页面发起的请求。

一般情况下浏览器请求A时发送的Header中Referer是什么,那么拿到A页面后document.referre的值就是什么。上图是一个请求A页面的Header,A的document.referre为http://localhost/Test/b.html。
 
如果在Header中不包含Referre,那么用document.referre去取的时候,就会被赋值为空字符串。

三、关于HTTPS请求

如果在一张普通的HTTP页面上点击了HTTPS的链接,那么在https请求头部可以附上Referer信息,之后在HTTPS页面中依然可以用document.referre来获得普通的http页面。
 
同样,如果是在一张https页面上点击了另一个HTTPS的链接,可以在请求的头部附上Referer信息。
 
但是如果是从一张https页面点击了http链接,那么很不幸,发送的http请求头里无法包含关于https页面的信息,这可能是出于一种对https页面的保护措施。

   所以,使用document.referrer也不行,那么怎么办呢?

  这是我的两个思路:

1、用session存储一个额外的变量用来判断是否用户是由b后退到了a。

2、拒绝页面的缓存,因为document.referer无法再前进后退时起作用,就是缓存惹得祸。不过未验证,我要验证下再说。暂时到这里。

时间: 2024-07-31 09:14:42

如何获取url访问历史记录的相关文章

Python 获取URL访问的HEAD头信息

主要给出两个版本,一个是通过 urllib 实现的,另一个是通过 urllib2 实现的,此为第二种,代码及实例如下: >>> import urllib2 >>> from urllib2 import * >>> webUrl = "http://www.baidu.com" >>> doc = urllib2.urlopen(webUrl) >>> print doc.info() #或 d

thinkphp5.0 获取URL信息

获取URL信息 $request = Request::instance(); // 获取当前域名 echo 'domain: ' . $request->domain() . '<br/>'; // 获取当前入口文件 echo 'file: ' . $request->baseFile() . '<br/>'; // 获取当前URL地址 不含域名 echo 'url: ' . $request->url() . '<br/>'; // 获取包含域名的

JavaScript学习之获取URL参数

最近看了几道面试题,其中有一道就是关于写一个方法来获取浏览器地址栏URL查询部分的字段内容.虽然之前看过相关的东西,但感觉有点模糊,所以就又全面的学习一遍,谨以此文记之! 准备知识 在JavaScript中,既然说到URL(这里也只是根据本题浅显介绍),那肯定就要说Location对象了: ①Location对象是window对象的一个属性,可通过window.location来访问(因为window就是全局对象,所以可以直接使用location来引用Location对象喽): ②Locatio

如何获取url#号后的参数

昨天遇到这个问题:在A页面中通过location.href跳转到另一个B页面,此跳转地址是http://www.xyz.com/aa.html#bb.html?param=xxx 现在要怎么在B页面中取到param的值?现在的情况是跳到B页面后地址栏显示的就是http://www.xyz.com/aa.html#bb.html 后面的参数部分没有了,取到的参数值也是空的 搞了好久也没出来,最后问了大牛才发现我的基本功不行啊 理解就出错了,#后的内容都不会传到服务端的,所以到新页面看到的地址栏中就

ThinkPHP第二课 框架MVC目录和URL访问方式

第二课 框架MVC目录和URL访问方式 1.说明: ThinkPHP是基于MVC的框架,认识框架目录将更好的实现分层,掌握ThinkPHP.URL访问就是访问框架的控制器(MVC中的C),共有四种方式,框架中的C起到分模块的作用. url的4种访问方式: 1.PATHINFO 模式 -- 重点!!!!!! http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2 2.普通模式 http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2

linux分析apache日志获取最多访问的前10个IP

apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数. 既然是统计,那么awk是必不可少的,好用而高效. 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail 首先用awk统计出来一个列表,然后用sort进行排序,最后用tail取最后的10个. 以上参数可以略作修改显示更多的数据,比如将tail加上-

Linux分析日志获取最多访问的前10个IP

原文地址:http://xuqq999.blog.51cto.com/3357083/774714 apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数. 既然是统计,那么awk是必不可少的,好用而高效. 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail 首先用awk统计出来一个列表,然后用sor

Java 网络编程(三) 创建和使用URL访问网络上的资源

链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Resource Locator)是统一资源定位符的简称,它表示Internet上某一资源的地址. 通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW, FTP站点.浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源. 在目前使用最为广泛的TCP/IP中对于URL中主机名

针对功能权限(url访问)如何避免越权访问

你可以用request获得之前的页面路径:Request.getHeader("Referer");然后你可以判断一下,这个是字符串类型的. 如果是需要登录的,你可以从session中获取登录信息,然后判断 你可以通过上一个页面传参,本页面判断,如果不匹配就处理,参数可以放在session当中或者使用request.setAttribute();这个方法,不要URL传参 jsp防止直接通过url访问是通过过滤器实现的