之前用的ssm框架,大部分只是利用spring的IOC特性,很明显这能够为我们开发人员在对象的创建上面节省大部分时间。当相似得到业务越来越多,很多代码也是越来越重复,轮子是越来越重复,比如验证用户登录这一块的代码。由于我们这边Java是给前端app调用的,在正式请求业务接口的之前,会校验该用户是否登陆过。所以在每个 controller里面最开始都是校验前端传递的登录码是否有效。前几日得闲,想到spring有aop的特性,简单的理解就是拦截器,在请求正式的业务数据之前,我们可以通过这个特性来验证客户端的是否已经登录(像以后如果比较复杂可以验证用户的的组织架构权限,错误日志搜集等等)。业务场景就是这些,下面就是具体实现。

我使用的是自定义注解来做的。首先定义一个切面注解,然后对这个注解添加声明解释,使用的环绕通知,切面方法有具体的校验方法。最后根据自己的实际需要,在对应的方法上面加上这个切面注解。

1.spring.xml、spring-mvc.xml文件中添加aop支持

<!--启用AOP-->
<aop:aspectj-autoproxy />

2.声明切面注解

package cn.com.org.common.aspectAnnotation;

import java.lang.annotation.*;

/**
* Created by kevin stark on 2017/7/12.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AppTokenAspect {
String methodName() default "";
}

3.对切面注解要做的操作的声明

package cn.com.org.control.aspectDefine;

import cn.com.org.common.constant.AllConstant;
import cn.com.org.service.user.service.UserBaseService;
import net.sf.json.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* Created by kevin stark on 2017/7/12.
* 定义具体的切面类
*/
@Aspect
@Component
public class APPTokenAspectDefine { private Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired
private UserBaseService userBaseService; // 定义一个 Pointcut, 使用 切点表达式函数 来描述对哪些 Join point 使用 advise.
@Pointcut("@annotation(cn.com.org.common.aspectAnnotation.AppTokenAspect)")
public void pointCut() {} /**
* 环绕通知调用切入方法。
* 在正式调用业务方法前,校验参数(token是否过期)
* @param pjp
* @return
*/
@Around("pointCut()")
public Object checkAppToken(ProceedingJoinPoint pjp){
log.info("");
Object object = null;
Object[] objs = pjp.getArgs();
//AopUtils
try {
if (null != objs && objs.length > 0) {
for (int i = 0; i < objs.length; i++) {
Object obj = objs[i];
// 接口的请求参数都是json类型,循环出来的值判断这个是不是json类型
if (obj instanceof JSONObject) {
JSONObject json = (JSONObject) objs[i];
//判断json结构中是否包含token字段
if (json.containsKey("token")) {
String token = json.getString("token");
Map<String, Object> map = new HashMap<>();
Boolean isSuccess = false;
Integer responseCode = -1;
String responseMsg = "";
HashMap<String, String> tokenResult = userBaseService.checkToken(token.trim());
if (!"success".equals(tokenResult.get("code"))) {
isSuccess = Boolean.FALSE;
responseCode = AllConstant.TOKEN_INVALID_CODE;
responseMsg = AllConstant.TOKEN_INVALID_MSG;
map.put("isSuccess", isSuccess);
map.put("responseCode", responseCode);
map.put("responseMsg", responseMsg);
return map;
} else {
// 可以对传参进行改造,比如校验通过后,就可以换到这个登录码对应的用户ID
json.put("empCode", tokenResult.get("userCode"));
objs[i] = json;
} }
}
}
} //如果校验通过程序往下执行
object = pjp.proceed();
} catch (Exception e) {
e.printStackTrace();
} catch (Throwable throwable) {
throwable.printStackTrace();
}

     // 因为我们拦截的方法都是有返回值的,智力要注意null的情况不然会报错,所以这里要做一点判空的处理
if (null == object) {
object = new Object();
} return object;
} }

4.spring.xml中声明这个bean

