其他-05-Springboot全局加密解密_Alan0517的博客-程序员秘密

技术标签: java  其他  

1.加密

package springcloud.dataencode;

import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.alibaba.fastjson.JSON;
import springcloud.pojo.ABC;
import springcloud.util.Base64Utils;

import java.security.PrivateKey;
import java.security.PublicKey;


@Component
@ControllerAdvice(basePackages = "springcloud.controller")
public class EncodeResponseBodyAdvice implements ResponseBodyAdvice<Object> {
    

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
    
        System.out.println("response-------->"+body);
        //加密
        System.out.println("准备加密的数据为"+body);
        String encode = Base64Utils.encode(JSON.toJSONString(body));
        return encode;
    }


    public static void main(String[] args) throws Exception {
    
        ABC abc1 = new ABC();
        abc1.setName("张三");
        abc1.setAge(1);
        abc1.setAddress("河南");
//        String encode = encode(JSON.toJSONString(abc1));
//        System.out.println(encode);
//        String decode = decode(encode);
//        ABC abc = JSON.parseObject(decode, ABC.class);
//        System.out.println(abc);


        RSA rsa = new RSA();

//获得私钥
        PrivateKey privateKey = rsa.getPrivateKey();
//获得公钥
        PublicKey publicKey = rsa.getPublicKey();

//公钥加密,私钥解密
        String s1 = JSON.toJSONString(abc1);
        byte[] encrypt = rsa.encrypt(s1, KeyType.PublicKey);
        byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
        String s = new String(decrypt);
        ABC abc = JSON.parseObject(s, ABC.class);
        System.out.println("abc = " + abc);


    }
}

2. 解密

package aaa;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;

import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import springcloud.pojo.ABC;
import springcloud.util.Base64Utils;

