You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Web服务配置消息解密遇端点映射问题求助

问题原因及解决方案

核心原因

这个错误的本质是:加密后的SOAP请求在未被解密的情况下,就被Spring WS的端点映射器处理了。此时请求的根元素是{http://www.w3.org/2001/04/xmlenc#}EncryptedData,但你的业务端点是针对原始业务SOAP消息的根元素定义的,自然找不到匹配的端点映射。

解决步骤

1. 确保安全拦截器优先执行

必须让Wss4jSecurityInterceptor在端点映射之前执行,确保请求先被解密为原始业务SOAP消息,再交给端点映射器处理。通过WsConfigurerAdapter(Spring Boot 3.x可直接继承)注册拦截器时,把它放在拦截器列表的首位:

@Configuration
@EnableWs
public class WebServiceConfig extends WsConfigurerAdapter {

    @Bean
    public Wss4jSecurityInterceptor securityInterceptor() {
        Wss4jSecurityInterceptor interceptor = new Wss4jSecurityInterceptor();
        // 配置解密参数
        interceptor.setValidationActions("Decrypt"); // 明确设置解密动作
        interceptor.setValidationUsername("your-key-alias");
        interceptor.setValidationPassword("your-key-password");
        interceptor.setKeyStoreLocation(new ClassPathResource("keystore.jks"));
        interceptor.setKeyStorePassword("keystore-password");
        interceptor.setEncryptionKeyIdentifier("DirectReference"); // 根据实际加密方式调整
        return interceptor;
    }

    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors) {
        // 把安全拦截器放在第一个位置,确保优先处理解密
        interceptors.add(0, securityInterceptor());
    }

    // 其他必要配置:如DefaultWsdl11Definition、MessageDispatcherServlet等
}

2. 验证端点注解配置正确性

确认你的@Endpoint类中@PayloadRoot的命名空间和本地名称,完全匹配解密后的业务SOAP请求根元素:

@Endpoint
public class DemoServiceEndpoint {

    private static final String SERVICE_NAMESPACE = "http://your-demo-service.com";

    @PayloadRoot(namespace = SERVICE_NAMESPACE, localPart = "DemoRequest")
    @ResponsePayload
    public DemoResponse handleDemoRequest(@RequestPayload DemoRequest request) {
        // 业务逻辑处理
        DemoResponse response = new DemoResponse();
        response.setResult("Success");
        return response;
    }
}

3. 检查Wss4j解密配置完整性

确保解密相关的参数配置正确,任何配置错误都会导致解密失败,请求依然以EncryptedData形式进入端点映射环节:

  • 密钥库路径、密码是否正确
  • 密钥别名、密码是否与加密端使用的一致
  • 解密动作是否设置为Decrypt(注意是setValidationActions,不是setSecurementActions——后者用于加密请求)

4. 区分Spring WS拦截器与MVC拦截器

不要把Spring WS的EndpointInterceptor注册到Spring MVC的拦截器链中,必须通过WsConfigurerAdapter的addInterceptors方法注册,确保拦截器属于Spring WS的消息处理链。

内容的提问来源于stack exchange,提问作者tangens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:30:06