首页 > 编程语言 >Java登陆第三十天——Cookie和Session

Java登陆第三十天——Cookie和Session

时间:2023-12-27 22:23:38浏览次数:30  
标签:Java Session Test5B session Cookie 服务端 客户端

会话

会话就是客户端与服务器的一次交互。

HTTP是一种无状态协议

  • 无状态:服务端不会记录客户端信息。

有的时候,我们需要保存客户端的信息。

  • 对于登陆功能来说,保存客户端信息,可以避免客户端每访问都需要登陆一次

至此,会话管理诞生。

Cookie是一种客户端会话技术,并保存在客户端之中。

HttpServletResponse方法 描述
void addCookie(Cookie var1) 向客户端添加响应报文头
  • Cookie是键值对的数据。

  • 创建若干个Cookie对象,并通过addCookie()方法响应给客户端。

    • (Tomcat会自动把Cookie对象转为set-cookie响应头)
  • 客户端接收到set-cookie响应头后,会在下次请求资源时,以cookie请求头的方式携带

Cookie类常用方法

方法 描述
String getName() 获取Cookie的键
String getValue() 获取Cookie的值
void setMaxAge(int expiry) 设置Cookie的存活时间(秒)
void setPath(String uri) 设置Cookie仅生效地址
  • 仅生效地址:

    • 在该地址中才有效,其他的地址,该Cookie不会在请求头中。

栗子

TestServlet5

@WebServlet("/Test5")
public class TestServlet5 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //给客户端响应两个Cookie
        resp.addCookie(new Cookie("keyA","valueA"));
        resp.addCookie(new Cookie("keyB","valueB"));
    }
}

TestServlet5B

@WebServlet("/Test5B")
public class TestServlet5B extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //cookie可能为多个,所以返回值是Cookie数组
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            for (Cookie cookie : cookies) {
                String value = cookie.getValue();
                System.out.println(value);
            }
        }else {
            System.out.println("没有Cookie");
        }
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5B

//控制台输出,先以无Cookie访问
没有Cookie

试验先Test5再访问Test5B

先请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5

并查看响应头
image

再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5B

//控制台输出
valueA
valueB

Cookie的时效性

Cookie会根据存活时间的长度被分为:会话级Cookie;持久化Cookie

会话级Cookie 持久化Cookie
服务端没指定Cookie存活时间 服务端指定了Cookie存活时间
Cookie存在内存中 Cookie存在硬盘中
Cookie在客户端关闭后就会自动释放 Cookie在硬盘中存活时间由服务器指定
Cookie到达指定时间会被释放

Session

Session是一种服务端会话技术,保存在服务端之中。

HttpServletRequest方法 描述
HttpSession getSession() 获取Session对象
  • 服务端会为个请求的客户端创建一个的Session对象

    • 同时会把Session对象的id以Cookie的形式保存在JSESSIONID中
  • 客户端创建完Session后,客户端会收到一个特殊的Cookie。

    • 键是JSESSIONID,值是Session对象的id
  • 客户端下次访问服务端,携带的Cookie中就包含JSESSIONID,服务端会根据JSESSIONID找到对应的Session对象

  • Session是域对象(下一篇文章介绍)

Session接口常用方法

方法 描述
String getId() 获取Session对象的id
boolean isNew() Session是否是新生成的
void setAttribute(String var1, Object var2) 往Session对象里存储键值对数据
Object getAttribute(String var1) 获取Session对象里存储的值

栗子

TestServlet5

@WebServlet("/Test5")
public class TestServlet5 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //输出Session的ID和新旧   T新F旧
        System.out.println(session.getId());
        System.out.println(session.isNew());

        session.setAttribute("keyA","valueA");

    }
}

TestServlet5B

@WebServlet("/Test5B")
public class TestServlet5B extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //输出Session的ID和新旧   T新F旧
        System.out.println(session.getId());
        System.out.println(session.isNew());

        System.out.println(session.getAttribute("keyA"));

    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5B

//控制台输出,先以无Session访问
84C99AA919BF34E18E3796AA3DEF807C
true
null

试验先Test5再访问Test5B

重启客户端

先请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5

