我有一个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也会尝试读取整个请求正文。
答案 0 :(得分:0)
Tomcat有一个请求大小限制。你可以配置它。如果超过它,Tomcat将关闭连接,这将导致客户端重置。