当登录失败时,我试图重定向登录页面上输入的用户名,但在我的控制器中,从“@modelattribute(”user“)”检索的用户的用户名为空。当我不使用spring security时,这是有效的。
我假设form实际上首先发送到spring security,然后重定向到控制器,因此在spring security之间输入的信息丢失。
@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";
}
<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是可行的,但是您的解决方案并没有完全正常工作,因为在failureHandler bean中似乎需要“p:defaultFailureURL”,尽管我在表单-login中有“authentication-failure-url=”/login?authfailed“
<bean id="failureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"
p:useForward="true"
p:defaultFailureUrl="/login"/>
之后,我不得不用post方法为/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";
}
您应该使用AuthenticationFailureHandler。就您的目的而言,声明Spring SimpleUrlAuthenticationFailureHandler类的bean并指定将请求fowarding到目标URL,而不是配置中的默认重定向行为就足够了。这样,您的登录控制器就可以访问原始请求,包括用户名。
文档:http://docs.spring.io/autorepo/docs/spring-security/3.2.1.release/apidocs/org/springframework/security/web/authenticationsimpleurlauthenticationfailurehandler.html
来源:https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authenticationsimpleurlauthenticationfailurehandler.java
<bean id="failureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"
p:useForward="true"
/>
然后在表单登录规范中:
<security:form-login
...
authentication-failure-handler-ref="failureHandler"
...
/>
最近我正在努力学习SpringMVC。似乎我没有很好地理解@SessionAttributes和@ModelAttribute注释的功能。 这是我的控制器的一部分: 基本上有一个jsp列出所有的项目。用户点击"addToCart"获取特定商品,该商品将被添加到购物车列表中。我最好先解释一下我对这个控制器的理解,你可以告诉我我没有得到什么。 第一次调用ItemController时,将执行creat
我有一个控制器,我把get和post方法都放在其中。这两种方法都很好,但当我将@ModelAttribute注释引入POST方法时,它开始给我状态400——客户端发送的请求在语法上不正确。 我不知道我做错了什么。视图看起来像: 我尝试将命令名称=“想法”更改为模型属性=“想法”,但没有好处。 Spring控制器看起来像 但是一旦我从submit方法中删除了@ model attribute(" I
如果我错了请纠正我。两者都可以用于数据绑定。 谢谢!!
我正在尝试使用表单更新用户名。问题是,当我使用@modelattribute时,我会得到以下错误: 帐户控制器类: 模型用户类: 负责用户名更改的用户服务方式:
年龄限制默认值不是由选择的,但是它与请求参数配合得很好。 YML文件 下面是带有请求参数Request的旧代码 下面是ModelAttribute请求的新代码
但Spring controller无法填充我的模型。这里是(但我不应该是问题所在,因为正如我所说的,IntelliJ的REST客户端工作良好) 下面是我的控制器的方法: