package org.dromara.common.encrypt.filter; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.encrypt.properties.ApiDecryptProperties; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import java.io.IOException; import java.util.Objects; /** * Crypto 过滤器 * * @author wdhcr */ public class CryptoFilter implements Filter { private final ApiDecryptProperties properties; public CryptoFilter(ApiDecryptProperties properties) { this.properties = properties; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletRequest requestWrapper = null; HttpServletRequest servletRequest = (HttpServletRequest) request; // 是否为 json 请求 if (StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) { // 是否为 put 或者 post 请求 if (HttpMethod.PUT.matches(servletRequest.getMethod()) || HttpMethod.POST.matches(servletRequest.getMethod())) { // 是否存在加密标头 String headerValue = servletRequest.getHeader(properties.getHeaderFlag()); if (StringUtils.isNotBlank(headerValue)) { requestWrapper = new DecryptRequestBodyWrapper(servletRequest, properties.getPublicKey(), properties.getPrivateKey(), properties.getHeaderFlag()); } } } chain.doFilter(Objects.requireNonNullElse(requestWrapper, request), response); } @Override public void destroy() { } }