Cookie/Session(重要)
1. 概论
会话:浏览器从打开到关闭,建立一个会话
2. 保存会话期间信息的俩种技术
Cookie:
客户端技术(响应,请求)
第一次访问服务端向客户端发送Cookie信息,之后客户端每次请求(注意一次访问本身就是一次请求)都携带Cookie,直到会话结束 (会话级)或者生命周期完结(持久级)。
Session(更重要):
服务端技术
服务器中存储Session信息,每个Session有个SessionID,服务器把SessionID保存在Cookie中,客户端每次请求携带Cookie,通过SessionID 得到Session信息。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
3. Cookie详解
3.1 介绍
-
cookie机制采用的是在客户端保持 HTTP 状态信息的方案。当浏览器访问WEB服务器的某个资源时,WEB服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件可理解为cookie域(键值对的集合),往后每次访问某个网站时,都会在请求头中带着这个网站的所有cookie值。(至于怎么区分不同网站的cookie的,很简单,每个网站都给他一个唯一标识比如网址等,每次打开某网址时,就查询该网站下的所有cookie值即可。)
-
简单来说Cookie就是服务端用来保存一些信息(K-V形式键值对)在客户端(浏览器里),一般的Cookie生命周期是一个会话,但也可以设置生命周期使得Cookie存在时间变长。
-
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
3.2 Cookie类使用
注意:一个Cookie只能存储一个信息(一个键值对),而且Cookie只能存String类型的数据(有局限性)
/* 常见方法 */ Cookie[] cookies = req.getCookies(); //从请求获取所有Cookie信息,返回Cookie数组 cookie.getName() //获取Cookie的名称(key) cookie.getValue(); //获取Cookie的值(value) resp.addCookie(cookie);//从响应添加Cookie Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//创建cookie,一个Cookie一个信息 cookie.setMaxAge(24 * 60 * 60); //设置cookie的有效期,秒为单位
3.3 删除Cookie
Cookie类中没有直接删除的操作,但是可以通过添加相同的Cookie(除了value和maxAge不一样)并设置生命周期(setMaxAge)为0,此时这个Cookie会覆盖原Cookie,从而达到删除Cookie的目的
3.4 Cookie保存中文信息乱码问题
使用Cookie保存中文可能会出现乱码问题使用URLEncode类和URLDecoder类解决问题
Cookie cookie = new Cookie("item1", URLEncoder.encode("中文信息", "UTF-8")); String decode = URLDecoder.decode(cookie.getValue(), "UTF-8");
4. Session详解
4.1 简单介绍
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
4.2 工作原理
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。所以生命周期一般在一个会话。
4.3 HttpSession接口的使用
public class SessionDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession();//从请求获取Session session.setAttribute("item1","520");//设置属性 session.setAttribute("item2",new Rectangle(5,20));//值可以是Object if (session.isNew()){//判断Session是否已经创建了 resp.getWriter().write("session 创建成功,ID"+session.getId()); }else { resp.getWriter().write("session 已经存在了"+session.getId()); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
//在Demo02中 HttpSession session = req.getSession();//从请求获取Session session.getAttribute("item1");//此时从另一个servlet程序获取值,实现了数据共享(Cookie也行),而不是用ServletContext session.getAttribute("item2"); session.removeAttribute("item1");//删除属性 session.invalidate();//注销,也可以在web.xml中配置
<!-->注销Session,节省服务器资源,再次访问会再次分配一个新的Session</!--> <session-config> <session-timeout>1</session-timeout><!-->分钟为单位</!--> </session-config>
5. Cookie和Session的异同
两者的区别:在安全和性能方面考虑
-
Cookie数据存放在客户端,Session数据放在服务器上。
-
Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用Session。
-
Session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用Cookie。
-
不同浏览器对Cookie的数据大小限制不同,个数限制也不相同。单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
-
可以考虑将登陆信息等重要信息存放为Session,不重要的信息可以放在Cookie中。
-
就java而言,Cookie存储的是String,Session存储的是Object
两者的联系:
1、都是用来记录用户的信息,以便让服务器分辨不同的用户。
2、可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。