17

我想关闭我认为是 Spring Boot 默认的 HttpOnly 会话。如何在春季启动时关闭 HttpOnly?

我目前有如下代码:

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

这将返回 HTTP 调用的响应标头:

Set-Cookie: JSESSIONID=D14846D9767B6404F1FB4B013AB66FB3; Path=/; HttpOnly 

请注意 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);
    }
}
4

4 回答 4

15

适合 Spring Boot 的已接受答案的另一种替代方法是覆盖您的EmbeddedServletContainerCustomizer.

首先,实现接口:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements EmbeddedServletContainerCustomizer

然后为自定义方法添加一个覆盖:

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

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

您还可以使用此方法调整 tomcat 中的其他内容,例如为 json 启用 gzip 并扩展最大 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);
    }
});
于 2014-06-12T15:10:01.183 回答
10
server.servlet.session.cookie.http-only=false 

(属性更新)

参考https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

于 2019-07-12T13:05:21.550 回答
6

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

server.servlet.session.cookie.http-only= # "HttpOnly" flag for the session cookie. configuration property.

官方文档中所述。

于 2016-11-18T15:09:46.327 回答
5

Tomcat 有一个名为 context 的属性useHttpOnly,它检查:

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

因此,您需要将其设置为 false。链接的配置适用于非嵌入式 Tomcat 服务器。我们需要找到一种方法来使用嵌入式 Tomcat。

这是你如何做到的。您声明一个@Bean用于将 a 添加EmbeddedServletContainerFactory到上下文的方法。您可以TomcatEmbeddedServletContainerFactory通过指定TomcatContextCustomizer配置适当属性的 a 来配置返回。

@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);
    }
}

此解决方案有效,因为您使用的是 Tomcat。使用不同的 Servlet 容器,解决方案会有所不同。

于 2014-03-15T20:29:26.500 回答