cxf消息拦截器

主要实现以下功能:
  1. 大文件

  2. 特殊验证

  3. 日志记录

  4. Soap消息处理

  5. 消息的压缩处理


好的,要实现的功能已经列出来了,一步步的添加.首先看基础代码,一个最简单的webservices代码如下:


接口

package com.gwtjs.web.services;

import javax.jws.WebService;

@WebService
public interface HandlerServices {
	public String sendHello(String par);
}



实现类:

package com.gwtjs.web.services.impl;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import org.apache.cxf.interceptor.InInterceptors;
import org.springframework.stereotype.Service;

@Service("HandlerServices")
@WebService(
		endpointInterface = "com.gwtjs.web.services.HandlerServices", 
		name="HandlerServices",
		targetNamespace="http://services.gwtjs.com:8181/batis/services/",
		portName="HandlerServicesPort",
		serviceName = "HandlerServices"
)
public class HandlerServicesImpl {
	
	@WebMethod
	public String sendHello(@WebParam String par) {
		return par + "-" + System.currentTimeMillis();
	}

}

这里注意没有xml配置,纯注解配置;

查询下cxf的监听器,想通过监听器的方式解决切入拦截,注入一个验证类,通过ide代码提示查到可以使用InInterceptors和OutInterceptors实现输入输出监听.扩展了cxf的监听器,代码如下:

package com.gwtjs.web.service.interception;

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;
import org.w3c.dom.NodeList;

/**
 * <h2><pre name="code" class="java">自定义拦截器在入口阶段实施拦截
</h2><p>
根据需要验证请求,如果不能通过验证抛出异常中断请求
</p>
* @author dzg * @date 2012年12月12日 上午11:54:48 * @version V1.0 shnashop * @Copyright (c) */public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {public AuthInterceptor() {// 拦截器在调用方法之前拦截SOAP消息super(Phase.PRE_INVOKE);}/** * @Description: 拦截器操作 * @param msg * 被拦截到的SOAP消息 * @throws Fault */@Overridepublic void handleMessage(SoapMessage msg) throws Fault {System.out.println("=====自定义拦截器=======");// 获取SOAP消息的HeaderList<Header> headers = msg.getHeaders();// 如果没有Headerif (headers == null || headers.size() < 1) {throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截"));}// 获取Header携带是用户和密码信息Header firstHeader = headers.get(0);Element ele = (Element) firstHeader.getObject();NodeList userIdEle = ele.getElementsByTagName("userId");NodeList userPassEle = ele.getElementsByTagName("userPass");if (userIdEle.getLength() != 1) {throw new Fault(new IllegalArgumentException("用户Id格式不对"));}else if (userPassEle.getLength() != 1) {throw new Fault(new IllegalArgumentException("用户密码格式不对"));}// 获取元素的文本内容String userId = userIdEle.item(0).getTextContent();String userPass = userPassEle.item(0).getTextContent();if (!userId.equals("cxf") || !userPass.equals("123456")) {throw new Fault(new IllegalArgumentException("用户和密码不正确"));}}}

 

编写完成在刚才的注解处加上新的注解:

@InInterceptors(interceptors={"org.apache.cxf.interceptor.LoggingInInterceptor","com.gwtjs.web.service.interception.AuthInterceptor"})

日志记录和特殊验证完成.

输出日志可以加上@OutInterceptors注解,自己扩展也行,使用LoggingOutInterceptor也行;

我的接口实现类完整的注解代码:

@Service("HandlerServices")
@InInterceptors(interceptors={"org.apache.cxf.interceptor.LoggingInInterceptor","com.gwtjs.web.service.interception.AuthInterceptor"})
@OutInterceptors(classes={org.apache.cxf.interceptor.LoggingOutInterceptor.class})
@WebService(
		endpointInterface = "com.gwtjs.web.services.HandlerServices", 
		name="HandlerServices",
		targetNamespace="http://services.gwtjs.com:8181/batis/services/",
		portName="HandlerServicesPort",
		serviceName = "HandlerServices"
)

明天期待,文本压缩...










评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值