Cookie and Session

一 概念

1、什么是会话

       指一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程
    (1)客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
    (2)使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。
    (3)为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。关于Cookie和Session的相关知识,将在下面的小节进行详细讲解。

二 Cookie

1、概念

      浏览器端的会话技术,通过在浏览器中记录一些服务器传递过来的数据,解决会话从什么时候开始,到什么时候结束。
2、应用场景

    2.1 记住用户名
    2.2 自动登录(记住用户名和密码)
3、API

    3.1 Cookie:
        Cookie(String name, String value)
        创建Cookie对象
        String getName()
        获取Cookie的名称
        String getValue()
        获取Cokkie的值
        void setPath(String uri)
        设置Cookie的路径--浏览器根据这个路径判断哪些Cookie要发送给服务器
    3.2 HttpServletResponse
        void addCookie(Cookie cookie)
        将Cookie发送给浏览器
    3.3 HttpServletRequest
        Cookie[] getCookies()
        获取浏览器发送的Cookie
    注:
        1) Cookie主要是通过名称和路径来确定唯一性的
            例如:
            /day04/a/b/cookie1
            /day04/a/cookie1
            虽然名称一样,因为路径不同,所以两个cookie可以同时存在
        2) 如果路径和名称一样,后添加的Cookie将覆盖前者
4、 Cookie 分类

    4.1 会话级别Cookie:
        默认的,关闭了浏览器Cookie就销毁了
    4.2 持久级别Cookie:
        可以设置指定Cookie在浏览器的存活时间,Cookie就不会随着浏览器关闭而销毁了。
    4.3 API
        void setMaxAge(int expiry)
        设置Cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
        注:1)当时间为0的时候,意思为立即删除此Cookie(前提:path和name必须一致)
            2)要删除已经存在的cookie,用来覆盖的cookie的名称与路径必须与原来的cookie一致
            3)expiry 大于 0 倒计时;=0删除cookie;小于零 会话级
           4)tomcat8允许中文,之前版本不支持(不要出现中文和任何符号)
           5)2、3、4规则:每台Web服务器(一个网站)有20个cookie(不精准);一个浏览器最多存储300个cookies(不精准),大小 4kb
    4.4 注意事项
        给Cookie添加数据的时候需要注意数据的内容,在cookie值中不能使用分号、逗号、空格。会出现异常:
        java.lang.IllegalArgumentException:
        An invalid character [32] was present in the Cookie value
    cookie对于基本符号、数字和字母是可以存储的,因此只需要将非法数据转换成符号、数字和字母形式存储,要使用的时候再转换成正常的数据(解码)即可。
    4.5 对数据进行 编码 与 解码的API
        1) URLEncoder类:
            static String encode(String s,String enc)
            将指定的字符串,按指定的编码表编码
        2) URLDecoder类:
            static String decode(String s, String enc)
            将指定的字符串,按指定的编码表解码

三 Session

1、概念

    当浏览器访问服务器时,Sevlet容器会创建一个Session对象和ID属性,以便后续客户端再次访问服务器时,判断是哪个客户端发送的,并选择与之对应的Session对象
    通常Session是借助Cokkie技术来传递ID属性的。
2、session 与 cookie 的区别

                    cookie              session
会话数据保存的位置       浏览器                 服务器
数据的安全性          不安全                 安全
存储数是否有限制            有                   无
​
3、引用场景

    3.1 保存购物车数据
    3.2 保存用户浏览器记录数据
    3.3 保存用户登录信息数据
    3.4 保存验证码
4、API

    4.1 HttpServletRequest
            HttpSession getSession()
            获取session对象
    4.2 HttpSession
            void setAttribute(String name, Object value)
            在session中保存数据
            Obeject getAttribute(String name)
            从session中获取数据
            void removeAttribute(String name)
            从session中移除数据

 

以下是使用cookie跟踪session的示例代码: ```python from flask import Flask, request, make_response app = Flask(__name__) # 设置一个随机的密钥作为cookie的加密密钥 app.secret_key = 'random_secret_key' @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # 获取用户提交的用户名和密码 username = request.form['username'] password = request.form['password'] # 验证用户名和密码是否正确 if username == 'admin' and password == 'password': # 如果验证通过,设置session变量 session['username'] = username return 'Logged in successfully!' else: return 'Invalid username or password' # 如果是GET请求,返回登录页面 return ''' <form method="post"> <p><input type="text" name="username"></p> <p><input type="password" name="password"></p> <p><input type="submit" value="Login"></p> </form> ''' @app.route('/profile') def profile(): # 检查session变量是否存在 if 'username' in session: return 'Hello, ' + session['username'] + '!' else: return 'You are not logged in' @app.route('/logout') def logout(): # 删除session变量 session.pop('username', None) return 'Logged out successfully!' # 设置cookie的过期时间为1小时 @app.before_request def make_session_permanent(): session.permanent = True app.permanent_session_lifetime = timedelta(hours=1) if __name__ == '__main__': app.run() ``` 在这个示例中,我们使用Flask框架来处理HTTP请求和响应。当用户登录时,我们设置了一个名为`username`的session变量,它存储用户的用户名。我们还设置了一个cookie,它包含了加密后的session ID,以便在后续的请求中识别用户。使用`session.pop()`函数可以删除session变量并在用户注销时从cookie中删除session ID。我们还使用了`before_request`钩子来设置cookie的过期时间,以便在一段时间后自动注销用户。 请注意,在实际应用中,您需要更加精细地控制cookiesession的设置,以确保系统的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值