<bean id="appTokenAspectDefine" class="cn.com.bluemoon.control.aspectDefine.APPTokenAspectDefine"></bean> 

具体应用

/**
* .获取目录页ICON的角标数
* @param request
* @param jsonObject
* @return
*/
// 添加切面主键,当有请求访问这个方法的时候,会调用的切面里面的校验登录码的方法
@AppTokenAspect
@ResponseBody
@RequestMapping(value="/getModel")
public Map<String, Object> getModel(HttpServletRequest request, @RequestBody JSONObject jsonObject) {
}

所以按照此方法在实际业务方法中,就可以节省更多的代码了。以后的日志手机或者说用户行为买点也可以按照此方法来改造了。

看来我们使用的spring还只是仅仅在增删改查的层面上了,应当多去研究他的特性结合自身的业务需求来改造整个项目。任重而道远啊。欢迎共同交流

  

  

spring aop 实践的更多相关文章

  1. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  2. Spring Boot实践——AOP实现

    借鉴:http://www.cnblogs.com/xrq730/p/4919025.html     https://blog.csdn.net/zhaokejin521/article/detai ...

  3. Spring基础系列--AOP实践

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9615720.html 本文目的是简单讲解下Spring AOP的使用. 推荐使用IDEA ...

  4. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

  5. [转]彻底征服 Spring AOP 之 实战篇

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  6. Spring AOP 实现原理与 CGLIB 应用

    https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/ AOP(Aspect Orient Programming),也就是面向 ...

  7. 161110、彻底征服 Spring AOP 之 实战篇

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  8. Spring AOP: Spring之面向方面编程

    Spring AOP: Spring之面向方面编程 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层次的对象,而AOP将程序分解 ...

  9. Spring AOP 实现原理与 CGLIB 应用--转

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存.对象池管理等.AOP 实现的关键就在于 ...

随机推荐

  1. 【java源码】解读HashTable类背后的实现细节

    HashTable这个类实现了哈希表从key映射到value的数据结构形式.任何非null的对象都可以作为key或者value. 要在hashtable中存储和检索对象,作为key的对象必须实现has ...

  2. Maven4-仓库

    坐标和构建是一个构件在Maven世界中的逻辑表示方式,而其物理表示方式是文件.Maven通过仓库来统一管理这些文件 什么是Maven仓库? 在Maven世界中,任何一个依赖,插件或者项目构建的输出,都 ...

  3. 酷炫,用Html5/CSS实现文字阴影

    前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现.她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过 ...

  4. Java中最常用的集合类框架之 HashMap

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构.      HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射 ...

  5. 如何利用sqoop将hive数据导入导出数据到mysql

    运行环境  centos 5.6   hadoop  hive sqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具. 上海尚学堂 ...

  6. JavaScript 高性能数组去重

    中午和同事吃饭,席间讨论到数组去重这一问题 我立刻就分享了我常用的一个去重方法,随即被老大指出这个方法效率不高 回家后我自己测试了一下,发现那个方法确实很慢 于是就有了这一次的高性能数组去重研究 一. ...

  7. springboot动态修改日志级别+权限认证

    1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...

  8. Testing - 自动化测试的几个基础概念

    自动化测试框架与模型 一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库.测试数据源.测试对象识别标准,以及种可重用的模块. 自动化测试框架在发展的过程中经历了几个阶段,模块驱动测试 ...

  9. stc15f104w模拟串口使用

    stc15f104w单片机体积小,全8个引脚完全够一般的控制使用,最小系统也就是个电路滤波----加上一个47uf电容和一个103电容即可,但因为其是一个5V单片机,供电需要使用5V左右电源. 该款单 ...

  10. Mac OS Sierra如何打开任何来源

    我们知道在Mac升级到最新的Mac OS Sierra系统之后,随之而来的是第三方应用都无法打开,提示的是无法打开或扔进废纸篓.而在之前的版本系统中,我们知道在系统偏好设置-->安全性与隐私-- ...