尝试将消息发送到浏览器时出现错误提示

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/

10-09 17:18