feat: 测试接入wps

dev_1.0.1
zhanglei 2026-07-20 11:33:22 +08:00
parent a1c58b525f
commit 0cda1b471b
1 changed files with 121 additions and 0 deletions

View File

@ -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<WpsFilter> wpsFilterRegistration() {
FilterRegistrationBean<WpsFilter> 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<String, String> 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<String> getHeaders(String name) {
String value = findExtra(name);
if (value != null) {
return Collections.enumeration(Collections.singletonList(value));
}
return super.getHeaders(name);
}
@Override
public Enumeration<String> getHeaderNames() {
Set<String> names = new HashSet<>();
Enumeration<String> 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<String, String> entry : extraHeaders.entrySet()) {
if (entry.getKey().equalsIgnoreCase(name)) {
return entry.getValue();
}
}
return null;
}
}
}