带有spring-security和CXF的tomcat 8.5“套接字写入错误”

时间:2017-02-07 22:19:14

标签: tomcat spring-security

我有一个Web应用程序,它是CXF SOAP服务,使用基本身份验证由Spring安全保护。

安全配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and().httpBasic()
        .and().csrf().ignoringAntMatchers("/ws/**");
}

应用程序部署在tomcat 8.5.11上,身份验证没问题,SOAP服务还可以但是我注意到,如果请求体更大(2MB),客户端(SOAPUI)不会得到服务器的响应但它会抛出:

ERROR:java.net.SocketException: Connection reset by peer: socket write error
java.net.SocketException: Connection reset by peer: socket write error

问题在于是否未预先执行基本身份验证。如果请求没有BASIC auth头,则tomcat中断而不是发送401响应。如果存在BASIC auth标头,则一切正常,处理请求并发送响应。看起来问题在于协商auth方法 - 客户端首先尝试没有auth然后服务器回复它期望基本auth然后客户端发送适当的auth头。它适用于小型有效负载,但如果有效负载超过2MB(大致),则tomcat会在第一个(未经身份验证的)请求中断,无需在日志中进行任何跟踪。

有趣的是,同一个应用程序可以在Jetty maven插件中运行。

Tomcat中是否有可以控制此行为的配置?如果没有BASIC auth标头,Tomcat应回复401,无论请求大小如何。就像现在一样,即使请求未经过身份验证,tomcat也会尝试读取整个请求正文。

1 个答案:

答案 0 :(得分:0)

Tomcat有一个请求大小限制。你可以配置它。如果超过它,Tomcat将关闭连接,这将导致客户端重置。