`
ligb2006
  • 浏览: 33295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

关于在后台实现前台表单的格式验证设计(Annotation+spring AOP)

阅读更多
关于在后台实现前台表单的格式验证:
因为对于一个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().getParameterNames();
    	String className = joinPoint.getSignature().getDeclaringType().getName();
    	String methodName = joinPoint.getSignature().getName();
    	String argType = (joinPoint.getSignature().toLongString()).split("\\(")[1].split("\\)")[0];
    	
    	Map<String,String> org_obj = new HashMap<String,String>();
    	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.ClassPathXmlApplicationContext;
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/applicationContext.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").getURL()); 
       // System.out.println(new ClassPathResource("config/logback.properties").getURL());
        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.properties");
       
        //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<Method> set = new HashSet<Method>(); 
        for(int i=0;i<methods.length;i++) 
        { 
        	boolean otherFlag = methods[i].isAnnotationPresent(AnotationTest.class); 
        	if(otherFlag) set.add(methods[i]); 
      	} 
      	for(Method m: set) 
      	{ 
      		AnotationTest anotationTest = m.getAnnotation(AnotationTest.class); 
      		System.out.println(anotationTest.regExp()); 
      		System.out.println("创建的社区:"+anotationTest.ifTip());
      	}*/
    }     
     
}

执行结果
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
false
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
	at com.test.main.EntityTestTwo$$EnhancerByCGLIB$$20bb68d6.setTel(<generated>)
	at com.test.main.Boot.main(Boot.java:32)
Caused by: com.test.main.RegExpException
	at com.test.main.SimpleAspect.puAdvise(SimpleAspect.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)手机号码填写错误
正则匹配抛出异常

	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:609)
	at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:39)
	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:49)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:50)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
	... 2 more


由于程序原本设计是基于web工程,所以因为在web工程遭遇500 ERROR时会异常退出,所以在程序中借助PrintWriter对象进行错误输出,当然要用到ajax,在错误输出时页面不会跳转,否则正常执行;注意由于没想到什么好的办法来终止程序执行,这里用抛出异常来处理,因为测试环境为普通的java工程,所以能否在web工程中如理想的运行,暂未作测试,之后会贴入web测试源码和测试结果。
  • 大小: 21.7 KB
分享到:
评论
1 楼 hip0216 2013-02-18  
大哥,能把配置文件给贴出来吗

相关推荐

    struts2+hibernate+annotation+spring整合的jar包

    Spring2.5.6版本支持AOP(面向切面编程),用于实现如日志、事务管理等横切关注点。Spring还集成了众多其他框架,如MyBatis、Quartz等,形成了一个完整的应用生态。 在整合SSH时,通常需要以下步骤: 1. **配置...

    jquery easyUI+struts2+spring+hibernate基于annotation实现的CRM

    【标题】:“jQuery EasyUI+Struts2+Spring+Hibernate基于注解实现的CRM系统” 在IT领域,CRM(Customer Relationship Management,客户关系管理)系统是企业用来优化与客户交互和管理的重要工具。本项目利用一系列...

    SpringBoot使用AOP+注解实现简单的权限验证的方法

    SpringBoot 使用 AOP+注解实现简单的权限验证的方法 SpringBoot 框架提供了强大的权限验证机制,以确保应用程序的安全性。其中一种方法是使用 AOP(Aspect-Oriented Programming)和注解来实现简单的权限验证。本文...

    基于Struts2.18+Spring2.5+Hibernater3.3+Annotation注解开发的电子商务网站demo

    在电子商务网站中,Spring可以管理Bean的生命周期,通过AOP实现事务管理,同时与Struts2协同工作,处理业务逻辑和服务层。 3. **Hibernate3.3**:Hibernate是Java领域的一个对象关系映射(ORM)框架,它简化了...

    基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发

    在基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发中,开发者可以利用注解(Annotation)来简化配置,提高开发效率。这个开发模式结合了三个主流的Java EE框架:Struts2作为MVC框架处理前端请求,...

    annotation hibernate struts spring springsecurity API中英文均有

    标题中的"annotation hibernate struts spring springsecurity"涵盖了四个关键的Java开发框架和技术:注解(Annotation)、Hibernate、Struts和Spring Security。这些是构建现代Java企业级应用的基础组件。 **注解...

    ssh-aop笔记

    - **事务管理**:Spring AOP可以方便地实现声明式事务管理,只需在服务层方法上添加@Transactional注解,无需编写事务控制代码。 - **日志记录**:可以在特定方法执行前后记录日志,简化日志处理。 - **性能监控**:...

    struts2+spring+hibernate示例

    **Annotation** 标签在Java中用于元数据,它允许在代码中添加信息,以便编译器、JVM或框架(如Spring和Hibernate)在运行时理解和处理。在SSH整合项目中,注解被广泛应用于配置各个组件,如在Action类上标注@...

    Struts2+Hibernate4+Spring3整合(注解和XML方式都有)

    在"Struts2+Hibernate4+Spring3整合"中,通常有两种方式实现整合: 1. **XML方式**:这是传统的配置方式,所有的配置信息都在XML文件中。Struts2的配置文件(struts.xml)定义Action和结果,Hibernate的配置文件...

    struts+spring+hibernate笔试题

    3. **表单验证:** 在执行 `Action` 之前,会通过 `ActionForm` 对象进行数据校验。 4. **业务逻辑处理:** 通过 `Action` 类调用业务逻辑层(Service)进行处理。 5. **结果返回:** 处理完成后返回一个 `Action...

    收集的struts+spring+hibernate面试题.doc

    在 Spring 中,AOP 可以通过声明式的方式实现,即通过 XML 或注解配置来定义切点(Pointcut)、增强(Advice)等。 **IOC(Inversion of Control,控制反转)**: 是一种设计模式,用来降低代码之间的耦合度。在 ...

    最新ssh框架配置(struts2.2.1+hibernate3.6.0+spring3.0.5)

    Spring框架是整个SSH中的粘合剂,它不仅提供了依赖注入(DI)和面向切面编程(AOP)功能,还在服务层管理业务对象,并与Struts2和Hibernate协同工作。Spring3.0.5增强了对JSR-303 Bean Validation的支持,改进了Web ...

    spring boot 防止重复提交实现方法详解

    Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 Spring Boot 防止重复提交实现方法的相关...

    spring+struts2+mybatis三大框架集成实现用户的增删改查入门操作案例

    **Spring框架**:Spring作为一款轻量级的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)容器,为应用程序提供依赖注入和事务管理等功能。在SSM集成中,Spring主要负责...

    spring-framework-2.5.5

    在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中,IoC容器是核心,负责管理对象的生命周期和依赖关系。在Spring 2.5.5中,你可以使用XML配置文件定义bean,也可以使用...

    Spring Security 3.pdf

    Spring Security 是一个强大的Java安全框架,专为Java和Spring生态系统设计,用于实现全面的身份验证、授权和服务级安全功能。在Spring Security 3版本中,它引入了许多改进和新特性,以适应不断变化的安全需求和...

    spring mvc项目后端源码

    2. **Controller**:控制器是处理请求和响应的核心组件,通常由实现了 `org.springframework.web.bind.annotation.Controller` 或 `org.springframework.stereotype.Controller` 注解的类组成。这些类包含处理方法,...

    Spring 2.0 MVC的应用

    在Spring MVC中,控制器通常是实现了`org.springframework.web.bind.annotation.Controller`注解的类。例如,我们可以创建一个名为`HomeController`的类,其中包含处理HTTP请求的方法,这些方法通常使用`@...

    Extjs+s2sh基于annotation实现的酒店管理系统

    【标题】:“Extjs+s2sh基于annotation实现的酒店管理系统”是一个综合性的IT项目,它融合了前端的Extjs框架和后端的Spring、Struts2以及Hibernate这三大经典技术(合称为S2SH),并利用注解(Annotation)进行简化...

    Spring Security详细介绍及使用含完整代码(值得珍藏)

    该框架利用Spring框架的核心功能,如IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)和AOP(Aspect-Oriented Programming,面向切面编程),通过一组可配置的Bean来实现对应用系统的...

Global site tag (gtag.js) - Google Analytics