Spring AOP基于配置文件的面向方法的切面
Spring AOP基于配置文件的面向方法的切面
Spring AOP根据执行的时间点可以分为around
、before
和after
几种方式。
around
为方法前后均执行before
为方法前执行after
为方法后执行
这里只对around
的方式进行介绍。本文只是摘录相应的思路,许多辅助类和方法不一一给出。因此下述方法并不能正常运行。
定义忽略权限检查注解类
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnorePermission {
}
定义需要权限检查的类及方法
@RestController
@RequestMapping(value = "/api/test")
public class TestController extends BaseController {
@RequestMapping(value="", method= RequestMethod.POST)
public ResponseEntity postTest(@RequestParam(name = "accessToken") String accessToken) {
ResponseEntity responseEntity = new ResponseEntity();
return responseEntity;
}
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public ResponseEntity deleteTest(@RequestParam(name = "accessToken") String accessToken) {
ResponseEntity responseEntity = new ResponseEntity();
return responseEntity;
}
/**
* 带了IgnorePermission注解,不进行权限检查。
*/
@IgnorePermission
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseEntity getTestList(@RequestParam(name = "accessToken") String accessToken) {
ResponseEntity responseEntity = new ResponseEntity();
return responseEntity;
}
}
定义切面aop类
public class PermissionAspect {
private Logger logger = LoggerFactory.getLogger(PermissionAspect.class);
private static final String DEFAULT_TOKEN_NAME = "accessToken";
private TokenManager tokenManager;
private String tokenName;
private boolean processing = true;
@Autowired
private BasicService BasicService;
public void setTokenManager(TokenManager tokenManager) {
this.tokenManager = tokenManager;
}
public void setTokenName(String tokenName) {
if (StringUtils.isEmpty(tokenName)) {
tokenName = DEFAULT_TOKEN_NAME;
}
this.tokenName = tokenName;
}
//ProceedingJoinPoint只有around的方式才可用
//JoinPoint则around、before和after均可用
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
processing = true;
ResponseEntity responseEntity = new ResponseEntity();
// 从切点上获取目标方法
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
// 若目标方法忽略权限检查,则直接调用目标方法
if (method.isAnnotationPresent(IgnorePermission.class)) {
return joinPoint.proceed();
}
// 检查 该用户是否已经开通
// System.out.println("******************* PermissionAspect start ************************");
logger.info("******************* PermissionAspect start ************************");
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 从 request header 中获取当前 token
String token = StringUtils.isBlank(request.getHeader(tokenName)) ? request.getParameter("accessToken") : request.getHeader(tokenName);
String userId = tokenManager.getUserId(token);
TestBasic TestBasic = BasicService.findByUserId(userId);
try {
if (null == TestBasic) {
String message = String.format("Test basic userId [%s] is not exist.", userId);
responseEntity.failure(ResponseConstant.CODE_000, "尚未申请开通功能。");
processing = false;
throw new Exception(message);
}
if (TestConstant.Test_BASIC_IS_PASS_PASSED != TestBasic.getIsPass()) {
String message = String.format("Test basic userId [%s] has no permission.", userId);
String tips = "不具备权限功能。";
if (TestConstant.Test_BASIC_IS_PASS_PROCESSING == TestBasic.getIsPass()) {
tips = "权限正在审核中。";
} else if (TestConstant.Test_BASIC_IS_PASS_DENY == TestBasic.getIsPass()) {
tips = "不具备权限。";
}
responseEntity.failure(ResponseConstant.CODE_000, tips);
processing = false;
throw new Exception(message);
}
} catch (Exception e) {
throw new Exception(e);
} finally {
// System.out.println("******************* PermissionAspect end ************************");
logger.info("******************* PermissionAspect end ************************");
if (processing) {
return joinPoint.proceed();//如果具备权限则执行相应的方法
} else {
return responseEntity;//如果不具备权限返回相应的json数据
}
}
}
}
配置文件的配置
开启切面支持
springMvc-context.xml中开启如下配置
<!-- 开启aspectj切面支持 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
定义 bean
applicationContext.xml中添加如下配置
<!--Test权限检查-->
<bean id="permissionAspect" class="com.test.api.test.PermissionAspect">
<property name="tokenManager" ref="tokenManager" />
<property name="tokenName" value="accessToken" />
</bean>
AOP配置
applicationContext.xml中添加如下配置
<aop:config>
<!--其他切面配置-->
... ...
<!--问题权限切面检查-->
<aop:aspect ref="permissionAspect" order="2">
<aop:around method="execute" pointcut="execution( * com.test.api.test.controller.TestController.*(..) )"/>
</aop:aspect>
</aop:config>
- 注:上述代码只是实现思路的摘录,代码不能直接运行。
Spring AOP基于配置文件的面向方法的切面的更多相关文章
- Spring Aop基于注解的实现
一.AspectOriented Programing,面向切面编程. AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等.将日志记录,性能统计,安全控制,事务处理,异常 ...
- Spring:基于配置文件的创建对象的各种方式
在Spring3.0之前,Spring主要创建对象的方法是基于配置文件的,即在配置文件中为对象进行注册,并且可以在配置文件当中为对象的字段或者称之为属性值进行赋值,接下来首先介绍基于配置文件的创建对象 ...
- Spring AOP实现方式四之注入式AspectJ切面【附源码】
现在我们要讲的是第四种AOP实现之注入式AspectJ切面 通过简单的配置就可以实现AOP了. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.ao ...
- spring aop在mvc的controller中加入切面无效
spring aop在mvc的controller中加入切面无效 因为MVC的controller,aop默认使用jdk代理.要使用cglib代理. 在spring-mybatis.xml配置文件中加 ...
- [原创]java WEB学习笔记108:Spring学习---基于配置文件的形式实现AOP
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...
- spring aop 基于schema的aop
AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP ...
- spring aop 动态代理批量调用方法实例
今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...
- spring-第十七篇之spring AOP基于注解的零配置方式
1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...
随机推荐
- echarts X轴数据显示不全问题
很奇怪,X轴只显示了部分节点.没有显示全. 在xAxis上加上下面的配置就能解决: xAxis: [ { type: 'category', axisLabel :{ interval:0 }, // ...
- 解决安装VS2013提示“已停止工作”问题
新安装操作系统(win8.1),手动安装各种驱动,安装VS2013,报错,见下图: 原因:显卡驱动问题. 解决办法:卸载intel显卡驱动这碧池.(系统会自动给你适配合适的)
- VMnet1和V8
vmware默认使用了两个虚拟网卡: vmnet1 v1 vmnet8 v8 vmnet1是host-only,也就是说,选择用vmnet1的话就相当于VMware给你提供了一个虚拟交换机,仅将虚拟机 ...
- Junit初级编码(一)第一个Junit测试程序
序,Junit测试是单元测试的一个框架,提供了很多方法,供我们快速开展单元测试.目前最新版本JAR包为4.12,官网地址为http://junit.org/ 一.第一个Junit测试程序 1 去官网下 ...
- sql server cpu占用过高优化
SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高 ...
- 【AngularJS】—— 2 初识AngularJs(续)
前一篇了解了AngularJS的一些简单的使用,这里继续跟着w3c学习一下剩下的内容. 本篇根据w3cschool.cc继续学习AngularJS剩余的内容,包括: 1 事件 2 模块 3 表单 4 ...
- 日常使用的shell脚本
1.shell实现无密码登陆 host=$ expect << EOF spawn ssh-copy-id $host expect "passw ...
- ACM3 求最值
/*2*2014.11.18*求最值*描述:给定N个整数(1<=N<=100),求出这N个数中的最大值,最小值.*输入:多组数据,第一行为一个整数N,第二行为N个不超过100的正整数,用空 ...
- svg技术(可缩放矢量图形)介绍
公司里面的产品用图表的地方也比较多,作为平台维护的我,收到几次需求提的建议中包括图表美化的功能,要炫,要3d,立体感,功能要强大等到:平台现有控件都是用的一个开源flash,我对flash虽然会一点但 ...
- POJ 2151 Check the difficulty of problems
以前做过的题目了....补集+DP Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K ...