当前位置: 首页 > 知识库问答 >
问题:

@ModelAttribute不使用spring

卫飞鹏
2023-03-14

当登录失败时,我试图重定向登录页面上输入的用户名,但在我的控制器中,从“@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";
}

共有1个答案

齐弘业
2023-03-14

您应该使用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客户端工作良好) 下面是我的控制器的方法: