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