根据 HTTP header 收集客户端相关信息

【课程】    web2.0程序设计
【作业要求】  用 tornado 编写一段小程序,根据 HTTP header 收集客户端相关信息:是否手机、操作系统、浏览器等信息*。
【作业提示】  主要解析 Request header[“User-Agent”] 。该字符串格式可通过 wiki 链接 查 到 ; 通 过 tornado 英 文 网 站 文 档 , 知 道 用 self.request 获 取
        tornado.httputil.HTTPServerRequest 对象实例,该实例有 headers 字典类型的属性。
【参考文档】  User-Agent定义及字符串格式(wiki)      tornado 英 文 网 站 文 档     常见的相关字符串和代表的版本信息

【实验环境】  操作系统:Ubantu 13.10   浏览器:firefox  python:2.7.5+  tornado:1.2.1版本

1.根据tonardo英文网站文档,了解到用self.request可以获取到客户端的相关信息。在这里,我先将request的比较重要的一些属性列出来,并作诠释

method
 HTTP 的请求方法:GET或POST

uri
 被请求的uri, 统一资源标识符,用来唯一的标识一个资源(关于uri)

path
 uri的路径部分

query
 uri的请求部分

version
HTTP协议的版本,如“HTTP/1.1”

headers
这是一个字典类型的属性,带有许多丰富的信息,HTTP headers是 HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。

接下来我们来一起看下这里面有哪些信息:
 ‘Accept-Language‘: ‘zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3‘,   //表示浏览器默认的语言设置,q表示优先级,q值越大等级越高
‘Accept-Encoding‘: ‘gzip, deflate‘,            //表示浏览器支持的的压缩方式
‘Connection‘: ‘keep-alive‘,               //表示浏览器和主机一直保持连接
‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,//表示浏览器支持的MIME类型
‘User-Agent‘: ‘Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0‘,//浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
‘Host‘: ‘localhost:8000‘,  //主机名
‘Cookie‘: ‘user=ZmZm|1417654344|5de24afe2a1e8c302f29211dfd4a726186bdc9af‘,//客户端存储的少量用户信息
‘Cache-Control‘: ‘max-age=0‘//响应缓存的有效秒速

headers[‘User-Agent‘]
浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息

常见的相关字符串和代表的版本信息

body
 请求内容的主体,如果存在,是一个string类型。

remote_ip
 一个表示客户端IP地址的字符串。

protocol
 程序所遵守的协议

host
 被请求的主机名

arguments
用来存储表示GET/POST的参数字典

files
 上传的文件

connection
 单个连接可以连接多个请求,通过该属性可以访问HTTP的请求

2.以下是我的这个小程序的核心代码(命名为t1.py):

#coding:utf-8
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.httpclient import AsyncHTTPClient  

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
     def get(self):
        print "**************NOW let me show you something about HTTPServerRequest**********"
        print "#method#:"
        print self.request.method
        print "#uri#:"
        print self.request.uri
        print "#path#:"
        print self.request.path
        print "#query#:"
        print self.request.query
        print "#version#:"
        print self.request.version
        print "#headers#:"
        print self.request.headers
        print "#headers[‘User-Agent‘]#:"
        print self.request.headers[‘User-Agent‘]
        print "#body#:"
        print self.request.body
        print "#remote_ip#:"
        print self.request.remote_ip
        print "#protocol#:"
        print self.request.protocol
        print "#host#:"
        print self.request.host
        print "#arguments#:"
        print self.request.arguments
        print "#files#:"
        print self.request.files
        print "#connection#:"
        print self.request.connection

if __name__ == "__main__":
    tornado.options.parse_command_line()
    application = tornado.web.Application(
        handlers = [(r"/", IndexHandler)])
    HTTP_SERVER = tornado.httpserver.HTTPServer(application)
    HTTP_SERVER.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

打开终端,输入以下命令行:

~$ python t1.py

打开浏览器 并打开链接:localhost:8000

这时候可以在终端看见以下输出

从headers[‘User-Agent‘]可看出, 我的实验中,

操作系统是linux,浏览器是firefox,版本是29.0   其中Gecko 是 Firefox 的呈现引擎,版本是20100101

时间: 2024-08-10 21:21:41

根据 HTTP header 收集客户端相关信息的相关文章

根据HTTP header收集客户端相关信息 --- tornado demo

理解:当客户端访问服务器时,会给服务器发送相关信息. tornado程序中,可在“处理请求类”(继承自tornado.web.RequestHandler)的请求函数中使用self.request.headers获得HTTP header客户端相关信息(包括"User-Agent") User-Agent说明:HTTP客户端运行的浏览器类型的详细信息.通过该头部信息,web服务器可以判断到当前HTTP请求的客户端浏览器类别. tornado程序: 1 import tornado.ht

C#获取客户端相关信息

1.获取Uri参数 2.获取客户端操作系统.浏览器信息 3.获取客户端分辨率

linux下收集系统全面信息(基于sosreport以及supportconfig)

Linux下日志的采集和分析是一个非常重要的工作,一般厂商都会有自己独有的命令,我这边列举下常用的两个Linux厂商的收集命令(Redhat Linux以及SuSe Linux),便于收集后,对系统进行全面分析. 1. 基于redhat的日志收集 [[email protected] etc]# sosreport sosreport (version 3.2) This command will collect diagnostic and configuration information 

iOS 类似简单的第三方微博客户端,可进行登录微博浏览相关信息

Demo地址:https://github.com/ChenNan-FRAM/Fenvo (如果你觉得有用麻烦star一下感激不尽) Fenvo Objective-C, iOS 类似简单的第三方微博客户端,可进行登录微博浏览相关信息.在这个过程我是遇到很多的问题,但是大部分都顺利解决了,相信如果你的项目有类似的地方我的项目里面也能够给你提供一定的帮助,如果需要,可以给我留言或者在Github上联系我. UI简陋,暂未完善.有UI大师指点就最好了. 这个应用我是从开始学后为了实践自己的能力一直在

收集与当前登录用户、启动日志及启动 故障的相关信息

获取当前用户的登录的相关信息. [[email protected] ~]# who root     pts/0        2014-07-28 10:03 (172.16.56.86) root     pts/1        2014-07-28 18:01 (172.16.56.86) 获取有关登录用户更详细的信息. [[email protected] ~]# w 09:42:32 up 4 days, 22:26,  2 users,  load average: 0.00,

08SpringMvc_(1)继承AbstractCommandController的Action[能够以实体的形式,收集客户端参数].(2)日期转换器和编码过滤器

上一篇文章说过要介绍两个控制器.这篇文章就介绍第二个控制器AbstractCommandController(这个类已经快要被废弃了,有更好的代替者,但还是要好好学这个类).这个控制器的额作用是为了收集提交的参数, 比如说之前的写法是://获取员工的姓名 String username=request.getParameter("username");这样去收集参数,提交的参数一多这样很不方便,所以引入了AbstractCommandController.记住SringMVC中的Act

MySQL查看数据库相关信息

使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql> show databases; +--------------------+ | Database           | +--------------------+ | information_schema | | INVOICE            | | mysql              | | performance_s

Oracle 通过ADR工具 收集ORA-600错误信息

 问题描述: 2014-06-10 在点检数据库预警文件时,出现Ora -00600 错误,并且Rman L1 备份失败,查询相关资料,得知是Bug:9835218.于是,提SR寻求Oracle 官方技术支持. Oracle回复如下: Your Service Request has been submitted as anORA-600/ORA-7445 issue based on the problem type you chose when logging the SR. Additio

微信相关信息

关注/取消关注事件<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> &l