尝试将消息发送到浏览器时出现错误提示java.lang.IllegalStateException: getOutputStream() has already been called for this response
我正在使用基本身份验证,并尝试在身份验证失败时发送消息。因此在执行以下代码时遇到此错误。
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
org.springframework.security.core.AuthenticationException authException)
throws IOException, ServletException {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setHeader("WWW-Authenticate", "Basic realm=" + getRealmName());
response.setContentType("text/html");
PrintWriter writer = response.getWriter();//here getting error
writer.println("HTTP Status 401 : " + authException.getMessage());
}
@Override
public void afterPropertiesSet() throws Exception {
setRealmName("localhost");
super.afterPropertiesSet();
}
}
有人可以帮忙吗?
最佳答案
可能是您使用的是Spring Boot,并且它检测到您尚未实现ErrorViewResolver Bean,我在DefaultErrorViewResolver类内部查找了一个@ConditionalOnMissingBean配置,该配置可将DefaultErrorViewResolver返回给您。
基本上,您的spring自动配置使用的是HttpServletResponse的getOutputStream(),并且您知道,一旦使用Stream,通常就无法对其进行操作。 (如您在此处看到的:https://docs.oracle.com/javaee/6/api/javax/servlet/ServletResponse.html#getOutputStream())
您的选择是禁用DefaultErrorViewResolver或使您的类实现ErrorViewResolver,然后将您的逻辑放入resolveErrorView()方法内。
希望这会有所帮助。
关于java - java.lang.IllegalStateException:此响应已被调用getOutputStream()-SpringBoot,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57802654/