【问题标题】:java.lang.IllegalStateException: getOutputStream() has already been called for this response - SpringBootjava.lang.IllegalStateException: getOutputStream() 已经为此响应调用 - SpringBoot
【发布时间】:2020-01-08 04:32:23
【问题描述】:

尝试向浏览器发送消息时出现以下错误

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();
    }

}

有人可以帮忙吗?

【问题讨论】:

    标签: java spring-boot spring-security


    【解决方案1】:

    可能是您正在使用 Spring Boot,但它检测到您尚未实现 ErrorViewResolver Bean,我查看了 DefaultErrorViewResolver 类并找到了一个 @ConditionalOnMissingBean 配置,该配置为您返回了 DefaultErrorViewResolver。

    基本上,您的 spring 自动配置正在使用 HttpServletResponse 的 getOutputStream(),并且如您所知,Streams 通常在使用后无法操作。 (你可以在这里看到:https://docs.oracle.com/javaee/6/api/javax/servlet/ServletResponse.html#getOutputStream()

    您的选择是禁用 DefaultErrorViewResolver 或让您的类实现 ErrorViewResolver,然后将您的逻辑放在 resolveErrorView() 方法中。

    希望这可能会有所帮助。

    【讨论】:

    • 用 getOutputStream 代替 getWriter 后错误解决。但现在问题已从代码中删除 setHeader 然后总是给出“需要完全身份验证才能访问此资源”如果放置 setHeader 然后总是加载登录弹出窗口。请帮助我。谢谢@tson22
    • 我也看过,但没有显示在带有浏览器的博客中。 @tson22
    猜你喜欢
    • 2023-03-08
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多