项目场景:基于Spring MVC的Web项目,Controller类中的处理Http请求的方法,对Http的请求头域有特定的要求或对头域通过检测才继续响应。
本文例子的做法思路如下:自定义一个Java注解,利用Spring的aop编程对标注有该注解的http请求的响应方法进行头域检测。
//自定义注解
package com.song.spring.aop.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 检查HttpRequest的头域Referer,防止跨站点请求伪造;
* 1、方法没有javax.servlet.http.HttpServletRequest参数,则不进行检测,相当于注解无效
* 2、headerValue和headerValueEnvName至少填一个,否则相当于注解无效;同时填,headerValue优先
* 3、headerValueEnvName获取不到值,相当于注解无效
* @author WeiGS
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HttpHeaderValidate {
/**
* 请求头名称
*/
String header();
/**
* 请求头对应的值
*/
String headerValue() default "";
/**
* 从环境变量或配置文件apiurl.properties获取请求头对应的值
*/
String headerValueEnvName() default "";
}
//切面代码
package com.song.spring.aop.aspect;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframewor