我的申请中有一个
login.jsp
页面。我正在使用 Struts 2 和一个简单的 validate()
方法来验证我的表单。我有两个问题:
validate()
方法验证表单。即检查空字段等。如果我需要检查我的用户名和密码组合,我应该在 validate()
内还是在我的操作类中执行此操作?
如果我在我的
Action
类中做同样的事情,正确的组合会导致成功页面。我希望不正确的组合能够引导至我的 JSP 页面并显示错误消息:“不正确的组合”。如何在 JSP 页面中检查请求是否来自操作类,以便它可以打印错误消息“组合不正确”?
身份验证属于操作,而不是验证,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
标志以避免看到明显失败的登录错误消息,尽管这也可以通过其他方式处理。登录后处理被省略。)
我建议,如果您的登录失败,只需在操作上公开数据属性,例如:
execute () {
boolean authenticated = login( getUsername(), getPassword() );
setLoginValid( authenticated );
if ( authenticated )
result = SUCCESS;
else
result = FAILURE;
return result;
}
然后在您的login.jsp中,只需在struts if标记中包装一条有关错误凭据的消息,并对loginValid属性进行测试。
将验证逻辑与业务逻辑分开是一个很好的实践。身份验证与验证逻辑无关。它是安全机制提供的一个单独的进程。当然,您可以创建执行身份验证的操作或拦截器,并且与任何操作一样,您可以配置它进行验证。
在 Struts2 中,通过应用
拦截器,它变得更加简化是处理请求的工作的一部分。在更复杂的场景中,身份验证成为业务逻辑的一部分,但验证输入字段的方法会重命名为相同的。如果您的操作只是进行身份验证,那么您可能不需要验证来处理身份验证。 对于第二个问题:您只需
addActionError(getText("error.key"))
即可使操作无效。然后返回结果,其中
<s:actionerror>
显示消息。更重要的是,如果您决定将其移至操作,验证逻辑将保持不变。在这种情况下,您唯一要做的就是删除验证堆栈。这种
验证的唯一原因是返回与"input"
不同的结果。