1、interceptor
ws的interceptor包括client端的in interceptor、out interceptor和server端的in interceptor、out interceptor。
interceptor,拦截器主要在请求相应之前或者之后调用,很好的降低了代码的耦合性,
主要用途有身份认证等
- cxf实现的interceptor
LoggingInInterceptor:登入日志打印拦截器
LoggingOutInterceptor:登出日志打印拦截器
详细地址:http://cxf.apache.org/javadoc/latest-2.7.x/org/apache/cxf/interceptor/Interceptor.html
wss4jininterceptor:这个interceptor可以帮我们做一些权限校验工作
自定义interceptor:
可以继承AbstractPhaseInterceptor, 实现handleMessage方法,在无参构造方法中指定执行的阶段Phase;
Phase:(org.apache.cxf.Phase)感觉完全有必要整个枚举,这还都是字符串。
PRE_INVOKE、POST_INVOKE、INVOKE ……
2、handler
ws的handler能够在读取soap消息前、后执行某些特定的代码,有点AOP的意思。
handler的作用:检验cookie,持久化消息,增加自定义表头等
handler的实现:javax.xml.ws.handler
- LogicalHandler<LogicalMessageContext>
只访问soap消息的payload部分
可以通过context.get(MessageContext.*)获得true or false,进而对不同的逻辑执行不同代码。
For example:
booleab outbound = (Boolean)context.get((MessageContext.MESSAGE_OUTBOUND_PROPERTY))
- SOAPHandler<SOAPMessageContext>
可以访问整个soap消息。
- 配置多个handler
如果要配置多个handler,需要写一个配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>handler1</handler-name><handler-class>com.baidu.iit.handler1</handler-class></handler>
<handler>
<handler-name>handler2</handler-name>
<handler-class>com.baidu.iit.handler2</handler-class>
</handler>
</handler-chain>
</handler-chains>
按照配置顺序,依次执行。
@WebService
//这里展示如何用@HandlerChain来声明一组Handler,他们会对指定的web service使用的SOAP消息进行处理,
@HandlerChain(file="/handler_chains.xml")
public class CalcServiceImpl implements ICalcService {
3、interceptor和handler的区别
interceptor要么前要么后处理,而handler是前后都处理