From 78cd3b3828798286b0e04d5e295eaa6a236b9402 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Mon, 20 Jul 2026 11:33:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B5=8B=E8=AF=95=E6=8E=A5=E5=85=A5wps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../safetyeval/adapter/config/WpsFilter.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java new file mode 100644 index 0000000..f727bd5 --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/WpsFilter.java @@ -0,0 +1,121 @@ +package org.qinan.safetyeval.adapter.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + */ +@Slf4j +@Configuration +public class WpsFilter extends OncePerRequestFilter { + + private static final String WPS_TOKEN_HEADER = "X-Weboffice-Token"; + private static final String AUTH_TOKEN_HEADER = "token"; + private static final String AUTH_TOKEN_PREFIX = "jjb-saas-auth:oauth:"; + + @Bean + public FilterRegistrationBean wpsFilterRegistration() { + FilterRegistrationBean bean = new FilterRegistrationBean<>(); + bean.setFilter(this); + bean.setOrder(Ordered.HIGHEST_PRECEDENCE); + bean.addUrlPatterns("/safetyEval-h5/wsp/*"); + bean.setName("wpsFilter"); + return bean; + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String uri = request.getRequestURI(); + return uri == null || !uri.contains("/safetyEval-h5/wsp/"); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String wpsToken = request.getHeader(WPS_TOKEN_HEADER); + if (!StringUtils.hasText(wpsToken)) { + log.warn("WPS callback missing {}: {}", WPS_TOKEN_HEADER, request.getRequestURI()); + filterChain.doFilter(request, response); + return; + } + + String token = wpsToken.trim(); + if (!token.startsWith(AUTH_TOKEN_PREFIX)) { + token = AUTH_TOKEN_PREFIX + token; + } + + MutableHeaderRequestWrapper wrapped = new MutableHeaderRequestWrapper(request); + wrapped.putHeader(AUTH_TOKEN_HEADER, token); + log.info("WPS token mapped to header {} for {}", AUTH_TOKEN_HEADER, request.getRequestURI()); + filterChain.doFilter(wrapped, response); + } + + static final class MutableHeaderRequestWrapper extends HttpServletRequestWrapper { + + private final Map extraHeaders = new HashMap<>(); + + MutableHeaderRequestWrapper(HttpServletRequest request) { + super(request); + } + + void putHeader(String name, String value) { + extraHeaders.put(name, value); + } + + @Override + public String getHeader(String name) { + String value = findExtra(name); + return value != null ? value : super.getHeader(name); + } + + @Override + public Enumeration getHeaders(String name) { + String value = findExtra(name); + if (value != null) { + return Collections.enumeration(Collections.singletonList(value)); + } + return super.getHeaders(name); + } + + @Override + public Enumeration getHeaderNames() { + Set names = new HashSet<>(); + Enumeration original = super.getHeaderNames(); + while (original.hasMoreElements()) { + names.add(original.nextElement()); + } + names.addAll(extraHeaders.keySet()); + return Collections.enumeration(names); + } + + private String findExtra(String name) { + if (name == null) { + return null; + } + for (Map.Entry entry : extraHeaders.entrySet()) { + if (entry.getKey().equalsIgnoreCase(name)) { + return entry.getValue(); + } + } + return null; + } + } +}