@Component
@ControllerAdvice(basePackages = "springcloud.controller")
public class DecodeRequestBodyAdvice implements RequestBodyAdvice {
    

    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType,
                            Class<? extends HttpMessageConverter<?>> converterType) {
    
        //这里设置成false 它就不会再走这个类了
        return true;
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage request, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
    
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
    
            //这个request其实就是入参 可以从这里获取流
            //入参放在HttpInputMessage里面  这个方法的返回值也是HttpInputMessage
            InputStream inputStream = request.getBody();
            if (inputStream != null) {
    
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
    
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
    
                stringBuilder.append("");
            }
        } catch (IOException ex) {
    
            throw ex;
        } finally {
    
            if (bufferedReader != null) {
    
                try {
    
                    bufferedReader.close();
                } catch (IOException ex) {
    
                    throw ex;
                }
            }
        }
        //获取请求数据
        String string = stringBuilder.toString();
        /*****************进行解密start*******************/
        System.out.println("请求的数据为:" + string);
        
        string=string.substring(string.indexOf(":")+2,string.indexOf("=")+1);

        String decode = Base64Utils.decode(string);
        System.out.println("【解密后的请求数据】decode=:" + decode);

        //把数据放到我们封装的对象中
        return new MyHttpInputMessage(request.getHeaders(), new ByteArrayInputStream(decode.getBytes("UTF-8")));
    }

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
                                Class<? extends HttpMessageConverter<?>> converterType) {
    
        return body;
    }

    @Override
    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
                                  Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
    
        return body;
    }

    //这里实现了HttpInputMessage 封装一个自己的HttpInputMessage
    static class MyHttpInputMessage implements HttpInputMessage {
    
        HttpHeaders headers;
        InputStream body;

        public MyHttpInputMessage(HttpHeaders headers, InputStream body) {
    
            this.headers = headers;
            this.body = body;
        }

        @Override
        public InputStream getBody() throws IOException {
    
            return body;
        }

        @Override
        public HttpHeaders getHeaders() {
    
            return headers;
        }
    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hmj050117/article/details/114730085

智能推荐

CentOS7配置国内yum源与epel源_JZU大博的博客-程序员秘密

国内yum源1.首先进入/etc/yum.repos.d/目录下,新建一个repo_bak目录,用于保存系统中原来的repo文件[[email protected] ~]# cd /etc/yum.repos.d/[[email protected] yum.repos.d]# mkdir repo_bak[[email protected] yum.repos.d]# mv *.repo repo_bak/2.在CentOS中配置使用网易和阿里的开源镜像到网易和阿里开源镜像站点下载系统对应版本的repo

在.NET 6.0上使用Kestrel配置和自定义HTTPS_dotNET跨平台的博客-程序员秘密

本章是《定制ASP NET 6.0框架系列文章》的第四篇。在本章,我们将学习ASP.NET Core的Kestrel配置和自定义HTTPS,好我们开始正文。在ASP.NET Core中,默认情况下HTTPS处于打开状态,这个不是问题,我们无需禁用它。因为如果你的服务是在防火墙后面,是属于后台服务,不对外网提供服务,启用HTTPS也是有意义的。通常,在Windows上,启用...

Log:日志选型调研『一』_偕臧x的博客-程序员秘密_日志数据库选型

文章目录关联背景日志库调研Google 关键词表格总结log4cxxLog4cpplog4clog4cplusgoogle glogz-logspdlogc-logsyslog-ngGitHub 搜索GItHub 村外有村总结成系列地址简 述: 准备在个人的项目中添加 Log 日志模块,便于项目日后定位和调试。因前面数月,有感受到了日志的威力,故决定调研后选取一个合适的日志模块 spdlog 。最后意外的惊喜发现,检索需要一点技巧,可遇村外有村,好风凭借力。本文初发于 “偕臧的小站”,同步转载

gcc教程(转)_xpp02的博客-程序员秘密

gcc目 录gccmakefile写法 gcc_egcs使用 gdb使用 gcc常用选项对代码的影响一般情况 -O 编译选项 -O2 编译选项 -fomit-frame-pointer 编译选项 -fomit-frame-pointer &amp;amp;&amp;amp; -O2 -fPIC 编译选项 -static 编译选项 AT&amp;...

Msp430概述_hust我是船长的博客-程序员秘密_msp430

总结一下MSP430给我的印象吧,感觉他就是一个迷你型的arm1:MSP430采用的是精简指令,他只有27条核心的汇编指令,这一点和arm相同,arm同样是采用精简指令,而80c51采用的是冗余指令,执行起来要复杂很多 寄存器编2:MSP430他有16个寄存器,这好像和arm也一样,但是略有不同的是,他的 r0 到 r3 是特殊功能寄存器,其中ro是程序指针(PC); r1是堆

Oracle数据库远程维护工具-oratools_wqlixueyang的博客-程序员秘密_oradgtool

为何会做这个工具 因为日常工作中琐事较多,其中较多的工作都是重复的,可复制的,所以就去写一个维护的工具,来帮助自己解决重复性高而且复杂的工作。oratools的介绍 此工具使用远程连接的方式与数据库连接,在功能列表中可以选择对应的功能,实现对数据库日常维护的需求,已实现的功能如下(功能现在已每天1~2个的速度增长): 1. 查询表、索引属性 2. 查询ASM磁盘组信息 3. 查询UNDO状态 4. ...

随便推点

HDU 2093 考试排名 (水题)_xcatf的博客-程序员秘密

考试排名Time Limit: 1000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19617Accepted Submission(s): 6788Proble...

OpenCV中判断点在矩形中的方法_qiao_lili的博客-程序员秘密_opencv 检测点在矩形内部

目录1.问题2.思路3.实现4.资料1.问题如图1.1所示,有红色和蓝色两个点,如何判断点相对于矩形的位置呢?2.思路首先,我们知道OpenCV中有一个函数:pointPolygonTest()。它的作用是判断一个点是否在轮廓中,基本用法如下:C++: double pointPolygonTest(InputArray contour, Point2f p...

浅析几种HID攻击_合天网安实验室的博客-程序员秘密

本文原创作者:MR.zhang原创投稿详情:重金悬赏 | 合天原创投稿等你0x01 WhatIs HID?HID全称为HumanInterfaceDevice直译为人类接口设备,也被...

关于emgucv的书_【Emgu】一起学EmguCV(一)配置与使用_weixin_39732991的博客-程序员秘密

首先先介绍一下OpenCV,OpenCV的全称是:Open Source Computer Vision Library,OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通...

Android实验_青釉lady的博客-程序员秘密_android课程实验

实验一  音乐播放器一、实验目的1、掌握Activity工作机制。2、掌握ListView、MediaPlayer等用法。二、实验内容设计一个音乐播放器,用ListView显示手机中MP3格式音乐,支持播放、暂停、继续、上一首、下一首等功能。三、工作流程图四、程序源代码1、布局页面在res的layout的activity_music.xml中&amp;lt;?xml version=&quot;1.0&quot; encod...

LATEX(2)增大表格名称与表格间距_zlkeepgoing的博客-程序员秘密_latex 表格名称

LaTeX的表格环境是默认把表格名称放在表格底部的,如果我们把表格名称放置在表格开头就会发现名称与表格的距离十分接近,非常不好看,就像下图显示的一样: 但是我们如果习惯把表格名称放置在表头又该怎么办呢?下面给大家提供两种方法。 版本一:在文中使用命令”\caption”前添加增大间距的命令,具体如下:\begin{table}[H]\centering\setlength{\aboveca

推荐文章

热门文章

相关标签