本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
文章
http://5148737.blog.51cto.com/5138737/1606499
介绍了如何将cxf与spring整合,本文将介绍如何添加拦截器,并使用权限校验的案例,来进行讲解。
整个过程为:client端调用server端的wsdl之前,配置拦截器,先添加 权限等相关信息, 发送请求到server端, server端同样配置拦截器,校验权限信息是否正确,如果不正确,则打印异常信息。
拦截器需要继承AbstractPhaseInterceptor 类。
(1)实现client端拦截器,添加权限信息(userId,userPass在spring配置文件中注入)
public class AddHeaderInteceptor extends AbstractPhaseInterceptor<SoapMessage>{
private String userId;
private String userPass;
public AddHeaderInteceptor() {
super(Phase.PREPARE_SEND);
@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
List<Header> headers = soapMessage.getHeaders();
Document doc = DOMUtils.createDocument();
Element userIdElement = doc.createElement("userId");
Element userPassElement = doc.createElement("userPass");
userIdElement.setTextContent(userId);
userPassElement.setTextContent(userPass);
Element authElement = doc.createElement("AuthHeader");
authElement.appendChild(userIdElement);
authElement.appendChild(userPassElement);
QName qName = new QName("xiejun");
SoapHeader soapHeader = new SoapHeader(qName, authElement);
headers.add(soapHeader);
public String getUserId() {
return userId;
public void setUserId(String userId) {
this.userId = userId;
public String getUserPass() {
return userPass;
public void setUserPass(String userPass) {
this.userPass = userPass;
解释:首先获得了SoapMessage的header,为一个list,创建了一个AuthHeader元素,里面包含userId与userPass两个子元素,组装成SoapHeader,最后将SoapHeader添加到header list中
(2)客户端配置文件,配置该拦截器
<!-- 注入相关权限信息 -->
<bean id="addHeaderInteceptor" class="com.xj.interceptor.AddHeaderInteceptor">
<property name="userId" value="xiejun"/>
<property name="userPass" value="1234"/>
</bean>
<jaxws:client id="hello" serviceClass="com.xj.service.IHello" address="http://localhost/cxf/testHello?wsdl">
<!-- <jaxws:inInterceptors>
<ref bean="handlerMessage"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<ref bean="addHeaderInteceptor"/>
</jaxws:outInterceptors>
</jaxws:client>
如上所示,可以同时为in和out两个拦截器链 配置 拦截器,这里我们为out拦截器链配置,其一为cxf本身自带的日志拦截器,打印日志显示;其二为我们添加权限信息的拦截器。
至此为止,客户端配置结束
(3)实现server端拦截器,校验权限信息是否正确
public class CheckHeader extends AbstractPhaseInterceptor<SoapMessage>{
public CheckHeader() {
super(Phase.PRE_INVOKE);
@Override
public void handleMessage(SoapMessage soapMessage) throws Fault {
List<Header> headers = soapMessage.getHeaders();
for(Header header:headers){
SoapHeader soapHeader = (SoapHeader)header;
Element element = (Element)soapHeader.getObject();
if(element.getTagName().endsWith("AuthHeader")){
NodeList userIdList = element.getElementsByTagName("userId");
NodeList userPassList = element.getElementsByTagName("userPass");
if(userIdList==null||userIdList.getLength()<1||userPassList==null||userPassList.getLength()<1){
System.out.println("error2");
String username = userIdList.item(0).getTextContent();
String password = userPassList.item(0).getTextContent();
if(!username.equals("xiejun")||!password.equals("123456")){
System.out.println("error3");
}else{
System.out.println("error1");
解释:拦截器中取出header信息,进行校验,不正确则打印异常信息,真实情况则可能是抛出异常。
(4)配置server端拦截器(与client配置相同)
<bean id="checkHeader" class="com.xj.interceptor.CheckHeader"/>
<!-- <bean id="hello" class="com.xj.service.HelloImpl"/> -->
<jaxws:endpoint id="testHello" implementor="com.xj.service.HelloImpl" address="/testHello" >
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<ref bean="checkHeader"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
</jaxws:outInterceptors>
</jaxws:endpoint>
这里将检验权限拦截器配置在in 拦截器链,因为在接收到请求之前,我们就要进行权限的验证。
启动该项目,发现如果用户名或密码不正确的话,则会打印错误信息。