一、cookies

  • 本质:浏览器端保存的键值对

  • 方便客户按照自己的习惯操作页面或软件,例如:用户验证,登陆界面,右侧菜单隐藏,控制页面列表显示条数...

  • cookies是由服务端写在浏览器端,以后每次请求的时候,浏览器都携带者cookie来访问

  cookie的设置方式

  • tronado(后台设置)

  1. self.cookies
  2. self.get_cookie("k1")
  3. self.set_cookie("k2","v2")
  • 前端js设置

  1. document.cookie
  2. document.cookie.split(“;”)  获取所有的cookie列表
  3. document.cookie = “k3=66” 设置
  4. document.cookie = “k3=66;path='/”

  基本操作

后台设置

import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
print(self.cookies)
print(self.get_cookie('k1'))
self.set_cookie('k2', '999')
self.render('index.html') settings = {
'template_path':'views',
} application = tornado.web.Application([
(r"/index", MainHandler),
],**settings) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

前端设置

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <script>
function setCookieBySeconds(name, value, expires) {
var current_date = new Date();
current_date.setDate(current_date.getSeconds()+expires);
document.cookie = name + '= ' + value +';expires=' + current_date.toUTCString();
} function setCookieByDays(name, value, expires) {
var current_date = new Date();
current_date.setDate(current_date.getDate()+expires);
document.cookie = name + '= ' + value +';expires=' + current_date.toUTCString();
} //此外还可以导入jquery.cookie.js后通过
// $.cookie('k1','v1',{expires:7});设置过期时间为7天
</script>
</body>
</html>

  加密cookie(签名)

  cookie很容易被恶意的客户端伪造,加入你想在cookie中保存当前登陆用户的id之类的信息,你需要对cookie做签名以防止伪造,Tornado通过set_secure_cookie和get_secure_cookie方法直接支持了这种功能,要使用这些方法,你需要在创建应用一个密钥,名字为cookie_secret(在settings配置cookie_secret)

  签名Cookie的本质是:

写cookie过程:

  • 将值进行base64加密
  • 对除值以外的内容进行签名,哈希算法(无法逆向解析)
  • 拼接 签名 + 加密值

读cookie过程:

  • 读取 签名 + 加密值
  • 对签名进行验证
  • base64解密,获取值内容
import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self):
login_user = self.get_secure_cookie("login_user", None)
if login_user:
self.write(login_user)
else:
self.redirect('/login') class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.current_user() self.render('login.html', **{'status': ''}) def post(self, *args, **kwargs): username = self.get_argument('name')
password = self.get_argument('pwd')
if username == 'wupeiqi' and password == '123':
self.set_secure_cookie('login_user', '武沛齐')
self.redirect('/')
else:
self.render('login.html', **{'status': '用户名或密码错误'}) settings = {
'template_path': 'template',
'static_path': 'static',
'static_url_prefix': '/static/',
'cookie_secret': 'aiuasdhflashjdfoiuashdfiuh'
} application = tornado.web.Application([
(r"/index", MainHandler),
(r"/login", LoginHandler),
], **settings) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

二、session

  • cookie保存单一键值对,session保存多个键值对

  • cookie是保存在客户端上,session是保存在服务端

  • session是基于cookie人为构建的

  • session在服务端存储类似于字典样式的结构,可以存在全局变量,数据库,文件,memcached radis,但是不能放在局部变量里

  1、面向对象基础

  • 面向对象中通过索引的方式访问对象,需要内部实现__getitem__、__delitem__、__setitem__方法

class Foo(object):

    def __getitem__(self, key):
print('__getitem__',key) def __setitem__(self, key, value):
print('__setitem__',key,value) def __delitem__(self, key):
print('__delitem__',key) obj = Foo()
result = obj['k1']
#obj['k2'] = 'wupeiqi'
#del obj['k1']

  2、Tornado扩展

  • Tornado框架中,默认执行Handler的get/post等方法之前默认会执行initialize方法,所以可以通过自定义的方式使得所有请求在处理前执行操作..
class BaseHandler(tornado.web.RequestHandler):

    def initialize(self):
self.xxoo = "wupeiqi" class MainHandler(BaseHandler): def get(self):
print(self.xxoo)
self.write('index') class IndexHandler(BaseHandler): def get(self):
print(self.xxoo)
self.write('index')

  3、自定义session

