Springboot如何去掉URL后面的jsessionid
如何去掉URL后面的jsessionid
url中有Jsessionid生成的原因
jsessionid是標(biāo)明session的id,它存在于cookie中,一般情況不會(huì)出現(xiàn)在url中,服務(wù)器會(huì)從客戶(hù)端的cookie中取出來(lái),但是如果客戶(hù)端禁用了cookie的話,就要重寫(xiě)url了,顯式的將jsessionid重寫(xiě)到Url中,方便服務(wù)器來(lái)通過(guò)這個(gè)找到session的id。
如果客戶(hù)端請(qǐng)求的cookie中不包含JSESSIONID,服務(wù)端調(diào)用request.getSession()時(shí)就會(huì)生成并傳遞給客戶(hù)端,此次響應(yīng)頭會(huì)包含設(shè)置cookie的信息
如果客戶(hù)端請(qǐng)求的cookie中包含JSESSIONID,服務(wù)端調(diào)用request.getSession()時(shí)就會(huì)根據(jù)JSESSIONID進(jìn)行查找對(duì)象,如果能查到就返回,否則就跟沒(méi)傳遞JSESSIONID一樣;
解決方式一
springBoot2.0之前版本
在 .yml配置文件中做如下配置
解決方式二
在啟動(dòng)類(lèi)中繼承SpringBootServletInitializer,然后重寫(xiě)這個(gè)方法 (此方法在springBoot2.0之前版本沒(méi)有起作用,暫時(shí)做記錄)
public void onStartup(ServletContext servletContext) throws ServletException { super.onStartup(servletContext); // This will set to use COOKIE only servletContext.setSessionTrackingModes( Collections.singleton(SessionTrackingMode.COOKIE) ); // This will prevent any JS on the page from accessing the // cookie - it will only be used/accessed by the HTTP transport // mechanism in use SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig(); sessionCookieConfig.setHttpOnly(true); }
Java關(guān)于jsessionid和URL
在寫(xiě)JSP程序時(shí),經(jīng)常發(fā)現(xiàn)url中有一個(gè)jsessionid參數(shù),在刷新之后就消失了。一些人認(rèn)為這是個(gè)一個(gè)BUG。
這不是一個(gè)bug。當(dāng)一個(gè)新的session被創(chuàng)建時(shí),server并不確定客戶(hù)端是否支持cookies,所以它生成了一個(gè)cookie,就是URL中jsessionid的值。當(dāng)客戶(hù)端在第二次帶著cookie返回時(shí),服務(wù)器就知道jsessionid不是必須的,所以就會(huì)刪掉它。如果客戶(hù)端沒(méi)有帶著cookie返回,服務(wù)器就會(huì)繼續(xù)在url中添加jsessionid參數(shù)。
但是現(xiàn)在幾乎很難想象瀏覽器會(huì)不支持cookie。jsessionid參數(shù)也可能會(huì)給SEO和安全帶來(lái)一定問(wèn)題。
對(duì)SEO的沖擊
有些搜索引擎可能會(huì)懲罰(找不到更好的詞形容)那些具有多個(gè)不同url但內(nèi)容相同的網(wǎng)站。因?yàn)閟essionid是唯一的,所以多個(gè)搜索機(jī)器人將返回相同的內(nèi)容但url不同。
這是一個(gè)嚴(yán)重的問(wèn)題。我們?cè)囈幌掠胓oogle搜索inurl:;jsessionid,Google的搜索結(jié)果:About 211,000,000 results (0.25 seconds)
安全問(wèn)題
在url中包含sessionId不是一個(gè)明智之舉,這將為攻擊者提供便利。
解決之道
不幸的是Servlet Specification和Servlet Containers中并未提供一個(gè)標(biāo)準(zhǔn)的方法去禁止在url中帶jsessionid。
不過(guò)我們可以通過(guò)servlet filter去解決這個(gè)問(wèn)題。
package com.lgete.web.filter; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; /** * @author Zhu Jia <a * href="mailto:zhujia7895@gmail.com" rel="external nofollow" >zhujia7895@gmail.com</a> * */ public class URLSessionFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (!(request instanceof HttpServletRequest)) { chain.doFilter(request, response); return; } HttpServletResponse httpResponse = (HttpServletResponse) response; HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper( httpResponse) { public String encodeRedirectUrl(String url) { return url; } public String encodeRedirectURL(String url) { return url; } public String encodeUrl(String url) { return url; } public String encodeURL(String url) { return url; } }; chain.doFilter(request, wrappedResponse); } public void init(FilterConfig filterConfig) { } public void destroy() { } }
在web.xml中添加以下內(nèi)容:
<filter> <filter-name>URLSessionFilter</filter-name> <filter-class>zj.web.filter.URLSessionFilter</filter-class> </filter> <filter-mapping> <filter-name>URLSessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04OpenFeign實(shí)現(xiàn)攜帶請(qǐng)求頭方案詳細(xì)介紹
這篇文章主要介紹了OpenFeign實(shí)現(xiàn)攜帶請(qǐng)求頭方案,在通過(guò)???OpenFeign???進(jìn)行服務(wù)調(diào)用的過(guò)程中,我們需要將用戶(hù)的??user-token???、??lang??等信息放入請(qǐng)求header中。在分布式系統(tǒng)中,往往一個(gè)業(yè)務(wù)接口內(nèi)部會(huì)發(fā)生多次RPC調(diào)用2022-11-11通過(guò)Java實(shí)現(xiàn)設(shè)置Word文檔頁(yè)邊距的方法詳解
頁(yè)邊距是指頁(yè)面的邊線到文字的距離。通??稍陧?yè)邊距內(nèi)部的可打印區(qū)域中插入文字和圖形等。今天這篇文章將為您展示如何通過(guò)編程方式,設(shè)置Word?文檔頁(yè)邊距,感興趣的可以了解一下2023-02-02JavaWeb應(yīng)用實(shí)例:用servlet實(shí)現(xiàn)oracle 基本增刪改查
本篇文章主要介紹了JavaWeb應(yīng)用實(shí)例:用servlet實(shí)現(xiàn)oracle 基本增刪改查,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01關(guān)于Hystrix的監(jiān)控及可視化面板
這篇文章主要介紹了關(guān)于Hystrix的監(jiān)控及可視化面板,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08springboot項(xiàng)目配置swagger2示例詳解
Swagger是一款RESTful接口的文檔在線自動(dòng)生成、功能測(cè)試功能框架。本文重點(diǎn)給大家介紹springboot項(xiàng)目配置swagger2示例代碼詳解,需要的朋友參考下吧2021-09-09java實(shí)現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫(xiě)工具
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫(xiě)工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04小伙熬夜用Java重現(xiàn)經(jīng)典超級(jí)馬里奧代碼實(shí)例
這篇文章主要介紹了Java重現(xiàn)經(jīng)典超級(jí)馬里奧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)詳解
在本篇文章中小編給大家分享了關(guān)于java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲(chǔ)的相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。2019-04-04