一、服务器端:

  1、权限判断:

package cn.tdtk.ws.interceptor;

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;

/** 通过 AbstractPhaseInterceptor,可以指定拦截器在那个阶段起作用。 */
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

//表示该拦截器在调用之前拦截 “SOAP消息”。
 public AuthInterceptor(){
  super(Phase.PRE_INVOKE);    
 }
 /**
  * 实现自己的拦截器,需要实现handleMessage方法。该方法里面的参数就是被拦截到的消息,一旦拦截到消息,
  * 那么剩下就是解析或修改SOAP消息。
  */
 @Override
 public void handleMessage(SoapMessage msg) throws Fault {
  List<Header> headers = msg.getHeaders();
  System.out.println(headers.size());
  if(headers==null || headers.size()<1){
   throw new Fault(new IllegalArgumentException("没有Header,不能调用"));
  }
  Header firstHeader = headers.get(0);
  Element elements = (Element) firstHeader.getObject();
  NodeList userids = elements.getElementsByTagName("username");
  NodeList passwords = elements.getElementsByTagName("password");
  
  if(userids.getLength()!=1)
   throw new Fault(new IllegalArgumentException("用户名的格式不正确!"));
  if(passwords.getLength()!=1)
   throw new Fault(new IllegalArgumentException("密码的格式不正确!"));
  
  String userid = userids.item(0).getTextContent();
  String password = passwords.item(0).getTextContent();
  
  //去数据库进行验证
  if(!userid.equals("tom") || !password.equals("123")){
   throw new Fault(new IllegalArgumentException("用户名或密码错误!"));
  }
 }

}

  2、发布和添加拦截器:

package cn.tdtk.test;

import javax.xml.ws.Endpoint;

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

import cn.tdtk.ws.dao.impl.HelloWorldImpl;
import cn.tdtk.ws.interceptor.AuthInterceptor;

public class HelloWorldServiceTest {
public static void main(String[] args) {

/** 发布web service */
// Endpoint.publish("http://127.0.0.1:8080/helloService",
// new HelloWorldImpl());

//使用拦截器,信息会打印在控制台上
EndpointImpl end = (EndpointImpl)Endpoint.publish("http://127.0.0.1:8080/helloService", new HelloWorldImpl());

// end.getDataBinding().setMtomEnabled(true);
/** 添加In拦截器 */
end.getInInterceptors().add(new LoggingInInterceptor());
//添加Out拦截器
end.getOutInterceptors().add(new LoggingOutInterceptor());

/** 添加自定义拦截器 */
end.getInInterceptors().add(new AuthInterceptor());
System.out.println("web service publish success");
}
}

  二、客户端:

  1、要完成权限验证,那么客户端必须携带验证信息用户名和密码,这些信息可以防止Header里面:

  

package cn.tdtk.ws.interceptor;

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.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

private String username;
private String password;

public AddHeaderInterceptor(String username,String password) {

super(Phase.PREPARE_SEND);//在发送之前进行拦截
this.username=username;
this.password=password;
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers = msg.getHeaders();
System.out.println("============"+ headers);
Document doc = DOMUtils.createDocument();
Element hele = doc.createElement("authHeader");

//这里的username和password标签要和服务器端一致
Element uele = doc.createElement("username");
uele.setTextContent(username);
Element pele = doc.createElement("password");
pele.setTextContent(password);

hele.appendChild(uele);
hele.appendChild(pele);

//将创建的header添加到SOAP的Header里面
headers.add(new Header(new QName("tom"),hele));

/*
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <authHeader>
      <username>tom</username>
      <password>1223</password>
    </authHeader>
  </soap:Header>
  <soap:Body>
    <ns2:getAllCats xmlns:ns2="http://dao.ws.tdtk.cn/"/>
  </soap:Body>
</soap:Envelope>
*/
}

}

  2、客户端访问,此时就需要进行拦截:

package cn.tdtk.test;

import java.util.List;

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

