前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用aop加解密http接口

使用aop加解密http接口

原创
作者头像
Java旅途
修改于 2020-06-28 02:21:05
修改于 2020-06-28 02:21:05
8440
举报
文章被收录于专栏:Java旅途Java旅途

背景

最近在写一个小程序接口,由于安全性比较高,因此需要给请求参数和响应进行加密处理。如果在每个方法上都加密解密,那样代码就显得太繁琐了而且工作量会加大。所以,我们会统一进行加解密处理,一种比较传统的方式就是通过拦截器进行拦截处理。在这里我们选择通过使用spring的aop来实现。

处理方案

1.比较spring的五种通知后。很容易发现,环绕通知可以解决我们的问题,环绕通知有哪些特点呢?

  • 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点 。
  • 对于环绕通知来说, 连接点的参数类型必须是 ProceedingJoinPoint. 它是 JoinPoint的子接口, 允许控制何时执行, 是否执行连接点 。
  • 在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行 。
  • 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常

2.具体看一下代码如何实现。

  • aspect类
代码语言:txt
AI代码解释
复制
import com.legendnet.elecmeter.utils.EncryptUtils;
import lombok.extern.slf4j.Slf4j;
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.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author 情系IT
 * @Description
 * @Date 2019-12-04 14:55
 */
@Aspect
@Slf4j
@Component
public class HttpAspect {

    // 定义切点controller包及子包下面的所有方法
    @Pointcut("execution(public * com.legendnet.elecmeter.controller..*.*(..))")
    public void httpRequest(){}