//控制台输出,先以无Session访问
84C99AA919BF34E18E3796AA3DEF807C
true

再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test5B

//控制台输出
84C99AA919BF34E18E3796AA3DEF807C
false
valueA

因为Session是在服务端内保存,重启才能保证第二次正常按预期运行。

标签:Java,Session,Test5B,session,Cookie,服务端,客户端
From: https://www.cnblogs.com/Ocraft/p/17931559.html

相关文章

  • JavaImprove--Lesson02--Object类,Objects工具类,封装类
    一.Object类Java中的Object类是所有类的超类,它是Java类层次结构的根类。这意味着所有的类都直接或间接地继承自Object类equals(Objectobj):用于比较两个对象是否相等。默认实现是比较对象的引用,但可以通过重写此方法来比较对象的内部状态。hashCode():返回对象的哈希码值,通......
  • java基础语法API之GUI图形化界面2
    一:概述在1中,已经对GUI图形化的基础知识做了个概述,2中主要以例子为载体说明。并且介绍时间监听机制二:具体说明<1>猜数字//创建窗体对象JFramejf=newJFrame();jf.setTitle("猜数字");jf.setSize(400,300);jf.set......
  • 无涯教程-Java泛型 - 参数类型
    泛型类可以具有参数化类型,其中类型参数可以替换为参数化类型。以下示例将展示上述概念。packagecom.learnfk;importjava.util.ArrayList;importjava.util.List;publicclassGenericsTester{publicstaticvoidmain(String[]args){Box<Integer,List<St......
  • Java的安装
    Ubuntu下的Java环境:1.JDK/JRE的安装2.java的环境变量3.运行普遍Java程序4.Java程序的运行脚本 1.先安装Java的软件包:JRE:openjdk-8-jre-headlessJDK: openjdk-8-jdk-headless安装命令:sudoaptinstall openjdk-8-jdk-he......
  • 无涯教程-Java泛型 - 多个类型
    泛型类可以具有多个类型参数。以下示例将展示上述概念。packagecom.learnfk;publicclassGenericsTester{publicstaticvoidmain(String[]args){Box<Integer,String>box=newBox<Integer,String>();box.add(Integer.valueOf(10),"HelloWorld")......
  • Sqoop连接数据库报错:Caused by: javax.net.ssl.SSLHandshakeException: No appropriat
    控制台报错:[[email protected]__hadoop-2.0.0-alpha]#./bin/sqooplist-databases--connectjdbc:mysql://192.168.45.10:3306--usernameroot--password1234562023-12-2802:58:50,807WARNtool.BaseSqoopTool:Settingyourpasswordonthecommand-linei......
  • [JAVA基础]后端原理
    后端原理【【网站架构】5分钟了解后端工作原理。为什么Tomcat长时间运行会崩溃?高并发线程池怎么设置?】https://www.bilibili.com/video/BV1PB4y11795/?share_source=copy_web&vd_source=55965a967914567042ced99f130f6538后段部分运行原理Tomcat+war包jar包后端程......
  • 无涯教程-Java泛型 - 泛型方法
    您可以编写一个可以用于不同类型参数调用的通用方法,根据传递给泛型方法的参数类型来找到对应方法进行处理。以下示例说明了如何使用单个Generic方法打印不同类型的数组-publicclassGenericMethodTest{//泛型方法printArraypublicstatic<E>voidprintArray(E[......
  • HTML学习第六天:初步探索JavaScript与交互
    在今天的HTML学习中,我初步探索了JavaScript和网页交互的世界。早上,我首先了解了JavaScript的基本概念和语法。JavaScript是一种用于增强网页交互性的脚本语言,它可以直接在浏览器中运行。我学习了如何使用变量、函数和基本的控制结构来编写JavaScript代码。午后,我开始将JavaScript与......
  • 无涯教程-Java泛型 - 类型推断
    类型推断表示Java编译器查看方法调用以及其相应的声明来检查和确定类型的参数,如果可用,则返回分配的类型。如果未使用类型推断,则编译器会生成未经检查的转换警告。Typeinference-语法Box<Integer>integerBox=newBox<>();Box  -Box是一个通用类。<>  -运算符表......