Spring Boot:从 url 中删除 jsessionid

Posted

技术标签:

【中文标题】Spring Boot:从 url 中删除 jsessionid【英文标题】:Spring Boot: remove jsessionid from url 【发布时间】:2015-10-25 19:31:42 【问题描述】:

如何从我的网址中删除 jsessionid?

我正在使用 Spring Boot MVC(没有 Spring Security;嵌入了 tomcat)。

我读过这可以通过将 disableUrlRewriting 设置为“true”来完成。 但这看起来像是一个 Spring Security 解决方案,我不使用它(这是一个没有登录的简单项目;只是页面;存在会话控制器并且必须是会话控制器)。

我问这个是因为 GoogleBot 正在创建包含 id 的 url。

编辑: 我使用以下描述的解决方案解决了它:https://randomcoder.org/articles/jsessionid-considered-harmful

【问题讨论】:

【参考方案1】:

由于这个问题是在春季启动上下文中,对我来说简单的解决方案是:

server:
  session:
    tracking-modes: cookie

从春季 2 开始

server:
  servlet
    session:
      tracking-modes: cookie

在 appication.yml 中添加它修改嵌入式 tomcat 配置。从 ll spring boot 属性列表中: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties

【讨论】:

spring-boot 2.0 应该是server.servlet.session.tracking-modes=cookie,查看上面@DaveG 的答案。【参考方案2】:

更便携的选项也适用于非 SpringBoot,将以下内容添加到 webapp 的web.xml

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

【讨论】:

【参考方案3】:

我创建了一个又快又脏的 spring-boot 应用程序,这就是我想出的。

生成的 ServletInitializer,你可以用这种方式改变它:

package com.division6.bootr;

import java.util.Collections;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer 

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException 
        // This can be done here or as the last step in the method
        // Doing it in this order will initialize the Spring
        // Framework first, doing it as last step will initialize
        // the Spring Framework after the Servlet configuration is 
        // established
        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);
    

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(SpringBootrApplication.class);
    


作者注

我不是 100% 确定什么时候引入的,但是通过引入以下参数,无需编写代码即可完成相同的操作:

server.servlet.session.cookie.http-only=true server.servlet.session.tracking-modes=cookie

【讨论】:

【参考方案4】:

你也可以试试这个,

        @Bean
            public ServletContextInitializer servletContextInitializer() 
                return new ServletContextInitializer() 

                    @Override
                    public void onStartup(ServletContext servletContext) throws ServletException 
                       servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
                       SessionCookieConfig sessionCookieConfig=servletContext.getSessionCookieConfig();
                       sessionCookieConfig.setHttpOnly(true);
                    
                ;

        

【讨论】:

以上是关于Spring Boot:从 url 中删除 jsessionid的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?

从请求正文 Spring Boot 中删除空属性

使用spring boot从外部url下载文件

如何从 Spring Boot 中的 JSON 数组中删除元素? [关闭]

无法从 Spring Boot 应用程序中设置的 DBRef 中删除

Spring boot无法从数据源(mysql)确定jdbc url