【问题标题】:Spring MVC : How to pass Model object from one method in controller to another method in same controller?Spring MVC:如何将模型对象从控制器中的一个方法传递到同一控制器中的另一个方法?
【发布时间】:2013-04-25 16:25:26
【问题描述】:

我已经在我的应用程序中集成了 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 后被覆盖,因为我之前在那里创建了一个新的模型对象。 但是我尝试了几个简单的选项,通过这些选项我可以将模型对象从一个控制器方法传递到同一控制器中的另一种方法。但没有任何效果。

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

        return new ModelAndView("portalLogin","secerror","true");
    

上述代码出现以下错误:

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

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

我不确定是否可以将模型对象用于@ModelAttribute annotations@ModelAttribute

请提供我可以试用的代码 sn-ps / 示例。

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

    @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());
    }

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

【问题讨论】:

  • 更改为:return new ModelAndView("redirect:portalLogin.html", model);

标签: spring spring-mvc spring-security


【解决方案1】:

你也可以试试这样的

<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>

【讨论】:

    【解决方案2】:

    让事情变得简单,如果你想显示一个错误的凭据消息,你可以简单地做这样的事情:

    在你的 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>
    

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2021-07-26
      • 2013-10-07
      • 2012-10-13
      • 2019-09-26
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多