怀旧网,博客详情:Cookie Session 介绍

1、Java Web 的基本概念

2、IDEA 中配置启动Tomcat

3、如何运行第一个Tomcat HttpServlet 程序

4、Servlet 详解

5、Response 和 Request 介绍

6、Cookie Session 介绍

7、JSP 详细讲解

8、Java Bean 介绍

9、MVC 架构介绍

10、Filter过滤器、监听器 介绍

11、JDBC 事务的使用

12、Java Web 文件上传

原创

Cookie Session 介绍

1、会话

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

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

有状态会话

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

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
  2. 服务器登记你来过了,下次来的时候我来匹配你;session

2、保存会话的两种技术

cookie

  • 客户端技术 (响应,请求)

session

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

常见场景:网站登录过之后,你下次访问就不用在登录了,直接就默认登录上去了;

3、Cookie

image-20240330140206056

image-20240328213757152

image-20240328214332463

cookie方法测试

编写java代码(测试cookie 记录用户访问客户端时间):

public class CookieTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求和响应的数据编码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        // 获取输出流对象
        PrintWriter out = resp.getWriter();

        // 获取当前会话的所有cookie
        Cookie[] cookies = req.getCookies();

        // 判断当前的cookies中是否有数据
        if(cookies == null){
            // 第一访问会话

            // 创建一个cookie对象
            Cookie cookie = new Cookie("firstTime", System.currentTimeMillis()+"");
            resp.addCookie(cookie);

            // 输出信息
            out.println("<h1>第一次访问当前网页</h1>");
        }else{
            for (int i = 0; i < cookies.length; i++) {
                // 获取一个cookie对象
                Cookie cookie = cookies[i];

                // 判断当前cookie对象的name是否为firstTime
                if("firstTime".equals(cookie.getName())){
                    // 获取cookie的值
                    String value = cookie.getValue();

                    // 强转数据类型
                    long lastTime = Long.parseLong(value);
                    Date date = new Date(lastTime);

                    // 如果是就输出最后一次访问
                    out.println("<h1>你第一次访问当前界面时间:"+date.toLocaleString()+"</h1>");
                }

                // 判断当前cookie对象的name是否为lastTime
                if("lastTime".equals(cookie.getName())){
                    // 获取cookie的值
                    String value = cookie.getValue();

                    // 强转数据类型
                    long lastTime = Long.parseLong(value);
                    Date date = new Date(lastTime);

                    // 如果是就输出最后一次访问
                    out.println("<h1>最后一次访问当前界面时间:"+date.toLocaleString()+"</h1>");
                }
            }
        }

        // 创建一个cookie对象
        Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");

        // 将当前创建的cookie对象添加到resp中去
        resp.addCookie(cookie);
    }
}

编写映射配置文件

<servlet>
    <servlet-name>cookieTest</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.CookieTestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>cookieTest</servlet-name>
    <url-pattern>/cookieTest</url-pattern>
</servlet-mapping>

访问测试:

image-20240328215831799

第一次访问网页输出

image-20240328215844482

第二次访问输出

image-20240328215855526

第三次访问输出

发现代码成功达到了我们的预期:

image-20240328215949887

在cookie中存储了当前的数据

image-20240328220030184

其他方法:配置当前cookie的失效时间

// 创建一个cookie对象
Cookie cookie = new Cookie("firstTime", System.currentTimeMillis()+"");
cookie.setMaxAge(60 * 60 * 24);
resp.addCookie(cookie);

在第一次添加cookie的时候设置失效时间

image-20240328220306562

当前的cookie失效时间设置成功。

关闭浏览器,再次打开

image-20240328220344428

默认就记录第一次访问的时间,

// 创建一个cookie对象
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");
cookie.setMaxAge(0);

手动修改cookie失效时间(当前就是一直都不会存在最后一次的访问时间了)

image-20240328221012862

