第 31 章 保存登录之前的请求

经常会碰到一种情况,用户花费大量时间编辑信息,但是session超时失效导致用户自动退出系统,安全过滤器会强制用户再次登录,但这也会使用户提交的信息全部丢失。

为了解决这个问题,Spring Security提供了一种称作SavedRequest功能,可以在未登录用户访问资源时,将用户请求保存起来,当用户登录成功之后SecurityContextHolderAwareRequestFilter会使用之前保存的请求,结合当前用户的请求生成一个新的请求对象,而这个请求对象中就保存了用户登录之前提交的信息。

SavedRequest功能默认就会被Spring Security启用,不需任何配置就可以重用登陆之前请求提交的数据。

如果希望尝试SavedRequest的功能,可以运行ch121中的实例。

进入系统后会显示一个表单,可以在表单中填写信息,然后进行提交。提交的目标页面是user.jsp。

未登录用户提交信息

图 31.1. 未登录用户提交信息


但是因为用户尚未登录,所以请求会被转发到登陆页面,当我们登录成功后,系统会自动跳转到用户登录之前请求的页面,user.jsp。

进入登陆页面

图 31.2. 进入登陆页面


因为我们使用了SavedRequest功能,所以现在就能在user.jsp看到我们登陆之前提交的信息。

使用登录之前提交的信息

图 31.3. 使用登录之前提交的信息


如果希望禁用SavedRequet这一功能,只需要在http标签中设置servlet-api-provision参数。

<http auto-config='true' servlet-api-provision="false">
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>
    

实例在ch121。