springMVC将request解密,response加密

1.使用 Filter 将request数据解密

 1.1 Filter 代码


@Component
public class DecryptFilter extends OncePerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(DecryptFilter.class);

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        boolean shouldEncrypt = false;
        String version = request.getHeader(AuthConstants.VERSION_CODE);
        String contentType = request.getContentType();
        String requestBody = null;
        if (check(version, request.getMethod()) && StringUtils.isNotEmpty(contentType)) {
            if (org.springframework.util.StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
                shouldEncrypt = true;
                requestBody = convertFormToString(request);
            } else if (org.springframework.util.StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_JSON_VALUE)) {
                shouldEncrypt = true;
                requestBody = convertInputStreamToString(request.getInputStream());
            }
        }

        if (shouldEncrypt) {
            Map<String, Object> parameterMap = new LinkedHashMap<>();
            DecryptHttpWrapper wrapper = new DecryptHttpWrapper(request, objectMapper.readValue(requestBody, parameterMap.getClass()));
            filterChain.doFilter(wrapper, response);
        } else {
            filterChain.doFilter(request, response);
        }
    }

    /**
     * 判断是否需要加解密
     **/
    public static boolean check(final String version, final String method) {
        boolean shouldEncrypt = false;
        try {
            if (StringUtils.isNotEmpty(version) && StringUtils.isNotEmpty(method)) {
                String checkMethod = method.toUpperCase();
                int versionInt = Integer.parseInt(version);
                if (versionInt >= AndroidVersion.DECRYPT_VERSION && ("POST".equals(checkMethod) || "PUT".equals(checkMethod))) {
                    shouldEncrypt = true;
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
            shouldEncrypt = false;
        }
        return shouldEncrypt;
    }

    /**
     * 判断是否需要加解密
     **/
    public static boolean check(final String version) {
        boolean shouldEncrypt = false;
        try {
            if (StringUtils.isNotEmpty(version)) {
                int versionInt = Integer.parseInt(version);
                if (versionInt >= AndroidVersion.DECRYPT_VERSION) {
                    shouldEncrypt = true;
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
            shouldEncrypt = false;
        }
        return shouldEncrypt;
    }

    private String convertFormToString(HttpServletRequest request) {
        String data = request.getParameter(AuthConstants.SECURE_DATA);
        try {
            return SecureHelper.decryptString(data);
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }

    private String convertInputStreamToString(InputStream inputStream) throws IOException {
        Map<String, String> map = new LinkedHashMap<>();
        String data = StreamUtils.copyToString(inputStream, Charset.forName("UTF-8"));
        map = objectMapper.readValue(data, map.getClass());
        return SecureHelper.decryptString(map.get(AuthConstants.SECURE_DATA));
    }
}

1.2 注册Filter

    @Bean
    public FilterRegistrationBean customEncryptFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new DecryptFilter());
        registration.addUrlPatterns("/**");
        registration.setName(DecryptFilter.class.getName());
        registration.setOrder(Integer.MAX_VALUE);
        return registration;
    }

1.3 自定义的  RequestWrapper


public class DecryptHttpWrapper extends HttpServletRequestWrapper {

    // todo: 还是使用Object比较好,防止出现复杂的数据类型
    private Map<String, String[]> parameterMap = new LinkedHashMap<>();

    public DecryptHttpWrapper(HttpServletRequest request, Map<String, Object> parameterMap) {
        super(request);
        parameterMap.forEach((key, value) -> {
            if (value != null) {
                this.parameterMap.put(key, new String[]{value.toString()});
            }
        });
    }

    @Override
    public Enumeration<String> getParameterNames() {
        Vector<String> vector = new Vector<String>(parameterMap.keySet());
        return vector.elements();
    }

    @Override
    public String getParameter(String name) {
        String[] results = parameterMap.get(name);
        if (results != null && results.length > 0) {
            return results[0];
        } else {
            return null;
        }
    }

    @Override
    public String[] getParameterValues(String name) {
        return parameterMap.get(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return parameterMap;
    }

    public void setParameterMap(Map<String, String[]> parameterMap) {
        this.parameterMap = parameterMap;
    }
}

2.使用 ControllerAdvice 将response数据加密

 2.1 代码

@ControllerAdvice
public class DecryptResponseBodyAdvice implements ResponseBodyAdvice<Object> {

    private final Logger logger = LoggerFactory.getLogger(DecryptResponseBodyAdvice.class);

    private final ObjectMapper objectMapper = new ObjectMapper();

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

    @Override
    public Object beforeBodyWrite(Object obj, MethodParameter methodParameter,
                                  MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
        if (serverHttpRequest.getHeaders() != null
                && serverHttpRequest.getHeaders().size() > 0
                && serverHttpRequest.getHeaders().get(AuthConstants.VERSION_CODE) != null
                && serverHttpRequest.getHeaders().get(AuthConstants.VERSION_CODE).size() > 0) {
            try {
                boolean shouldEncrypt = DecryptFilter.check(serverHttpRequest.getHeaders().get(AuthConstants.VERSION_CODE).get(0));
                if (shouldEncrypt) {
                    return new Result() {{
                        setData(SecureHelper.encryString(objectMapper.writeValueAsString(obj)));
                    }};
                }
            } catch (Exception e) {
                logger.error(e.getMessage());
                return obj;
            }
        }
        return obj;
    }

    private static class Result {

        @JsonProperty(AuthConstants.SECURE_DATA)
        private String data;

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC的request对象是用于处理HTTP请求的对象。在Spring MVC中,控制器(Controller)可以通过方法参数或注解来获取和使用request对象。通过Spring的依赖注入机制,可以自动将request对象注入到控制器的方法中。 引用提到了一种获取request对象的方法,即通过WebApplicationContextUtils.RequestObjectFactory的getObject()方法获取当前的request对象。 引用提到了在使用Spring MVC框架时,当页面直接请求json静态文件时会报"Request method 'POST' not supported"的错误。这个错误通常是因为请求的方法不正确导致的。可以检查请求的URL、请求方法以及相应的处理方法是否匹配。 引用提到了一种减少代码冗余的方法,即在控制层基类中注入request对象,并手动调用获取request对象的代码。这种方法可以提高代码的复用性和可维护性。 总结来说,Spring MVC的request对象是用于处理HTTP请求的对象,可以通过方法参数或注解来获取和使用。可以使用依赖注入机制自动注入request对象,也可以手动调用获取request对象的方法。在使用过程中需要注意请求方法的匹配和错误处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringMVC中获取request的三种方式](https://blog.csdn.net/weixin_38761297/article/details/100929393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [spring mvc处理json文件静态资源文件报错Request method 'POST' not supported](https://blog.csdn.net/baidu_19473529/article/details/78408488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值