java.lang.IllegalStateException:已为此响应调用getOutputStream()-SpringBoot
尝试向浏览器发送消息时出现以下错误java.lang.IllegalStateException:已为此响应调用getOutputStream()-SpringBoot,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,尝试向浏览器发送消息时出现以下错误 java.lang.IllegalStateException:已为此响应调用getOutputStream() 我正在使用基本身份验证,并试图在身份验证失败时发送消息。因此,在执行下面的代码时会出现上述错误 public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { @Override public void commence(H
java.lang.IllegalStateException:已为此响应调用getOutputStream()
我正在使用基本身份验证,并试图在身份验证失败时发送消息。因此,在执行下面的代码时会出现上述错误
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(),正如您所知,一旦使用流,通常无法对其进行操作。(如您在此处所见:) 您可以选择禁用DefaultErrorViewResolver或使类实现ErrorViewResolver,然后将逻辑放在resolveErrorView()方法中
希望这可能会有所帮助。可能是因为您使用的是Spring Boot,它检测到您没有实现ErrorViewResolver Bean,我查看了DefaultErrorViewResolver类的内部,发现了一个@ConditionalOnMissingBean配置,它返回了一个DefaultErrorViewResolver 基本上,spring自动配置使用的是HttpServletResponse的getOutputStream(),正如您所知,一旦使用流,通常无法对其进行操作。(如您在此处所见:) 您可以选择禁用DefaultErrorViewResolver或使类实现ErrorViewResolver,然后将逻辑放在resolveErrorView()方法中
希望这会有所帮助。在替换为getOutputStream而不是使用getWriter后,错误得到解决。但现在问题是从代码中删除了setHeader,然后总是给出“访问此资源需要完全身份验证”,如果放置了setHeader,则总是加载登录弹出窗口。请帮帮我。谢谢@tson22也许这篇文章会很有趣,我也看了,但没有用浏览器显示在博客上@TSON22错误在替换为getOutputStream而不是使用getWriter后得到解决。但现在问题是从代码中删除了setHeader,然后总是给出“访问此资源需要完全身份验证”,如果放置了setHeader,则总是加载登录弹出窗口。请帮帮我。谢谢@tson22也许这篇文章会很有趣,我也看了,但没有用浏览器显示在博客上@tson22