中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot應用中如何設置Cookie的SameSite屬性

發布時間:2022-01-25 10:45:17 來源:億速云 閱讀:1037 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“Springboot應用中如何設置Cookie的SameSite屬性”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Springboot應用中如何設置Cookie的SameSite屬性”這篇文章吧。

Cookie除了keyvalue以外有幾個屬性。

  • httpOnly 是否允許js讀取cookie

  • secure 是否僅僅在https的鏈接下,才提交cookie

  • domain cookie提交的域

  • path cookie提交的path

  • maxAge cookie存活時間

  • sameSite 同站策略,枚舉值:Strict Lax None

其他的都很熟悉了,最后一個是 Chrome 51 開始,瀏覽器的 Cookie 新增加了一個 SameSite 屬性,用來防止 CSRF 攻擊和用戶追蹤。

關于SameSite的詳細解釋 可以看 Cookie 的 SameSite 屬性

在Javaweb應用中 ,設置 Cookie一般都是用 javax.servlet.http.Cookie,但是SameSite屬性出來不久,Servlet庫還沒更新,所以沒有設置SameSite的方法.

javax.servlet.http.Cookie 中定義的的屬性

可以看到,還沒有SameSite的定義

//
// The value of the cookie itself.

private String name; // NAME= ... "$Name" style is reserved
private String value; // value of NAME
// Attributes encoded in the header's cookie fields.
private String comment; // ;Comment=VALUE ... describes cookie's use
// ;Discard ... implied by maxAge < 0
private String domain; // ;Domain=VALUE ... domain that sees cookie
private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
private String path; // ;Path=VALUE ... URLs that see the cookie
private boolean secure; // ;Secure ... e.g. use SSL
private int version = 0; // ;Version=1 ... means RFC 2109++ style
private boolean isHttpOnly = false;

通過 ResponseCookie 給客戶端設置Cookie

本質上,Cookie也只是一個header。我們可以不使用Cookie對象,而通過自定義Header的方式來給客戶端設置Cookie

ResponseCookie 是Spring定義的一個Cookie構建工具類,極其簡單

import java.time.Duration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
public class TestController {
	
	@GetMapping("/test")
	public Object test (HttpServletRequest request,
					HttpServletResponse response) throws Exception {
		
		ResponseCookie cookie = ResponseCookie.from("myCookie", "myCookieValue") // key & value
				.httpOnly(true)		// 禁止js讀取
				.secure(false)		// 在http下也傳輸
				.domain("localhost")// 域名
				.path("/")			// path
				.maxAge(Duration.ofHours(1))	// 1個小時候過期
				.sameSite("Lax")	// 大多數情況也是不發送第三方 Cookie,但是導航到目標網址的 Get 請求除外
				.build()
				;
		
		// 設置Cookie Header
		response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
		
		return "ok";
	}
}

響應給客戶端的Cookie

Springboot應用中如何設置Cookie的SameSite屬性

所有屬性都響應正確 &radic;

HttpSession Cookie 的SameSite屬性

HttpSession依賴一個名稱叫做JSESSIONID(默認名稱)的Cookie。

對于JSESSIONID Cookie 的設置,可以修改如下配置。但是,目前spring也沒實現SameSite的配置項。

配置類 : org.springframework.boot.web.servlet.server.Cookie

server.servlet.session.cookie.comment
server.servlet.session.cookie.domain
server.servlet.session.cookie.http-only
server.servlet.session.cookie.max-age
server.servlet.session.cookie.name
server.servlet.session.cookie.path
server.servlet.session.cookie.secure

通過修改容器的配置,對Session Cookie設置SameSite屬性

import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.apache.tomcat.util.http.SameSiteCookies;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfiguration {
	@Bean
	public TomcatContextCustomizer sameSiteCookiesConfig() {
		return context -> {
			final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
			// 設置Cookie的SameSite
			cookieProcessor.setSameSiteCookies(SameSiteCookies.LAX.getValue());
			context.setCookieProcessor(cookieProcessor);
		};
	}
}

Spring Session的SameSite屬性

通過自定義 CookieSerializer 設置 SameSite屬性

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.web.http.CookieSerializer;

import com.video.common.spring.session.DynamicCookieMaxAgeCookieSerializer;
@Configuration
public class SpringSessionConfiguration {
	
	@Bean
	public CookieSerializer cookieSerializer() {
		DynamicCookieMaxAgeCookieSerializer serializer = new DynamicCookieMaxAgeCookieSerializer();
		serializer.setCookieName("JSESSIONID");
		serializer.setDomainName("localhost");
		serializer.setCookiePath("/");
		serializer.setCookieMaxAge(3600);
		serializer.setSameSite("Lax");  // 設置SameSite屬性
		serializer.setUseHttpOnlyCookie(true);
		serializer.setUseSecureCookie(false);
		return serializer;
	}
}

以上是“Springboot應用中如何設置Cookie的SameSite屬性”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉水县| 民勤县| 博乐市| 延寿县| 盱眙县| 宁海县| 米脂县| 上杭县| 龙里县| 普兰店市| 英超| 洪泽县| 利川市| 墨竹工卡县| 台中县| 黄浦区| 余干县| 泉州市| 兴国县| 宜川县| 鲁甸县| 历史| 刚察县| 竹北市| 清原| 黄石市| 湖州市| 天祝| 原平市| 瓦房店市| 英超| 遵义县| 肥西县| 申扎县| 灵石县| 大英县| 阳泉市| 绍兴县| 新泰市| 尉犁县| 徐水县|