1

我的应用程序中有一个login.jsp页面。我正在使用 Struts 2 和一个简单的validate()方法来验证我的表单。我有两个问题:

  1. validate()我的表单 bean 类中的方法验证表单。即检查空字段等。如果我需要检查我的用户名和密码组合,我应该在内部validate()还是在我的操作类中执行此操作?

  2. 如果我在Action课堂上做同样的事情,正确的组合会导致成功页面。我希望不正确的组合导致我的 JSP 页面以及错误消息:“不正确的组合”。如何在我的 JSP 页面中检查请求来自操作类,以便它可以打印错误消息“错误组合”?

4

3 回答 3

1

身份验证属于行动,而不是验证,IMO。

可能会考虑对字段本身使用 XML 或注释验证并将登录尝试放入 中validate(),但代码很小,无论哪种方式我都会很舒服。

public String execute() {
    if (userService.loginValid(username, password) {
        return SUCCESS;
    }

    addActionError(getText("login.failure"));
    return FAILURE;
}

我会使用框架对动作级错误消息的支持而不是使用标志(如果我这样做了,我不会将该标志与本地重复),并且我强烈建议使用可以注入的东西来执行实际登录使测试更容易。

使用该validate()方法使事情变得非常紧凑:

public void validate() {
    if (!userService.loginValid(username, password)) {
        addActionError(getText("login.failure"));
    }
}

假设您定义了合理的“输入”和“成功”结果,这可能就是您所需要的。如果看代码的开发者熟悉框架,validate()版本就比较清晰了。

如果您对使用 XML 或注释验证不感兴趣,也可以手动进行。这绝对属于validate(),对于像这样的常用实用方法,静态导入使代码仍然相对简洁:

public void validate() {
    boolean tryLogin = true;

    if (isBlank(username)) {
        addFieldError("username", getText("login.username.required"));
        tryLogin = false;
    }

    if (isBlank(password)) {
        addFieldError("password", getText("login.password.required"));
        tryLogin = false;
    }

    if (tryLogin && !userService.loginValid(username, password)) {
        addActionError(getText("login.failure"));
    }
}

(我添加了tryLogin标志以避免看到明显会失败的登录错误消息,尽管这也可以通过其他方式处理。登录后处理省略了。)

于 2013-01-25T22:35:54.040 回答
0

我会说您绝对不希望验证方法中的登录逻辑;那是为了验证数据。

我建议如果您的登录失败,只需在操作上公开一个数据属性,例如:

execute () {

   boolean authenticated = login( getUsername(), getPassword() );
   setLoginValid( authenticated );

   if ( authenticated ) 
      result = SUCCESS;
   else 
      result = FAILURE;

   return result;

}

然后在您的 login.jsp 中,只需在 struts if 标记中包装一条有关错误凭据的消息,并测试 loginValid 属性。

于 2013-01-25T20:44:05.073 回答
0

验证框架的目的是检查字段值是否有效,以防止在执行操作时出现意外错误。

将验证逻辑与业务逻辑分开是一种很好的做法。身份验证与验证逻辑无关。它是由安全机制提供的一个单独的过程。当然,您可以创建执行身份验证的操作或拦截器,并且与任何操作一样,您可以对其进行配置以进行验证。

validation在 Struts2 中,通过将拦截器应用到处理请求的工作中,它更加简化了。在更复杂的场景中,身份验证成为业务逻辑的一部分,但验证输入字段的方法重命名相同。如果您的操作只是进行身份验证,那么您可能不需要验证来处理身份验证。

对于您的第二个问题:您所需要的只是addActionError(getText("error.key"))使该操作无效。然后返回结果<s:actionerror>显示消息的位置。

更重要的是,如果您决定将验证逻辑移到操作中,则验证逻辑保持不变。在这种情况下,您唯一需要做的就是删除验证堆栈。这种验证的唯一原因是返回与 不同的结果"input"

于 2013-01-25T21:37:31.863 回答