【问题标题】:Spring security: Cannot call sendRedirect() after the response has been committed [duplicate]Spring security:提交响应后无法调用 sendRedirect() [重复]
【发布时间】:2016-06-04 00:24:45
【问题描述】:

我正在使用以下代码进行注销:

public class LogoutHandler extends SimpleUrlLogoutSuccessHandler {


@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
        throws IOException, ServletException {
    if(!response.isCommitted()) {
        String targetURL = "myUrl";
        response.setContentType(MediaType.TEXT_PLAIN_VALUE);
        response.getWriter().write(target);
        response.getWriter().flush();
        response.getWriter().close();
        getRedirectStrategy().sendRedirect(request, response, targetURL);
    }

 }

}

但在调用 /logout WS 时出现以下异常:

 java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:494)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
at org.springframework.security.web.firewall.FirewalledResponse.sendRedirect(FirewalledResponse.java:26)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)

【问题讨论】:

  • 刷新响应后,您根本无法执行sendRedirect
  • 如何更正我的代码?
  • 那么我们应该如何使用onLogoutSuccess?没有重定向?

标签: java spring web-services spring-security


【解决方案1】:

不,你不能在写完正文后使用sendRedirect,因为这样就会“提交”响应。

如果您想使用自定义正文进行重定向,您可以设置相当于在编写响应正文之前执行重定向

response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);
response.setHeader("Location", targetURL);

【讨论】:

  • 现在我没有异常但我没有重定向到目标页面。
  • 我使用嵌入式 Tomcat Spring 应用程序。这个 setHeader 工作,但不知道为什么 setError 然后 sendRedirect 会引发异常,但在独立的 tomcat 中运行不会引发异常......
  • 那么我们应该如何使用onLogoutSuccess?没有重定向?
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多