ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

@ControllerAdvice解密请求,加密响应

2022-01-24 19:03:08  阅读:183  来源: 互联网

标签:return org xf 解密 springframework import 加密 ControllerAdvice com


package com.xf.config;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.Priority;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;

import com.xf.common.NoSecret;
import com.xf.service.CacheService;
import com.xf.tools.AesUtils;
import com.xf.tools.HttpServletRequestUtil;
import com.xf.tools.JWTUtils;

import cn.hutool.core.io.IoUtil;
import lombok.val;

@ControllerAdvice("com.xf.controller")
@Priority(1)
public class MyRequestBodyAdvice implements RequestBodyAdvice {

    @Autowired
    CacheService cacheService;

    @Override
    public boolean supports(MethodParameter methodParameter, Type targetType,
            Class<? extends HttpMessageConverter<?>> converterType) {
        return methodParameter.hasParameterAnnotation(RequestBody.class);
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
            Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
        val request = HttpServletRequestUtil.getRequest();
        if (request.getServletPath().contains("login"))
            return inputMessage;
        if (!parameter.getMethod().isAnnotationPresent(NoSecret.class)) {
            return new HttpInputMessage() {
                @Override
                public InputStream getBody() throws IOException {
                    List<String> tokenList = inputMessage.getHeaders().get("token");
                    if (tokenList.isEmpty()) {
                        throw new RuntimeException("缺少必要参数");
                    }
                    String token = tokenList.get(0);
                    Integer accid = JWTUtils.getAccid(token);
                    String bodyStr = IoUtil.read(inputMessage.getBody(), "utf-8");
                    val req = HttpServletRequestUtil.getRequest();
//                    Console.log(HttpServletRequestUtil.getAllRequestInfo());
//                    Console.log(bodyStr);
                    val loginObj = cacheService.getLogin(accid);
                    val key = loginObj.getString("key");
                    val iv = loginObj.getString("iv");
                    req.setAttribute("key", key);
                    req.setAttribute("iv", iv);
                    try {
                        bodyStr = AesUtils.decrypt(bodyStr, key, iv);
                    } catch (Exception e) {
                        throw new RuntimeException("解密失败");
                    }
                    return IoUtil.toStream(bodyStr, "utf-8");
                }

                @Override
                public HttpHeaders getHeaders() {
                    return inputMessage.getHeaders();
                }
            };
        }
        return null;
    }

    @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;
    }

}

 

package com.xf.config;

import java.util.HashMap;

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import com.alibaba.fastjson.JSONObject;
import com.xf.common.R;
import com.xf.tools.AesUtils;
import com.xf.tools.HttpServletRequestUtil;

import lombok.val;

@ControllerAdvice("com.xf.controller")
public class MyResponseBodyAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof R) {
            R tem = (R) body;
            // 前端非得强行有个data
            if (!tem.containsKey("data"))
                tem.put("data", new HashMap<String, Object>());
            val req = HttpServletRequestUtil.getRequest();
            if (req.getServletPath().contains("login"))
                return body;
            val key = req.getAttribute("key").toString();
            val iv = req.getAttribute("iv").toString();
//            return tem;
            try {
                return AesUtils.encrypt(JSONObject.toJSONString(tem), key, iv);
            } catch (Exception e) {
                return null;
            }
        }
        return body;
    }
}

 

标签:return,org,xf,解密,springframework,import,加密,ControllerAdvice,com
来源: https://www.cnblogs.com/wujf/p/15840558.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有