    @Around("httpRequest()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Exception {

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        // target 判断来源然后根据不同的解密算法解密
        String target = request.getParameter("target");
        String paramCode = request.getParameter("param_code");
        paramCode = paramCode.replaceAll(" ", " ");

        if(StringUtils.isNotBlank(paramCode)){
            if("miniProgram".equals(target)){
                paramCode = EncryptUtils.aesDecrypt(paramCode);
            }

            log.info("请求参数为:【{}】",paramCode);
        }
		request.setAttribute("param_code",paramCode);
        Object proceed = "";
        try {
            proceed = proceedingJoinPoint.proceed();
            if("miniProgram".equals(target)){
            	proceed = EncryptUtils.aesEncrypt(proceed.toString());
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return proceed;
    }
}
  • controller类
代码语言:txt
AI代码解释
复制
import com.alibaba.fastjson.JSON;
import com.legendnet.elecmeter.common.ResultBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author 情系IT
 * @Description
 * @Date 2019-12-04 15:23
 */
@RestController
@Slf4j
public class TestController {

    @RequestMapping("test")
    public String test(HttpServletRequest request){
        String param_code = request.getAttribute("param_code").toString();
        log.info("我已接收到参数,参数为:【{}】",paramCode);

        ResultBean resultBean = new ResultBean();
        resultBean.fillData("这就是我的响应");
        return JSON.toJSONString(resultBean);
    }
}

3.由于小程序和app的加密方式不同,为了代码的高可用,我们通过target参数来判断其来源,然后选择不同的加解密方式进行处理。

大功告成,接下来安心的写接口就可以了,妈妈再也不用担心我去处理加密解密的问题了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring AOP 实践指南
Spring AOP(面向切面编程)是Spring框架的一个关键特性之一。它提供了一种在应用程序中实现横切关注点的方法,这些关注点通常会散布在应用程序的多个模块中,并且与核心业务逻辑存在交叉。
訾博ZiBo
2025/01/06
1150
Spring AOP 实践指南
SpringBoot中切点实现请求和返回数据的打印
此处表示com.example.demo.controller包及其子包中所有以Controller结尾的类中的所有方法.
玖柒的小窝
2021/09/14
1.3K0
SpringBoot中切点实现请求和返回数据的打印
详解Java中高级程序员必须要掌握的Spring Aop(上篇)
在企业级服务中,经常面临多个业务类中需要完成一些相同的事情,如日志记录、异常处理、事物管理、安全管理等,这些多个业务类共同关注的点也叫横切关注点( cross-cutting concern )。如果在每个业务类中都加上这些横切关注点逻辑,不仅工作量会很大,而且容易产生冗余代码。这时候为解决横切关注点的面向切面编程(AOP)应运而生,AOP 补充了面向对象编程(OOP)。OOP 中模块化的关键单元是类,而在 AOP 中模块化的单元是切面。切面支持跨多个类型和对象的关注点(例如事务管理)。
用户3587585
2022/09/21
1.6K0
自定义注解妙用,一行代码搞定用户操作日志记录
1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表名、表名称等记录不到。 这个时侯就用到了自定义注解,把想要记录的内容放在注解中,通过切入点来获取到注解参数,然后将参数插入数据库记录 2.Spring AOP 2.1.关于Spring AOP的一些术语 切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@A
程序猿DD
2022/03/16
8000
Spring 中 AOP 的实现
AOP 称为面向切面编程,在程序开发中,AOP 技术可以在不改变原有方法代码的情况下,把逻辑直接插入到方法上。Spring AOP 的大致原理主要依靠的是动态代理,你以为操作的这个类,实际上操作的是它的一个代理类。动态代理用到两种机制,一直是基于 JDK 的动态代理,另一种是基于 CGLib 的动态代理。网上有很多介绍这种原理的文章,深入了解可以参考这些文章。
水货程序员
2018/11/13
5210
SpringBoot的AOP实战
切入点表达式格式:execution(访问权限 方法返回值 方法声明(参数) 异常类型)
十玖八柒
2022/08/01
4410
SpringBoot的AOP实战
切面加自定义注解实现请求调用记录
对于一个已经发布的服务而言,通常我们会记录接口的调用日志,就类似收费接口按调用次数来进行收费,但是它的作用也不仅限于此,比如:在本人的小程序中,通过会通过接口调用次数来分析哪些接口调用次数少,哪些调用的多,进而分析该功能是不是应该下线(此前发布过问题反馈和在线做题的功能,但是上线后使用次数过于低,所以就把这个功能删掉了)。
每天学Java
2020/06/02
1.2K0
SpringBoot:切面AOP实现权限校验:实例演示与注解全解
blog.csdn.net/mu_wind/article/details/102758005
JAVA葵花宝典
2020/11/13
2.6K0
SpringBoot:切面AOP实现权限校验:实例演示与注解全解
SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
知了一笑
2019/07/19
9580
深入理解AOP思想
概念 : AOP为Aspect Oriented Programming的缩写, 意思为切面编程。
用户11097514
2024/05/30
1020
深入理解AOP思想
【线上排查实战】AOP切面执行顺序你真的了解吗
公司这两个月启动了全新的项目,项目排期满满当当,不过该学习还是要学习。这不,给公司搭项目的时候,踩到了一个Spring AOP的坑。
蛮三刀酱
2020/10/29
6200
【线上排查实战】AOP切面执行顺序你真的了解吗
给SpringBoot接口加全局日志(AOP)
一想到,每个接口都需要加一个开始时间和一个结束时间,我就感觉特别烦,就是不想撸代码。
猿码优创
2019/07/27
2K0
使用AOP+自定义注解完成spring boot的接口权限校验
定义解析注解的MyAnnotationService,完成接口权限校验的逻辑,这里我是获取接口请求时header中的user_name参数,进行校验:
玖柒的小窝
2021/09/15
6970
使用AOP+自定义注解完成spring boot的接口权限校验
Spring AOP使用
AOP全程是Aspect—Oriented—Programming,面向切面编程。AOP采用横向抽取机制,将分散在各个方法中的重复代码抽取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。
ha_lydms
2023/08/09
1730
Spring AOP使用
Spring AOP 详解
出处:http://www.cnblogs.com/frankliiu-java/archive/2010/01/05/1639664.html
全栈程序员站长
2021/05/19
3890
【Spring学习】AOP实现日志记录
AOP,面向切面编程。通过预编译方式和运行时动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
pbinlog
2022/03/21
6800
【Spring学习】AOP实现日志记录
SpringBoot 2.x 进阶 之 Web
接着上一篇,SpringBoot2.x 教你快速入门,本篇内容我们来学习 SpringBoot2.X 进阶 Web 方面开发常用的一些知识点。
AI码真香
2022/09/13
4450
SpringBoot 2.x  进阶 之 Web
Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
在spring boot里面一切配置都是很简单的,下面为我所有被请求到的controller加上Aop的功能吧,看码:
林老师带你学编程
2019/05/26
4.9K0
@Aspect 5种通知详解 | Spring系列第35篇
这几种通知用起来都比较简单,都是通过注解的方式,将这些注解标注在@Aspect类的方法上,这些方法就会对目标方法进行拦截,下面我们一个个来看一下。
路人甲Java
2020/07/14
3.8K0
@Aspect 5种通知详解 | Spring系列第35篇
Spring-AOP @AspectJ进阶之访问连接点信息
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点对象,该类是JoinPoint的子接口。
小小工匠
2021/08/17
3760
相关推荐
Spring AOP 实践指南
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文