cookie与session的区别+springboot使用

1. cookie

1.1 介绍

Cookie(也称为Web Cookie或浏览器Cookie)是一种存储在用户浏览器中的小型数据文件,通常由服务器生成并发送到用户的浏览器中。这些数据可以是文本形式,并且包含键值对、有效期、作用域和安全性等属性。

当用户首次访问一个网站时,服务器会创建一个Cookie,并通过HTTP响应头中的Set-Cookie字段发送给浏览器。浏览器会将这个Cookie保存在本地,通常是客户端计算机的硬盘或内存上。在用户下次访问该网站时,浏览器会自动将此Cookie附加到请求中并发送回服务器。服务器接收到这个Cookie后,可以根据其中的信息识别用户身份,从而实现诸如保持登录状态、个性化设置等功能。

1.2 作用

Cookie是一种小型文本文件,通常由Web服务器生成并发送到用户的浏览器中。它在客户端和服务器之间传递数据,具有多种作用:

保存用户数据:Cookie可以在客户端上保存用户的各种数据,如登录状态、身份识别信息等。当用户再次访问网站时,浏览器会将这些Cookie一同发送给服务器,从而实现自动登录、保存浏览历史等功能。

记录用户偏好和行为:Cookie帮助网站记住用户的偏好和行为,从而提供更好的用户体验。例如,在购物网站上添加商品到购物车后,即使用户关闭了浏览器,购物车中的内容仍然会被保留。

保持Web应用程序的连续性:由于HTTP协议是无状态的,因此需要通过Cookie来保持Web应用的状态管理。这样可以确保用户在多次请求之间保持一致的体验。

个性化设置:Cookie可以用于存储用户的个性化设置,如主题、语言偏好等。这使得用户在不同时间访问同一网站时能够看到符合其偏好的内容。

会话管理:Cookie常用于记录用户的会话状态,包括登录状态、访问次数等信息。这样可以在用户重新访问网站时识别其身份,并提供相应的服务。

跨域数据交换:虽然Cookie主要用于在同一域名下的数据交换,但其可以通过设置Domain属性实现跨子域名的数据共享。

广告和跟踪:许多Cookie还被用于收集用户的浏览历史和在线行为数据,以便进行精准广告投放和行为分析。

1.3 springboot操作cookie

在Spring Boot中设置Cookie主要依赖于HttpServletResponse类的addCookie()方法,同时可以通过ResponseCookie工具类进行更复杂的自定义操作。

设置一个简单的Cookie:

import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.bind.annotation.RestController ;
import javax.servlet.http.HttpServletResponse ;

@RestController
public class CookieController {

	@GetMapping("/setCookie")
	public void setCookie(HttpServletResponse response) {
		// 创建一个新的Cookie对象
		Cookie cookie = new Cookie("name", "value");
		        
		// 设置Cookie的最大存活时间为30天
		cookie.setMaxAge (30 * 24 * 60 * 60);
		        
		// 设置Cookie的路径为根路径,即“/”
		cookie.setPath ("/");
		
		// 将Cookie添加到响应中
		response.addCookie (cookie);
	}
}

使用Spring定义的ResponseCookie工具类:

import org.springframework.http.HttpHeaders ;
import org.springframework.web.bind.annotation.GetMapping ;
import org.springframework.web.bind.annotation.RestController ;

@RestController
public class CookieController {

	@GetMapping("/setCookieWithSameSite")
	public void setCookieWithSameSite(HttpServletResponse response) {
		// 使用ResponseCookie构建工具类
		ResponseCookie cookie = ResponseCookie.from ("name", "value")
		.maxAge(30 * 24 * 60 * 60) // 设置最大存活时间
		.path("/") // 设置路径
		.sameSite(ResponseCookie.SameSite Lax) // 设置SameSite属性为Lax
		.httpOnly(true); // 设置HttpOnly属性为true以防止XSS攻击
		
		// 将Cookie添加到响应中
		response.addHeader (HttpHeaders setCookie, cookie.toString ());
	}
}

2. session

2.1 介绍

Session是一种服务器端的数据存储机制,用于跟踪和管理用户在Web应用程序中的状态信息。它在计算机网络应用中被称为“会话控制”,其主要功能是为每个用户创建一个唯一的会话ID,并将该ID通过Cookie或URL重写的方式发送给客户端浏览器,在后续请求中携带。

当用户首次访问服务器时,服务器会为其创建一个唯一的Session对象,并生成一个对应的Cookie(通常名为JSESSIONID),其中包含这个唯一ID。这个ID确保了用户在不同页面之间跳转时,服务器能够识别并访问存储在该Session中的数据。

2.2 作用

