2013-04-25 93 views
0

我在我的應用程序中集成了Spring Security,並希望在出現錯誤憑據的情況下向用戶顯示錯誤消息。 JSP:Spring MVC:如何將Model對象從控制器中的一個方法傳遞到同一控制器中的另一個方法?

<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"); 
    

我正在上面的代碼以下錯誤:

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

我沒碰到過this鏈接,但我發現這是一個非常漫長的解決方案,不知道是否iv'e寫這麼多的代碼。

我不確定我是否可以使用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()); 
    } 

但我仍想知道如果我可以從一個控制器方法在同一個控制器通過某種方式傳遞模型對象的另一種方法。

+0

更改爲:返回新的ModelAndView(「redirect:portalLogin.html」,model); – Ritesh 2013-04-25 16:52:17

回答

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> 
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> 
相關問題