我想关闭我认为是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);
}
}
答案 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);
答案 3 :(得分:0)
server.servlet.session.cookie.http-only=false
(属性已更新)
引用https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html