Javaweb(十)
  aH5iJNmqbh1v 2023年11月02日 29 0
1、会话跟踪技术

1.1、会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

如下所受,有三个浏览器向服务器发送了请求,从而建立了三个会话:

image.png

1.2、会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。数据共享的案例,例如:在用户登录后在页面显示用户名,购物平台在将商品加入购物车后点击结算时会有商品详情等等。

为什么需要会话跟踪技术?

HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。

1.3、实现方式:

①、客户端会话跟踪技术:Cookie ②、服务端会话跟踪技术:Session

2、Cookie

2.1、Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

2.2、Cookie的基本使用:

①、发送cookie image.png

②、获取cookie

image.png

//发送cookie
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 发送cookie
         * */
        //1、创建cookie对象
        Cookie cookie = new Cookie("username", "zhangsan");
        //2、发送cookie
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取cookie数组
        Cookie[] cookies = request.getCookies();
        //遍历数组
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if ("username".equals(name)) {
                //获取数据
                String value = cookie.getValue();
                System.out.println("name = " + name + "\tvalue = " + value);
                break;
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

运行上面的代码分别访问AServlet和BServlet,BServlet会获取到AServlet发送的cookie并且输出在控制台。

2.3、cookie的原理:

Cookie的实现是基于HTTP协议的:

响应头:set-cookie 请求头:cookie

如下所示:image.png

2.4、cookie的存活时间:

默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁。

cookie可以设置存活时间,如下所示:

image.png

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 发送cookie
         * */
        //1、创建cookie对象
        Cookie cookie = new Cookie("username", "zhangsan");

        //设置存活时间:7天
        cookie.setMaxAge(60 * 60 * 24 * 7);

        //2、发送cookie
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

2.5、cookie存储中文(cookie是不能直接存储中文的!!!)

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 发送cookie
         * */
        String name = "张三";
        //采用url编码
        String encode = URLEncoder.encode(name, "utf-8");

        //1、创建cookie对象
        Cookie cookie = new Cookie("username", encode);

        //设置存活时间:7天
        cookie.setMaxAge(60 * 60 * 24 * 7);

        //2、发送cookie
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
3、Session

服务端会话跟踪技术:将数据保存到服务端。JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能。

3.1、Session的使用:

image.png

@WebServlet("/AServletDemo1")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session对象
        HttpSession session = request.getSession();
        //存储数据(这里的第二个参数可以是任意的数据类型!!)
        session.setAttribute("username", "zhangsan");

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
//获取session
@WebServlet("/BServletDemo2")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从session中获取数据
        //获取对象
        HttpSession session = request.getSession();
        Object username = session.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

3.2、session原理:

image.png 3.3、session的钝化、活化

钝化:在服务器正常关闭后,Tomcat:会自动将Session数据写入硬盘的文件中。 活化:再次启动服务器后,从文件中加载数据到Session中。

3.4、session的销毁

image.png

其中invalidate方法是手动销毁的方法!!!!

4、cookie和session的比较

4.1、区别:

image.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ijEHlwWobBkw   6天前   15   0   0 Java
  DKE3T9FhmJBk   6天前   14   0   0 Java
  2xk0JyO908yA   6天前   20   0   0 Java
aH5iJNmqbh1v
作者其他文章 更多

2023-11-13

2023-11-12

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

最新推荐 更多

2024-05-05