import cn.tdtk.ws.dao.Cat;
import cn.tdtk.ws.dao.Entry;
import cn.tdtk.ws.dao.HelloWorld;
import cn.tdtk.ws.dao.StringCat;
import cn.tdtk.ws.dao.User;
import cn.tdtk.ws.dao.impl.HelloWorldImplService;
import cn.tdtk.ws.interceptor.AddHeaderInterceptor;

public class HelloWorldServiceTest {

/**
* @param args
*/
public static void main(String[] args) {
HelloWorldImplService factory= new HelloWorldImplService();
HelloWorld hw = factory.getHelloWorldImplPort();
//为客户端添加拦截器
Client cl = ClientProxy.getClient(hw);
cl.getInInterceptors().add(new LoggingInInterceptor());

//添加自定义拦截器
cl.getOutInterceptors().add(new AddHeaderInterceptor("tom","123"));
cl.getOutInterceptors().add(new LoggingOutInterceptor());

System.out.println("====================");
User us = new User();
us.setId(1);
us.setName("tom");
us.setPwd("123");
us.setAddress("shanghai");
List<Cat> lists = hw.getCatsByUser(us);
for(Cat cat : lists){
System.out.println("Name: "+cat.getName()+" : "+"Color: "+cat.getColor());
}

System.out.println("====================");
StringCat sc = hw.getAllCats();
for(Entry en : sc.getEntrys()){
System.out.println(en.getKey()+" : "+en.getValue().getName());
}

}

}

  三、控制台上回打印出SOAP信息,从中可以看出在访问访问之前已经给SOAP信息添加了soap:Header消息,它携带用户名和密码。

2013-7-3 9:33:34 org.apache.cxf.services.HelloWorldImplService.HelloWorldImplPort.HelloWorld
信息: Outbound Message
---------------------------
ID: 1
Address: http://127.0.0.1:8080/helloService
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><username>tom</username><password>123</password></authHeader></soap:Header><soap:Body><ns2:getCatsByUser xmlns:ns2="http://dao.ws.tdtk.cn/"><arg0><address>shanghai</address><id>1</id><name>tom</name><pwd>123</pwd></arg0></ns2:getCatsByUser></soap:Body></soap:Envelope>
--------------------------------------
2013-7-3 9:33:34 org.apache.cxf.services.HelloWorldImplService.HelloWorldImplPort.HelloWorld
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {Content-Length=[403], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.5.4.v20111024)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getCatsByUserResponse xmlns:ns2="http://dao.ws.tdtk.cn/"><return><color>橙色</color><id>1</id><name>机器猫</name></return><return><color>黑色</color><id>2</id><name>huanhuan</name></return><return><color>红色</color><id>3</id><name>xixi</name></return></ns2:getCatsByUserResponse></soap:Body></soap:Envelope>
--------------------------------------
Name: 机器猫 : Color: 橙色
Name: huanhuan : Color: 黑色
Name: xixi : Color: 红色
====================
============[]
2013-7-3 9:33:34 org.apache.cxf.services.HelloWorldImplService.HelloWorldImplPort.HelloWorld
信息: Outbound Message
---------------------------
ID: 2
Address: http://127.0.0.1:8080/helloService
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><username>tom</username><password>123</password></authHeader></soap:Header><soap:Body><ns2:getAllCats xmlns:ns2="http://dao.ws.tdtk.cn/"/></soap:Body></soap:Envelope>
--------------------------------------
2013-7-3 9:33:34 org.apache.cxf.services.HelloWorldImplService.HelloWorldImplPort.HelloWorld
信息: Inbound Message
----------------------------
ID: 2
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {Content-Length=[709], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.5.4.v20111024)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getAllCatsResponse xmlns:ns2="http://dao.ws.tdtk.cn/"><return><entrys><key>第4个</key><value><color>黑色</color><id>2</id><name>huanhuan</name></value></entrys><entrys><key>第3个</key><value><color>橙色</color><id>1</id><name>机器猫</name></value></entrys><entrys><key>第5个</key><value><color>红色</color><id>3</id><name>xixi</name></value></entrys><entrys><key>第1个</key><value><color>橙色</color><id>1</id><name>lulu</name></value></entrys><entrys><key>第2个</key><value><color>黑色</color><id>2</id><name>haha</name></value></entrys></return></ns2:getAllCatsResponse></soap:Body></soap:Envelope>
--------------------------------------
第4个 : huanhuan
第3个 : 机器猫
第5个 : xixi
第1个 : lulu
第2个 : haha

