SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)

唠叨两句

讲真,SOAP跟现在流行的RESTful WebService比起来显得很难用。冗余的XML文本信息太多,可读性差,它的请求信息有时很难手动构造,不太好调试。不过说归说,对某些企业用户来说SOAP的使用率仍然是很高的。

需求背景

接手维护的一个项目,最近客户想开放项目中的功能给第三方调用,而且接入方指定必须是SOAP接口。这项目原来的代码我看着头疼,也不想再改了,除非推倒重写。客户的需求虽然不难但要的很急,为了尽快交付就使用SpringBoot快速搭一个微服务。

开始动手

1.新建一个Spring Starter Project
2.加入cxf的maven配置
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.1.15</version>
    </dependency>

编写服务代码(示例代码)

@WebService(name = "UserService", targetNamespace="http://demo.example.com/")
public interface IUserService {

    @WebMethod
    User getUserById(@WebParam(name = "id") int id);

    int addUser(@WebParam(name = "user") User user);
}
@InInterceptors(interceptors={"com.example.demo.auth.AuthInterceptor"})
@WebService(serviceName = "UserService", targetNamespace = "http://demo.example.com/", endpointInterface = "com.example.demo.soap.IUserService")
@Component
public class UserServiceImpl implements IUserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private IUserDAO userDAO;

    @Override
    public User getUserById(int id) {
        return userDAO.getUserById(id);
    }

    @Override
    public int addUser(User user) {
        logger.info("save user [" + user.getId() + "]");
        userDAO.addUser(user);
        return 0;
    }
}

鉴权拦截器

@Component
public class AuthInterceptor extends AbstractSoapInterceptor {

    private static final String BASIC_PREFIX = "Basic ";
    private static final String USERNAME = "lichmama";
    private static final String PASSWORD = "123456";

    public AuthInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
        String auth = request.getHeader("Authorization");
        if (auth == null) {
            throw new IllegalArgumentException("auth failed, header [Authorization] not exists");
        }
        if (!auth.startsWith(BASIC_PREFIX)) {
            throw new IllegalArgumentException("auth failed, header [Authorization] is illegal");
        }
        String plaintext = new String(Base64.getDecoder().decode(auth.substring(BASIC_PREFIX.length())));
        if (StringUtils.isEmpty(plaintext) || !plaintext.contains(":")) {
            throw new IllegalArgumentException("auth failed, header [Authorization] is illegal");
        }
        String[] userAndPass = plaintext.split(":");
        String username = userAndPass[0];
        String password = userAndPass[1];
        if (!USERNAME.equals(username) || !PASSWORD.equals(password)) {
            throw new IllegalArgumentException("auth failed, username or password is incorrect");
        }
    }
}

编写配置类

@Configuration
public class SoapConfig {

    @Autowired
    private IUserService userService;

    @Autowired
    @Qualifier(Bus.DEFAULT_BUS_ID)
    private SpringBus bus;

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, userService);
        endpoint.publish("/userService");
        return endpoint;
    }
}

修改CXF默认发布路径(application.properties)

server.port=8000
cxf.path=/soap

启动项目后访问http://localhost:8000/soap/userService?wsdl

使用SoapUI测试一下,看上去没什么问题

最后交代一下开发环境

STS 3.7.3 + SpringBoot 2.0.1 + JDK1.8

收工下班了。

原文地址:https://www.cnblogs.com/lichmama/p/8728262.html

时间: 2024-10-11 22:53:19

SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)的相关文章

cxf快速简单的实现webservice调用

webservice的历史和相关技术 参考:http://www.cnblogs.com/doosmile/archive/2012/06/21/2557351.html webservice技术现在已经非常成熟,大浪淘沙后,目前java开发webservice的框架主要包括axis2和cxf. axis2和cxf都是apache旗下的产品,但是其目的不同,导致webservice开发方法也不一样.两个框架都得到了开发者的支持.有必要对二者进行以下对比.     Axis2 CXF 目标 Web

使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

使用CXF框架,发布webservice服务,并使用客户端远程访问webservice  1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache      * CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext    * CXF默认是依赖于Spring的    * Apache CXF 发行包中的jar,如果全部放到lib中

玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP 协议的Web 接口,需要注意的是它和 HTTP 协议并非绑定关系.我的个人理解就是:通过HTTP协议不同请求方法(GET.POST.PUT.Patch,DELETE)来判断如何操作统一命名的资源,并且通过不同的响应码来知道执行的状态. 关于 RESTful API 具体详细介绍,我推荐阅读下面 3

SOAP Webservice和RESTful Webservice

REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource)2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理.您可以通过

Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源

随便聊聊 SOA &amp; SOAP &amp; WebService 的一些东西,以及客户端开发的代码逻辑解析

http://blog.csdn.net/hikaliv/article/details/6459779 一天的时间调通了一个 WebService 的 Java 端的 C/S.一个 Android 端的 C/S,调通了而已,很不爽,很闷.因为刚刚上手 JAVA & Eclipse,对于我这个用惯了 VS 2010 的同学来说,感觉大大的不好.被迫和陌生的感觉很容易让我这个巨蟹座的男人直接地由然而生强烈的抵触情绪.不过话说回来了,网络方面的东西我一直很感兴趣,苦于没有项目参与.谁让项目要求我 A

REST &amp; SOAP webservice 小结

REST: REST是一种架构设计,特点是面向资源,存在于互联网的任何事物都可以理解为资源,REST相比较SOAP WS具有比较低的开发门槛. 1. 网络上的事物被抽象成资源,每个资源对应唯一的资源标示(URI) 2. 所有对资源的操作都是无状态的 REST遵循HTTP规范,其对资源的核心操作对应http method - get/post/put/delete(获取.增加.修改.删除),通过URI来获取资源并对其进行操作. SOAP: SOAP有严格的规范和标准,针对安全和事物等的管理更加成熟

webService总结(一)——使用CXF公布和调用webService(不使用Spring)

CXF和Axis2是两个比較流行的webService框架,接下来我会写几篇博客简介怎样使用这两种框架. 首先,先简介一下CXF的使用. CXF公布webService有多种方法.这里我介绍三种: 1.不使用Spring.CXF自己主动公布webService 2.不使用Spring,CXF手动公布webService 3.使用Spring + CXF公布webService 这篇博客以实例介绍第一种方法--不使用Spring,CXF自己主动公布webService. 服务端: 文件夹结构例如以

PHP中调用Soap/WebService

关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子.但是主要讲述了如何用PHP开发服务器端.客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况.在本文中我们做一个简单的示范. 一.寻找WebService来源 WebService可以自己编写,但是也可以从网络上去寻找现成的.我用的是www.xmethods.net里的US Zip Validator.它的WSDL文件位置在:http://www.webservicemart.com/uszip.