【发布时间】:2015-11-03 18:47:27
【问题描述】:
我试图在登录失败时重定向登录页面上输入的用户名,但在我的控制器中,从“@ModelAttribute("user")”检索到的用户的用户名为空。当我不使用弹簧安全时,这是可行的。
我假设表单实际上首先发布到 Spring Security,然后它被重定向到控制器,因此输入的信息在 Spring Security 之间丢失。
如何在不将用户发送到链接参数的情况下检索用户?
PS:我尝试为“/loginFailed”创建一个控制器,并在登录失败时将其发送到那里,并在该控制器上使用 method = RequestMethod.POST。
登录控制器
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String listPersons(@ModelAttribute("user") User u, @RequestParam(required = false) String authfailed, String logout,
String denied, Model model) {
model.addAttribute("user", u);
String message = "";
if (authfailed != null) {
message = "Invalid username or password, try again !";
} else if (logout != null) {
message = "Logged Out successfully, login again to continue !";
} else if (denied != null) {
message = "Access denied for this user !";
}
model.addAttribute("error", message);
return "login";
}
login.jsp
<c:url var="trylogin" value="/j_spring_security_check" ></c:url>
<c:url var="register" value="/register" ></c:url>
<div id="login-box">
<form:form action="" modelAttribute="user" method="POST">
<table>
<tr>
<td> <form:label path="username"> <spring:message text="Username: "/> </form:label> </td>
<td> <form:input path="username" /> </td>
</tr>
<tr>
<td> <form:label path="password"> <spring:message text="Password: "/> </form:label> </td>
<td> <form:password path="password" /> </td>
</tr>
<tr>
<td> <input type="submit" value="<spring:message text="Login"/>"
onclick="document.getElementById('user').setAttribute('action', '${trylogin}')"/> </td>
<td> <input type="submit" value="<spring:message text="Register"/>"
onclick="document.getElementById('user').setAttribute('action', '${register}')"/> </td>
</tr>
</table>
</form:form>
<c:if test="${not empty error}">
<div class="error">${error}</div>
</c:if>
</div>
编辑(解决方案):
谢谢@James,创建一个 failureHandler 是可行的方法,但是您的解决方案不能正常工作,因为即使我有“authentication-failure-url =”,您似乎在 failureHandler bean 中也需要“p:defaultFailureUrl” /login?authfailed"" 在表单登录中
<bean id="failureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"
p:useForward="true"
p:defaultFailureUrl="/login"/>
之后我不得不为 /login 添加另一个函数,因为 p:defaultFailureUrl="/login?authFailed" 只会将它作为 /login 发送,并且浏览器上的链接保持为 "/j_spring_security_check" 我不能'不明白为什么。
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginFail(@ModelAttribute("user") User u, @RequestParam(required = false) String authfailed, RedirectAttributes redirectAttrs) {
redirectAttrs.addFlashAttribute("user", u);
redirectAttrs.addFlashAttribute("error", "Invalid username or password, try again !");
return "redirect:/login";
}
【问题讨论】:
标签: java spring jsp spring-mvc spring-security