用户创建帐户后,我想自动登录该用户.
我的标准表单登录由Springs过滤器在/ postlogin处理.如果我去http:// localhost / postlogin它试图登录我(失败,因为我没有包括post参数),但做出正确的尝试.
但是如果我想以编程方式登录用户,并尝试从控制器返回:“forward:/ postlogin”我得到一个404.
我假设forward:指令不通过过滤器,因此不能被UsernamePasswordAuthenticationFilter处理.
解决方法
我错读了另一条指导,意识到正确的处理方法如下:
1)在SecurityContextHolder上手动设置认证令牌
UsernamePasswordWithAttributesAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( loadUserByUsername(username),password,authorities ); SecurityContextHolder.getContext().setAuthentication(authenticationToken);
2)此时不要呈现页面或使用forward:指令.您必须使用redirect:directive.
return "redirect:/accountcreated";
如果您呈现页面,页面将加载正常,但会话对象将丢失,因为将创建一个新的j_session_id,但不会使其到浏览器中间请求,下一个请求将使用旧的j_session_id,丢失新的会话对象& authetication.
使用forward:指令将绕过认证过滤器,没有好的.
但重定向:导致更新的会话信息使其到浏览器.