SpringBoot整合WebSerice

说明: WebService是很早以前的技术, 已经比较过时了, WebService在jdk1.8或及以下版本兼容性更好; jdk1.9或及其以上版本, WebService兼容性不太友好, 此笔记基于jdk11

1. WebServiceTest父模块

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zqd</groupId>
  <artifactId>WebServiceTest</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>Server</module>
    <module>Client</module>
    <module>Common</module>
  </modules>
  <packaging>pom</packaging>

  <name>WebServiceTest Maven Webapp</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
    <relativePath/>
  </parent>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
      </dependency>
      <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-ri</artifactId>
        <version>2.3.4</version>
        <type>pom</type>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.1.5.Final</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.4.3</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>
View Code
复制代码

2. Common子模块

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zqd</groupId>
  <artifactId>Common</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>Common</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <parent>
    <groupId>com.zqd</groupId>
    <artifactId>WebServiceTest</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>
    <dependency>
      <groupId>com.sun.xml.ws</groupId>
      <artifactId>jaxws-ri</artifactId>
      <type>pom</type>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
    </dependency>
  </dependencies>
</project>
View Code
复制代码
复制代码
package com.zqd.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * @author ADeng
 * @date 2022/5/22
 * @desc
 */
@WebService(name= "MessageService"
        , targetNamespace = "http://service.zqd.com"
)
public interface IMessageService {
    @WebMethod
    String echo(@WebParam String msg);
}
View Code
复制代码

3. Server子模块

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zqd</groupId>
  <artifactId>Server</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>Server</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <parent>
    <groupId>com.zqd</groupId>
    <artifactId>WebServiceTest</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>com.zqd</groupId>
      <artifactId>Common</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>
View Code
复制代码
复制代码
package com.zqd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 *  启动后访问: http://localhost:8080/services
 */
@SpringBootApplication
public class App
{
    public static void main( String[] args ) {
        SpringApplication.run(App.class, args);
    }
}
View Code
复制代码
复制代码
package com.zqd.service;

import org.springframework.stereotype.Service;

import javax.jws.WebService;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc
 */
@WebService(serviceName= "MessageService"
        , targetNamespace = "http://service.zqd.com"
        , endpointInterface = "com.zqd.service.IMessageService"
)
@Service
public class MessageServiceImpl implements IMessageService {
    @Override
    public String echo(String msg) {
        return "[ECHO] : " + msg;
    }
}
View Code
复制代码
复制代码
package com.zqd.interceptor;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;
import org.w3c.dom.NodeList;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc
 */
@Component
public class WebServiceAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
    private static final String USER_NAME = "qzeng";
    private static final String USER_PASSWORD = "123";
    private SAAJInInterceptor saa = new SAAJInInterceptor(); // 创建拦截器
    public WebServiceAuthInterceptor() {
        super(Phase.PRE_PROTOCOL);
        super.getAfter().add(SAAJInInterceptor.class.getName()); // 添加拦截
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
        if (soapMessage == null) { // 没有消息内容
            this.saa.handleMessage(message); // 直接走默认处理
            soapMessage = message.getContent(SOAPMessage.class);
        }
        SOAPHeader header;
        try {
            header = soapMessage.getSOAPHeader();
        } catch (SOAPException e) {
            throw  new Fault(new IllegalAccessException("找不到header信息,无法实现用户认证处理"));
        }
        NodeList usernameNodeList = header.getElementsByTagName("username");
        NodeList passwordNodeList = header.getElementsByTagName("password");
        if (usernameNodeList.getLength() < 1 || passwordNodeList.getLength() < 1) {
            throw new Fault(new IllegalAccessException("找不到Header信息, 无法实现永固认证处理"));
        }
        String username = usernameNodeList.item(0).getTextContent().trim();
        String password = passwordNodeList.item(0).getTextContent().trim();
        System.out.println("username = " + username + ", password = " + password);
        if (USER_NAME.equals(username) && USER_PASSWORD.equals(password)) {
            System.out.println("用户认证成功");
        } else {
            SOAPException soapException = new SOAPException("用户认证失败");
            System.out.println("用户认证失败");
            throw new Fault(soapException);
        }
    }

}
View Code
复制代码
复制代码
package com.zqd.config;

import com.zqd.interceptor.WebServiceAuthInterceptor;
import com.zqd.service.IMessageService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc
 */
@Configuration
public class CXFConfig {
    @Autowired
    private Bus bus;
    @Autowired
    private IMessageService messageService;
    @Autowired
    private WebServiceAuthInterceptor webServiceAuthInterceptor;

    @Bean
    public ServletRegistrationBean getRegistrationBean() {
        return new ServletRegistrationBean(new CXFServlet(), "/services/*");
    }

    @Bean
    public Endpoint messageEndpoint() {
        EndpointImpl endpoint = new EndpointImpl(this.bus, this.messageService);
        endpoint.publish("/MessageService");
        endpoint.getInInterceptors().add(this.webServiceAuthInterceptor);
        return endpoint;
    }

}
View Code
复制代码

4. Client子模块

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zqd</groupId>
  <artifactId>Client</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>Client</name>
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <parent>
    <groupId>com.zqd</groupId>
    <artifactId>WebServiceTest</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>


  <dependencies>
    <dependency>
      <groupId>com.zqd</groupId>
      <artifactId>Common</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>
View Code
复制代码
复制代码
package com.zqd.interceptor;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.List;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc
 */
public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
    private String username;
    private String password;
    public ClientLoginInterceptor(String username, String password) {
        super(Phase.PREPARE_SEND);
        this.username = username;
        this.password = password;
    }
    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        List<Header> headerList = soapMessage.getHeaders();
        Document document = DOMUtils.createDocument();
        Element auth = document.createElement("authority");
        Element username = document.createElement("username");
        Element password = document.createElement("password");
        username.setTextContent(this.username);
        password.setTextContent(this.password);
        auth.appendChild(username);
        auth.appendChild(password);
        headerList.add(0, new Header(new QName("authority"), auth));
    }
}
View Code
复制代码
复制代码
package com.zqd.client;

import com.zqd.interceptor.ClientLoginInterceptor;
import com.zqd.service.IMessageService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc 方式一: 代理方式调用
 */
public class CXFClientProxy {
    public static void main(String[] args) {
        String url = "http://localhost:8080/services/MessageService?wsdl";
        JaxWsProxyFactoryBean proxy = new JaxWsProxyFactoryBean();
        proxy.setAddress(url);
        proxy.setServiceClass(IMessageService.class);
        proxy.getOutInterceptors().add(new ClientLoginInterceptor("qzeng", "123"));
        IMessageService messageService = (IMessageService) proxy.create();
        String message = "hello world zqd";
        String result = messageService.echo(message);
        System.out.println(result);
    }
}
View Code
复制代码
复制代码
package com.zqd.client;

/**
 * @author ADeng
 * @date 2022/5/22
 * @desc 方式二: 动态模式来调用
 */
import com.zqd.interceptor.ClientLoginInterceptor;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class CXFClientDynamic {
    public static void main(String[] args) throws Exception {
        String url = "http://localhost:8080/services/MessageService?wsdl"; // WebService服务地址
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(url); // 创建一个客户端类
        client.getOutInterceptors().add(new ClientLoginInterceptor("qzeng", "123"));
        String message = "hello world zqd";
        Object[] result = client.invoke("echo", message);
        System.out.println(result[0]);
    }
}
View Code
复制代码

 

posted @   剑阁丶神灯  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示