zhaowenxuan
17 小时以前 296b67944a807fb918d78b50a2d89768ec4aca38
接口加解密
1个文件已修改
6个文件已添加
525 ■■■■ 已修改文件
ltkj-admin/src/main/java/com/ltkj/web/controller/api/DefaultController.java 344 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/advice/EncryptResponseAdvice.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/anno/Encrypt.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/config/DecryptFilterConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/filter/DecryptFilter.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/utils/CryptoUtil.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/wrapper/DecryptRequestWrapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/api/DefaultController.java
@@ -9,17 +9,16 @@
import com.itextpdf.text.Paragraph;
import com.ltkj.common.core.domain.AjaxResult;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.hosp.domain.DictHosp;
import com.ltkj.hosp.domain.TjCustomer;
import com.ltkj.hosp.domain.TjOrder;
import com.ltkj.hosp.domain.TjOrderYcxm;
import com.ltkj.hosp.mapper.TjCustomerMapper;
import com.ltkj.hosp.service.ITjCustomerService;
import com.ltkj.hosp.service.ITjOrderDetailService;
import com.ltkj.hosp.service.ITjOrderService;
import com.ltkj.hosp.service.TjOrderYcxmService;
import com.ltkj.hosp.service.*;
import com.ltkj.hosp.vodomain.ShenGaoTiZhongVo;
import com.ltkj.system.service.ISysConfigService;
import com.ltkj.web.config.pdfutils.PdfUtils;
import com.ltkj.web.controller.api.anno.Encrypt;
import com.ltkj.web.controller.system.TjCheckController;
import com.ltkj.web.controller.system.TjReportController;
import io.swagger.annotations.ApiOperation;
@@ -27,7 +26,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
@@ -53,8 +51,6 @@
    private TjCheckController tjCheckController;
    @Autowired
    private TjCustomerMapper tjCustomerMapper;
    @Resource
    private ITjCustomerService customerService;
    @Autowired
    private ITjOrderService tjOrderService;
    @Autowired
