关闭HttpOnly Spring启动

时间:2014-03-15 18:50:35

标签: java spring spring-boot httponly

我想关闭我认为是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 个答案:

答案 0 :(得分:12)

适用于春季启动的已接受答案的另一种替代方法是覆盖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并扩展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);
    }
});

答案 1 :(得分:4)

Tomcat有context attribute named useHttpOnly检查:

  

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

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

这是你怎么做的。您声明了@Bean方法,用于向上下文添加EmbeddedServletContainerFactory。您可以通过指定配置相应属性的TomcatEmbeddedServletContainerFactory来配置返回的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);
    }
}

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

答案 2 :(得分:4)

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

mysqli_stmt_bind_param($statement, "siss",$first_name,$last_name,$email,$username,$password);

official documentation中所述。

答案 3 :(得分:0)

server.servlet.session.cookie.http-only=false 

(属性已更新)

引用https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html