• JavaWeb-cookie&session


    目录

    1.会话

    2.保存会话的两种技术

    3.Cookie

    4.Session


    1.会话

    会话:用户打开一个浏览器,点击了很多超链接,可以访问多个web资源,关闭浏览器资源,这个过程可以称之为会话

    有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话

    举例:怎么证明你是XXX学校的学生?

    你                                           XXX学校

    1)发票                                 XXX学校给你发票

    2)学校登记                         XXX学校标记你来过了

    一个网站,怎么证明你来过?

    服务器端                                  客户端

    1)服务端给客户端一个cookie(类似于信件),客户端下次访问服务器端带上信件就可以了

    2)服务器登记你来过了,下次你来的时候,服务器进行匹配

    2.保存会话的两种技术

    cookie

    • 客户端技术(相应、请求)

    session

    • 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中

    常见情景:网站登录之后,你下次就不用再登录了,第二次访问直接上去了

    测试代码:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.Cookie;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. import java.util.Date;
    9. //保存用户上一次访问的时间
    10. public class CookieDemo01 extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //服务器,告诉你,你来的时间,把这个时间封装称为一个信件,你下次带来,我就知道你来了
    14. //解决中文乱码
    15. req.setCharacterEncoding("utf-8");//请求时
    16. resp.setHeader("Content-Type", "text/html;charset=utf-8");//响应时
    17. PrintWriter out = resp.getWriter();
    18. //Cookie,服务器端从客户端获取
    19. Cookie[] cookies = req.getCookies();//数组--->cookie可能存在多个
    20. //判断cookie是否存在
    21. if(cookies!=null){
    22. //如果存在怎么办
    23. out.write("你上一次访问的时间是:");
    24. for (int i=0;i< cookies.length;i++) {
    25. Cookie cookie=cookies[i];
    26. //获得cookie的名字
    27. if(cookie.getName().equals("lastLoginTime")){
    28. //获取cookie中的值
    29. //将字符串转变为一个Date
    30. long lastLoginTime = Long.parseLong(cookie.getValue());
    31. Date date = new Date(lastLoginTime);
    32. out.write(date.toLocaleString());//使用本地时间格式化
    33. }
    34. }
    35. }else{
    36. out.write("这是第一次访问网站");
    37. }
    38. //服务器给客户端相应一个cookie
    39. Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
    40. cookie.setMaxAge(24*60*60);//cookie的有效期为一天
    41. resp.addCookie(cookie);
    42. }
    43. @Override
    44. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    45. super.doPost(req, resp);
    46. }
    47. }

    映射路径:

    1. <servlet>
    2. <servlet-name>CookieDemo01servlet-name>
    3. <servlet-class>com.lwy.servlet.CookieDemo01servlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>CookieDemo01servlet-name>
    7. <url-pattern>/c1url-pattern>
    8. servlet-mapping>

    3.Cookie

    1)从请求中拿到cookie信息

    2)服务器响应给客户端cookie

    Cookie[] cookies = req.getCookies(); //获得Cookie
    cookie.getName(); //获得cookie中的key 
    cookie.getValue(); //获得cookie中的vlaue 
    new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
    cookie.setMaxAge(24*60*60); //设置cookie的有效期
    resp.addCookie(cookie); //响应给客户端一个cookie

    cookie:一般会保存在本地的 用户目录下 appdata;

    问题:一个网站cookie是否存在上限?

    • 一个Cookie只能保存一个信息;
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
    • Cookie大小有限制4kb;
    • 300个cookie浏览器上限

    删除Cookie

    • 不设置有效期,关闭浏览器,自动失效;
    • 设置有效期时间为 0 ;

    中文数据传输的编码和解码:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.Cookie;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.net.URLDecoder;
    8. import java.net.URLEncoder;
    9. //中文数据传输
    10. public class CookieDemo02 extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. //解决中文乱码
    14. req.setCharacterEncoding("utf-8");
    15. resp.setHeader("Content-Type","text/html;charset=utf-8");
    16. //服务器从客户端获取
    17. Cookie[] cookies = req.getCookies();
    18. //判断cookie是否存在
    19. if(cookies!=null){
    20. for(int i=0;i
    21. Cookie cookie=cookies[i];
    22. if(cookie.getName().equals("name")){
    23. //解码
    24. System.out.println(URLDecoder.decode(cookie.getValue(),"utf-8"));
    25. }
    26. }
    27. }
    28. Cookie cookie = new Cookie("name", URLEncoder.encode("李玮烨","utf-8"));
    29. resp.addCookie(cookie);
    30. }
    31. @Override
    32. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    33. doGet(req, resp);
    34. }
    35. }
    1. <servlet>
    2. <servlet-name>CookieDemo02servlet-name>
    3. <servlet-class>com.lwy.servlet.CookieDemo02servlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>CookieDemo02servlet-name>
    7. <url-pattern>/c2url-pattern>
    8. servlet-mapping>

    4.Session

     什么是 Session ?

    • 服务器会给每一个用户(浏览器)创建一个 Session 对象;

    • 一个 Session 独占一个浏览器,只要浏览器没有关闭,这个 Session 就存在;

    • 用户登录之后,整个网站它都可以访问!-> 保存用户的信息;保存购物车的信息…

    Session 和 cookie 的区别:

    • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
    • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
    • Session 对象由服务创建;

    测试session存字符串:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.*;
    3. import java.io.IOException;
    4. public class SessionDemo01 extends HttpServlet {
    5. @Override
    6. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    7. //解决乱码问题
    8. req.setCharacterEncoding("utf-8");
    9. resp.setHeader("Content-Type","text/html;charset=utf-8");
    10. //得到session
    11. HttpSession session = req.getSession();
    12. //给session中存东西
    13. session.setAttribute("name","李玮烨");
    14. //获取session的id
    15. String id = session.getId();
    16. //判断session是不是新创建的
    17. if(session.isNew()){
    18. resp.getWriter().write("session创建成功,id:"+id);
    19. }else{
    20. resp.getWriter().write("session已经存在,id:"+id);
    21. }
    22. //session在创建时做了什么事情
    23. // Cookie cookie = new Cookie("JSESSIONID",id);
    24. // resp.addCookie(cookie);
    25. }
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    28. doGet(req, resp);
    29. }
    30. }

    映射路径:

    1. <servlet>
    2. <servlet-name>SessionDemo01servlet-name>
    3. <servlet-class>com.lwy.servlet.SessionDemo01servlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>SessionDemo01servlet-name>
    7. <url-pattern>/s1url-pattern>
    8. servlet-mapping>

    测试session存用户信息:

    用户信息类:

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

    存放在session中:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.*;
    3. import java.io.IOException;
    4. public class SessionDemo01 extends HttpServlet {
    5. @Override
    6. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    7. //解决乱码问题
    8. req.setCharacterEncoding("utf-8");
    9. resp.setHeader("Content-Type","text/html;charset=utf-8");
    10. //得到session
    11. HttpSession session = req.getSession();
    12. //给session中存东西
    13. session.setAttribute("name",new Person("李玮烨",18));
    14. //获取session的id
    15. String id = session.getId();
    16. //判断session是不是新创建的
    17. if(session.isNew()){
    18. resp.getWriter().write("session创建成功,id:"+id);
    19. }else{
    20. resp.getWriter().write("session已经存在,id:"+id);
    21. }
    22. //session在创建时做了什么事情
    23. // Cookie cookie = new Cookie("JSESSIONID",id);
    24. // resp.addCookie(cookie);
    25. }
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    28. doGet(req, resp);
    29. }
    30. }

    对信息进行获取:

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import javax.servlet.http.HttpSession;
    6. import java.io.IOException;
    7. public class SessionDemo02 extends HttpServlet {
    8. @Override
    9. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. //解决乱码问题
    11. req.setCharacterEncoding("utf-8");
    12. resp.setHeader("Content-Type","text/html;charset=utf-8");
    13. //得到session
    14. HttpSession session = req.getSession();
    15. Person person = (Person) session.getAttribute("name");
    16. System.out.println(person.toString());
    17. }
    18. @Override
    19. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    20. doGet(req, resp);
    21. }
    22. }

    注销session:

    方式一:手动注销

    1. import javax.servlet.ServletException;
    2. import javax.servlet.http.HttpServlet;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import javax.servlet.http.HttpSession;
    6. import java.io.IOException;
    7. //注销servlet
    8. public class SessionDemo03 extends HttpServlet {
    9. @Override
    10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. HttpSession session = req.getSession();
    12. session.removeAttribute("name");
    13. session.invalidate();//注销sessionid
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    17. doGet(req, resp);
    18. }
    19. }

    映射路径:

    1. <servlet>
    2. <servlet-name>SessionDemo03servlet-name>
    3. <servlet-class>com.lwy.servlet.SessionDemo03servlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>SessionDemo03servlet-name>
    7. <url-pattern>/s3url-pattern>
    8. servlet-mapping>

    方式二:写配置文件,设置自动过期

    1. <session-config>
    2. <session-timeout>15session-timeout>
    3. session-config>
  • 相关阅读:
    spring boot配置文件中 Duration解析
    如何实现IP地址精准定位?
    分布式本地缓存 ehcache 缓存同步复制
    EtherCAT报文-ARWM(自动增量一读多写)抓包分析
    Aspose转换Word文档带目录
    蓝桥杯算法赛 第 6 场 小白入门赛 解题报告 | 珂学家 | 简单场 + 元宵节日快乐
    ORA-01460:unimplemented or unreasonable conversion
    面渣逆袭:MySQL六十六问,两万字+五十图详解!有点六!
    使用 Docker 安装 IPFS 星际文件系统
    TiDB备份与恢复简介
  • 原文地址:https://blog.csdn.net/qq_61727355/article/details/126809212