2

在下一个案例中,我不理解 Struts2 验证的概念:

我的应用程序包含 2 个操作:

  1. 登录动作
  2. 驱动力动作

我可以drive.action从浏览器命令行运行而无需填写用户名和密码login.action

drive.action如果用户没有成功填写用户名和密码,我如何实现验证代码以防止从命令行运行login.action

4

2 回答 2

1

验证概念

Struts 2 验证是通过 XML 或注释配置的。操作中的手动验证也是可能的,并且可以与 XML 和注释驱动的验证相结合。

验证还取决于验证和工作流拦截器(两者都包含在默认拦截器堆栈中)。验证拦截器自己进行验证并创建一个特定于字段的错误列表。工作流拦截器检查是否存在验证错误:如果发现任何错误,它会返回“输入”结果(默认情况下),将用户带回包含验证错误的表单。

如果我们使用默认设置并且我们的操作没有定义“输入”结果并且存在验证(或者,顺便说一下,类型转换)错误,我们将收到一条错误消息,告诉我们没有“输入”为动作定义的结果。


很简单,您可以通过验证配置文件或注释将验证器映射到字段。然后通过validation拦截器堆栈、自定义堆栈或defaultStack.

当验证开始时,它会调用验证管理器来执行实际验证并将错误保存到ValidationAware操作中。

你的操作应该实现这个接口,或者只是扩展ActionSupport它已经实现的地方,以保存错误。然后workflow拦截器检查这些错误,如果发现它们中的任何一个重定向到INPUT结果,如果没有发现错误,则执行操作调用。您还可以通过实现默认实现的接口向操作添加编程验证,从而覆盖方法。ValidateableActionSupportvalidate()

作为基于 XML 的验证的补充,您还可以应用基于注释的配置。这只是服务器端验证,应用于浏览器的客户端验证通过 Struts 标记启用 javascript,用于将验证内容呈现给正在验证的页面。

所有这些概念都不适用于需要身份验证的动作(除非将身份验证拦截器应用于动作)。如果您使用 JAAS 身份验证,那么您应该考虑您的操作来实现PrincipalAware或使用roles拦截器来限制对检查isUserInRole(). 如果用户未通过身份验证,您可以使用Action.LOGINresult 返回到身份验证拦截器中的登录页面,如Is there a way to redirect to another action class without using onstruts.xml example。

于 2013-08-29T06:57:29.080 回答
0

要实现这一点,您需要使用 Dave Newton 所说的拦截器。
拦截器代码是:

package com.interceptor;
public class SessionInterceptor implements Interceptor,ServletRequestAware,SessionAware
{ 
   HttpServletRequest request; //request object
   public Map<String, Object> sessionMap;

@Override
public void setSession(Map<String, Object> arg0) {
    
    this.sessionMap = arg0;
}

@Override
public void setServletRequest(HttpServletRequest arg0) {
    
    this.request = arg0;
}

@Override
public void destroy() {
    
    
}

@Override
public void init() {
    
    
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
    
    sessionMap=invocation.getInvocationContext().getSession();
    ActionContext context=(ActionContext)invocation.getInvocationContext();

    String className = invocation.getAction().getClass().getName();
    String ActionName = invocation.getAction().toString();//action name which is called
           
            //below check if session map or username is null or you logic
            if(sessionMap==null || sessionMap.get("userName")==null){
            return "loginError";    //this will return without calling your drive.action if user name or session is null
        }else{
            return invocation.invoke();  //if session is available or user name then it will run the action
        }
  }//end of intercept method
}//end of class

struts.xml 是:

    <package name="Pkg" extends="struts-default" namespace="/">
    
    <interceptors>
        <interceptor name="sessionCheck" class="com.interceptor.SessionInterceptor">
    </interceptor>
    <interceptor-stack name="sessionStack">
        <interceptor-ref name="sessionCheck"/>          
        <interceptor-ref name="defaultStack" />
    </interceptor-stack>
    </interceptors>
    
    <default-interceptor-ref name="sessionStack"></default-interceptor-ref>
    
    <global-results>
        <result name="loginError">login.jsp</result>
    </global-results>
           //here all the actions which you want to apply interceptor
         //rest of actions where above SessionInterceptor will be applied
        ...
        ....
        .....

不要在上面的包中写你第一个 login.action 而是创建新的包struts.xml

   <package name="Pkg2" extends="struts-default">       
    <action name="login.action" class="com.action.LogAction" method="execute">
        <result name="success" type="redirect">drive</result> <!-- here action name drive is action from above package where interceptor is applied or any which you want-->
    </action>
  </package>

我希望这就是你要找的。
这里有几个链接可以帮助你

  1. 会话拦截器
  2. 包配置
  3. 拦截器
  4. 拦截器堆栈示例
于 2013-08-29T05:13:22.780 回答