会话跟踪技术,Session和Cookie详解

简介: Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。

一、会话跟踪

1、场景描述

比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操作结果才能和登录用户做关联。

2、概念简介

可以把会话理解为客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。

二、Cookie用法详解

1、Cookie简介

Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

04-1.png

Cookie是由服务器创建,然后通过响应发送给客户端的键值对。客户端会保存Cookie,并会标注出Cookie的来源。当客户端向服务器发出请求时会把Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端。

2、Cookie用法

  • 创建Cookie

JavaWeb中,可以基于Servlet创建Cookie,并设置属性。

public class CookieServletOne extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 创建Cookie
        Cookie cookie = new Cookie("author","cicada");
        // 设置生命周期 1小时
        cookie.setMaxAge(60*60);
        response.addCookie(cookie) ;
        response.getWriter().print("Hello:Cookie");
    }
}

访问:http://localhost:6002/cookieServletOne

查看响应头:

Response Header
Set-Cookie: author=cicada; Max-Age=3600;

这样,服务器创建的Cookie在客户端就拿到了。

  • 获取Cookie
public class CookieServletOne extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doPost...");
        Cookie[] cookies = request.getCookies() ;
        for (Cookie cookie:cookies){
            System.out.println("Name:"+cookie.getName());
            System.out.println("Value:"+cookie.getValue());
        }
        response.setContentType("text/html;charset=utf-8");
        String userName = request.getParameter("userName") ;
        response.getWriter().print("Hello:"+userName);
    }
}

通过测试,控制台输出:Name:author;Value:cicada

  • 更新Cookie

更新就是指Cookie的覆盖,如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。

public class CookieServletTwo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 创建Cookie
        Cookie cookie = new Cookie("author","smile");
        // 设置生命周期 2小时
        cookie.setMaxAge(60*60*2);
        response.addCookie(cookie) ;
        response.getWriter().print("Hello:Cookie");
    }
}

可以通过上面方法测试Cookie的获取结果。

  • 删除Cookie

cookie.setMaxAge(0):生命等于0是一个特殊的值,它表示cookie被作废。

public class CookieServletTwo extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies() ;
        for (Cookie cookie:cookies){
            if (cookie.getName().equals("author")){
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
        }
        String userName = request.getParameter("userName") ;
        response.getWriter().print("Hello:"+userName);
    }
}

这样再测试Cookie的获取方法,发现上面删除的Cookie就没有了。

3、Cookie相关API

  • setMaxAge()

设置 cookie 过期的时间,秒为单位。默认情况cookie 只会在当前 session 会话中有效。

  • getMaxAge()

获取 cookie 的最大生存周期。

  • getName()

获取 cookie 的名称。名称在创建后不能改变。

  • getValue()

获取与 cookie 关联的值。

  • setValue(String value)

设置与cookie关联的value值。相同的name多次设置会覆盖。

三、Session 跟踪

1、Session简介

会话管理,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。Servlet中可以把一个会话内需要共享的数据保存到HttSession对象中。四大域对象:PageContext、ServletRequest、HttpSession、ServletContext。

2、Session运行原理

04-2.png

  • 首次使用

首次使用session时,服务器端要创建session,session是保存在服务器端,数据是保存在session中,sessionId通过Cookie发送给客户端,且只在浏览器本次会话中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失。

  • 客户端访问

客户端再次访问服务器时,在请求中会带上sessionId,服务器会通过sessionId找到对应的session,而无需再创建新的session。

  • 时效性

当一个session长时间没人使用的话,服务器会把session删除了,这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,也可以在的web.xml中覆盖这个配置!

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

3、相关API用法

  • getSesssion()

当前会话已经存在session对象那么直接返回,如果当前会话还不存在,创建session对象并返回 。

  • getAttribute(String name)

返回该 session 会话中具有指定名称的对象 。

  • getId()

分配给该 session 会话的唯一标识符的字符串。

  • setAttribute(String name,Object value)

使用指定的名称绑定一个对象到该 session 会话。

  • removeAttribute(String name)

从该 session 会话移除指定名称的对象。

4、应用案例

在网站中,经常可见的一个功能就是上次登录时间,这个功能基于Session可以很便捷的实现。

public class SessionServletOne extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        HttpSession session = request.getSession(true) ;
        Date createTime = new Date(session.getCreationTime());
        Date lastAccessTime = new Date(session.getLastAccessedTime());
        session.setAttribute("author","cicada");
        response.getWriter().print(
                "SessionId:" + session.getId() + "<br/>"+
                "User Author:" + session.getAttribute("author")+"<br/>"+
                "Create Time:" + dateFormat.format(createTime)+"<br/>"+
                "Last Access Time:"+dateFormat.format(lastAccessTime));
    }
}

访问http://localhost:6002/sessionServletOne

页面打印,多次访问,查看效果。

SessionId:40C12C367CBFA7469D57E72C5C091300
User Author:cicada
Create Time:2019-12-14 15:34:10
Last Access Time:2019-12-14 15:35:13
相关文章
|
3月前
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
|
3月前
|
存储 安全
Cookie会话跟踪的原理
会话跟踪技术包括Cookie和Session。Cookie是客户端技术,首次访问时服务器通过Set-Cookie响应头发送Cookie,浏览器保存并在后续请求中通过Cookie请求头回传,实现会话跟踪。但Cookie易被用户修改或禁用,安全性较低。Session则是服务器端技术,每次会话生成唯一的Session ID,通过Cookie传递给客户端,客户端在后续请求中携带此ID,服务器据此识别会话。Session更安全,但在集群环境中需解决会话共享问题。
84 1
|
4月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
128 4
|
4月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
5月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
109 1
|
5月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
344 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
6月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
145 1
|
6月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
6月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
7月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
493 0