cookies与session

一、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()
时间: 2024-10-24 08:55:03

cookies与session的相关文章

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

本文实例讲述了asp.net网站防恶意刷新的Cookies与Session解决方法,是WEB程序设计中非常实用的技巧.分享给大家供大家参考.具体实现方法如下: Session版实现方法: public double time; public const int freetime = 1;//防刷冰冻时间间隔,当前为1秒 #region 防恶意刷新 if (Session.SessionID == null) {   Response.End(); } else if (Session["sion

关于Cookies与Session系列一

这两个东西,最近项目操作的比较少,不过这两个在Web项目开发中一直都扮演着很重要的角色,有时有些细节会不小心就遗忘掉. Cookies  的概述 Cookies是由服务器端生成,发送给客户端,用来保存一些数据文本文件.在用户进行网页浏览时,这家伙会在客户端与服务器之前传递,常用作身份的验证.用户会话识别或存储小型数据.由于cookies是保存在客户端,那么就意味着用户可以修改和读取,因此有人利用木马.病毒窃取用户Cookies并获得用户信息,所以,作为开发人员,Cookies不适合保存重要或者涉

Cookies和Session的定义与区别

Cookies和Session二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 ema

Cookies和Session的区别

原文:http://www.cnblogs.com/lijihong/p/4743818.html 今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Session?②为什么要用Cookies和Session:③Session什么情况下被销毁.下一篇文章将以Java为例,简单实践一下. 1. 什么是Cookies,什么是Session? 关于这两个概念,很多

Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 Cookies.Session.Request是专门针对WEB项目的额外支持. 顺便说下,今天有园友在群里问到ORM对MVC的支持.或者对WinForm支持吗?对于ORM来说,本身是对表现层没有任何的联系.它仅仅是让你在开发的时候,能以面向对象的思想(语法)去做

浅析http协议、cookies和session机制、浏览器缓存

http协议中headers,cookies.session.缓存等相关知识,发现些新知识点. 这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分. 一.http headers           NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应返回数据. 每次请求都有头部和实体部分,先看下面笔者监听QQ空间的headers,QQ空间的原因是它头部内容比较全 ? 1 2 3 4 5 6 7 8

cookies与session的区别

HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id

有关cookies与session的详细信息

COOKIES与SESSION 详细信息参考:https://www.cnblogs.com/linguoguo/p/5106618.html 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie

Cookies和Session的区别和理解

Cookies和Session的区别和理解 cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范.网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies . 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用

django cookies与session

1. cookiies # cookies def login(request): print('COOKIES',request.COOKIES) print('SESSION',request.session) if request.method =='POST': name = request.POST.get('user') pwd = request.POST.get('pwd') if name =='bob' and pwd =='123': ret = redirect('/AP