【问题标题】:is it allowed to redirect a request after forwarding?转发后是否允许重定向请求?
【发布时间】:2011-08-30 15:29:56
【问题描述】:
在某些情况下,我想强制注销用户。我正在使用 Spring Security,我知道如何做到这一点的唯一方法是转发/重定向到 /logout (或 Spring 为注销尝试而监听的任何 URL)。由于理论上用户可以阻止他的浏览器跟随重定向,所以我宁愿转发到注销 URL,因为执行注销逻辑非常重要。由于 Spring 在(未)成功注销后总是会进行重定向,我想知道这是否会成为问题。所以,简而言之,是在请求已经转发之后允许重定向,还是会导致 IllegalStateException?
【问题讨论】:
标签:
java
servlets
redirect
spring-mvc
spring-security
【解决方案1】:
所以,简而言之,在请求已经转发之后是否允许重定向,还是会导致 IllegalStateException?
不,绝对没问题。响应本身不知道转发 - 它纯粹发生在服务器内部。转发只是一种将控制从一个服务器组件内部转移到另一个服务器组件的机制。
相比之下,您通常无法在重定向后转发,因为重定向“提交”响应,并且无法撤消。
【解决方案2】:
只有在提交响应时,您才会收到IllegalStateException。所以如果转发的资源在重定向之前提交了响应,那么你会得到IllegalStateException。当响应标头已经发送时,响应被提交。当您将一个字节写入响应正文并刷新它时,可能会发生这种情况。重定向需要未提交的响应,因为重定向需要通过设置带有空白正文的 Location 标头来完成。
在一个体面的 MVC 方法中,JSP 是响应的一部分,因此无论何时您通过 scriptlet 或 JSTL <c:redirect> 从 JSP 内部发送重定向,那么您将冒@ 987654325@。但是,如果您不在任何地方这样做,就没有什么可担心的。