@@ -63,6 +59,37 @@
    private ISysConfigService sysConfigService;
    @Autowired
    private TjOrderYcxmService tjOrderYcxmService;
    @Autowired
    private IDictHospService dictHospService;
    @Autowired
    private ITjCustomerService customerService;
    /**************************************** 提供给HIS调用 *************************************************/
    /**
     * 对于HIS提供
     * 根据身份证号查询返回体检记录:包含姓名、身份证号、性别、出生日期、年龄、体检号、联系电话,体检日期,报告状态
     * @param json
     * @return
     */
    @PostMapping("/getInfo")
    public AjaxResult getInfo(@RequestBody String json){
        JSONObject entries = JSONUtil.parseObj(json);
        String card = entries.getStr("card");
//        TjCustomer customer = tjCustomerMapper.getCusInfo(card);
        String key = sysConfigService.selectConfigByKey("h5OrXcxQueryDate");
        if (StrUtil.isBlank(key)){
            key = "2025-05-01";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(key);
            List<Map<String ,Object>> customer = tjCustomerMapper.getCusInfoList(card,date);
            return AjaxResult.success(customer);
        } catch (ParseException e) {
            return AjaxResult.error();
        }
    }
    /**
     * 提供给三方调用的报告查看接口
@@ -81,23 +108,6 @@
            return;
        }
        tjReportController.preview(response,true,tjNum);
    }
    @PostMapping("/viewReportUrl")
    public AjaxResult viewReportUrl(@RequestBody String json){
        JSONObject entries = JSONUtil.parseObj(json);
        String tjNum = entries.getStr("tjNum");
        LambdaQueryWrapper<TjOrder> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(TjOrder::getHeshouStatus,1);
        wrapper.eq(TjOrder::getTjNumber,tjNum);
        List<TjOrder> list = tjOrderService.list(wrapper);
        if (list.isEmpty()){
            return AjaxResult.error("报告未核收,请核收后查看");
        }
        TjOrder tjOrder = tjOrderService.getOrderByTjNum(tjNum);
        TjCustomer tjCustomer = tjCustomerMapper.selectById( tjOrder.getUserId());
        String filePath = tjCustomer.getCusId() + tjNum + tjCustomer.getCusName() + "_报告.pdf";
        return AjaxResult.success(filePath);
    }
    /**
@@ -215,29 +225,17 @@
        return JSONUtil.toBean(entries, AjaxResult.class);
    }
    /**************************************** 自用接口 有加解密 ******************************************/
    /**
     * 对于HIS提供
     * 根据身份证号查询返回体检记录:包含姓名、身份证号、性别、出生日期、年龄、体检号、联系电话,体检日期,报告状态
     * @param json
     * @return
     * 小程序查询分院区信息列表
     */
    @PostMapping("/getInfo")
    public AjaxResult getInfo(@RequestBody String json){
        JSONObject entries = JSONUtil.parseObj(json);
        String card = entries.getStr("card");
//        TjCustomer customer = tjCustomerMapper.getCusInfo(card);
        String key = sysConfigService.selectConfigByKey("h5OrXcxQueryDate");
        if (StrUtil.isBlank(key)){
            key = "2025-05-01";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(key);
            List<Map<String ,Object>> customer = tjCustomerMapper.getCusInfoList(card,date);
            return AjaxResult.success(customer);
        } catch (ParseException e) {
            return AjaxResult.error();
        }
    @Encrypt
    @PostMapping("/getHospList")
    @ApiOperation(value = "小程序查询分院区信息列表")
    public AjaxResult getHospList() {
        List<DictHosp> list = dictHospService.list();
        return AjaxResult.success(list);
    }
    /**
@@ -246,6 +244,7 @@
     * @param json
     * @return
     */
    @Encrypt
    @PostMapping("/getCusInfo")
    public AjaxResult getInfoCus(@RequestBody String json){
        JSONObject entries = JSONUtil.parseObj(json);
@@ -260,8 +259,226 @@
            if (customer == null) return AjaxResult.error();
            name = customer.getCusName();
        }
        List<Map<String ,Object>> customer = tjCustomerMapper.getCusInfoListByCardAndName(card,name);
        return AjaxResult.success(customer);
        String key = sysConfigService.selectConfigByKey("h5OrXcxQueryDate");
        if (StrUtil.isBlank(key)){
            key = "2025-05-01";
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(key);
            List<Map<String ,Object>> customer = tjCustomerMapper.getCusInfoListByCardAndName(card,name,date);
            return AjaxResult.success(customer);
        } catch (ParseException e) {
            return AjaxResult.error();
        }
    }
    /**
     * 提供给三方调用的报告查看接口
     * @param response
     * @param json
     */
    @Encrypt
    @PostMapping("/cusViewReport")
    public void cusViewReport(HttpServletResponse response, @RequestBody String json) throws IOException {
        JSONObject entries = JSONUtil.parseObj(json);
        String tjNum = entries.getStr("tjNum");
        LambdaQueryWrapper<TjOrder> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(TjOrder::getHeshouStatus,1);
        wrapper.eq(TjOrder::getTjNumber,tjNum);
        List<TjOrder> list = tjOrderService.list(wrapper);
        if (list.isEmpty()){
            return;
        }
        tjReportController.preview(response,true,tjNum);
    }
    /**
     * 提供给三方调用的报告数据接口
     * @param json
     * @return
     */
    @Encrypt
    @PostMapping("/cusReportData")
    public AjaxResult cusReportData(@RequestBody String json){
        String tjNum = JSONUtil.parseObj(json).getStr("tjNum");
        LambdaQueryWrapper<TjOrder> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(TjOrder::getHeshouStatus,1);
        wrapper.eq(TjOrder::getTjNumber,tjNum);
        List<TjOrder> list = tjOrderService.list(wrapper);
        if (list.isEmpty()){
            return AjaxResult.error("暂无数据!!");
        }
        JSONObject entries = JSONUtil.parseObj(tjCheckController.updateCheckType(tjNum));
        LambdaQueryWrapper<TjOrderYcxm> wq = new LambdaQueryWrapper<>();
        wq.eq(TjOrderYcxm::getTjh, tjNum);
        List<TjOrderYcxm> ycxms = tjOrderYcxmService.list(wq);
        Map<String, List<TjOrderYcxm>> stringListMap = ycxms.stream().collect(Collectors.groupingBy(TjOrderYcxm::getParentName));
        int xmXh = 1;
        JSONArray jczs = JSONUtil.createArray();
        for (Map.Entry<String, List<TjOrderYcxm>> entry : stringListMap.entrySet()) {
            List<TjOrderYcxm> details = entry.getValue();
            String xmmc = entry.getKey();
            boolean isXmWrite = false;
            int index = 1;
            JSONObject object = JSONUtil.createObj();
            for (TjOrderYcxm detail : details) {
                if (!isXmWrite) {
                    object.putOpt("xh",xmXh);
                    object.putOpt("xmmc",xmmc);
                    xmXh++;
                }
                String result = detail.getJcjg();
                if (StrUtil.isNotBlank(result)) {
                    result = result.replaceAll("本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查", "");
                    StringBuilder builder = new StringBuilder();
                    if (StrUtil.isBlank(result.replaceAll("\n", "").trim())) continue;
                    builder.append("    (").append(index).append(")").append(detail.getJcxm()).append(": ").append(result).append("\n");
                    index++;
                    result = builder.toString();
                }
                object.putOpt("result",result);
            }
            jczs.add(object);
        }
        entries.putOpt("jczs",jczs);
        xmXh = 1;
        JSONArray ysjy = JSONUtil.createArray();
        for (Map.Entry<String, List<TjOrderYcxm>> entry : stringListMap.entrySet()) {
            List<TjOrderYcxm> details = entry.getValue();
            if(null !=details && !details.isEmpty()){
                details= details.stream()
                        .sorted(Comparator.comparing(TjOrderYcxm::getJcxm))
                        .collect(Collectors.toList());
                boolean isXmWrite = false;
                int index1 = 1;
                for (TjOrderYcxm detail : details) {
                    JSONObject obj = JSONUtil.createObj();
                    String xmmc = entry.getKey().toString();
                    if (!isXmWrite) {
                        isXmWrite = true;
                        obj.putOpt("xh",xmXh);
                        obj.putOpt("xmmc",xmmc);
                        xmXh++;
                    }
                    String result = detail.getJcjg();
                    if (StrUtil.isNotBlank(result)) {
                        StringBuilder builder = new StringBuilder();
                        if (StrUtil.isBlank(result.replaceAll("\n", "").trim())) continue;
                        builder.append("    (").append(index1).append(")").append(detail.getJcxm()).append(": ").append(result).append("\n");
                        index1++;
                        result = builder.toString();
                    }
                    if (StrUtil.isNotBlank(result)) {
                        obj.putOpt("result",result);
                    } else {
                        obj.putOpt("result","建议定期复查");
                    }
                    String str = "     ";
                    List<Map<String, Object>> maps = new ArrayList<>();
                    String jynr = detail.getJynr();
                    JSONArray array = JSONUtil.parseArray(jynr);
                    for (Object object : array) {
                        Map<String,Object> objectMap=new HashMap<>();
                        JSONObject jsonObject = (JSONObject) object;
                        String bt = jsonObject.getStr("bt");
                        String nr = jsonObject.getStr("nr");
                        objectMap.put("bt",bt);
                        objectMap.put("nr",nr);
                        if(null !=bt || null !=nr) maps.add(objectMap);
                    }
                    ArrayList<String> strings = new ArrayList<>();
                    List<Map<String, Object>> collect1 = maps.stream().distinct().collect(Collectors.toList());
                    for (Map<String, Object> objectMap : collect1) {
                        String content = str + objectMap.get("bt").toString() + objectMap.get("nr").toString();
                        if (StrUtil.isBlank(content)) content = "     ";
                        strings.add(content);
                    }
                    obj.putOpt("contents",strings);
                    ysjy.add(obj);
                }
            }
        }
        entries.putOpt("ysjy",ysjy);
        removeNullFields(entries);
        return JSONUtil.toBean(entries, AjaxResult.class);
    }
    @Encrypt
    @PostMapping("/viewReportUrl")
    public AjaxResult viewReportUrl(@RequestBody String json){
        JSONObject entries = JSONUtil.parseObj(json);
        String tjNum = entries.getStr("tjNum");
        LambdaQueryWrapper<TjOrder> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(TjOrder::getHeshouStatus,1);
        wrapper.eq(TjOrder::getTjNumber,tjNum);
        List<TjOrder> list = tjOrderService.list(wrapper);
        if (list.isEmpty()){
            return AjaxResult.error("报告未核收,请核收后查看");
        }
        TjOrder tjOrder = tjOrderService.getOrderByTjNum(tjNum);
        TjCustomer tjCustomer = tjCustomerMapper.selectById( tjOrder.getUserId());
        String filePath = tjCustomer.getCusId() + tjNum + tjCustomer.getCusName() + "_报告.pdf";
        return AjaxResult.success(filePath);
    }
    /**
     * 小程序点击体检报告查询详情,显示身高体重体重指数收缩压舒张压
     */
    @Encrypt
    @GetMapping("/getShenGaoTiZhong")
    @ApiOperation(value = "小程序-体检报告查询详情")
    public AjaxResult getShenGaoTiZhong(@RequestParam @ApiParam(value = "体检号") String tjNumber) {
//        Map<String, Object> objectMap = new HashMap<>();
        LambdaQueryWrapper<TjOrder> wq1 = new LambdaQueryWrapper<>();
        wq1.eq(TjOrder::getTjNumber, tjNumber);
        wq1.eq(TjOrder::getCheckStatus, 1);
        TjOrder one = tjOrderService.getOne(wq1);
        if (one == null) {
            return AjaxResult.success("体检暂未完成!!");
        }
        List<ShenGaoTiZhongVo> maps = detailService.getShenGaoTiZhongList(one.getTjNumber());
        log.info("ltkj {}的体检报告查询详情"+maps,tjNumber);
        return AjaxResult.success(maps);
    }
    /**
     * 小程序点击体检报告查询详情,显示身高体重体重指数收缩压舒张压
     */
    @Encrypt
    @GetMapping("/updatePhone")
    @ApiOperation(value = "小程序-修改手机号接口")
    public AjaxResult updatePhone(@RequestParam @ApiParam(value = "身份证号") String sfzh,
                                  @RequestParam @ApiParam(value = "姓名") String name,
                                  @RequestParam @ApiParam(value = "手机号") String phone) {
        if(StrUtil.isBlank(sfzh) || StrUtil.isBlank(name) || StrUtil.isBlank(phone)){
            return AjaxResult.error("请输入正确的信息!");
        }
        if(!MatchUtils.isIdCard(sfzh)){
            return AjaxResult.error("身份证号格式错误 请核对后重新输入!");
        }
        LambdaQueryWrapper<TjCustomer> wq = new LambdaQueryWrapper<>();
        wq.eq(TjCustomer::getCusIdcard, sfzh);
        wq.like(TjCustomer::getCusName, name);
        TjCustomer customer = customerService.getOne(wq);
        if(null != customer){
            if(!MatchUtils.isMobileNO( phone)){
                return AjaxResult.error("手机号不正确 请核对后重新输入!");
            }
            customer.setCusPhone( phone);
            customerService.updateById(customer);
            return AjaxResult.success("修改成功!");
        }
        return AjaxResult.error("未查询到该人员!");
    }
    public static void removeNullFields(JSONObject jsonObject) {
@@ -299,37 +516,4 @@
            jsonObject.remove(key);
        }
    }
    /**
     * 小程序点击体检报告查询详情,显示身高体重体重指数收缩压舒张压
     */
    @GetMapping("/updatePhone")
    @ApiOperation(value = "小程序-修改手机号接口")
    public AjaxResult updatePhone(@RequestParam @ApiParam(value = "身份证号") String sfzh,
                                  @RequestParam @ApiParam(value = "姓名") String name,
                                  @RequestParam @ApiParam(value = "手机号") String phone) {
        if(StrUtil.isBlank(sfzh) || StrUtil.isBlank(name) || StrUtil.isBlank(phone)){
            return AjaxResult.error("请输入正确的信息!");
        }
        if(!MatchUtils.isIdCard(sfzh)){
            return AjaxResult.error("身份证号格式错误 请核对后重新输入!");
        }
        LambdaQueryWrapper<TjCustomer> wq = new LambdaQueryWrapper<>();
        wq.eq(TjCustomer::getCusIdcard, sfzh);
        wq.like(TjCustomer::getCusName, name);
        TjCustomer customer = customerService.getOne(wq);
        if(null != customer){
            if(!MatchUtils.isMobileNO( phone)){
                return AjaxResult.error("手机号不正确 请核对后重新输入!");
            }
            customer.setCusPhone( phone);
            customerService.updateById(customer);
            return AjaxResult.success("修改成功!");
        }
        return AjaxResult.error("未查询到该人员!");
    }
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/advice/EncryptResponseAdvice.java
New file
@@ -0,0 +1,38 @@
package com.ltkj.web.controller.api.advice;
import com.ltkj.web.controller.api.anno.Encrypt;
import com.ltkj.web.controller.api.utils.CryptoUtil;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@RestControllerAdvice
public class EncryptResponseAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return returnType.hasMethodAnnotation(Encrypt.class)
                || returnType.getContainingClass().isAnnotationPresent(Encrypt.class);
    }
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        try {
            String json = body instanceof String ? (String) body : new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(body);
            System.out.println("加密前:" + json);
            return CryptoUtil.encrypt(json);
        } catch (Exception e) {
            throw new RuntimeException("响应加密失败", e);
        }
    }
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/anno/Encrypt.java
New file
@@ -0,0 +1,16 @@
package com.ltkj.web.controller.api.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @Company: 西安路泰科技有限公司
 * @Author: zhaowenxuan
 * @Date: 2025/7/17 17:31
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/config/DecryptFilterConfig.java
New file
@@ -0,0 +1,22 @@
package com.ltkj.web.controller.api.config;
import com.ltkj.web.controller.api.filter.DecryptFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @Company: 西安路泰科技有限公司
 * @Author: zhaowenxuan
 * @Date: 2025/7/17 17:27
 */
