springBoot整合CXF并实现用户名密码校验的方法

准备工作:

创建springBoot项目webservice_server

创建springBoot项目webservice_client

分别添加CXF的依赖:

<!-- CXF webservice -->
<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
  <version>3.1.11</version>
</dependency>
<!-- CXF webservice -->

一.定义要发布的接口和实现类

接口:

@WebService
public interface AppService {

  @WebMethod
  String getUserName(@WebParam(name = "id") String id) throws UnsupportedEncodingException;
  @WebMethod
  public User getUser(String id) throws UnsupportedEncodingException;
}

实现类:

//name暴露的服务名称, targetNamespace:命名空间,设置为接口的包名倒写(默认是本类包名倒写). endpointInterface接口地址
@WebService(name = "test" ,targetNamespace ="http://cxf.wolfcode.cn/" ,endpointInterface = "cn.wolfcode.cxf.AppService")
public class AppServiceImpl implements AppService {
  JSONResult jsonResult = JSONResult.getJsonResult();
  @Override
  public String getUserName(String id) throws UnsupportedEncodingException {
    System.out.println("==========================="+id);
    JSONResult result= JSONResult.getJsonResult();
    result.setSuccess(true);
    result.setMessage("明哥");
    return result.toJsonObject();
  }
  @Override
  public User getUser(String id)throws UnsupportedEncodingException {
    System.out.println("==========================="+id);
    return new User(1L,"明哥");
  }
}

二.发布服务

1.定义配置类

@Configuration
public class CxfConfig {
  //默认servlet路径/*,如果覆写则按照自己定义的来
  @Bean
  public ServletRegistrationBean dispatcherServlet() {
    return new ServletRegistrationBean(new CXFServlet(), "/services/*");
  }

  @Bean(name = Bus.DEFAULT_BUS_ID)
  public SpringBus springBus() {
    return new SpringBus();
  }

  //把实现类交给spring管理
  @Bean
  public AppService appService() {
    return new AppServiceImpl();
  }

  //终端路径
  @Bean
  public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(springBus(), appService());
    endpoint.getInInterceptors().add(new AuthInterceptor());//添加校验拦截器
    endpoint.publish("/user");
    return endpoint;
  }
}

2.发布服务

@SpringBootApplication
public class WebserviceApplication {

  public static void main(String[] args) {
    SpringApplication.run(WebserviceApplication.class, args);
  }
}

因为我添加了用户名和密码校验所以在发布之前还需要定义自己校验用户名和密码的Interceptor

public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
  Logger logger = LoggerFactory.getLogger(this.getClass());
  private static final String USERNAME="root";
  private static final String PASSWORD="admin";

  public AuthInterceptor() {
    //定义在哪个阶段进行拦截
    super(Phase.PRE_PROTOCOL);
  }

  @Override
  public void handleMessage(SoapMessage soapMessage) throws Fault {
    List<Header> headers = null;
    String username=null;
    String password=null;
    try {
      headers = soapMessage.getHeaders();
    } catch (Exception e) {
      logger.error("getSOAPHeader error: {}",e.getMessage(),e);
    }

    if (headers == null) {
      throw new Fault(new IllegalArgumentException("找不到Header,无法验证用户信息"));
    }
    //获取用户名,密码
    for (Header header : headers) {
      SoapHeader soapHeader = (SoapHeader) header;
      Element e = (Element) soapHeader.getObject();
      NodeList usernameNode = e.getElementsByTagName("username");
      NodeList pwdNode = e.getElementsByTagName("password");
       username=usernameNode.item(0).getTextContent();
       password=pwdNode.item(0).getTextContent();
      if( StringUtils.isEmpty(username)||StringUtils.isEmpty(password)){
        throw new Fault(new IllegalArgumentException("用户信息为空"));
      }
    }
    //校验用户名密码
    if(!(username.equals(USERNAME) && password.equals(PASSWORD))){
      SOAPException soapExc = new SOAPException("认证失败");
      logger.debug("用户认证信息错误");
      throw new Fault(soapExc);
    }
  }
}

现在可以发布服务了.....

发布完成后访问http://localhost:8888/services/user?wsdl

能够出现以下界面就是发布OK

三.调用服务

1.新建调用端项目,添加依赖

2.因为示例演示了两种调用方式,其中一种需要用到接口,所以先把服务接口拷贝一份到调用端项目中(代码就是上面接口的代码)

3.因为服务端添加了用户名密码校验,所以调用的时候需要添加用户名密码信息, 所以需要使用下面的Interceptor完成添加用户名密码信息

/**
 * Created by sky on 2018/2/27.
 */
public class LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
  private String username="root";
  private String password="admin";
  public LoginInterceptor(String username, String password) {
    //设置在发送请求前阶段进行拦截
    super(Phase.PREPARE_SEND);
    this.username=username;
    this.password=password;
  }

  @Override
  public void handleMessage(SoapMessage soapMessage) throws Fault {
    List<Header> headers = soapMessage.getHeaders();
    Document doc = DOMUtils.createDocument();
    Element auth = doc.createElementNS("http://cxf.wolfcode.cn/","SecurityHeader");
    Element UserName = doc.createElement("username");
    Element UserPass = doc.createElement("password");

    UserName.setTextContent(username);
    UserPass.setTextContent(password);

    auth.appendChild(UserName);
    auth.appendChild(UserPass);

    headers.add(0, new Header(new QName("SecurityHeader"),auth));
  }
}

4.调用接口

/**
 * Created by sky on 2018/2/27.
 */
public class Cxfclient {
  //webservice接口地址
  private static String address = "http://localhost:8888/services/user?wsdl";

