- 浏览: 25690 次
最新评论
关于在后台实现前台表单的格式验证设计(annotation+spring aop)iteye技术网站
2011年05月01日
关于在后台实现前台表单的格式验证:
因为对于一个web工程来说,安全是比较重要的,view中实现的js验证,对于一个hacker或者说是一个专业的破坏者来说是不会起到任何作用的,最直接的,它可以完全的自编浏览器,跳过js的验证,丢入n多不合规则的数据,那带来的安全隐患时巨大的,如何在后台实现完美的验证,而不必要写太多的代码是极其重要的。
1.思路结构图
2.源码实现
Annotation
package com.test.main; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AnotationTest { String regExp(); String ifTip(); }
TestEntity
package com.test.main; import java.util.Date; public class EntityTestTwo { private int sex; private String tel; private Date beginDate; public String getTel() { return tel; } @AnotationTest(regExp="^\\d{11}$",ifTip="手机号码填写错误") public void setTel(String tel) { this.tel = tel; } public Date getBeginDate() { return beginDate; } //@AnotationTest(regExp="^\\d\\d\\d\\d-\\d\\d-\\d\ \d$",ifTip="日期填写错误") public void setBeginDate(Date beginDate) { this.beginDate = beginDate; } public int getSex() { return sex; } @AnotationTest(regExp="^.$",ifTip="性别填写错误") public void setSex(int sex) { this.sex = sex; } }
RegExpException
package com.test.main; public class RegExpException extends Exception{ public RegExpException(String exceptionDesc){ System.out.println(exceptionDesc); } }
SimpleAspect
package com.test.main; import java.io.IOException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class SimpleAspect { @Pointcut("execution(* com.test.main.*.set*(..))") public void simplePointcut() {} @AfterReturning(pointcut="simplePointcut()") public void simpleAdvice() { //System.out.println("注入执行"); } @Before(value="simplePointcut()") public void puAdvise(JoinPoint joinPoint) throws Exception, IOException{ // //String className="com.test.main.EntityTest"; //根据request的请求参数,此时应该全部产生 //ServletActionContext.getRequest().getParameterNa mes(); String className = joinPoint.getSignature().getDeclaringType().getNam e(); String methodName = joinPoint.getSignature().getName(); String argType = (joinPoint.getSignature().toLongString()).split("\ \(")[1].split("\\)")[0]; Map org_obj = new HashMap(); org_obj.put("int", "java.lang.Integer"); org_obj.put("double", "java.lang.Double"); org_obj.put("float", "java.lang.Float"); org_obj.put("boolean", "java.lang.Boolean"); org_obj.put("char", "java.lang.Character"); org_obj.put("byte", "java.lang.Byte"); org_obj.put("short", "java.lang.Short"); org_obj.put("long", "java.lang.Long"); if(org_obj.containsKey(argType)){ argType = org_obj.get(argType); } String propertyValue = joinPoint.getArgs()[0].toString(); Class pointCutClass = Class.forName(className); Class[] parameterTypes = new Class[1]; parameterTypes[0] = Class.forName(argType); Method method=null; try{ method = pointCutClass.getMethod(methodName,parameterTypes) ; }catch(NoSuchMethodException e){ Method[] methods = pointCutClass.getMethods(); for(Method m : methods) if(m.getName().equals(methodName)) //for(Class c : m.getParameterTypes()) method = m; } boolean otherFlag = method.isAnnotationPresent(AnotationTest.class); //if(otherFlag) set.add(method); if(otherFlag){ AnotationTest anotationTest = method.getAnnotation(AnotationTest.class); //传过来的参数值 String regExp = anotationTest.regExp(); String ifTip = anotationTest.ifTip(); boolean bl = Pattern.matches(regExp,propertyValue); System.out.println(bl); if(!bl){ //PrintWriter out = System.out.println(ifTip); throw new RegExpException("正则匹配抛出异常"); } } } }
Test
package com.test.main; import java.net.URL; import org.slf4j.ILoggerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlAp plicationContext; import org.springframework.core.io.ClassPathResource; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; public final class Boot { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ Logger logger = LoggerFactory.getLogger(Boot.class); //从web.xml读配置 ApplicationContext ctx = new ClassPathXmlApplicationContext("config/application Context.xml"); // A a = (A) ctx.getBean("a"); // a.sayHello(); EntityTestTwo a = (EntityTestTwo)ctx.getBean("entityTwo"); //SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-ss"); //a.setBeginDate(new Date()); // a.setSex(222); a.setTel("1111111111"); //logger. //String path = System.getProperty("user.dir"); //BasicConfigurator.configure(); // PropertyConfigurator.configure(new ClassPathResource("config/logback.properties").get URL()); // System.out.println(new ClassPathResource("config/logback.properties").get URL()); String logbackCfg = "config/logback.xml"; URL logURL = new ClassPathResource(logbackCfg).getURL(); System.out.println(logURL); ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); LoggerContext loggerContext = (LoggerContext) loggerFactory; //loggerContext.reset(); JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(loggerContext); configurator.doConfigure(logURL); logger.debug("dddd"); logger.info("wowowow"); logger.error("yanzhengosss"); // PropertyConfigurator.configure("/config/log4j.prop erties"); //B b = (B) ctx.getBean("b"); //b.sayHi(); // /*String className="com.test.main.EntityTest"; Class test = null; try { test = Class.forName(className); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Method[] methods = test.getMethods(); Set set = new HashSet(); for(int i=0;i) at com.test.main.Boot.main(Boot.java:32) Caused by: com.test.main.RegExpException at com.test.main.SimpleAspect.puAdvise(SimpleAspect.j ava:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source) at java.lang.reflect.Method.invoke(Unknown Source)手机号码填写错误 正则匹配抛出异常 at org.springframework.aop.aspectj.AbstractAspectJAdv ice.invokeAdviceMethodWithGivenArgs(AbstractAspectJ Advice.java:627) at org.springframework.aop.aspectj.AbstractAspectJAdv ice.invokeAdviceMethod(AbstractAspectJAdvice.java:6 09) at org.springframework.aop.aspectj.AspectJMethodBefor eAdvice.before(AspectJMethodBeforeAdvice.java:39) at org.springframework.aop.framework.adapter.MethodBe foreAdviceInterceptor.invoke(MethodBeforeAdviceInte rceptor.java:49) at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java: 171) at org.springframework.aop.framework.adapter.AfterRet urningAdviceInterceptor.invoke(AfterReturningAdvice Interceptor.java:50) at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java: 171) at org.springframework.aop.interceptor.ExposeInvocati onInterceptor.invoke(ExposeInvocationInterceptor.ja va:89) at org.springframework.aop.framework.ReflectiveMethod Invocation.proceed(ReflectiveMethodInvocation.java: 171) at org.springframework.aop.framework.Cglib2AopProxy$D ynamicAdvisedInterceptor.intercept(Cglib2AopProxy.j ava:635) ... 2 more
由于程序原本设计是基于web工程,所以因为在web工程遭遇500 ERROR时会异常退出,所以在程序中借助PrintWriter对象进行错误输出,当然要用到ajax,在错误输出时页面不会跳转,否则正常执行;注意由于没想到什么好的办法来终止程序执行,这里用抛出异常来处理,因为测试环境为普通的java工程,所以能否在web工程中如理想的运行,暂未作测试,之后会贴入web测试源码和测试结果。
发表评论
-
在Windows下安装Hadoop遇到的几个问题
2012-01-20 01:02 857在Windows下安装Hadoop遇到 ... -
windows下使用gcc编译boost库
2012-01-20 01:02 3536windows下使用gcc编译boost ... -
Visual Studio 2008 SP1 补丁安装时发生严重错误-安装失败-解决方法整合版!-分享
2012-01-20 01:02 2888Visual Studio 2008 SP1 补丁 ... -
编译 boost
2012-01-20 01:02 808编译 boost 2011年05月17日 ... -
将 Flex 3 的应用程序迁移到 Flex 4 ―第 1 部分:将 Flex 3 Dashboard 应用程序导入 Flash Builder 4
2012-01-20 01:02 694将 Flex 3 的应用程序迁移到 Flex 4 ―第 1 部 ... -
网络语言进课堂:上海禁止北京面对
2012-01-19 08:51 666网络语言进课堂:上海禁 ... -
跟着我去流浪
2012-01-19 08:51 623跟着我去流浪 2011年09 ... -
关于非诚勿扰
2012-01-19 08:51 657关于非诚勿扰 2012年01月17日 ... -
全国十大美女城市客观排行 2008/03/08 11:0
2012-01-19 08:51 702全国十大美女城市客观排行 2008/03/08 11:0 2 ... -
CUDA的VISUAL STUDIO 2008环境配置(转)
2012-01-17 01:19 1053CUDA的VISUAL STUDIO 2008环境配置(转) ... -
3dsmax使用哪个版本好
2012-01-17 01:19 37443dsmax使用哪个版本好 20 ... -
关于Android的一些设计
2012-01-17 01:19 659关于Android的一些设计 2012年01月13日 ... -
WMI(Windows管理规范)常见问题解答
2012-01-17 01:19 718WMI(Windows管理规范)常见 ... -
下载安卓源代码过程
2012-01-17 01:19 690下载安卓源代码过程 2011年12月23日 linux和 ... -
学编程的同学看看
2012-01-15 20:02 637学编程的同学看看 2009年11月21日 ... -
三种语言的下载者源代码:C Delphi Vb
2012-01-15 20:02 772三种语言的下载者源代码:C Delphi Vb 2010年0 ... -
发几个vb整人小程序代码.第一次发帖.希望大家多多支持
2012-01-15 20:02 1227发几个vb整人小程序代 ... -
VB制作快捷打开电脑里的应用软件比如:我的电脑 网上邻居 等....
2012-01-15 20:01 630VB制作快捷打开电脑里的应用软件比如:我的电脑 网上邻居 等. ... -
VB如何连接帮助文件
2012-01-15 20:01 788VB如何连接帮助文件 2009年12月04日 VB如何 ... -
java操作word等
2012-01-11 12:12 505java操作word等 2011年05月01日 1、一个 ...
相关推荐
GSH:spring3.1.0M2+Hibernate3.5+GWT2.4+JPA+Annotation+Spring4gwt0.0.1亲手整合,也可以上新浪博客去看 http://blog.sina.com.cn/s/blog_687dfecb0100yrmf.html
Spring_Annotation_AOP
struts2.18+hibernate3.3.2+spring2.56、annotation注解 全部打包 可以用
NULL 博文链接:https://bijian1013.iteye.com/blog/2142528
NULL 博文链接:https://tianhei.iteye.com/blog/978969
jquery easyUI+struts2+spring+hibernate基于annotation实现的CRM
基于Log4j+SpringAOP+Annotation的可注解日志切面组件 使用方式 @Log(logAfter = true, logBefore = true) public returntype methodName(params) 测试类com.liam.aop.aspect.test.AopLogAnnotationTest 测试输出 ...
http://blog.csdn.net/shan9liang/article/details/22295841 EJB+Annotation实现AOP的DEMO
SpringMVC+Hibernate+annotation+Easyui权限管理系统,Session过期控制(包括Ajax请求的过期控制),访问权限控制(权限控制到按钮),hibernate数据库用户名与密码加密,其它的不说了,绝对物有所值
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
在微服务流行的当下,在使用SpringCloud/Springboot框架开发中,AOP使用的非常广泛,尤其是@Aspect注解方式当属最流行的,不止功能强大,性能也很优秀,还很舒心!所以本系列就结合案例详细介绍@Aspect方式的切面的...
Spring mvc Aop+annotation实现系统日志记录功能实现的jar包asm-3.3.jar ,aspectjrt.jar , aspectjweaver.jar , cglib-nodep-2.1_3.jar , spring-aop.jar
基于annotation的aop实现 动态代理理念(study content Aspect)
JSF+Spring+Hibernate(Annotation)的login小实例,建议入门的朋友看看,老鸟就免了,呵呵。环境:SQLSever2000+jdk5.0+spring2.0+hibernate3.2+jsf
反射、Annotation与aop技术文档 反射、Annotation与aop技术文档,
aop入门。
下载后请修改数据库用户名和密码,即springAnnotation-hibernate.xml...分页显示,编辑更新,多行删除等更功能,使用了MVC设计模式,结构清晰明了,适合初学者, 入口地址:http://localhost:8080/mvcDemo/user/turnadd
SpringAOP的注解配置完成切面的编程,完成execution,annotation两种表达式的实例Ddemo
NULL 博文链接:https://tuoxinquyu.iteye.com/blog/1465187
Struts2+Spring2+Hibernate3+Annotation所需JAR包