解析session与cookie

Session和Cookie相关概念

  • Session和Cookie都是有服务器生成的。
  • Session和Cookie都是键值对形式保存,主要用于存储特定的一些状态值。
  • Session保存在服务器,Cookie保存在客户端。通常来说,Session的ID会以Cookie的形式返回给客户端的。
  • Session和Cookie都是有生命周期的。Cookie的生命周期受到Cookie自身的有效期和客户端的影响,一般来说,浏览器(客户端)是会自动将存活的Cookie封装在请求头里面,向服务器发送。如果Cookie有效期过期或客户端清理了Cookie,则发送的请求中就没有Cookie值;Session的生命周期受到Session自身的有效期和客户端是否关闭的影响。SessionID虽然是已Cookie的形式返回给客户端,但是它是不受客户的Cookie容器的管理,而是和客户端进程有关,即客户端进程不关闭,一般Session在客户端就不会失效。
  • Session和Cookie都是有作用域的。

实例演示:以cookie记录用户状态

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录Session与Cookie</title>
    <link rel="stylesheet"
          href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    {% if username %}
        <h2>欢迎您 :{{ username }}</h2>
        <a href="/logout/">注销</a>
    {% else %}
        <form action="/login_cookie/" method="post">
            {% csrf_token %}
            <div class="form-group">
                <label class="sr-only">username</label>
                <input type="text" class="form-control" name="username"
                       placeholder="用户名"/>
            </div>
            <div class="form-group">
                <label class="sr-only">Password</label>
                <input type="password" class="form-control" name="passwd"
                       placeholder="密码"/>
            </div>
            <div class="form-group">
                <input class="btn btn-primary" type="submit" value="Submit">
            </div>
        </form>
    {% endif %}

</div>
<script type="application/javascript"
        src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="application/javascript"
        src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

login/views.py

from django.shortcuts import render

# Create your views here.

def login_cookie(request):
    # 从Cookie中获取用户名
    username = request.COOKIES.get("username", False)
    response = render(request, ‘login.html‘, locals())
    # 如果POST表单,进行登录验证
    if request.method == "POST":
        username = request.POST[‘username‘]
        pwd = request.POST[‘passwd‘]
        if username == ‘ptqa‘ and pwd == ‘4399‘:
            response = render(request, ‘login.html‘, locals())
            # 设置Cookie
            response.set_cookie("username", username)
    return response

step1:首次访问http://127.0.0.1:8000/login_cookie/   可以观察到 Request headers 中没有Cookie,处于未登录状态

step2:登录后(输入账号名ptqa,密码4399)自动跳转首页,此时可以观察到,在Response Headers 中存在Set-Cookie:username=ptqa; Path=/

step3:此时,刷新页面或新开窗口访问http://127.0.0.1:8000/login_cookie/ 可观察到请求中的Request Headers 中自动带上 Cookie:username=ptqa; 页面处于已登录状态。

显然,通过cookie的方式验证用户登录容易被破解,如下使用jmeter篡改Cookie值,则同样可以进入已登录状态显示界面,如下

实例演示:以Session记录用户状态

 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录Session与Cookie</title>
    <link rel="stylesheet"
          href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    {% if username %}
        <h2>欢迎您 :{{ username }}</h2>
        <a href="/logout/">注销</a>
    {% else %}
        <form action="/login_session/" method="post">
            {% csrf_token %}
            <div class="form-group">
                <label class="sr-only">username</label>
                <input type="text" class="form-control" name="username"
                       placeholder="用户名"/>
            </div>
            <div class="form-group">
                <label class="sr-only">Password</label>
                <input type="password" class="form-control" name="passwd"
                       placeholder="密码"/>
            </div>
            <div class="form-group">
                <input class="btn btn-primary" type="submit" value="Submit">
            </div>
        </form>
    {% endif %}

</div>
<script type="application/javascript"
        src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="application/javascript"
        src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

login/views.py

from django.shortcuts import render, redirect

# Create your views here.

