0

我已经在我的应用程序中集成了 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

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

我不确定是否可以将 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());
    }

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

4

2 回答 2

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>
于 2013-04-25T16:32:10.957 回答
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>
于 2013-04-25T20:21:55.553 回答