您的位置:首页 > 其它

WebService学习笔记-CXF添加自定义拦截器

2016-02-04 11:03 453 查看
使用自定义拦截器实现用户名和密码的校验

客户端:出拦截器
服务器:入拦截器

客户端

AddUserInterceptor.java
[code=java;toolbar:false">package com.demo.interceptors;

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.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.xml.utils.DOMHelper;//使用xalan-2.7.1.jar
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String username;
private String password;

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

/*
 * 消息格式
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
  <atguigu>
  <username>umgsai</username>
  <password>123456</password>
  </atguigu>
  </soap:Header>
  <soap:Body>
  <ns1:sayHi xmlns:ns1="http://demo.com/">
   <text>test~~~</text>
  </ns1:sayHi>
  </soap:Body>
  </soap:Envelope>
 * 
 * */

@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
Document document = DOMHelper.createDocument();
Element rootElement = document.createElement("atguigu");
Element usernameElement = document.createElement("username");
usernameElement.setTextContent(username);
rootElement.appendChild(usernameElement);
Element passwordElement = document.createElement("password");
passwordElement.setTextContent(password);
rootElement.appendChild(passwordElement);
headers.add(new Header(new QName("atguigu"), rootElement));
System.out.println("拦截...");
}

}package com.demo.interceptors;

import javax.xml.namespace.QName;

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 CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

public CheckUserInterceptor() {
super(Phase.PRE_PROTOCOL);// 准备协议化时拦截
}

@Override
public void handleMessage(SoapMessage message) throws Fault {
Header header = message.getHeader(new QName("atguigu"));
if (header != null) {
Element element = (Element) header.getObject();
String username = element.getElementsByTagName("username").item(0).getTextContent();
String password = element.getElementsByTagName("password").item(0).getTextContent();
if (username.equals("umgsai")&&password.equals("123456")) {
System.out.println("通过拦截器...");
return;
}
}
//不能通过
System.out.println("没有通过拦截器");
throw new Fault(new RuntimeException("用户名或密码不正确"));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: