雄猫 8.5 "socket write error",带弹簧安全和 CXF



我有一个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头,则一切正常,处理请求并发送响应。看起来问题出在协商身份验证方法上——客户端首先在没有身份验证的情况下尝试,然后服务器回复它期望的基本身份验证,然后客户端发送适当的身份验证头。它适用于较小的有效负载,但如果有效负载超过2MB(大致),tomcat会在第一个(未经验证的)请求上中断,在日志中没有任何跟踪。

有趣的是,同样的应用程序在Jettymaven插件中也能工作。

Tomcat中是否有任何配置可以控制这种行为?如果不存在BASIC auth头,Tomcat应回复401,而不管请求大小如何。现在,tomcat会尝试读取整个请求体,即使请求没有经过身份验证。

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

最新更新