SpringBoot切面控制业务逻辑
业务逻辑:写一个公共拦截类,过滤传进Controller的参数
为了调用接口安全起见,每个需要调用的接口有一个参数accessToken,用于安全验证
注:先进入过滤器Filter,再进入aop,最后进入Controller,我们做的事在aop过滤Controller参数
package com.xgt.config; import com.xgt.common.BaseController;
import com.xgt.common.PcsResult;
import com.xgt.util.IpUtil;
import org.apache.commons.lang.StringUtils;
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.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method; /**
* 拦截器:记录用户接口操作次数
* @author cc
*/ @Aspect
@Component
public class ControllerInterceptor extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class); @Value("${spring.profiles.active}")
private String env; /**
* 定义拦截规则:拦截com.xgt.controller.bs包下面的所有类中
*/ @Pointcut("execution(* com.xgt.controller.bs..*.*(..))")
public void controllerMethodPointcut(){} /**
* 拦截器具体实现
* @param pjp
* @return JsonResult(被拦截方法的执行结果,或需要登录的错误提示。)
*/ @Around("controllerMethodPointcut()") //指定拦截器规则;也可以直接把“execution(* com.xjj.........)”写进这里
public PcsResult Interceptor(ProceedingJoinPoint pjp){
Object[] paramValues = pjp.getArgs(); String accessToken = "";
for(int i=0;i<paramValues.length;i++){
if(accessToken!=null) {
accessToken = paramValues[0].toString();
}
} Object result = null;
try {
String accessTokenKey="xxxx";
if(!accessToken.equals(accessTokenKey)){
return newResult(false).setMessage("参数错误");
}
int requestCount=0;
if(StringUtils.isNotEmpty(accessTokenKey)){
requestCount++;
if(requestCount>100){
return newResult(false).setMessage("请求的太快啦,休息一会再试试");
}
}
if(result == null){
// 一切正常的情况下,继续执行被拦截的方法
result = pjp.proceed();
requestCount++;
}
} catch (Throwable e) {
logger.error("exception: ", e);
return newResult(false).setMessage(""+e.getMessage());
}
return (PcsResult) result;
} }
补充:拦截命名规则简述
1)表示匹配所有方法
execution(* *(..))
2)表示匹配com.savage.server.UserService中所有的公有方法
execution(public * com. savage.service.UserService.*(..))
3)表示匹配com.savage.server包及其子包下的所有方法
execution(* com.savage.server..*.*(..))
SpringBoot切面控制业务逻辑的更多相关文章
- springMvc基本注解:@Component、@Repository(持久层) 、@Service(业务逻辑) 、@Controller(控制层)
1.@Controller(控制层) :就是action层 2.@Service(业务逻辑) :业务逻辑层,负责处理各种控制层的操作 3.@Repository(持久层) :称为“持久化”层,负责对数 ...
- springboot 全局异常捕获,异常流处理业务逻辑
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...
- 【快学springboot】5.全局异常捕获,异常流处理业务逻辑
前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...
- SpringBoot自定义异常,优雅解决业务逻辑中的错误
概要 你是不是在为业务逻辑中出现的异常弄的焦头烂额,常常在后台报错,前端却无法提示错误内容,导致用户体验极差?比如下单失败,前端只能提示下单失败,但是却不知道为什么失败,是库存不足,还是余额不足,亦或 ...
- SpringBoot切面Aop的demo简单讲解
前言 本篇文章主要介绍的是SpringBoot切面Aop的demo简单讲解. SpringBoot Aop 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 切面(Aop) 一.概 ...
- 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)
https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...
- Springboot中mybatis执行逻辑源码分析
Springboot中mybatis执行逻辑源码分析 在上一篇springboot整合mybatis源码分析已经讲了我们的Mapper接口,userMapper是通过MapperProxy实现的一个动 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
前言 从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...
- javascript要不要用来处理业务逻辑
这个问题,我现在才明白该怎样描述这个已经困惑了我很久的问题,在公司做的项目中,js对于数据验证起到了很大的作用,但是这使得整个项目的业务逻辑变得零散,甚至混乱 现在公司里的项目就是这样的.现在再想想, ...
随机推荐
- firefox插件开发及源码下载
在个别情况下,由于数据量巨大,造成显示性能的明显下降,此时使用c++开发firefox插件,可以提高用户使用体验. test.html: 在插件中,我们导出3个函数给js:AddStr, Pause, ...
- MySQL数据库“十宗罪”(十大经典错误案例)
Top 1: Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 1 2 3 4 5 6 mysql> show variables lik ...
- Android不编译某个模块
Android 5.1 源码,编译相关的文件一般在build目录下build/target/product 放了很多mk文件:一般不同的产品会有不同的目录 假设我不想编译OpenWnn,在build目 ...
- Java - extends
继承 一个类得到了另一个类当中的成员变量和成员函数. Java只支持单继承,一个父类可以有多个子类. 使用继承,可减少重复代码.把重复代码放入父类中.需要添加共同的成员变量或函数时可以直接操作父类. ...
- luogu P1361 小猫爬山 [iddfs]
题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道上的缆车最大承重量为W ...
- 九度OJ1000
题目描述: 求整数a,b的和. 输入: 测试案例有多行,每行为a,b的值. 输出: 输出多行,对应a+b的结果. 样例输入: 1 2 4 5 6 9 样例输出: 3 9 15 代码实现: #inclu ...
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
今天使用hql语句的时候,遇到了一个这样的bug,修改的方法是
- 内核对象kobject和sysfs(1)——概述
内核对象kobject和sysfs(1)--概述 问题: 在走读驱动代码时,经常看见kref,kobj,sysfs这些结构,这些结构到底有什么作用?如何理解并使用这些结构呢?这将在接下来的这一系列文章 ...
- pwnable.kr random 之 write up
---恢复内容开始--- 首先看源代码: #include <stdio.h> int main(){ unsigned int random; random = rand(); // r ...
- Jmeter之app性能测试(ios,android)
测试小菜鸟alter今天一大早又学习了一点东西关于jmeter-app性能测试,现在记录一下.提到性能测试,那我就简单总结一下.(想跳过的,直接将页面下移到下一个红色字体处) 性能测试的相关知识介绍 ...