Cookie、Session

Cookie:服务端生成Cookie发给客户端用于认证

Session:服务端进行进行登记,每人有不同的Session

session与cookie的区别

Cookie:当用户打开浏览器访问网站,服务器端会生成一个cookie发给客户端,客户端访问网站就会携带cookie

Session:客户端请求服务端,服务端会生成一个sessionid,每个用户唯一,用类似于发给客户端cookie的方式发给客户端这个sessionid,用sessionid来辨别这次请求是那个客户端发来的。而在服务器端保存的session会存入很多东西,也是根据sessionid来辨别这些session中的内容是哪个用户的。

  • cookie是将用户的数据写给用户的浏览器,用浏览器保存,可保存多个cookie
  • session是将用户的数据,写给用户的session,服务器端保存,不建议保存太多
  • session由服务器创建

cookie

一个web站点可以发多个cookie

常用方法

  1. Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie
  2. resp.addCookie(cookie); //响应给客户端cookie
  3. Cookie[] cookies = req.getCookies(); //获得cookie数组
  4. cookie.setMaxAge(24*60*60); //设置cookie有效期
  5. cookie.getName() //获得cookie名字
  6. cookie.getValue() //获得cookie的值

服务端发送给客户端cookie

  1. //服务端发给客户端cookie
  2. Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
  3. resp.addCookie(cookie);

服务端获取客户端带来的cookie

  1. //服务器端从客户端获取cookie
  2. Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie

设置cookie有效期,以秒为单位

  1. cookie.setMaxAge(24*60*60);

例子:保存cookie上一次访问的时间

  1. public class CookieDemo01 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. req.setCharacterEncoding("UTF-8");
  5. resp.setCharacterEncoding("UTF-8");
  6. PrintWriter out = resp.getWriter();
  7. //服务器端从客户端获取cookie
  8. Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie
  9. //判断cookie是否为空
  10. if (cookies!=null){
  11. out.write("上一次访问的时间是:");
  12. for (int i = 0; i <cookies.length; i++) {
  13. //获取cookie
  14. Cookie cookie = cookies[i];
  15. //获取cookie中的名字
  16. if (cookie.getName().equals("lastLoginTime")){
  17. //获取cookie中的值
  18. long lastLoginTime = Long.parseLong(cookie.getValue());
  19. Date date = new Date(lastLoginTime);
  20. out.write(date.toLocaleString());
  21. }
  22. }
  23. }else {
  24. out.write("第一次访问");
  25. }
  26. //服务端发给客户端cookie
  27. Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
  28. resp.addCookie(cookie);
  29. }
  30. @Override
  31. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  32. }
  33. }

删除cookie

不设置有效期,关闭浏览器自动失效

设置cookie有效期为0

创建一个cookie,名字必须和要删除的cookie名字一致

  1. public class CookieDemo02 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
  5. //设置有效期为0
  6. lastLoginTime.setMaxAge(0);
  7. resp.addCookie(lastLoginTime);
  8. }
  9. @Override
  10. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. }
  12. }

URL编解码

  1. URLEncoder.encode("str", "utf-8"); //str进行URL编码
  2. URLDecoder.decode("str", "utf-8"); //str进行URL解码

session

session在浏览器一打开就存在了,会类似于发送给客户端cookie一样。但这只是SessionID的操作,Session还可以设置其他的属性。

之前Servlet文章有提过,Servlet之间本身是无法通信,例如分享数据的。但是可以通过ServletContext上下文实现,其实在Session中通过Attribute也可以实现Servlet之间的通信的。

  1. Cookie cookie = new Cookie("JSESSIONID", sessionId);
  2. resp.addCookie(cookie);

常用方法

方法 作用
req.getSession() 获得一个session
session.setAttribute("name", "Zh1z3ven") 设置属性,value部分可以是一个对象
session.getAttribute("name") 获取属性
session.removeAttribute("name"); 删除属性
session.invalidate(); 注销session
session.getId() 获取sessionid
session.isNew() 判断是否为新创建的session

例子:创建session,获取sessionid,设置session属性

  1. public class SessionDemo01 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //解决编码问题
  5. req.setCharacterEncoding("utf-8");
  6. resp.setCharacterEncoding("utf-8");
  7. resp.setContentType("text/html");
  8. //得到session
  9. HttpSession session = req.getSession();
  10. //设置session属性
  11. session.setAttribute("name", "Zh1z3ven");
  12. //获取sessionid
  13. String sessionId = session.getId();
  14. //判断是否为新创建的session
  15. boolean aNew = session.isNew();
  16. if (aNew){
  17. resp.getWriter().write("session创建成功,sessionID为:" + sessionId);
  18. }else {
  19. resp.getWriter().write("session已经在服务器中存在, SessionID为:" + sessionId);
  20. }
  21. }
  22. @Override
  23. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  24. }
  25. }

