欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot如何去掉URL后面的jsessionid

 更新時(shí)間:2021年11月19日 15:04:13   作者:余_小凡  
這篇文章主要介紹了Springboot如何去掉URL后面的jsessionid,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

如何去掉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)文章

最新評(píng)論