会话技术Cookie&Session
Posted icehand1214
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话技术Cookie&Session相关的知识,希望对你有一定的参考价值。
一、会话技术简介
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为为一次会话。
因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
Cookie:数据存储在客户端,减少服务器端的存储压力,安全性不好,客户端可以清除cookie。
Session:将数据存储在服务器端,增加服务器的压力,安全性相对较好。
二、Cookie技术
Cookie技术是将用户的数据存储到客户端的技术。
1 . 服务器端向客户端发送一个Cookie
1)创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
注意:Cookie中不能存储中文
2)设置Cookie在客户端的持久化时间:
cookie.setMaxAge(int seconds); (单位:秒)
注意:cookie默认是会话级别,存储在浏览器的内存中,浏览器关闭,cookie销毁。
设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,在持久化时间内,关闭浏览器cookie信息不会被销毁。
示例:
cookie.setMaxAge(10*60); // 设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息
3)设置Cookie的携带路径:
cookie.setPath(String path);
注意:如果不设置携带路径,默认该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
示例:
cookie.setPath("/"); // 代表访问服务器下的所有的资源都携带这个cookie cookie.setPath("/WEB16"); // 代表访问WEB16应用中的任何资源都携带这个cookie cookie.setPath("/WEB16/cookieServlet"); // 代表访问WEB16中的cookieServlet时才携带这个cookie
4)向客户端发送Cookie:
response.addCookie(Cookie cookie);
发送Cookie完整代码:
1 //1.创建cookie对象 2 Cookie cookie = new Cookie("username", "zhangsan"); 3 //2.为cookie设置持久化时间 4 cookie.setMaxAge(10 * 60);//10分钟 5 //3.为cookie设置携带的路径 6 cookie.setPath("/WEB16");//代表访问WEB16应用中的任何资源都携带该cookie 7 //4.将cookie发送到客户端 8 response.addCookie(cookie);
该cookie会以响应头的形式发送给客户端:
2 . 服务器端怎么接收客户端携带的Cookie
1)通过request获得所有的Cookie:
Cookie[] cookies = request.getCookies();
2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
接收Cookie完整代码:
1 //获得客户端携带的所有cookie 2 Cookie[] cookies = request.getCookies(); 3 //遍历cookie数组 4 if (cookies != null) { 5 for (Cookie cookie : cookies) { 6 //获得cookie的名称 7 String cookieName = cookie.getName(); 8 if (cookieName.equals("username")) { 9 //获得该cookie的值 10 String cookieValue = cookie.getValue(); 11 System.out.println(cookieValue); 12 } 13 } 14 }
3 . 删除客户端的Cookie
如果想删除客户端的cookie信息,那么就使用同名、同路径、持久化时间为0的cookie进行覆盖即可。
删除Cookie完整代码:
1 Cookie cookie = new Cookie("username", ""); // 同名 2 cookie.setPath("/WEB16"); // 同路径 3 cookie.setMaxAge(0); // 设置持久化时间为0 4 5 response.addCookie(cookie);
案例:记录用户的上次访问时间(Cookie技术)
1 package com.boss.lastaccesstime; 2 3 import java.io.IOException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.Cookie; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 public class LastAccessTimeServlet extends HttpServlet { 14 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws ServletException, IOException { 17 18 // 获得当前时间 19 Date date = new Date(); 20 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 21 String currentTime = format.format(date); 22 23 // 创建cookie记录当前的最新的访问时间 24 Cookie cookie = new Cookie("lastAccessTime", currentTime); 25 cookie.setMaxAge(60 * 10 * 500); 26 response.addCookie(cookie); 27 28 // 获得客户端携带的cookie 29 String lastAccessTime = null; 30 Cookie[] cookies = request.getCookies(); 31 if (cookies != null) { 32 for (Cookie coo : cookies) { 33 if ("lastAccessTime".equals(coo.getName())) { 34 lastAccessTime = coo.getValue(); 35 } 36 } 37 } 38 39 response.setContentType("text/html;charset=UTF-8"); 40 if (lastAccessTime == null) { 41 response.getWriter().write("您是第一次访问"); 42 } else { 43 response.getWriter().write("您上次的访问的时间是:" + lastAccessTime); 44 } 45 46 } 47 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) 49 throws ServletException, IOException { 50 doGet(request, response); 51 } 52 }
三、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()时创建
何时销毁:
1)服务器(非正常)关闭时
2)手动销毁session
session.invalidate();
3)session过期/失效(默认30分钟)
时间的起算点:从最后一次操作服务器端的资源开始计时
可以在web.xml中进行配置:
<session-config> <session-timeout>30</session-timeout> </session-config>
作用范围:默认在一次会话中,也就是说,在一次会话中任何资源公用一个session对象
示例代码:
1 package com.boss.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 public class SessionServlet1 extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 //第一次访问为该会话创建一个新的Session 17 HttpSession session = request.getSession(); 18 19 session.setAttribute("name", "jerry"); 20 21 String id = session.getId(); 22 23 response.getWriter().write("JSESSIONID:" + id); 24 25 } 26 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException { 29 doGet(request, response); 30 } 31 }
1 package com.boss.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 public class SessionServlet2 extends HttpServlet { 12 13 protected void doGet(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 //已经存在直接获取 17 HttpSession session = request.getSession(); 18 19 Object attribute = session.getAttribute("name"); 20 21 response.getWriter().write(attribute + ""); 22 23 } 24 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 doGet(request, response); 28 } 29 }
先访问SessionServlet1:
再访问SessionServlet2:
此时,如果关闭浏览器,再访问SessionServlet2:
这是因为cookie默认是会话级别,在未设置持久化时间的情况下,关闭浏览器,cookie销毁了(JSESSIONID丢了),因此访问不到之前的session。
可以手动创建一个存储JSESSIONID的cookie并设置持久化时间从而达到对session的持久化。
修改SessionServlet1:
1 package com.boss.session; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.servlet.http.HttpSession; 11 12 public class SessionServlet1 extends HttpServlet { 13 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 17 //第一次访问为该会话创建一个新的Session 18 HttpSession session = request.getSession(); 19 20 session.setAttribute("name", "jerry"); 21 22 String id = session.getId(); 23 24 //手动创建一个存储JSESSIONID的cookie 25 Cookie cookie = new Cookie("JSESSIONID", id); 26 cookie.setPath("/WEB16"); 27 cookie.setMaxAge(60 * 10); 28 29 response.addCookie(cookie); 30 31 response.getWriter().write("JSESSIONID:" + id); 32 33 } 34 35 protected void doPost(HttpServletRequest request, HttpServletResponse response) 36 throws ServletException, IOException { 37 doGet(request, response); 38 } 39 }
再次尝试先访问SessionServlet1,再访问SessionServlet2,然后关闭浏览器,再打开浏览器访问SessionServlet2,可以正常返回。
面试题:
1 . 浏览器关闭,Session就销毁了?
不对
2 . Session访问不到了有哪几种情况?
1)cookie被清除了(JSESSIONID丢了)
2)session过期了(默认30分钟)
3)服务器关闭(session销毁了)
4)cookie默认是会话级别,当cookie没有设置持久化时间时,浏览器关闭保存原JSESSIONID的cookie就没有了,此时session也访问不到了(JSESSIONID丢了)
以上是关于会话技术Cookie&Session的主要内容,如果未能解决你的问题,请参考以下文章