Apache CXF自定义拦截器
为什么设计拦截器?
1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器
拦截器分类:
1.按所处的位置分:服务器端拦截器,客户端拦截器。
2.按消息的方向分:入拦截器,出拦截器。
3.按定义者分:系统拦截器,自定义拦截器。
客户端添加日志拦截器
package com.client.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 AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ private String name;
private String password;
/**
*
* @param name
* @param password
*/ public AddUserInterceptor(String name,String password) {
super(Phase.PRE_PROTOCOL);//准备协议化时拦截
// TODO Auto-generated constructor stub
this.name=name;
this.password=password;
} @Override
public void handleMessage(SoapMessage msg) throws Fault {
// TODO Auto-generated method stub
List<Header> headers = msg.getHeaders(); Document document = DOMUtils.createDocument();
Element rootEle = document.createElement("apple");
Element nameEle = document.createElement("name");
nameEle.setTextContent(name);
rootEle.appendChild(nameEle); Element passwordEle = document.createElement("password");
passwordEle.setTextContent(password);
rootEle.appendChild(passwordEle); headers.add(new Header(new QName("apple"), rootEle));
System.out.println("client handMwssage()....");
} }
服务器端拦截器:
package com.service.interceptor; 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 CheckUser extends AbstractPhaseInterceptor<SoapMessage>{ public CheckUser() {
super(Phase.PRE_PROTOCOL);
// TODO Auto-generated constructor stub
} /*
<Envelope>
<head>
<apple>
<name>bo ram</name>
<password>520</password>
<apple>
</head>
<Body>
<favorite>
<arg0>Tara</arg0>
<favorite>
</Body>
</Envelope>
*/ @Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
Header header = message.getHeader(new QName("apple"));
if(header!=null){
Element appleEle=(Element) header.getObject();
String name = appleEle.getElementsByTagName("name").item(0).getTextContent();
String password = appleEle.getElementsByTagName("password").item(0).getTextContent();
if("bo ram".equals(name)&&"520".equals(password)){
System.out.println("Server 通过拦截器");
return;
}
} System.out.println("server 没有通过拦截器。。。。。");
throw new Fault(new Exception("请求需要一个正确的用户名和密码"));
} }
客户端
package com.cxf_client.client; import java.util.List; import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message; import com.client.interceptor.AddUserInterceptor;
import com.client.simple3.Simple;
import com.client.simple3.SimpleimplService; public class Simpleclient2 { public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleimplService simpleimplService = new SimpleimplService();
Simple simpleimplPort = simpleimplService.getSimpleimplPort();
//发送请求的客户端数据
Client client = ClientProxy.getClient(simpleimplPort);
//客户端出拦截器
List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new AddUserInterceptor("bo ram", "520"));
// //客户端入拦截器
// List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
// inInterceptors.add(new LoggingInInterceptor()); String favorite = simpleimplPort.favorite("Tara");
System.out.println(favorite); } }
服务端
package com.service.server; import java.util.List; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws22.EndpointImpl;
import org.apache.cxf.message.Message; import com.service.impl.Simpleimpl;
import com.service.interceptor.CheckUser; public class SimpleServer2 { public static void main(String[] args) {
// TODO Auto-generated method stub
String address="http://localhost:8848/simpleserver/simple";
Endpoint publish = Endpoint.publish(address, new Simpleimpl());
EndpointImpl endpointimpl=(EndpointImpl) publish;
//服务端入拦截器
List<Interceptor<? extends Message>> inInterceptors = endpointimpl.getInInterceptors();
inInterceptors.add(new CheckUser());
// //服务端出拦截器
// List<Interceptor<? extends Message>> outInterceptors = endpointimpl.getOutInterceptors();
// outInterceptors.add(new LoggingOutInterceptor()); System.out.println("published");
} }
Apache CXF自定义拦截器的更多相关文章
- CXF 自定义拦截器
此例子来自apache cxf sample. /** * Licensed to the Apache Software Foundation (ASF) under one * or more ...
- 【WebService】WebService之CXF的拦截器(五)
CXF拦截器介绍 CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦 ...
- CXF添加拦截器和自定义拦截器
前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...
- (六)CXF之自定义拦截器
一.需求分析 客户端在调用服务端的方法时,需要进行用户名和密码验证.此时分为: 客户端请求的时候,要发送用户名密码到服务端 服务端检验用户名密码. 二.案例 前提:本章案例是基于前一章节的例子进一步讲 ...
- (八)CXF添加自定义拦截器
前面我们说到CXF添加内置的拦截器,今天的话,我们来讲下如何添加自定义拦截器: 我们的实例是客户端访问服务端webservice接口要加权限认证. 我们思路先说下.我们可以通过在SOAP消息的Head ...
- 【CXF】- 拦截器 Interceptor
CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创 ...
- 12.Struts2自定义拦截器
12.自定义拦截器 拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...
- 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...
- Struts2 自定义拦截器
自定义拦截器(权限管理),包含了对ajax和表单请求的拦截 package com.interceptor; import java.io.IOException; import java.io.Pr ...
随机推荐
- .NET中的枚举(Enum)
摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...
- 【读书笔记】-【编程语言的实现模式】-【LL(1)递归下降的语法解析器】
形如:[a,b,c] [a,[b,cd],f] 为 嵌套列表 其ANTLR文法表示: list :'[' elements ']'; // 匹配方括号 elements : elements (',' ...
- Mysql的“Limit”操作
Limit操作: ,; #返回第6-15行数据 ; #返回前5行 ,; #返回前5行 性能优化: 基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.测试SQL语句1: Sele ...
- 数论 - n元线性同余方程的解法
note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m ...
- ADO.net中常用的对象介绍
ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation. DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表 ...
- Java集合Iterator迭代器的实现
一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...
- MVVM(Model-View-View-Model)简单分析(及代码示例)
项目组,现在用的MVVM(Model-View-View-Model)模式,搞了一个多月,感觉有点明白了.
- C#开发中可能会用到的一些小贴士(转)
转至http://www.cnblogs.com/Ebony-Ivory/p/4380106.html C#篇: 1.目标平台的选择 64位操作系统在编译VS里的程序时,根据需要设置项目属性的“目标平 ...
- 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传
[源码下载] 重新想象 Windows 8 Store Apps (66) - 后台任务: 下载和上传 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 后台 ...
- [moka同学笔记]yii2.0 advanced高级版 安装配置 与 rbac (Ⅰ)
1.下载地址:http://www.yiichina.com/download,下载 Yii2 的高级应用程序模板 2.配置与安装 在服务器www目录下yii2test [下载下来更改advance ...