当前位置: 首页 > news >正文

SPRINGBOOT整合CXF发布WEB SERVICE和客户端调用(用户和密码验证)

主要分为客户端和服务端

服务端

  1. pom配置
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>webservice-service</artifactId><version>0.0.1-SNAPSHOT</version><name>webservice-service</name><description>webservice-client</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- HTTP --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.4</version></dependency><!-- Fast Json --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.41</version></dependency><!-- CXF webservice --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.3</version><exclusions><exclusion><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
  1. Config配置
@Configuration
public class CxfConfig {@Autowiredprivate Bus bus;@Autowiredprivate ServiceMaster serviceMaster;//------------------------------------------  默认是services ------------------------------------------@Beanpublic ServletRegistrationBean cxfServlet(){return new ServletRegistrationBean( new CXFServlet(), "/services/*");}@Beanpublic Endpoint endpoint(){EndpointImpl endpoint = new EndpointImpl(bus, serviceMaster);endpoint.publish("/ServiceMaster");endpoint.getInInterceptors().add(new ClientLoginInterceptor());endpoint.getInInterceptors().add(new AuthInterceptor());return endpoint;}}

3.WebService拦截器验证

package com.example.webserviceclient.intercptor;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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.NodeList;import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;/*** 定义拦截器用户用户验证*/
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {private static final Logger logger = LoggerFactory.getLogger(AuthInterceptor.class);private SAAJInInterceptor saa = new SAAJInInterceptor();private static final String USER_NAME = "guanguan";private static final String USER_PASSWORD = "sailing2018!";public AuthInterceptor() {super(Phase.PRE_PROTOCOL);getAfter().add(SAAJInInterceptor.class.getName());}@Overridepublic void handleMessage(SoapMessage message) throws Fault {System.out.println("来了哟!"+message);SOAPMessage mess = message.getContent(SOAPMessage.class);if(mess==null){saa.handleMessage(message);mess=message.getContent(SOAPMessage.class);}SOAPHeader header =null;try {header = mess.getSOAPHeader();} catch (SOAPException e) {logger.error("getSOAPheader error:{}",e.getMessage(),e);e.printStackTrace();}if(header==null){throw new Fault(new IllegalAccessException("找不到Header,无法验证用户信息"));}NodeList username = header.getElementsByTagName("username");NodeList password = header.getElementsByTagName("password");if(username.getLength()<1){throw new Fault(new IllegalAccessException("找不到Header,无法验证用户信息"));}if(password.getLength()<1){throw new Fault(new IllegalAccessException("找不到Header,无法验证用户信息"));}String userName = username.item(0).getTextContent().trim();String passWord = password.item(0).getTextContent().trim();if(USER_NAME.equals(userName)&&USER_PASSWORD.equals(passWord)){System.out.println("admin auth success");logger.info("admin auth success");}else {SOAPException soapException = new SOAPException("认证错误");logger.info("admin auth failed");throw new Fault(soapException);}}
}

4.客户端用户密码登录验证

package com.example.webserviceclient.intercptor;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;public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {private String username;private String password;public ClientLoginInterceptor() {super(Phase.PREPARE_SEND);}public ClientLoginInterceptor(String username, String password) {//super();super(Phase.PREPARE_SEND);this.username = username;this.password = password;}@Overridepublic void handleMessage(SoapMessage soap) throws Fault {List<Header> headers = soap.getHeaders();Document doc = DOMUtils.createDocument();Element auth = doc.createElement("authrity");Element username = doc.createElement("username");Element password = doc.createElement("password");username.setTextContent(this.username);password.setTextContent(this.password);auth.appendChild(username);auth.appendChild(password);headers.add(0, new Header(new QName("timamaes"), auth));}
}

5.service处理类

import com.example.webserviceclient.service.ServiceMaster;
import org.springframework.stereotype.Service;
import javax.jws.WebService;@Service
@WebService(serviceName = "ServiceMaster", targetNamespace = "http://service.webserviceclient.example.com", endpointInterface = "com.example.webserviceclient.service.ServiceMaster")
public class ServiceMasterImpl implements ServiceMaster {@Overridepublic String sendMessage(String username) {System.out.println("---------------------"+username);return "收到消息啦!" + username;}
}
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;@WebService(name = "ServiceMaster", targetNamespace = "http://service.webserviceclient.example.com")//采用的是包的反向地址
public interface ServiceMaster {@WebMethod@WebResult(name = "String", targetNamespace = "http://service.webserviceclient.example.com")//采用的是包的反向地址String sendMessage(@WebParam(name = "username") String username);}

客户端

1.pom

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>webservice-client</artifactId><version>0.0.1-SNAPSHOT</version><name>webservice-client</name><description>webservice-client</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- HTTP --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.4</version></dependency><!-- Fast Json --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.41</version></dependency><!-- Web Service - cxf --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.3.3</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.3.3</version></dependency><!-- Junit --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>

2.测试代码

import com.example.webserviceclient.interceptor.ClientLoginInterceptor;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.junit.Test;public class WebController {@Testpublic void TestClient(){//----------------------------------------  创建动态客户端  ----------------------------------------JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient("http://localhost:8080/services/ServiceMaster?wsdl");
//此地址为服务端请求地址,端口配置文件中没有指定,默认为8080//-------------------------------  需要密码的情况需要加上用户名和密码  -----------------------------client.getOutInterceptors().add(new ClientLoginInterceptor("guanguan", "sailing2018!"));Object[] objects = new Object[0];try {// invoke("方法名",参数一,参数二,参数三....);objects = client.invoke("sendMessage", "天黑请闭眼。。。");System.out.println("返回数据:" + objects[0]);} catch (java.lang.Exception e) {e.printStackTrace();}}}

认证通过时服务端后台打印
在这里插入图片描述
客服端打印
在这里插入图片描述
当认证不通过时
服务端
在这里插入图片描述
客户端
在这里插入图片描述

http://www.lryc.cn/news/227540.html

相关文章:

  • 代码随想录训练营Day5:哈希数组
  • 腾讯云3年轻量2核2G4M和2核4G5M服务器540元三年
  • 程序员的护城河:职业发展的关键元素
  • 基于SpringBoot+Vue的在线学习平台系统
  • Kafka+redis分布式锁结合使用心得总结
  • cmd打开idea
  • javaScript爬虫程序抓取评论
  • RT-DETR 应用 CARAFE:特征内容感知重新组装
  • Git Commit 之道:规范化 Commit Message 写作指南
  • 【机试题】LazyIterator迭代器懒加载问题
  • 【面试经典150 | 位运算】位1的个数
  • vue中数据代理和事件处理
  • Unity之NetCode多人网络游戏联机对战教程(8)--玩家位置同步
  • spring boot 中@Value读取中文配置时乱码
  • 选择.NET 还是 Java?
  • vue 高阶组件;高阶组件
  • 数据结构:树的基本概念(二叉树,定义性质,存储结构)
  • 【Qt之QStandardItemModel类】介绍
  • 01-Spring中的工厂模式
  • Linux是什么,Linux系统介绍
  • 爬虫项目(11):使用多线程对36手机高清壁纸批量抓取
  • JavaScript_动态表格_删除功能
  • 一步一步开发微信小程序(Django+Mysql)
  • mysql 讲解(1)
  • k8s关于metadata、spec.containers、spec.volumes的属性介绍(yaml格式)
  • 腾讯域名优惠卷领取
  • elastic-job 完结篇
  • 基于 Gin 的 HTTP 代理 demo
  • 【ATTCK】MITRE Caldera - 测试数据泄露技巧
  • 【数据结构】树与二叉树(十二):二叉树的递归创建(算法CBT)