2013-08-28 80 views
2

我不明白,在接下来的情况下,Struts2的验证的概念:Struts 2的验证概念的理解

我的应用程序由2个动作:

  1. login.action
  2. drive.action

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

如何执行验证代码,以防止在命令行中运行drive.action(如果用户未在login.action中成功填写用户名和密码?

+1

命令行?验证取决于拦截器。 –

+2

您可能正在寻找认证而不是验证。 –

+0

http://stackoverflow.com/questions/5509606/sessions-in-struts2-application/5517526#5517526 –

回答

1

The validation concept

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

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

如果我们使用的是默认设置,但我们的操作没有定义“输入”结果并且存在验证(或者偶然发生了 类型转换)错误,我们会收到错误消息我们 没有为动作定义“输入”结果。


这很简单,你通过验证的配置文件验证器的字段映射,或通过注释。然后通过显式或隐式地通过拦截器堆栈,自定义堆栈或defaultStack引用拦截器来应用拦截器。

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

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

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

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

+0

如果我启用客户端验证,那么服务器端验证将被禁用?@ Roman C – tanmoy

+0

@tanmoy不,服务器端验证可以工作,不管客户端验证如何。 –

+0

@ Roman C所以我们不需要单独的javascript代码进行验证。我对么? – tanmoy

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
    如果问题得以解决,请标记为答案。谢谢。
+0

你的拦截器不会工作。 SessionAware和ServletRequestAware接口标记_actions_用于注入,而不是其他_interceptors_。修改它以从调用上下文中获取会话和请求。 –

+0

@StevenBenitez:先生,上面的代码正在为我工​​作。如果有错误,请纠正。 –

+0

我不知道它将如何工作。什么是注入会话映射和HttpServletRequest?通常,ServletConfigInterceptor将这些注入到_actions_中。拦截器不拦截其他_interceptors_,所以再次,不知道这是如何工作的。 –