- 会话
- 有状态会话
- 保存会话的两种技术
- cookie
- session
- 常见场景
- Cookie
- cookie细节
- 删除cookie
- Session
- 什么是session
- session使用场景
- session和cookie的区别
- 设置session自动过期在web.
会话
用户打开一个浏览器到关闭浏览器,这个过程可以称之为会话。
有状态会话
客户端再次访问服务端时,服务端知道客户端曾经来过,称之为有状态会话。
保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务端技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在session中
常见场景
- 网站登录后,下次访问不需要登录
Cookie
- 服务端响应给客户端cookie
- 服务端从客户端请求中拿到cookie
Cookie[] cookies = req.getCookies();//获取cookiecookie.getName();//获取cookie的keycookie.getValue();//获取cookie的valueCookie cookie = new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis()));//新建cookiecookie.setMaxAge(24*60*60);//设置cookie有效期设置为1天resp.addCookie(cookie);//响应给客户端一个cookie
- cookie一般会保存在本地的用户目录下的appData目录下
<?
package com.qing.servlet;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 CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器告诉你,你来的时间,把这个时间封装为一个信件,下次来时,带上信件,服务器就知道你又来了 //简单解决中文乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); //Cookie,服务端从客户端获取 Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个 //判断cookie是否存在,第一次访问服务器时,不存在,cookie是由服务器给客户端的 if (cookies == null || cookies.length < 1) { out.write("这是您第一次访问本站"); } else { //如果存在,读取cookie,获取cookie中的值 boolean flag = true; for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if ("lastLoginTime".equals(cookie.getName())) { flag = false; out.write("您上一次访问本站的时间是:"); long lastLoginTime = Long.parseLong(cookie.getValue()); out.write(new Date(lastLoginTime).toLocaleString()); System.out.println(new Date(lastLoginTime).toLocaleString()); } } if (flag) { out.write("这是您第一次访问本站"); } } //服务器给客户端响应一个cookie Cookie cookie = new Cookie("lastLoginTime",String.valueOf(System.currentTimeMillis())); //cookie有效期设置为1天 cookie.setMaxAge(24*60*60); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
<?
cookie细节
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个cookie
- cookie大小有限制,一般为4kb
- 浏览器存放cookie一般最多300
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期为0
Session
什么是session
- 服务器会给每个用户(浏览器)创建一个session对象
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
- 用户登录之后,整个网站都可以访问
session使用场景
- 保存登录用户的信息
- 购物车信息
- 在整个网站中经常使用的数据,我们将它保存在session中
session和cookie的区别
- cookie是把要保存的数据写给浏览器,浏览器保存(可以保存多个)
- session是把要保存的数据写的用户独占的session中,服务器保存(只保存重要的信息,减少服务器资源的浪费)
package com.qing.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //得到session HttpSession session = req.getSession(); //给session存数据 session.setAttribute("name","清风"); //获取session的ID String id = session.getId(); //判断session是不是新创建的 if (session.isNew()) { resp.getWriter().write("session创建成功,ID:" + id); } else { resp.getWriter().write("session已经在服务器中存在了,ID:" + id); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
package com.qing.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //得到session HttpSession session = req.getSession(); //从session中取数据 String name = (String) session.getAttribute("name"); System.out.println(name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
package com.qing.servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;public class SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决中文乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //得到session HttpSession session = req.getSession(); //手动注销session session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}
<?
No comments:
Post a Comment