获取sessin属性,新建一个person类

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public Person() {
  5. }
  6. public Person(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. @Override
  23. public String toString() {
  24. return "Person{" +
  25. "name='" + name + '\'' +
  26. ", age=" + age +
  27. '}';
  28. }
  29. }

修改前面demo中设置属性值的语句

  1. session.setAttribute("name", new Person("Zh1z3ven", 18));

获取session属性中的person对象

  1. public class SessionDemo02 extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //解决编码问题
  5. req.setCharacterEncoding("utf-8");
  6. resp.setCharacterEncoding("utf-8");
  7. resp.setContentType("text/html");
  8. //得到session
  9. HttpSession session = req.getSession();
  10. //获取Session信息
  11. Person name = (Person) session.getAttribute("name");
  12. System.out.println(name);
  13. }
  14. @Override
  15. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. }
  17. }

这里就实现了不同的Servlet之间数据共享。

注销Session

删除属性,注销session。但是注销了会马上生成一个新的session

  1. HttpSession session = req.getSession();
  2. session.removeAttribute("name");
  3. session.invalidate();

也可以在web.xml设置session过期时间

  1. <!-- 设置session配置-->
  2. <session-config>
  3. <!-- 设置session过期时间,以分钟为单位-->
  4. <session-timeout>2</session-timeout>
  5. </session-config>

Java之Cookie与Session的更多相关文章

  1. Java学习--Cookie 和session

  2. java的会话管理:Cookie和Session

    java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...

  3. Java cookie和session介绍与区别

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  4. Java——Cookie与Session

    Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务 ...

  5. Java Cookie和Session(转载)

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  6. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  7. Java Cookie和Session

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. cookie、session和java过滤器

    基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一 ...

  9. Java Web之Cookie、Session

    讲Cookie和Seesion之前,先讲一下HTTP连接其实是无序的,服务器不知道是谁在访问它.现在我们来实现一个简单的邮箱功能. 要求: 1.登录页面登录之后看到收件箱和欢迎我 2.点击收件箱看到几 ...

随机推荐

  1. docker进入容器所在虚拟机的指令

    sudo docker inspect -f {{.State.Pid}} 44fc0f0582d9 在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了. $ sudo nsenter ...

  2. buu [V&N2020 公开赛]strangeCpp

    拖入ida,静态调试一下,本来想动调的,发现一直缺dll.没办法,只能头铁,静态 找到主函数,然后并没有发现什么,找了半天,没结果,后面也是看了大佬wp,才找到解决方式,感觉这种只能通过动调来找到关键 ...

  3. buu 相册

    一.拖入jeb,这个神器里面,感觉对jeb使用还是不熟悉,对我逆向产生了一些障碍. 抓住题目给的提示,邮箱,全局直接搜索,mail. 看下它的交叉引用 找到了发邮件的方法, C2的MAILFROME说 ...

  4. 微软商业智能系列(一)初识微软BI

    随着移动互联网.云计算.物联网和大数据技术的广泛应用,社会已经迈入全新的数据时代.掌握数据资产,进行智能化决策,已成为企业胜出的关键.越来越多的企业开始重视数据战略布局,重新定义自己的核心竞争力,从数 ...

  5. python之数据驱动ddt操作(方法二)

    import unittestfrom ddt import ddt,unpack,datafrom selenium import webdriverfrom selenium.webdriver. ...

  6. mybatis-6-动态sql

    动态sql简介&OGNL了解 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处 理器相似. MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作. if cho ...

  7. Linux 安装 Nodejs 的两种方式

    Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...

  8. 每天五分钟Go - 指针

    什么是指针 一个指向内存地址的变量,称为指针变量,指针是一个特殊的变量,他的值存储的是另一个值的内存地址 指针变量的声明 var var_name *type var_name 是指针变量的名称,ty ...

  9. C#.NET RSA 私钥签名 公钥验证签名

    C#.NET RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8或PKCS1格式)转为C#.NET的RSACryptoSer ...

  10. [XIN算法应用]NOI2020美食家

    XIN(\(updated 2021.6.4\)) 对于很多很多的题目,发现自己并不会之后,往往会直接冲上一个XIN队算法,然而,这样 \(\huge{\text{鲁莽}}\) 的行为只能获得 TLE ...