  //测试
  public static void main(String[] args) {
    test1();
    test2();
  }

  /**
   * 方式1:使用代理类工厂,需要拿到对方的接口
   */
  public static void test1() {
    try {
      // 代理工厂
      JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
      // 设置代理地址
      jaxWsProxyFactoryBean.setAddress(address);
      //添加用户名密码拦截器
      jaxWsProxyFactoryBean.getOutInterceptors().add(new LoginInterceptor("root","admin"));;
      // 设置接口类型
      jaxWsProxyFactoryBean.setServiceClass(AppService.class);
      // 创建一个代理接口实现
      AppService cs = (AppService) jaxWsProxyFactoryBean.create();
      // 数据准备
      String LineId = "1";
      // 调用代理接口的方法调用并返回结果
      User result = (User)cs.getUser(LineId);
      System.out.println("==============返回结果:" + result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 动态调用方式
   */
  public static void test2() {
    // 创建动态客户端
    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    Client client = dcf.createClient(address);
    // 需要密码的情况需要加上用户名和密码
     client.getOutInterceptors().add(new LoginInterceptor("root","admin"));
    Object[] objects = new Object[0];
    try {
      // invoke("方法名",参数1,参数2,参数3....);
      System.out.println("======client"+client);
      objects = client.invoke("getUserName", "1");
      System.out.println("返回数据:" + objects[0]);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

嗯...总体上就是这么简单, 演示代码可以去这里下载:http://xz.jb51.net:81/201808/yuanma/springBoot_WebService_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • springBoot整合CXF并实现用户名密码校验的方法

    准备工作: 创建springBoot项目webservice_server 创建springBoot项目webservice_client 分别添加CXF的依赖: <!-- CXF webservice --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version

  • Springboot整合Shiro实现登录与权限校验详细解读

    目录 Springboot-cli 开发脚手架系列 简介 前言 1. 环境 2. 简介 3. Realm配置 4. 核心配置 5. 接口编写 6. 网页资源 7. 效果演示 8. 源码分享 Springboot-cli 开发脚手架系列 Springboot优雅的整合Shiro进行登录校验,权限认证(附源码下载) 简介 Springboo配置Shiro进行登录校验,权限认证,附demo演示. 前言 我们致力于让开发者快速搭建基础环境并让应用跑起来,提供使用示例供使用者参考,让初学者快速上手. 本博

  • python实现用户名密码校验

    本文实例为大家分享了python实现用户名密码校验的具体代码,供大家参考,具体内容如下 需要实现功能 输入用户名密码 : 认证成功后显示 欢迎信息 : 连续输错三次后 锁定 : readme: 具体请看代码注释,懒了 1.输入用户名密码 2.判断用户名是否在锁定文件中 3.判断用户名密码是否正确 代码 # 输入用户名密码 # 认证成功后显示欢迎信息 # 连续输错三次后锁定 count = 0 while True: #输入用户名密码 username = input("Username:&quo

  • 解决springboot整合cxf启动报错,原因是版本问题

    springboot整合cxf启动报错 错误信息如下 [DEBUG] 2021-01-26 11:28:47,848 [main] org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception org.springframework.beans.factory.NoSuchBeanDefinitionException: N

  • Springboot整合Shiro之加盐MD5加密的方法

    1.自定义realm,在Shiro的配置类中加入以下bean /** * 身份认证 realm */ @Bean public MyShiroRealm myShiroRealm(){ MyShiroRealm myShiroRealm = new MyShiroRealm(); System.out.println("myShiroRealm 注入成功"); return myShiroRealm; } 2.重写方法 // 身份认证 @Override protected Authe

  • redis开启和禁用登陆密码校验的方法

    1. 开启登陆密码校验 在redis-cli命令行工具中执行如下命令: config set requirepass yourpassword 2. 禁用登陆密码校验 同上,需要在redis-cli中执行如下命令: config set requirepass "" 以上这篇redis开启和禁用登陆密码校验的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • springboot整合cxf发布webservice以及调用的方法

    webservice性能不高,但是现在好多公司还是在用,恰好今天在开发的时候对接项目组需要使用到webservice下面来说下简单的案例应用 首先老规矩:引入jar包 <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.1.11</version> &

  • SpringBoot整合Spring Boot Admin实现服务监控的方法

    目录 1. Server端服务开发 1.1. 引入核心依赖 1.2. application.yml配置文件 1.3. Security配置文件 1.4. 主启动类 2. Client端服务开发 2.1. 引入核心依赖 2.2. application.yml配置文件 2.3. logback-spring.xml文件 2.4. 主启动类 3. 验证 4. 配置邮件告警 4.1. 引入核心依赖 4.3. 通知配置文件 4.4. 验证 Spring Boot Admin用于管理和监控一个或多个Sp

  • springboot整合shiro之thymeleaf使用shiro标签的方法

    thymeleaf介绍 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果.这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式.浏览器解释 html 时会忽略未定义的标签属性,所以 t

  • springboot整合Nginx实现负载均衡反向代理的方法详解

    目录 一.百度百科 二.Nginx作为web服务器 三.Nginx处理请求逻辑图 四.Nginx的优点 五.Nginx应用场景 1.反向代理 2.负载均衡 3.动静分离 六.Nginx的常用命令 1.启动 2.从容停止 3.快速停止 4.强制停止 5.重启 6.重启Nginx服务 七.Nginx配置文件 八.Nginx 配置实例-反向代理实例 1.实现效果 2.准备工作 3.访问过程的分析 4.具体配置 5.最终测试 九.Nginx 的原理 1.mater 和 worker 2.worker 如

随机推荐