转发后允许重定向请求吗?

时间:2011-05-22 15:41:48

标签: java servlets redirect spring-mvc spring-security

在某些情况下,我想强行注销用户。我正在使用Spring Security,我知道如何执行此操作的唯一方法是转发/重定向到/ logout(或者Spring注销的任何URL以进行注销尝试)。从理论上讲,用户可以阻止他的浏览器遵循重定向,我宁愿前往注销URL,因为执行注销逻辑非常重要。由于Spring在(非)成功注销后总会进行重定向,我想知道这是否会成为一个问题。那么,简而言之,是在转发请求后允许重定向,还是会导致IllegalStateException?

2 个答案:

答案 0 :(得分:6)

  

那么,简而言之,是在转发请求后允许重定向,还是会导致IllegalStateException?

不,这绝对没问题。响应本身不知道转发 - 它完全出现在服务器的内部。转发只是一种机制,用于将控制从一个服务器组件内部传输到另一个服务器组件。

相比之下,重定向后通常无法转发,因为重定向“提交”响应,并且没有撤消。

答案 1 :(得分:4)

提交响应时,您只会获得IllegalStateException。因此,如果转发的资源在重定向之前提交响应,那么您将获得IllegalStateException。响应头已经发送时提交响应。当您将一个字节写入响应主体并将其刷新时,就会发生这种情况。重定向需要未提交的响应,因为需要通过设置带有空白主体的Location标头来完成重定向。

在一个不错的MVC方法中,JSP是响应的一部分,因此每当您通过 scriptlet 或JSTL <c:redirect>从JSP内部发送重定向时,您将风险IllegalStateException。但如果你不在任何地方这样做,就没什么可担心的。