Springboot如何去掉URL后面的jsessionid
如何去掉URL后面的jsessionid
url中有Jsessionid生成的原因
jsessionid是標明session的id,它存在于cookie中,一般情況不會出現(xiàn)在url中,服務器會從客戶端的cookie中取出來,但是如果客戶端禁用了cookie的話,就要重寫url了,顯式的將jsessionid重寫到Url中,方便服務器來通過這個找到session的id。
如果客戶端請求的cookie中不包含JSESSIONID,服務端調(diào)用request.getSession()時就會生成并傳遞給客戶端,此次響應頭會包含設置cookie的信息
如果客戶端請求的cookie中包含JSESSIONID,服務端調(diào)用request.getSession()時就會根據(jù)JSESSIONID進行查找對象,如果能查到就返回,否則就跟沒傳遞JSESSIONID一樣;
解決方式一
springBoot2.0之前版本
在 .yml配置文件中做如下配置

解決方式二
在啟動類中繼承SpringBootServletInitializer,然后重寫這個方法 (此方法在springBoot2.0之前版本沒有起作用,暫時做記錄)
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關于jsessionid和URL
在寫JSP程序時,經(jīng)常發(fā)現(xiàn)url中有一個jsessionid參數(shù),在刷新之后就消失了。一些人認為這是個一個BUG。
這不是一個bug。當一個新的session被創(chuàng)建時,server并不確定客戶端是否支持cookies,所以它生成了一個cookie,就是URL中jsessionid的值。當客戶端在第二次帶著cookie返回時,服務器就知道jsessionid不是必須的,所以就會刪掉它。如果客戶端沒有帶著cookie返回,服務器就會繼續(xù)在url中添加jsessionid參數(shù)。
但是現(xiàn)在幾乎很難想象瀏覽器會不支持cookie。jsessionid參數(shù)也可能會給SEO和安全帶來一定問題。
對SEO的沖擊
有些搜索引擎可能會懲罰(找不到更好的詞形容)那些具有多個不同url但內(nèi)容相同的網(wǎng)站。因為sessionid是唯一的,所以多個搜索機器人將返回相同的內(nèi)容但url不同。
這是一個嚴重的問題。我們試一下用google搜索inurl:;jsessionid,Google的搜索結果:About 211,000,000 results (0.25 seconds)
安全問題
在url中包含sessionId不是一個明智之舉,這將為攻擊者提供便利。
解決之道
不幸的是Servlet Specification和Servlet Containers中并未提供一個標準的方法去禁止在url中帶jsessionid。
不過我們可以通過servlet filter去解決這個問題。
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>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
通過Java實現(xiàn)設置Word文檔頁邊距的方法詳解
頁邊距是指頁面的邊線到文字的距離。通常可在頁邊距內(nèi)部的可打印區(qū)域中插入文字和圖形等。今天這篇文章將為您展示如何通過編程方式,設置Word?文檔頁邊距,感興趣的可以了解一下2023-02-02
JavaWeb應用實例:用servlet實現(xiàn)oracle 基本增刪改查
本篇文章主要介紹了JavaWeb應用實例:用servlet實現(xiàn)oracle 基本增刪改查,非常具有實用價值,需要的朋友可以參考下。2017-01-01
java實現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫工具
這篇文章主要為大家詳細介紹了java實現(xiàn)數(shù)字轉(zhuǎn)換人民幣中文大寫工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
小伙熬夜用Java重現(xiàn)經(jīng)典超級馬里奧代碼實例
這篇文章主要介紹了Java重現(xiàn)經(jīng)典超級馬里奧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲詳解
在本篇文章中小編給大家分享了關于java8中NIO緩沖區(qū)(Buffer)的數(shù)據(jù)存儲的相關知識點,需要的朋友們參考下。2019-04-04

