Struts 2validation概念的理解

在下一种情况下,我不理解Struts2validation的概念:

我的申请包括两个动作:

  1. login.action
  2. drive.action

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

如果用户未在login.action成功填充用户和密码,如何实现validation代码以防止从命令行运行drive.action

validation概念

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

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

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


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

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

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

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

所有这一概念都不适用于需要身份validation的操作(除非将身份validation拦截器应用于操作)。 如果使用JAAS身份validation,则应考虑执行PrincipalAware或使用roles拦截器来限制对检查isUserInRole()的操作的访问。 如果用户未经过身份validation,则可以使用Action.LOGIN结果返回到身份validation拦截器中的登录页面。 是否有方法可以在不使用struts.xml示例的情况下重定向到另一个操作类 。

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

 package com.interceptor; public class SessionInterceptor implements Interceptor,ServletRequestAware,SessionAware { HttpServletRequest request; //request object public Map sessionMap; @Override public void setSession(Map 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是:

             login.jsp  //here all the actions which you want to apply interceptor //rest of actions where above SessionInterceptor will be applied ... .... ..... 

不要先在上面的包里面写一个login.action,而是在struts.xml创建新包,如:

    drive    

我希望这就是你要找的东西。
这里有一些可能对您有帮助的链接

  1. 会话拦截器
  2. 包配置
  3. 拦截器
  4. 拦截器堆栈示例
    如果这解决了您的问题,请标记为答案。 谢谢。