关于在后台实现前台表单的格式验证:
因为对于一个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
分享到:
相关推荐
Spring2.5.6版本支持AOP(面向切面编程),用于实现如日志、事务管理等横切关注点。Spring还集成了众多其他框架,如MyBatis、Quartz等,形成了一个完整的应用生态。 在整合SSH时,通常需要以下步骤: 1. **配置...
【标题】:“jQuery EasyUI+Struts2+Spring+Hibernate基于注解实现的CRM系统” 在IT领域,CRM(Customer Relationship Management,客户关系管理)系统是企业用来优化与客户交互和管理的重要工具。本项目利用一系列...
SpringBoot 使用 AOP+注解实现简单的权限验证的方法 SpringBoot 框架提供了强大的权限验证机制,以确保应用程序的安全性。其中一种方法是使用 AOP(Aspect-Oriented Programming)和注解来实现简单的权限验证。本文...
在电子商务网站中,Spring可以管理Bean的生命周期,通过AOP实现事务管理,同时与Struts2协同工作,处理业务逻辑和服务层。 3. **Hibernate3.3**:Hibernate是Java领域的一个对象关系映射(ORM)框架,它简化了...
在基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发中,开发者可以利用注解(Annotation)来简化配置,提高开发效率。这个开发模式结合了三个主流的Java EE框架:Struts2作为MVC框架处理前端请求,...
标题中的"annotation hibernate struts spring springsecurity"涵盖了四个关键的Java开发框架和技术:注解(Annotation)、Hibernate、Struts和Spring Security。这些是构建现代Java企业级应用的基础组件。 **注解...
- **事务管理**:Spring AOP可以方便地实现声明式事务管理,只需在服务层方法上添加@Transactional注解,无需编写事务控制代码。 - **日志记录**:可以在特定方法执行前后记录日志,简化日志处理。 - **性能监控**:...
**Annotation** 标签在Java中用于元数据,它允许在代码中添加信息,以便编译器、JVM或框架(如Spring和Hibernate)在运行时理解和处理。在SSH整合项目中,注解被广泛应用于配置各个组件,如在Action类上标注@...
在"Struts2+Hibernate4+Spring3整合"中,通常有两种方式实现整合: 1. **XML方式**:这是传统的配置方式,所有的配置信息都在XML文件中。Struts2的配置文件(struts.xml)定义Action和结果,Hibernate的配置文件...
3. **表单验证:** 在执行 `Action` 之前,会通过 `ActionForm` 对象进行数据校验。 4. **业务逻辑处理:** 通过 `Action` 类调用业务逻辑层(Service)进行处理。 5. **结果返回:** 处理完成后返回一个 `Action...
在 Spring 中,AOP 可以通过声明式的方式实现,即通过 XML 或注解配置来定义切点(Pointcut)、增强(Advice)等。 **IOC(Inversion of Control,控制反转)**: 是一种设计模式,用来降低代码之间的耦合度。在 ...
Spring框架是整个SSH中的粘合剂,它不仅提供了依赖注入(DI)和面向切面编程(AOP)功能,还在服务层管理业务对象,并与Struts2和Hibernate协同工作。Spring3.0.5增强了对JSR-303 Bean Validation的支持,改进了Web ...
Spring Boot 防止重复提交是指在用户提交表单或请求时,防止同一客户端在短时间内对同一 URL 的重复提交,从而避免服务器端的处理压力和数据的一致性问题。下面将详细介绍 Spring Boot 防止重复提交实现方法的相关...
**Spring框架**:Spring作为一款轻量级的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)容器,为应用程序提供依赖注入和事务管理等功能。在SSM集成中,Spring主要负责...
在Spring 2.5.5中,AOP主要通过基于代理的实现,包括JDK动态代理和CGLIB代理。 在Spring框架中,IoC容器是核心,负责管理对象的生命周期和依赖关系。在Spring 2.5.5中,你可以使用XML配置文件定义bean,也可以使用...
Spring Security 是一个强大的Java安全框架,专为Java和Spring生态系统设计,用于实现全面的身份验证、授权和服务级安全功能。在Spring Security 3版本中,它引入了许多改进和新特性,以适应不断变化的安全需求和...
2. **Controller**:控制器是处理请求和响应的核心组件,通常由实现了 `org.springframework.web.bind.annotation.Controller` 或 `org.springframework.stereotype.Controller` 注解的类组成。这些类包含处理方法,...
在Spring MVC中,控制器通常是实现了`org.springframework.web.bind.annotation.Controller`注解的类。例如,我们可以创建一个名为`HomeController`的类,其中包含处理HTTP请求的方法,这些方法通常使用`@...
【标题】:“Extjs+s2sh基于annotation实现的酒店管理系统”是一个综合性的IT项目,它融合了前端的Extjs框架和后端的Spring、Struts2以及Hibernate这三大经典技术(合称为S2SH),并利用注解(Annotation)进行简化...
该框架利用Spring框架的核心功能,如IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)和AOP(Aspect-Oriented Programming,面向切面编程),通过一组可配置的Bean来实现对应用系统的...