import tornado.ioloop
import tornado.web
from hashlib import sha1
import os, time #将session以全局变量的形式保存
session_container = {} #创建cookie_str随机字符串 的函数
create_session_id = lambda: sha1('%s%s' % (os.urandom(16), time.time())).hexdigest() class Session(object): #静态字段--session key名
session_id = "__sessionId__" def __init__(self, request):
#尝试获取__sessionId__
session_value = request.get_cookie(Session.session_id)
if not session_value:
#获取失败,就创建随机字符串
self._id = create_session_id()
else:
#成功---拿值
self._id = session_value
#最后设置cookie---"__sessionId__:随机字符串"
request.set_cookie(Session.session_id, self._id) def __getitem__(self, key):
return session_container[self._id][key] def __setitem__(self, key, value):
if session_container.has_key(self._id):
session_container[self._id][key] = value
else:
session_container[self._id] = {key: value} def __delitem__(self, key):
del session_container[self._id][key] class BaseHandler(tornado.web.RequestHandler): def initialize(self):
# my_session['k1']访问 __getitem__ 方法
#实例session对象,实现索引访问
self.my_session = Session(self) class MainHandler(BaseHandler): def get(self):
print(self.my_session['c_user'])
print(self.my_session['c_card'])
self.write('index') class LoginHandler(BaseHandler): def get(self):
self.render('login.html', **{'status': ''}) def post(self, *args, **kwargs): username = self.get_argument('name')
password = self.get_argument('pwd')
if username == 'wupeiqi' and password == '123': self.my_session['c_user'] = 'wupeiqi'
self.my_session['c_card'] = '12312312309823012' self.redirect('/index')
else:
self.render('login.html', **{'status': '用户名或密码错误'}) settings = {
'template_path': 'views',
'static_path': 'static',
'static_url_prefix': '/static/',
'cookie_secret': 'aiuasdhflashjdfoiuashdfiuh',
'login_url': '/login'
} application = tornado.web.Application([
(r"/index", MainHandler),
(r"/login", LoginHandler),
], **settings) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

cookies与session的更多相关文章

  1. Cookies和Session的区别

    原文:http://www.cnblogs.com/lijihong/p/4743818.html 今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一 ...

  2. Cookies和Session理论总结

    今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Sessi ...

  3. Cookies 和session

    一 会话跟踪 在一个会话的多个请求中共享数据,这就是会话跟踪技术 请求登录(请求参数是用户名和密码): 请求转账(请求参数与转账相关的数据): 请求信誉卡还款(请求参数与还款相关的数据). 登录信息在 ...

  4. 18、cookies与session学习笔记

    本文记录学习 cookies 和 session 的一些小练习和知识点   知识点1    cookies 和 session 的由来   HTTP协议是无状态的协议,因为一旦浏览器和服务器之间的请求 ...

  5. cookies和session

      基于cookies做用户验证时,敏感信息不适合放在cookies中 cookies保存在客户浏览器端的键值对 session保存在服务器端的键值对(依赖于cookies),把用户浏览器中的cook ...

  6. django cookies与session

    1. cookiies # cookies def login(request): print('COOKIES',request.COOKIES) print('SESSION',request.s ...

  7. 有关cookies与session的详细信息

    COOKIES与SESSION 详细信息参考:https://www.cnblogs.com/linguoguo/p/5106618.html 会话(Session)跟踪是Web程序中常用的技术,用来 ...

  8. django中cookies和session

    django中cookies和session是两个经常使用的用户认证工具.都是类似于字典的数据类型,都是request的内部属性 cookies的读写方法 cookies读,比如username us ...

  9. asp.net网站防恶意刷新的Cookies与Session解决方法

    本文实例讲述了asp.net网站防恶意刷新的Cookies与Session解决方法,是WEB程序设计中非常实用的技巧.分享给大家供大家参考.具体实现方法如下: Session版实现方法: public ...

  10. Cookies和Session的定义与区别

    Cookies和Session二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网 ...

随机推荐

  1. CentOS7:gdb出现没有调试信息:Missing Separate debuginfos

    现在刚刚开始学习用gdb调试程序,结果:在centos下,出现这样的错误: gdb在调试程序时候提示 Missing separate debuginfos, use: debuginfo-insta ...

  2. 【JS设计模式】装饰者模式

    装饰者模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象 装饰模式的特点 (1) 装饰对象和真实对象有同样的接口.这样clien ...

  3. 李洪强IOS经典面试题 33-计算有多少个岛屿

    李洪强IOS经典面试题 33-计算有多少个岛屿 问题 在一个地图中,找出一共有多少个岛屿. 我们用一个二维数组表示这个地图,地图中的 1 表示陆地,0 表示水域.一个岛屿是指由上下左右相连的陆地,并且 ...

  4. SqlServer2005删除实例

    控制面板->选中“SQL Server 2005”卸载,卸载的时候可以选择实例.

  5. SQLi-Labs学习笔记

    结构化查询语言,也叫做SQL,从根本上说是一种处理数据库的编程语言.对于初学者,数据库仅仅是在客户端和服务端进行数据存储.SQL通过结构化查询,关系,面向对象编程等等来管理数据库.编程极客们总是搞出许 ...

  6. 浅谈myeclipse2015做cordova/phonegap开发

    近期公司项目经理要求用cordova写安卓程序,之前对cordova什么都不懂,然后从网上搜啊搜,好歹有所了解了,感觉做web开发的比較合适,属于三种开发模式的第三种. myeclipse2015有个 ...

  7. jQuery中jsonp的跨域处理,no access-control-allow-origin,unexpected token

    引言 ajax跨域就无法成功获取数据了,需要通过jsonp来处理 报错如下 1.改为jsonp var targeturl = ajaxurl+"?g=Api&m="+m+ ...

  8. 【转】redis C接口hiredis 简单函数使用介绍

    from : http://blog.csdn.net/kingqizhou/article/details/8104693 hiredis是redis数据库的C接口,目前只能在linux下使用,几个 ...

  9. Windows动态库的使用 part one

    二.动态库程序 这篇写得比较乱,看不懂的可以跳part 2,直接上图片的.   动态库的使用: 4.3.1 隐式链接 动态库的隐式连接,需要动态库的 动态库文件".dll" , 动 ...

  10. Android一键锁屏源码

    APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...