Cookie&Session机制详解
来源:互联网 发布:mac怎么切换输入法 编辑:程序博客网 时间:2024/06/11 09:23
1.会话技术简介
(1) 存储客户端的状态
由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态。
(2) 会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie.
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力 .
2. Cookie:
(1) Cookie 机制采用的是在客户端保持 HTTP 状态信息的方案
(2) Cookie:
① Cookie 是在浏览器访问 WEB 服务器的某个资源时,由 WEB 服务器在 HTTP 响应消息头中附带传送给浏览器的一个小文本文件。
② 一旦 WEB 浏览器保存了某个 Cookie,那么它在以后每次访问该 WEB 服务器时,都会在 HTTP 请求头中将这个 Cookie 回传给 WEB 服务器。
③ 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
④ 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
(3) API:
//1. 创建一个 Cookie 对象Cookie cookie = new Cookie("cookieKey","cookieVal");//2. 把该 Cookie 对象回传给客户端浏览器response.addCookie(cookie);
//1. 获取 Cookie. 只能获取所有的 Cookie. 即一个 Cookie 的数组Cookie[] cookies = request.getCookies();//2. 获取具体的 Cookie 信息.for(int i = 0; i < cookies.length; i++){ Cookie cookie = cookies[i]; String name = cookie.getName(); String val = cookie.getValue();}(4) 关于 Cookie 的两个比较重要的 API:
① setMaxAge(): 设置 Cookie 的有效时间. 单位为 秒.
设置为 0, 则删除该 Cookie
设置为 负数, 表示不再浏览器端的磁盘上存储该 Cookie
设置为 正数, 表示存储的时间.
②setPath(): 设置 Cookie 的有效路径.
默认情况下, 该 Cookie 仅适用于当前路径及当前路径的子路径
可以调用 setPath() 方法来设置 Cookie 的有效路径.
(5) 使用 Cookie 实现简单免登陆的功能:
有一个登陆页面. 输入用户名和密码之后, 提交到一个 Servlet 或 JSP, 在服务端比对 username 和 password. 若正确, 则登陆成功. 响应成功页面: success.jsp.
关闭浏览器后, 直接访问 success.jsp, 正常情况下, 先查询是否有输入的 username 和 password, 若没有则重定向到登陆页面, 要求输入用户名和密码.
若使用了 Cookie 的免登陆功能, 则: 检查是否有和登陆相关的 Cookie 传过来, 若有, 则验证从 cookie 中获取 username 和 password, 进行比对,若比对成功, 则免登陆.
注意: 实际上, 浏览器可以选择不再接受服务器端的 Cookie. 则意味着没有办法进行回传. 此时网上购物, 登陆信箱都会失效.
//在Login.jsp页面中:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <form action="success.jsp" method="POST"> Username: <input type="text" name="username"/> <br> Password: <input type="password" name="password"/> <br> <input type="submit" value="Submit"/> </form></body></html>
//在Success.jsp页面中:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <h4>Success Page</h4> <% String username = request.getParameter("username"); String password = request.getParameter("password"); //若 username 和 password 都是 null, 则尝试从 request 中来获取 Cookie if(username == null && password == null){ Cookie [] cookies = request.getCookies(); //out.println("Cookie 数组的长度:" + cookies.length); //out.print("<br>"); //取出需要的 Cookie. 只能通过遍历的方式, 根据 Cookie 的 name 进行筛选。 if(cookies != null && cookies.length > 0){ for(Cookie cookie: cookies){ String name = cookie.getName(); if("username".equals(name)){ username = cookie.getValue(); } if("password".equals(name)){ password = cookie.getValue(); } } } } if("abc".equals(username) && "123".equals(password)){ out.print("登陆成功! welcome:" + username); //把用户名作为 Cookie 传回去. response.addCookie(new Cookie("username",username)); //把密码作为 Cookie 传回去. response.addCookie(new Cookie("password",password)); }else{ response.sendRedirect("login.jsp"); } %></body></html>
3.Session
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。
(1) 获得Session对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)
(2) 怎样向session中存取数据(session也是一个域对象)
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
(3) session生命周期
创建:第一次指定request.getSession();
销毁:服务器关闭、session失效/过期、手动session.invalidate();
session作用范围:默认一会话中
(4) 跟踪 HttpSession 对象的机制:
① 若第一个访问 WEB 应用的某一个需要 HttpSession 的页面, 此时服务端会创建一个新的 HttpSession 对象, 把 HttpSession 的 id 以一个 Cookie 的方式返回给客户端
② 在发送请求的时候, 根据 Cookie 的机制, 会自动的把当前的 Cookie 在传回去, 于是就自动的找到了先前的那个 HttpSession 对象
③ Cookie 的 name 值为 JSESSIONID
(5) Session 的应用
① 在登陆后, 存储用户的信息.
② 可以解决表单的重复提交.
③ 使用验证码: 原理和表单重复提交一模一样!
4.cookie 和session 的区别:
(1) cookie数据存放在客户的浏览器上,session数据放在服务器上。
(2) cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session。
(3) session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 ,考虑到减轻服务器性能方面,应当使用COOKIE。
(4) 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
(5) 所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
阅读全文
1 0
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- session/cookie机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Cookie/Session机制详解
- Tensorflow简介
- C#tablecontrol隐藏标题2种方法
- 后端服务性能压测实践
- Centos7.3开机自动启动或执行指定命令
- 算法系列(11)LeetCode136 Single Number
- Cookie&Session机制详解
- 微信小程序开发入门教程
- Qt/Qml工程转VS工程
- hdu1166 基础的线段树/树状数组问题
- 欧几里得几何(2)Beta
- python文件打开方式详解——a、a+、r+、w+区别
- 补充
- pyhton中SyntaxError:Missing parentheses in call to 'print'
- n位整数去掉m位后求最大值问题