Spring MVC:如何将Model对象从控制器中的一个方法传递到同一个控制器中的另一个方法?

时间:2013-04-25 16:25:26

标签: spring spring-mvc spring-security

我已在我的应用程序中集成了Spring Security,并希望在凭据错误的情况下向用户显示错误消息。 JSP:

    <c:out value='${secerror}' /> //prints nothing on screen
    <c:if test="${empty secerror}">
    error is empty or null. //always prints this line on screen
    </c:if>
    <c:if test="${not empty secerror}">
    <div class="errorblock">
        Your login attempt was not successful, try again.<br /> Caused :
        ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
    </div>
    </c:if>
     <c:set var = "url" value = "/j_spring_security_check" />
    <form:form method="post" commandName="portalLogin" action="${pageContext.servletContext.contextPath}${url}" name="f">

[更新]:对不起,我意识到我的模型对象在重定向到portalLogin.html之后被重写,因为我创建了一个先前创建的新模型对象。 但我尝试了几个简单的选项,通过它我可以将Model对象从一个控制器方法传递到同一个控制器中的另一个方法。但没有任何效果。

  1. 我尝试使用forward:前缀而不是重定向前缀。为此,我根本没有收到错误消息。
  2. 我在loginerror方法中尝试了以下代码。

        return new ModelAndView("portalLogin","secerror","true");
    
  3. 上述代码出现以下错误:

            java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'portalLogin' available as request attribute
    

    我确实遇到了this链接,但我发现这是一个非常冗长的解决方案,并且不确定是否要编写那么多代码。

    我不确定我是否可以将Model对象用于@ModelAttribute注释@ModelAttribute

    请向我提供我可以试用的代码片段/示例。

    我的控制器方法是这样的:

        @RequestMapping("/portalLogin")
    public ModelAndView goToLogin(Model model) {
        try {
            System.out.println("Enter goToLogin************************");
        } catch (Exception exception) {
    
        }
        return new ModelAndView("portalLogin", "portalLogin", new LoginModel());
        //return new ModelAndView("portalLogin", model);
    }
    
        @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public ModelAndView loginerror(ModelMap model) {
    
        //model.addAttribute("secerror", "true");
        //return "redirect:portalLogin.html";
        return new ModelAndView("portalLogin","secerror","true");
    
    }  
    

    [更新]:作为一种解决方法,我在loginerror方法中添加了goToLogin方法逻辑,因为我的唯一目的是获取portalLogin页面。错误按预期抛出。

        @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public ModelAndView loginerror(Model model) {
         model.addAttribute("secerror", "true");       
        return new ModelAndView("portalLogin", "portalLogin", new LoginModel());
        }
    

    但我仍然想知道我是否可以通过某种方式将Model对象从一个控制器方法传递到同一个控制器中的另一个方法。

2 个答案:

答案 0 :(得分:0)

让我们轻松一点,如果你想要显示一个错误的凭证信息,你可以简单地做这样的事情:

在spring-security.xml中:

<sec:form-login login-page="/login.jsp"
    default-target-url="/default-url-when-login-correct"
    authentication-failure-url="/login.jsp?error=true"
    login-processing-url="/login" always-use-default-target="true" />

在你的login.jsp中:

<c:if test="${not empty param.error}">
    <span>${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}</span>
</c:if>

答案 1 :(得分:0)

您也可以尝试这样的事情

<c:if test="${not empty secerror == 'true'}">
<tr>
<td colspan="2" align="center"><font style="color: red">Your login attempt was not successful, try again</font>
</td></tr></c:if>