def login_session(request):
    # 从Session中获取用户名
    username = request.session.get(‘username‘, False)
    # 如果POST表单,进行登录验证
    if request.method == "POST":
        username = request.POST[‘username‘]
        pwd = request.POST[‘passwd‘]
        if username == ‘ptqa‘ and pwd == ‘4399‘:
            # 设置Session
            request.session[‘username‘] = username
            # request.session.set_expiry(300) #会让 Session 在五分钟后过期

    # 登录不成功或第一访问就停留在登录页面
    return render(request, ‘login.html‘, locals())

def logout(request):
    if "username" in request.session:
        del request.session[‘username‘]
    return redirect("/login_session/")

step1:首次访问http://127.0.0.1:8000/login_session/ 可观察到Request Headers 中并没有sessionId 并且处于未登录状态

step2:登录,输入账号ptqa,密码4399 ,在Response Headers 中可以观察到存在 Set-Cookie:sessionid=qigvbt2ckkcc5rydr46dehzjryg0mh41;

step3:重新刷新页面或新开窗口,则观察到在Request Headers 中带有Cookie Sessionid,并且处于登录状态。

显然,这种使用sessonid的方式比较安全,如果篡改sessionid,则无法进行登录。如下:

时间: 2024-11-02 23:00:08

解析session与cookie的相关文章

Session与Cookie解析

Session和Cookie这两个对象也接触了比較长的时间了,今天就来总结一下. 首先,他们都是会话跟踪中经常使用的技术.Cookie在client记录信息来确定用户身份,Session在服务端记录信息来确定用户. 这篇文章将系统解说Cookie与Session的机制.使用场景和实例. Cookie机制: Cookie的产生:当两个用户都用訪问了同一个购物站点,訪问结束关闭浏览器后,假设用http协议传输Web数据,client和server的连接就关闭了,此时不能保存会话状态. 也就是说假设用

Session 与 Cookie

Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们本身只是HTTP中的一个配置项,在servlet规范中也只对应一个类而已. 理解 Cookie 通俗地说就是当一个用户通过 HTTP 协议访问一个服务器的时候,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器的时候,数据又被完整地带回给服务器.W3C 在设计 Cookie 时实际上考虑的是为了记录用户在一段时间内访问 Web

Session,Cookie,jsessionid,Url重写

在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码: < % cookie[]cookies = request.getCookies(); if (cookies.lenght == 0 || cookies == null){ doStuffForNewbie(); //没有访问过 }else{ doStuffForReturnVisitor(); //已经访问过了 } % > 这是很浅显

ASP.Net篇之Session与Cookie

Session: Session是“会话”的意思,然而,因为http协议是无状态的,那么每次客户端请求服务器端,服务器端都会以“崭新”的页面展示给客户端,这在静态的html页面中是不会存在任何影响,但是在动态页面中,需要与用户交互,要保持与客户端用户的联系,则需要一些东西来保持,而Session的话,则是具有“保持状态,保持会话”的能力. 注意的是,Session是保存在服务器端的.(Cookie是保存在客户端的)需要注意的是,如果用户突然关闭了客户端页面,那么Session就会丢失,即“会话丢

SESSION和cookie的使用和区别

PHP中SESSION和cookie的使用和区别 cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制. PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似. 1.1 设置cookie: 可以用 setcookie() 或 setrawcookie() 函数来设置 cookie.也可以通过向客户端直接发送http头来设置. 1.1.1 使用setcookie()函数设置

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的.所以就有了此篇文章啦. 文章结构:(1)Servlet过滤器Filter:(2)SpringMVC的HandlerInterceptor:(3)对比认知. 一.Servlet过滤器Filter: 此部分是从赵四大佬那里学来的,并补充自己的认知 (1)概念: 能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,它只能

【转】session和cookie详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个

Session和Cookie的关系

Session和Cookie关系 两者构建了web的回话数据 Cookie作为客户端的回话,Session为服务器端的 共同点: 都是1对1的,(一个客户一个独立的回话) 都以键值对的方式存储数据 都有过期时间 不同点 cookie存储在浏览器中(内存或硬盘),每次请求时传送至服务器,消耗流量 session储存在服务器端,每次客户请求时,服务器根据票据标识从内存取出,消耗内存,(也可以设置为将信息转化为cookie存储,请求时再解析转为Session对象),还可以存储在数据库,缓存, Cook

网络协议-----session与cookie

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