如何将Interceptor(Schema验证)应用于服务器上部署的多个服务中的特定端点

时间:2018-07-04 08:46:10

标签: web-services soap interceptor

我在一台服务器上部署了两个肥皂端点(soap服务)。当我覆盖以下拦截器时,它将同时应用于这两种服务。如何启用/禁用特定于一项服务的拦截器。请帮助

拦截器代码如下。

@Override     public void addInterceptors(列表拦截器){

    PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor();
    validatingInterceptor.setValidateRequest(true);
    validatingInterceptor.setValidateResponse(true);
    validatingInterceptor.setXsdSchemaCollection(LogAnalyzerFile());
    interceptors.add(validatingInterceptor);
}

注意:它是一个使用注释的spring boot项目。 我

1 个答案:

答案 0 :(得分:0)

package com.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.StringUtils;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurationSupport;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.SmartEndpointInterceptor;
import org.springframework.ws.server.endpoint.MethodEndpoint;
import org.springframework.ws.soap.SoapBody;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
import org.springframework.ws.wsdl.wsdl11.Wsdl11Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;
import org.xml.sax.SAXException;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

@EnableWs
@Configuration
public class TestConfig extends WsConfigurationSupport implements SmartEndpointInterceptor {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Bean(name="testlog")
    public ServletRegistrationBean testlog(ApplicationContext applicationContext) {

        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(servlet, "/File/*");
        servletRegistrationBean.setName("Log");
        return servletRegistrationBean;
    }

    @Bean(name = "testFile")
    public Wsdl11Definition testFile()
    {
        SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
        wsdl11Definition.setWsdl(new ClassPathResource("test.wsdl"));
        logger.info("test.wsdl:");

        return wsdl11Definition;
    }

    @Bean(name = "UploadLogFile")
    public XsdSchema UploadLogFile() {
         return new SimpleXsdSchema(new ClassPathResource("1.xsd"));

    }

    @Bean(name = "ErrorInfo")
    public XsdSchema ErrorInfo() {
        return new SimpleXsdSchema(new ClassPathResource("2.xsd"));

    }

    public Resource[] getSchemas() {
        List<Resource> schemaResources = new ArrayList<>();
        schemaResources.add(new ClassPathResource("1.xsd"));
        schemaResources.add(new ClassPathResource("2.xsd"));
        return schemaResources.toArray(new Resource[schemaResources.size()]);
    }

    @Override
    public boolean shouldIntercept(MessageContext messageContext, Object endpoint) {

        if (endpoint instanceof MethodEndpoint) {
            MethodEndpoint methodEndpoint = (MethodEndpoint)endpoint;
            return methodEndpoint.getMethod().getDeclaringClass() == YourEndpoint.class;
        }

        return false;
    }

    private Boolean validateSchema(Source source_, MessageContext messageContext) throws Exception {
        boolean errorFlag = true;
        SchemaFactory _schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema _schema = _schemaFactory.newSchema(getSchemas()[0].getFile());

        Validator _validator = _schema.newValidator();
        DOMResult _result = new DOMResult();
        try {
            _validator.validate(source_, _result);
        } catch (SAXException _exception) {
            errorFlag = false;
            SoapMessage response = (SoapMessage) messageContext.getResponse();
            String faultString = StringUtils.hasLength(_exception.getMessage()) ? _exception.getMessage() : _exception.toString();
            SoapBody body = response.getSoapBody();
            body.addServerOrReceiverFault(faultString, Locale.US);
            _exception.printStackTrace();
        }

        return errorFlag;
    }

    @Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
        WebServiceMessage webServiceMessageRequest = messageContext.getRequest();
        SoapMessage soapMessage = (SoapMessage) webServiceMessageRequest;
        SoapHeader soapHeader = soapMessage.getSoapHeader();
        Source bodySource = soapMessage.getSoapBody().getPayloadSource();
        return validateSchema(bodySource,messageContext);

    }

    @Override
    public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
        return true;
    }

    @Override
    public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
        return false;
}
    @Override
    public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) throws Exception {

    }
}