无论刷新多少次,都没有最后一次访问的数据了

如果cookie中存的是中文,那么最好做以下两步:

  1. 在setCookie的时候设置编码
  2. 在读取cookie的时候设置解码
// 设置编码
URLEncoder.encode("怀旧", "utf-8");
// 解码
URLEncoder.decode(cookie.getValue(), "utf-8");

结论

  • cookie在没有设置时间的时候,默认生命周期为当前会话关机就失效
  • 当cookie设置消失时间后,在时间没有到期前,再次访问网站就可以在此访问到上次会话保存的cookie(cookie默认存储在本地磁盘中)
  • 如果想手动让cookie失效,可以手动进行关闭或者在浏览器端打开开发者控制台进行手动删除,或者在服务端,通过设置setMaxAge为0就可以实现直接让当前cookie失效
  • 在涉及到有中文的时候,最好通过URLEncoder来设置好编码

4、session

image-20240330140319090

image-20240329094458990

image-20240330140014076

image-20240330140041667

session的使用

获取session

public class SessionTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 获取session
        HttpSession session = req.getSession();

        // 将输入存入session中
        session.setAttribute("userName", "怀旧");

        // 判断session是不是新创建的
        if (session.isNew()) {
            // 获取session的sessionId
            resp.getWriter().println("新创session创建成功!sessionID为:" + session.getId());
        }
    }
}

注册映射

<servlet>
    <servlet-name>session1</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.SessionTestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session1</servlet-name>
    <url-pattern>/s1</url-pattern>

在创建一个Servlet用来读取session数据

public class SessionTest1Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 获取session
        HttpSession session = req.getSession();

        // 获取session中的数据
        String username = (String)session.getAttribute("userName");

        // 将得到数据输出到前端
        resp.getWriter().println(username);
    }
}

注册映射

<servlet>
        <servlet-name>session2</servlet-name>
        <servlet-class>com.huaijiuwang.servlet.SessionTest1Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>session2</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>

运行测试:

访问/hj/s1

image-20240330141225475

第一次访问,输出创建成功!

再次访问测试

image-20240330141304363

输出内容为空

访问s2

image-20240330141322327

成功取出数据

关闭浏览器再次打开:

image-20240330141435167

session重新创建了

换一个浏览器在打开

image-20240330141555579

也创建了一个单独的session并且session都不想相同

测试在session中存入自定义数据类型数据

public class Student {
    private String userName;
    private int age;

    public Student(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}

修改代码

// 将输入存入session中
session.setAttribute("userName", new Student("怀旧", 18));

// 获取session中的数据
Student student = (Student)session.getAttribute("userName");

// 将得到数据输出到前端
resp.getWriter().println(student.toString());

重启运行测试

image-20240330142135444

image-20240330142142074

成功获取数据。

session的清除

创建一个清除session的Servlet

public class SessionTest2Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        // 获取session
        HttpSession session = req.getSession();

        // 手动注销session
        session.invalidate();
    }
}

编写映射文件

<servlet>
    <servlet-name>session3</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.SessionTest2Servlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session3</servlet-name>
    <url-pattern>/s3</url-pattern>
</servlet-mapping>

测试运行

image-20240330142350811

image-20240330142402512

image-20240330142409131

运行注销后,session就变成一个新的session了

代表原始数据也会被注销,数据同样会被刷新

自动注销session

直接编写配置文件即可

<session-config>
    <!-- 单位为分钟(这边就是1分钟后session失效) -->
    <session-timeout>1</session-timeout>
</session-config>

运行测试:

image-20240330142604934

等待1分钟后重新刷新,看看session会不会发生改变

image-20240330142653304

发现1分钟后session成功刷新了。

  • 平台作者:怀旧(联系作者)
  • QQ:444915368
  • 邮箱:444915368@qq.com
  • 电话:17623747368
  • 评论

    登录后才可以进行评论哦!

    回到顶部 留言