7.Web Service CXF添加拦截器

今天我们写下拦截器,前面大家学过servlet,struts2 都有拦截器概念,主要作用是做一些权限过滤,编码处理等;

webservice也可以加上拦截器,我们可以给webservice请求加权限判断功能;

webservice分服务端和客户端,服务端和客户端都是可以加拦截器的,无论是服务端还是客户端,都分进,出(In,Out)拦截器;

package com.oyyp.webservice.impl;



import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.oyyp.webservice.HelloWord;

public class Server {
    public static void main(String[] args) {
        System.out.println("web service start");
        HelloWord implementor=new HelloWordImpl();
        //这里的ip是你电脑的IP地址
        String  address="http://192.168.1.107:90/helloWord";
        JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
        factoryBean.setAddress(address);//设置暴露地址
        factoryBean.setServiceClass(HelloWord.class);//接口类
        factoryBean.setServiceBean(implementor);//设置实现类
        factoryBean.getInInterceptors().add(new LoggingInInterceptor()); // 添加in拦截器 日志拦截器
        factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加out拦截器
        factoryBean.create();//创建文本service接口
        System.out.println("web service started");
    }

}

这里的话,我们通过factoryBean对象可以获取拦截器组,添加进或者出拦截器,这里有个经典的拦截器,我们开发的时候经常用,就是日志拦截器,

我们可以把客户端的请求,以及服务端返回的信息打印出来,可以打印控制台,也可以打印到执行文件;这里为了演示方便,直接搞无参的拦截器,

打印到控制台;

无论是自定义的拦截器,还是CXF自带的拦截器,都必须实现Interceptor接口。
这里写图片描述
然后我们再来执行下客户端的Client类,结果:
这里写图片描述
然后我们仔细观察Server端的控制台:

web service start
二月 17, 2017 4:41:01 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://webservice.oyyp.com/}HelloWordService from class com.oyyp.webservice.HelloWord
二月 17, 2017 4:41:05 下午 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be http://192.168.191.1:90/helloWord
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
web service started
二月 17, 2017 4:41:18 下午 org.apache.cxf.services.HelloWordService.HelloWordPort.HelloWord
信息: Inbound Message
----------------------------
ID: 1
Address: http://192.168.191.1:90/helloWord?wsdl
Http-Method: GET
Content-Type: 
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[192.168.191.1:90], User-Agent=[Java/1.8.0_92]}
--------------------------------------
二月 17, 2017 4:41:20 下午 org.apache.cxf.services.HelloWordService.HelloWordPort.HelloWord
信息: Inbound Message
----------------------------
ID: 2
Address: http://192.168.191.1:90/helloWord
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[text/xml, multipart/related], connection=[keep-alive], Content-Length=[185], content-type=[text/xml; charset=UTF-8], Host=[192.168.191.1:90], SOAPAction=[""], User-Agent=[JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e]}
Payload: <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getRoles xmlns:ns2="http://webservice.oyyp.com/"></ns2:getRoles></S:Body></S:Envelope>
--------------------------------------
二月 17, 2017 4:41:23 下午 org.apache.cxf.services.HelloWordService.HelloWordPort.HelloWord
信息: Outbound Message
---------------------------
ID: 2
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getRolesResponse xmlns:ns2="http://webservice.oyyp.com/"><return><item><key>tom</key><value><id>1</id><roleName>技术总监</roleName></value><value><id>2</id><roleName>架构师</roleName></value></item><item><key>jack</key><value><id>3</id><roleName>程序员</roleName></value></item></return></ns2:getRolesResponse></soap:Body></soap:Envelope>
--------------------------------------

这里的打印出来的就是日志信息:Inbound 进信息 Outbound 是出信息,进的时候,大家会看到有个Headers SOAP消息。后面我们可以在里面加我们的数据;

在Outbound Message里,Payload消息里我们可以找到webservice返回的数据 SOAP消息;

同理,我们在客户端也可以加进出拦截器,先要在客户端的pom.xml添加:

 <dependencies>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-core</artifactId>
        <version>3.1.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.1.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.1.5</version>
    </dependency>

  </dependencies>

在修改Client代码:

package com.oyyp.webservice;

import java.util.List;

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


public class Client {

    public static void main(String[] args) {
        HelloWordService helloWordService=new HelloWordService();
        HelloWord helloWord=helloWordService.getHelloWordPort();
        org.apache.cxf.endpoint.Client client=ClientProxy.getClient(helloWord);
        client.getInInterceptors().add(new LoggingInInterceptor()); // 添加in拦截器 日志拦截器
        client.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加out拦截器
        //System.out.println(helloWord.say("小三"));
//      User user=new User();
//      user.setUserName("jack");
//      user.setPassword("123456");
//      List<Role> roles=helloWord.getRoleByUser(user);
//      for (Role role : roles) {
//          System.out.println(role.getId()+"-"+role.getRoleName());
//      }
        MyRoleArray arry=helloWord.getRoles();
        List<MyRole> roleList=arry.item;
        for (int i = 0; i < roleList.size(); i++) {
            MyRole my=roleList.get(i);
            System.out.print(my.key+":");
            for (Role r : my.value) {
                System.out.print(r.getId()+"-"+r.getRoleName());
            }
            System.out.println("+++++++");
        }
    }
}

这里的话,我们用到了ClientProxy,客户端代理。

二月 17, 2017 5:10:38 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://webservice.oyyp.com/}HelloWordService from WSDL: http://192.168.191.1:90/helloWord?wsdl
二月 17, 2017 5:10:40 下午 org.apache.cxf.services.HelloWordService.HelloWordPort.HelloWord
信息: Outbound Message
---------------------------
ID: 1
Address: http://192.168.191.1:90/helloWord
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getRoles xmlns:ns2="http://webservice.oyyp.com/"/></soap:Body></soap:Envelope>
--------------------------------------
二月 17, 2017 5:10:41 下午 org.apache.cxf.services.HelloWordService.HelloWordPort.HelloWord
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml; charset=UTF-8
Headers: {content-type=[text/xml; charset=UTF-8], Date=[Fri, 17 Feb 2017 09:10:40 GMT], Server=[Jetty(9.2.15.v20160210)], transfer-encoding=[chunked]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getRolesResponse xmlns:ns2="http://webservice.oyyp.com/"><return><item><key>tom</key><value><id>1</id><roleName>技术总监</roleName></value><value><id>2</id><roleName>架构师</roleName></value></item><item><key>jack</key><value><id>3</id><roleName>程序员</roleName></value></item></return></ns2:getRolesResponse></soap:Body></soap:Envelope>
--------------------------------------
tom:1-技术总监2-架构师+++++++
jack:3-程序员+++++++

这里也是出进的日志信息,和上面那个类似;

OK到这里的话,添加拦截器已经完了;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值