2012-01-18 65 views
1

我有一个方法可以处理URI为“/ home”的请求。该请求在成功登录时生成。这里是一个小的代码来支持我的情况:Spring MVC奇怪的行为

<security:form-login login-processing-url="/static/j_spring_security_check" 
login-page="/login" authentication-failure-url="/login?login_error=t" 
default-target-url="/home"/> 

该方法的主体演示了什么,我试图实现:

String userMail = SecurityContextHolder.getContext(). 
    getAuthentication().getName(); 
logger.info(userMail); 

Person p = userService.retrieveUserByEmail(userMail); 
session.setAttribute("person", p); 

return "user/home"; 

这一点很重要,因为人p被用作其他数据源要求。

现在的问题。我不知道它是否属于Google Chrome浏览器,但由于某些原因,浏览器会记住您在登录前完成的请求,而不是在成功登录过程后通过/ home请求,它会生成以前请求绕过这个/ home门,导致空指针异常,因为从未设置过p,因为会话没有被/ home请求填充。

我知道对于其他请求我应该进行验证,但我不喜欢让用户在没有事先通过/ home的情况下生成任何请求的想法。

完成与文字说明,现在解释我是如何得到的步骤不必要的行为:

  1. 索要请求,你知道存在诸如: 对myApp/nameOfSomething/viewThisSomething - 你被带到对数(您必须通过身份验证才能接受请求)

  2. 您输入正确的凭据,而不是转到default-target-url =“/ home” 您正在自动进行以前的请求myApp/nameOfSomething/viewThisSomething没有填充sessio n与必要的数据并导致空指针异常。

还有什么有趣的是,记录显示邮件,所以它可能是,他们都在同一时间执行,但/家的要求是比较慢 - 可以发生的呢?

我通过检查null和强制返回到/ home的方式解决了其他方法中的情况,这种方式按预期工作,但我是控制怪胎,不喜欢用户在做他不打算做的事情。

谢谢你的时间,

回答

2

这不是一个错误,它是一个功能。让用户在登录后进入他想去的地方而不是强迫他去主页更方便用户。他可以为其中一个受保护页面添加书签,或只是浏览一些包含受保护页面链接的非受保护页面。

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-form-target

如果表单登陆之前,没有试图访问受保护的资源 提示,默认目标-url就会发挥作用。这是成功登录后用户将被带到的 URL,并且 默认为“/”。您还可以配置这些内容,以便始终将 设置为 always-use-default-target属性,以便始终在此页面上登录(无论登录名是“按需登录” 还是明确选择登录) “真”

恕我直言,你应该保持原样,但确保在登录成功后设置所需的sesion属性,而不是在主页中设置此属性。这将确保每个受保护的页面都可以访问会话属性,即使用户没有访问主页。

通过使用自定义的UsernamePasswordAuthenticationFilter子类,您可以轻松完成此任务,该子类在身份验证成功后在会话中设置适当的属性。

+0

哦,我在做自定义方面很糟糕,但不管怎么样,谢谢我会研究它。 – Aubergine 2012-01-18 19:07:02