Session在计算机网络应用中,尤其是Web应用程序中,是一种用于会话控制和状态管理的机制。其主要作用如下:

  1. 保存用户数据:Session对象存储特定用户会话所需的属性及配置信息,这样当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

  2. 唯一标识用户:每个用户访问时,服务器都会为该用户分配一个唯一的会话ID(Session ID),这个ID通过Cookie或URL重写的方式发送给客户端浏览器,并在后续的请求中携带。这样可以区分不同用户的请求,确保数据的一致性和安全性。

  3. 保持用户状态:Session技术能够保持用户的状态信息,实现用户登录、购物车、个性化设置等功能。例如,在用户登录后,Session可以存储用户的登录状态,以便在后续请求中识别该用户并提供相应的服务。

  4. 数据共享:Session可以在一次会话的多次请求之间共享数据,将数据保存到服务器端。这意味着在用户在系统中不同的web页面之间进行跳转时,存储在Session中的数据不会丢失。

  5. 生命周期管理:Session的生命周期是用户持续请求时间再加上一段时间(一般为20分钟左右),当用户关闭浏览器或者超时未操作时,Session会被销毁。

  6. 提高用户体验:由于Session可以存储和传递用户的数据,因此可以避免重复输入信息,提升用户体验。例如,在购物车功能中,Session可以记住用户的购物选择,在用户多次访问期间保持这些选择。

  7. Session作为一种服务器端的数据存储机制,主要用于跟踪和管理用户会话相关的数据,确保用户在不同页面之间的数据一致性和连续性,从而提升用户体验和系统的可用性。

2.3 使用

Session的生命周期

  • 创建:当用户首次访问服务器时,服务器创建一个Session对象,并生成一个唯一的Session ID。
  • 使用:用户在不同页面之间跳转时,携带这个Session ID,服务器通过这个ID找到对应的Session对象,从而读取或修改其中的数据。
  • 销毁:Session可以在一定时间后自动销毁,或者在用户主动注销时销毁。销毁的条件通常包括超过预设的空闲时间或用户明确退出系统。
import javax.servlet.http.HttpSession;  
  
@Controller  
public class MyController {  
  
    @RequestMapping("/setSession")  
    public String setSessionAttribute(HttpSession session) {  
        session.setAttribute("username", "JohnDoe");  
        return "redirect:/showSession";  
    }  
  
    @RequestMapping("/showSession")  
    public String showSessionAttribute(Model model, HttpSession session) {  
        String username = (String) session.getAttribute("username");  
        model.addAttribute("username", username);  
        return "sessionPage";  
    }  
}

3. 区别

Session与Cookie是两种常见的用于跟踪用户状态和实现用户认证的机制,它们在存储位置、安全性、数据类型以及有效期等方面存在显著区别。

  • 存储位置
    • Cookie:数据保存在客户端(浏览器)上。
    • Session:数据保存在服务器端。
  • 安全性
    • Cookie:由于数据存储在客户端,容易被攻击者通过分析本地文件进行篡改或窃取,因此被认为不够安全。为了提高安全性,通常会结合使用HTTPS协议来加密传输过程。
    • Session:数据存储在服务器上,即使客户端被恶意攻击,攻击者也难以直接获取到敏感信息,因此相对更安全。
  • 数据类型
    • Cookie:只能存储ASCII字符,如果需要存储非ASCII字符,则必须进行编码处理。
    • Session:可以存储任意类型的数据,一般情况下可以看作是一个容器,能够存储更多复杂的数据结构。
  • 有效期
    • Cookie:可以设置为长时间保持,甚至永久有效,具体取决于Cookie的生命周期设置。
    • Session:通常在用户关闭浏览器或应用程序时终止,没有固定的生命周期,但可以通过配置延长其有效性。
  • 存取方式
    • Cookie:每次请求服务器时都会携带Cookie,服务器根据Cookie中的信息识别用户身份。
    • Session:服务器通过Session ID识别用户,当用户首次访问时生成一个唯一的Session ID并发送给客户端,后续请求中客户端会携带这个ID,服务器根据ID读取相应的Session数据。
  • 性能影响
    • Cookie:由于数据存储在客户端,不会占用服务器资源,但会占用一定的客户端内存或磁盘空间。
    • Session:由于数据存储在服务器上,会占用服务器资源,特别是在高并发情况下可能会对服务器性能产生较大影响。
  • Cookie和Session各有优缺点。Cookie适合存储不敏感的信息且希望减少服务器负载的情况;而Session则更适合需要高安全性和复杂数据存储的场景。

参考链接

cookie详解,一篇文章彻底搞懂cookie
彻底了解Cookie和Session的区别(面试)

Spring Boot 跨域和 Session Cookie失效问题的解决方法如下: 首先,跨域问题可以通过配置Spring Boot的CORS(跨源资源共享)来解决。在Spring Boot中,可以使用注解 `@CrossOrigin` 或在配置类中添加 `addCorsMappings` 方法来配置跨域的访问。 @CrossOrigin 注解可以应用在控制器类或方法上,指定允许跨域的来源、方法、头部、是否允许携带凭证(比如 Cookie)等参数。例如: ```java @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600, allowCredentials = "true") @GetMapping("/example") public ResponseEntity<String> getExample() { // ... } ``` 另一种配置跨域的方法是创建配置类,并继承 `WebMvcConfigurer` 接口,并重写其 `addCorsMappings` 方法。例如: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://localhost:8080") .allowedMethods("GET", "POST") .allowCredentials(true) .maxAge(3600); } } ``` 其次,Session Cookie失效问题可以通过在跨域请求中添加凭证(Credentials)来解决。具体来说,可以将 `allowCredentials` 参数设置为 `true`,同时在请求头中添加 `withCredentials: true`。例如: ```javascript fetch('http://localhost:8080/api/example', { method: 'GET', credentials: 'include' // 或 'same-origin' }) ``` 这样配置后,Spring Boot就可以正常接收带有 Cookie 的跨域请求,并在服务端保持 Session 的有效性。 综上所述,通过配置跨域设置和同时在请求中添加凭证,可以解决Spring Boot跨域和Session Cookie失效的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值