【发布时间】:2013-12-11 13:33:33
【问题描述】:
我正在访问登录控制器中的 SavedRequest 以在登录表单中设置重定向 URL。当会话过期(或服务器启动后首次登录)时,savedRequest 为空。
如果我在新的浏览器会话中访问 url,则保存的请求可用。
我可以通过登录控制器一致地访问重定向 url 吗?
注意。我正在使用 spring 3.2.3 ..据我所知,savedRequest 不再可以从会话中访问。
login.jsp
<form action="${actionUrl}" method='POST' autocomplete='off'>
<span class="box-label">Username:</span>
<input type="text" name="j_username" data-dojo-type="dijit/form/TextBox" data-dojo-props="style:{width:'150px'}">
<span class="box-label">Password:</span>
<input type="password" name="j_password" data-dojo-type="dijit/form/TextBox" data-dojo-props="style:{width:'150px'}">
<input type="submit" data-dojo-type="dijit/form/Button" data-dojo-props="label:'Login'"/>
<input type="hidden" name="redirect" value="${redirect}">
</form>
登录控制器:
@Controller
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(final HttpSession session, final Model model, final HttpServletRequest request,
final HttpServletResponse response) {
addRedirectUrlToModel(model, request, response);
return "login";
}
private void addRedirectUrlToModel(final Model model, final HttpServletRequest request, final HttpServletResponse response) {
SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
if (savedRequest != null) {
model.addAttribute("redirect", savedRequest.getRedirectUrl());
} else {
System.out.println("saved request is null");
}
}
安全配置:
<sec:http auto-config="true" use-expressions="true">
<sec:form-login login-page="/login"
authentication-success-handler-ref="authSuccHandler"
authentication-failure-handler-ref="authFailHandler" />
<sec:logout delete-cookies="JSESSIONID" invalidate-session="true" />
<sec:access-denied-handler error-page="/error/not-authorised"/>
<sec:session-management session-fixation-protection="none"
invalid-session-url="/login/sessionExpired"
session-authentication-error-url="/login/alreadyLoggedIn"
>
<sec:concurrency-control max-sessions="1"
expired-url="/login/sessionExpiredDuplicateLogin"
error-if-maximum-exceeded="false"/>
</sec:session-management>
【问题讨论】:
-
请求存储在会话中,因此确实在会话超时后,存储的请求就消失了。
-
当会话被会话 mngmt 结束时也会发生这种情况(由于在另一个浏览器/机器上登录)
-
是的,所有会触发会话销毁的东西都会导致这种行为。没有会话,没有保存的请求。
-
还有其他方式获取重定向网址吗?例如如果我尝试访问localhost/app/my/page 并被重定向到localhost/app/login .. 我想在我的登录控制器中访问localhost/app/my/page
-
将其作为隐藏参数存储在表单中(可能是加密的)。如果您存储它/依赖会话并且没有会话它将失败。
标签: spring spring-mvc spring-security