WS之cxf的权限拦截器应用的更多相关文章

  1. CXF实战之拦截器Interceptor(四)

    拦截器(Interceptor)是CXF功能最基本的扩展点,能够在不正确核心模块进行改动的情况下.动态加入非常多功能.拦截器和JAX-WS Handler.Filter的功能相似,当服务被调用时.就会 ...

  2. 基于Springmvc的登录权限拦截器

    1.什么是拦截器 拦截器是指通过统一拦截从浏览器发往服务端的请求来完成功能的增强. 使用场景:解决请求的共性问题(如:乱码问题,权限验证问题等) 2.拦截器的基本工作原理 springmvc可以通过配 ...

  3. struts2 权限拦截器 拦截没有登陆的请求

    假设有这样的登陆: ActionContext.getContext().getSession().put("UserMsg", userMsg); 则可以这样判断是否登陆: im ...

  4. CXF对Interceptor拦截器的支持

    前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和Handler的功能类似.在每个请求响应之前或响应之后,做一些事情.这里的Interceptor就和Filter. ...

  5. cxf与struts2拦截器冲突的解决方案

    最近学习接口,学习了下cxf,用tomcat部署访问的时候,发现接口不能访问:百度了很多,最终找到比较好的解决方案: sturts2配置: <!-- 设置strus拦截器 --> < ...

  6. (六)CXF之自定义拦截器

    一.需求分析 客户端在调用服务端的方法时,需要进行用户名和密码验证.此时分为: 客户端请求的时候,要发送用户名密码到服务端 服务端检验用户名密码. 二.案例 前提:本章案例是基于前一章节的例子进一步讲 ...

  7. (五)CXF之添加拦截器

    一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...

  8. springmvc权限拦截器

    配置文件spring-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  9. javax.xml.ws.soap.SOAPFaultException: 没有Header,拦截器实施拦截

    客户端代码: client.getOutInterceptors().add(new AuthInterceptor("zhangsan", "123456") ...

随机推荐

  1. dojo 三 类和继承 dojo/_base/declare

    这里要讲有关类的定义.继承和实现.官方教程:http://dojotoolkit.org/documentation/tutorials/1.7/declare/类的声明是通过declare 这个方法 ...

  2. Ubuntu14.04安装和配置Tomcat8.0.12

    Ubuntu14.04长的好看,所以一时间很感兴趣,研究各种软件的安装和开发环境的配置.今天先把安装的tomcat 8.0.12的教程分享给大家.如果你需要,请收藏!!!   官方网站下载最新的tom ...

  3. 第十篇 PO核心功能及流程详解

    详见链接:http://bbs.erp100.com/thread-272866-1-1.html1. P2P lifecycleP2P是procure to pay的缩写,p2p循环值得就是采购到付 ...

  4. [CF189A]Cut Ribbon(完全背包,DP)

    题目链接:http://codeforces.com/problemset/problem/189/A 题意:给你长为n的绳子,每次只允许切a,b,c三种长度的段,问最多能切多少段.注意每一段都得是a ...

  5. CString和string

    CString和string(一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: CString(typedef CS ...

  6. 转:CSS布局:Float布局过程与老生常谈的三栏布局

    使用CSS布局网页,那是前端的基本功了,什么两栏布局,三栏布局,那也是前端面试的基本题了.一般来说,可以使用CSSposition属性进行布局,或者使用CSSfloat属性布局.前者适合布局首页,因为 ...

  7. Android微信SDK API 调用教程1

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...

  8. android 开发如何做内存优化

    不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我 们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造 ...

  9. LA 3644 X-Plosives

    最简单的并查集 多做做水题,加深一下理解 //#define LOCAL #include <cstdio> + ; int parent[maxn]; int GetParent(int ...

  10. HDU 1372 Knight Moves【BFS】

    题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...