将跟踪模式设置为cookie以删除附加的会话ID,而不使用web.xml

时间:2013-04-28 11:17:23

标签: java spring spring-mvc cookies

我正在设置一个完全基于java的spring应用程序,没有xml配置:

public class WebApp extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebMvcConfigurer.class};
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { mypackages })
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/static-assets/");
    }

    @Bean
    public ViewResolver viewResolver() {

        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

我把它放在哪里,曾经在我的web.xml中?

 <session-config>
        <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

5 个答案:

答案 0 :(得分:8)

你可以按照下面的方式进行

public class WebConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext)
            throws ServletException {
        HashSet<SessionTrackingMode> set = new HashSet<SessionTrackingMode>();
        set.add(SessionTrackingMode.COOKIE);
        servletContext.setSessionTrackingModes(set);

    }

}

答案 1 :(得分:3)

Since 3.2.0.RC1这可以在AbstractSecurityWebApplicationInitializer中使用,如下所示:

public class WebSecutityInit extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected Set<SessionTrackingMode> getSessionTrackingModes() {
        return EnumSet.of(SessionTrackingMode.SSL);
    }
}

答案 2 :(得分:2)

在Spring Boot应用中,您可以使用application property server.session.tracking-modes配置模式。

application.properties添加:

server.session.tracking-modes=cookie

或者如果您使用application.yml

server:
  session:
    tracking-modes: 'cookie'

Spring Boot自动配置在内部使用与servletContext.setSessionTrackingModes相同的调用,Bassem在his answer中建议使用该调用。

答案 3 :(得分:0)

另一个适用于我的解决方案是SecurityConfig类中的以下代码。

d <- data.frame("User id"=c(1,1,2,3,1),
                block=c("north","south","east","west","south"), check.names = F)

f <- function(l, vec) {
  vec[l] <- 1
  vec
}

vec <- setNames(rep(0, 4), levels(d$block))
df <- aggregate(block~`User id`, d, f, vec)

答案 4 :(得分:0)

spring boot 2.4.0 起,应用程序属性被重命名为 server.servlet.session.tracking-modes。

所以,在application.properties中,需要添加

server.servlet.session.tracking-modes="cookie"

如果使用application.yml,需要有

server:
    servlet:
        session:
            tracking-modes: cookie