关闭HttpOnly Spring启动

Nic*_*ich 12 java spring httponly spring-boot

我想关闭我认为是Spring Boot默认的HttpOnly会话.如何在弹簧靴上关闭HttpOnly?

我目前有以下代码:

@RequestMapping(value = "/stuff", method = GET)
public @ResponseBody
myObject doStuff(HttpSession session)
{
        session.setAttribute("foo", "bar");
        return  new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

这会在HTTP调用上返回响应头:

Set-Cookie: JSESSIONID=D14846D9767B6404F1FB4B013AB66FB3; Path=/; HttpOnly 
Run Code Online (Sandbox Code Playgroud)

注意HttpOnly标志.我想把它关掉.我该怎么办?

旁注:是的我知道httpOnly是一个安全功能,通过关闭它允许javascript访问我的cookie即XSS.

另外,我没有默认配置以外的任何配置.

@ComponentScan
@EnableAutoConfiguration
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(WebApplication.class);
        app.run(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 12

适用于spring boot的已接受答案的另一种替代方法是覆盖您的自定义方法EmbeddedServletContainerCustomizer.

首先,实现界面:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements EmbeddedServletContainerCustomizer
Run Code Online (Sandbox Code Playgroud)

然后为customize方法添加覆盖:

@Override
public void customize(final ConfigurableEmbeddedServletContainer container)
{
    ((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers(new TomcatContextCustomizer()
    {
        @Override
        public void customize(Context context)
        {
            context.setUseHttpOnly(false);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我发现httpOnly根本没有为我设置..所以我不得不使用这种方法来打开httpOnly(显然我的设置上面是'true').

您还可以使用此方法调整tomcat中的其他内容,例如为json打开gzip并扩展max http headersize(在我需要执行此操作的情况下进行kerberos身份验证):

((TomcatEmbeddedServletContainerFactory) container).addConnectorCustomizers(new TomcatConnectorCustomizer()
{
    @Override
    public void customize(final Connector connector)
    {
        AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
        httpProtocol.setMaxHttpHeaderSize(65536);
        httpProtocol.setCompression("on");
        httpProtocol.setCompressionMinSize(256);
        String mimeTypes = httpProtocol.getCompressableMimeTypes();
        String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
        httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 您实际上在一个答案中回答了我的两个问题,而您甚至不知道我的另一个问题是什么。荣誉 (2认同)

Sot*_*lis 5

Tomcat 有一个名为的上下文属性useHttpOnly,用于检查:

是否应该在会话 cookie 上设置 HttpOnly 标志以防止客户端脚本访问会话 ID?默认为 true。

所以需要将其设置为 false。链接的配置适用于非嵌入式 Tomcat 服务器。我们需要找到一种方法来使用嵌入式 Tomcat 来实现这一点。

操作方法如下。您声明一个@Bean将 a 添加EmbeddedServletContainerFactory到上下文的方法。您可以通过指定配置适当属性的TomcatEmbeddedServletContainerFactorya 来配置返回的值。TomcatContextCustomizer

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.setTomcatContextCustomizers(Arrays.asList(new CustomCustomizer()));
    return factory;
}

static class CustomCustomizer implements TomcatContextCustomizer {
    @Override
    public void customize(Context context) {
        context.setUseHttpOnly(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

该解决方案之所以有效,是因为您使用的是 Tomcat。对于不同的Servlet容器,解决方案会有所不同。


Enr*_*omo 5

至少在 Spring Boot >= 1.4 上,它更容易,只需使用以下属性:

server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie. configuration property.
Run Code Online (Sandbox Code Playgroud)

官方文档中所述