Struts 2validation概念的理解
在下一种情况下,我不理解Struts2validation的概念:
我的申请包括两个动作:
- login.action
- 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
我希望这就是你要找的东西。
这里有一些可能对您有帮助的链接
- 会话拦截器
- 包配置
- 拦截器
- 拦截器堆栈示例
如果这解决了您的问题,请标记为答案。 谢谢。