@Configuration
public class DecryptFilterConfig {
    @Bean
    public FilterRegistrationBean<DecryptFilter> decryptFilter() {
        FilterRegistrationBean<DecryptFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new DecryptFilter());
        registrationBean.addUrlPatterns("/api/cusViewReport", "/api/cusReportData", "/api/getCusInfo","/api/getHospList","/api/updatePhone");
        return registrationBean;
    }
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/filter/DecryptFilter.java
New file
@@ -0,0 +1,36 @@
package com.ltkj.web.controller.api.filter;
import com.ltkj.web.controller.api.utils.CryptoUtil;
import com.ltkj.web.controller.api.wrapper.DecryptRequestWrapper;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.stream.Collectors;
//@Component
//@WebFilter(urlPatterns = {"/api/cusViewReport", "/api/cusReportData", "/api/getCusInfo"})
public class DecryptFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String body = new BufferedReader(httpRequest.getReader()).lines()
                .collect(Collectors.joining(System.lineSeparator()));
        System.out.println("请求数据:"+body);
        try {
            String decryptedBody = CryptoUtil.decrypt(body);
            System.out.println("解密后:"+decryptedBody);
            DecryptRequestWrapper wrappedRequest = new DecryptRequestWrapper(httpRequest, decryptedBody);
            chain.doFilter(wrappedRequest, response);
        } catch (Exception e) {
            throw new ServletException("请求体解密失败", e);
        }
    }
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/utils/CryptoUtil.java
New file
@@ -0,0 +1,36 @@
package com.ltkj.web.controller.api.utils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class CryptoUtil {
    private static final String KEY = "f$9Lz#Q@1vT!eW2%"; // AES密钥(16位)
    private static final String ALGORITHM = "AES";
    // 加密
    public static String encrypt(String plainText) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
        byte[] encrypted = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }
    // 解密
    public static String decrypt(String cipherText) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(cipherText));
        return new String(decrypted);
    }
    public static void main(String[] args) throws Exception {
        String encrypt = encrypt("{\"card\": \"622722197210102079\",\"name\":\"焦拉民\"}");
        System.out.println("encrypt = " + encrypt);
        String decrypt = decrypt(encrypt);
        System.out.println("decrypt = " + decrypt);
    }
}
ltkj-admin/src/main/java/com/ltkj/web/controller/api/wrapper/DecryptRequestWrapper.java
New file
@@ -0,0 +1,33 @@
package com.ltkj.web.controller.api.wrapper;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class DecryptRequestWrapper extends HttpServletRequestWrapper {
    private final byte[] body;
    public DecryptRequestWrapper(HttpServletRequest request, String decryptedBody) {
        super(request);
        this.body = decryptedBody.getBytes();
    }
    @Override
    public ServletInputStream getInputStream() {
        ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream() {
            @Override public boolean isFinished() { return bais.available() == 0; }
            @Override public boolean isReady() { return true; }
            @Override public void setReadListener(ReadListener readListener) {}
            @Override public int read() { return bais.read(); }
        };
    }
    @Override
    public BufferedReader getReader() {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }
}