会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话。
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1. 保存会话的两种技术
1.1 cookie
客户端技术
package com.zjb.cookie;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.Date;/** * 保存用户上一次访问的时间 */public class CookieDemoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //服务器端从客户端获取 Cookie[] cookies = req.getCookies(); //判断cookie是否存在 if(cookies!=null){ out.write("您上次访问的时间是:"); for (Cookie cookie : cookies) { //获取cookie的名字 if(cookie.getName().equals("lastLoginTime")){ //获取cookie的值 String value = cookie.getValue(); Date date = new Date(Long.parseLong(value)); out.write(date.toLocaleString()); } } }else{ out.write("这是您第一次访问本站"); } //服务器给客户端发送一个cookie Cookie cookie = new Cookie("lastLoginTime", String.valueOf(System.currentTimeMillis())); //设置cookie有效期为1天,单位: s cookie.setMaxAge(24*60*60); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
cookie:一般会保存在本地的用户目录下appdata;
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制4kb
- 300个cookie是浏览器上限
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0,就相当于删除了cookie
保存中文
package com.zjb.cookie;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import java.net.URLEncoder;public class UnicodeCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); Cookie[] cookies = req.getCookies(); if(cookies!=null){ out.write("您上次访问的名字:"); for (Cookie cookie : cookies) { if(cookie.getName().equals("username")){ //进行utf-8解码 String value = URLDecoder.decode(cookie.getValue(), "utf-8"); out.write(value); } } }else{ out.write("您是第一次访问"); } //URLEncoder.encode("张三","utf-8") 进行中文编码 Cookie cookie = new Cookie("username", URLEncoder.encode("张三","utf-8")); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
1.2 session
什么是session
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
- 用户登录之后,整个网站它都可以访问。例:保存用户信息,保存购物车信息
向session中存储信息
package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo01Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); //获取session HttpSession session = req.getSession(); session.setAttribute("name","小明"); //获取session的ID String sessionId = session.getId(); if(session.isNew()){ resp.getWriter().write("session创建成功,ID:"+sessionId); }else{ resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
从session获取信息
package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 从session中获取值*/public class SessionDemo02Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取session HttpSession session = req.getSession(); String name = (String)session.getAttribute("name"); System.out.println(name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
手动注销session
package com.zjb.session;import javax.servlet.ServletException;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo03Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取session HttpSession session = req.getSession(); //删除session中信息 session.removeAttribute("name"); //手动注销session session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
在web.xml中设置自动注销
<!-- 自动注销session 设置session默认的失效时间 --><session-config> <!-- 1分钟后自动失效 单位:分钟--> <session-timeout>1</session-timeout></session-config>
1.3、cookie和session的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上.
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
- 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
注意:
- session很容易失效,用户体验很差;
- 虽然cookie不安全,但是可以加密 ;
- cookie也分为永久和暂时存在的;
- 浏览器 有禁止cookie功能 ,但一般用户都不会设置;
- 一定要设置失效时间,要不然浏览器关闭就消失了;
两者最大的区别在于生存周期,一个是浏览器启动到浏览器关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)
Session信息是存放在server端,但session id是存放在client cookie的
Cookie是完全保持在客户端的
参考:https://www.cnblogs.com/l199616j/p/11195667.html