Struts 2验证概念的理解

时间:2013-08-28 23:08:55

标签: java validation authentication struts2

我不理解下一种情况下Struts2验证的概念:

我的申请包含两项行动:

  1. login.action
  2. drive.action
  3. 我可以从浏览器命令行运行drive.action而无需填写login.action

    中的用户和密码

    如果用户未在drive.action中成功填写用户和密码,如何实施阻止命令行运行login.action的验证码?

2 个答案:

答案 0 :(得分:1)

  

The validation concept

     

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

     

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

     

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


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

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

您的操作应该实现此接口,或者只是扩展已经实现的ActionSupport以保存错误。然后workflow拦截器检查这些错误,如果发现任何错误重定向到input结果,如果没有发现错误,则执行动作调用。您还可以通过实现Validateable接口为操作添加编程验证,默认情况下ActionSupport已实现,因此会覆盖validate()方法。

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

所有这一概念都不适用于需要身份验证的操作(除非将身份验证拦截器应用于操作)。如果您使用JAAS身份验证,那么您应该考虑采取行动来实现PrincipalAware或使用roles拦截器来限制对检查isUserInRole()的操作的访问。如果用户未在Is there a way to redirect to another action class without using on struts.xml示例中进行身份验证,则可以使用Action.LOGIN结果返回到身份验证拦截器中的登录页面。

答案 1 :(得分: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. session interceptor
  2. package configuration
  3. interceptor
  4. interceptor stack example
    如果这解决了您的问题,请标记为答案。感谢。