CXF与Spring以及拦截器整合

下载CXF

http://cxf.apache.org/download.html

以apache-cxf-3.0.12为例

 

服务器端

 

新建一个web项目

 

引入cxf  lib下所有的包(图个方便)自带了spring相关包

 

编写一个UserService接口

package com.zns.ws;

import javax.jws.WebService;

@WebService
public interface UserService {
    public String func1(String name);
}

 

编写一个UserServiceImpl实现类

package com.zns.ws.impl;

import javax.jws.WebService;
import com.zns.ws.UserService;

public class UserServiceImpl implements UserService {
    @Override
    public String func1(String name) {
        return "hello: "+name;
    }
}

 

 

自定义一个拦截器

package com.zns.ws.server.interceptor;

import java.util.List;

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

public class CheckUserAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    public CheckUserAuthInterceptor() {
        super(Phase.PRE_INVOKE); // 在调用方法之前调用自定拦截器
    }

    @SuppressWarnings("null")
    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders();
        if (headers == null && headers.size() == 0) {
            throw new Fault(new IllegalArgumentException("调用方没有提供Header信息..."));
        }
        Header firstHeader = headers.get(0);
        Element ele = (Element) firstHeader.getObject();
        String userName = ele.getElementsByTagName("username").item(0).getTextContent();
        String passWord = ele.getElementsByTagName("password").item(0).getTextContent();

        if (userName.equals("zns") && passWord.equals("123456")) {
            System.out.println("验证用户授权信息成功...");
            return;
        }
        System.out.println("验证用户授权信息失败...");
        throw new Fault(new IllegalArgumentException("用户名或者密码错误!,请提供正确授权信息方可调用..."));
    }

}

 

 

 

增加一个spring-cxf.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws 
        http://cxf.apache.org/schemas/jaxws.xsd">

    <!-- Import Apache CXF Bean Definition -->
    <import resource="classpath*:META-INF/cxf/cxf.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

    <jaxws:endpoint implementor="com.zns.ws.impl.UserServiceImpl"
        address="/user">
        <!-- 添加in拦截器 -->
        <jaxws:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
            <bean class="com.zns.ws.server.interceptor.CheckUserAuthInterceptor" />
        </jaxws:inInterceptors>
        <!-- 添加out拦截器 -->
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
        </jaxws:outInterceptors>
    </jaxws:endpoint>

</beans>

 

 

修改web.xml

<!-- Spring Config Location -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-cxf.xml</param-value>
    </context-param>
    <!-- Spring ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Apache CXFServlet -->
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- CXFServlet Mapping -->
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>

 

 

运行项目 访问测试

http://localhost:8080/项目名/ws/

 

http://localhost:8080/项目名/ws/user?wsdl

 

 

客户端调用

 

新建一个web项目

同样引入cxf  lib下所有的包(图个方便)自带了spring相关包

 

用cxf的wsdl2java工具生成客户端代码调用

设置系统环境变量

CXF_HOME=D:\apache-cxf-xxx

在path后面加上 %CXF_HOME%/bin;

在cmd命令中输入wsdl2java,如果有提示usage,就表明配置成功

 

wsdl2java -p 生成代码的包名 -d 生成目录 -all  xxx.wsdl

-p  指定其wsdl的命名空间,也就是要生成代码的包名:

-d  指定要产生代码所在目录

-client 生成客户端测试web service的代码

-server 生成服务器启动web service的代码

-impl 生成web service的实现代码

-ant  生成build.xml文件

-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file

 

wsdl2java -p com.zns.ws.output -d D:\EclipseWorkSpace\TestClient\src -all http://localhost:8080/项目名/ws/user?wsdl

 

执行命令后 刷新工程文件 

 

编写一个拦截器来追加认证header信息

package com.zns.ws.client.interceptor;

import java.util.List;

import javax.xml.namespace.QName;

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;

public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    private String username;
    private String password;

    public AddHeaderInterceptor(String username, String password) {
        super(Phase.PRE_PROTOCOL);// 准备协议化时拦截
        this.username = username;
        this.password = password;
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headerList = message.getHeaders();

        Document doc = DOMUtils.createDocument();
        Element ele = doc.createElement("authHeader");
        Element uElement = doc.createElement("username");
        uElement.setTextContent(username);
        Element pElement = doc.createElement("password");
        pElement.setTextContent(password);

        ele.appendChild(uElement);
        ele.appendChild(pElement);

        headerList.add(new Header(new QName("authHeader"), ele));
    }

}

 

 

测试调用

package com.zns.ws.test;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

import com.zns.ws.client.interceptor.AddHeaderInterceptor;
import com.zns.ws.output.UserService;
import com.zns.ws.output.UserServiceImplService;

public class test {
    public static void main(String[] args) {
        UserServiceImplService userServiceImplService = new UserServiceImplService();
        UserService userService = userServiceImplService.getUserServiceImplPort();
        Client client = ClientProxy.getClient(userService);

        // 添加自定义拦截器
        client.getOutInterceptors().add(new AddHeaderInterceptor("zns", "123456"));

        // 添加In拦截器 日志拦截器
        client.getInInterceptors().add(new LoggingInInterceptor());
        // 添加Out拦截器 日志拦截器
        client.getOutInterceptors().add(new LoggingOutInterceptor());

        // 调用方法
        String result = userService.func1("abc");

        System.out.println(result);
    }
}

转载于:https://www.cnblogs.com/zengnansheng/p/10389290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值