(六)CXF之自定义拦截器
一、需求分析
- 客户端在调用服务端的方法时,需要进行用户名和密码验证。此时分为:
- 客户端请求的时候,要发送用户名密码到服务端
- 服务端检验用户名密码。
二、案例
- 前提:本章案例是基于前一章节的例子进一步讲解自定义拦截器
2.1 服务端
- 发布服务
ublic class PublishMain {
public static void main(String[] args) {
String address="http://localhost:3333/login";
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress(address);
factoryBean.setServiceClass(ILogin.class);
factoryBean.setServiceBean(new Login());
/**
* // 添加in拦截器 日志拦截器
* // 添加out拦截器 日志拦截器
*/
factoryBean.getInInterceptors().add(new LoggingInInterceptor());// 添加in拦截器 日志拦截器
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); 添加out拦截器 日志拦截器
/**
* 添加自定义拦截器,验证客户端发送的用户名和密码
*/
factoryBean.getInInterceptors().add(new MyLoginInteceptor());
factoryBean.create();
System.out.println("服务发布.......");
}
}
factoryBean.getInInterceptors().add(new MyLoginInteceptor()); 在接收SOAP消息的时候,会执行LoggingInInterceptor日志拦截器和
自定义的 MyLoginInteceptor拦截器,该拦截器用于验证soap消息中的用户名和密码的合法性。
编写自定义的拦截器类
package com.shyroke.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.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList; public class MyLoginInteceptor extends AbstractPhaseInterceptor<SoapMessage> { public MyLoginInteceptor() {
/**
* Phase.PRE_INVOKE 在调用方法之前调用自定拦截器
*/
super(Phase.PRE_INVOKE); } @SuppressWarnings("null")
public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders();
if (headers == null && headers.size() == 0) {
throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截"));
} Header header = headers.get(0); Element ele = (Element) header.getObject();
NodeList uList = ele.getElementsByTagName("userName");
NodeList pList = ele.getElementsByTagName("passWord"); if (uList.getLength() != 1) {
throw new Fault(new IllegalArgumentException("用户名格式不对"));
}
if (pList.getLength() != 1) {
throw new Fault(new IllegalArgumentException("密码格式不对"));
} String userName = uList.item(0).getTextContent();
String passWord = pList.item(0).getTextContent(); if (!userName.equals("admin") || !passWord.equals("123")) {
throw new Fault(new IllegalArgumentException("用户名或者密码错误!"));
} } }
- 其他代码与上一章节相同,本文省略。
2.2 客户端
- client.java
package com.shyroke.service; import java.util.List; import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.shyroke.interceptor.MyHeaderInterceptor; public class Client {
public static void main(String[] args) {
ILogin login=new ILoginService().getILoginPort(); org.apache.cxf.endpoint.Client client=ClientProxy.getClient(login); /**
* LoggingInInterceptor该拦截器类会在客户端被调用前打印日志
* LoggingOutInterceptor该拦截器类会在客户端被调用后打印日志
*/
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor()); /**
* 客户端请求服务端的方法的时候要先加用户名密码以供服务端验证
*/
client.getOutInterceptors().add(new MyHeaderInterceptor("admin1","123")); MyRoleArray roles=login.getRoles();
List<MyRole> roleList= roles.item;
for(MyRole role:roleList) {
System.out.println(role.getKey());
for(Role r:role.getValue()) {
System.out.println(r.getId()+"\t"+r.getRoleName());
}
System.out.println("------------------");
}
}
}
client.getOutInterceptors().add(new MyHeaderInterceptor("admin1","123")) 客户端在请求服务单的方法时,会发送SOAP消息,就会先执行MyHeaderInterceptor
日志拦截器和自定义拦截器MyHeaderInterceptor,该拦截器用于发送在发送的SOAP消息中添加用户名密码等验证信息,以供服务端接收并验证。
- MyHeaderInterceptor.java
package com.shyroke.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 MyHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String userName;
private String passWord; public MyHeaderInterceptor(String userName, String passWord) {
/**
* Phase.PREPARE_SEND 准备发送SOAP消息的时候调用拦截器
*/
super(Phase.PREPARE_SEND);
this.userName = userName;
this.passWord = passWord;
} public void handleMessage(SoapMessage message) throws Fault { List<Header> headerList = message.getHeaders(); Document doc = DOMUtils.createDocument();
Element ele = doc.createElement("LoginHeader");
Element uElement = doc.createElement("userName");
uElement.setTextContent(userName); Element pElement = doc.createElement("passWord");
pElement.setTextContent(passWord); ele.appendChild(uElement);
ele.appendChild(pElement); headerList.add(new Header(new QName("http://com.shyroke"), ele)); } }
- 结果:

- 可知,服务端拦截器是生效的。
服务端代码在: 点击
客户端代码在: 点击
(六)CXF之自定义拦截器的更多相关文章
- CXF之六 自定义拦截器
CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承Abstrac ...
- Apache CXF自定义拦截器
为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...
- CXF添加拦截器和自定义拦截器
前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...
- Spring Mvc 的自定义拦截器
spring mvc的拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户 ...
- (六)Struts2的拦截器
一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...
- spring mvc <mvc:annotation-driven/> 自定义拦截器不走
<mvc:annotation-driven/> 这个便签会注册2个自定义拦截器,所以导致请求过来就会自己去走注册的这2个拦截器和定义的一堆bean 但是这个便签是必须得定义的 直接贴代码 ...
- 12.Struts2自定义拦截器
12.自定义拦截器 拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...
- 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...
- SpringMVC——自定义拦截器、异常处理以及父子容器配置
自定义拦截器: 一.若想实现自定义拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口. 二.HandlerIntercepto ...
随机推荐
- 网络爬虫requests-bs4-re-1
最近了解了爬虫,嗯--------,有时候会搞得有点头晕. 跟着线上老师实现了两个实例.可以用python下载源代码玩玩,爬淘宝的很刺激,虽然违反了ROBOTS协议. GIT地址
- MSP与PSP
摘抄自Triton.zhang——eeworld 1. MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13 2. 权 ...
- grub下如何指定哪个分区为根文件系统?
答: 使用root命令,如: grub> set root=(hd0,msdos1)
- VS中卸载Visual Assist X
Tools=>Extensions and updates=>找到Visual Assist X 卸载:
- 【转载】 AutoML技术现状与未来展望
原文地址: https://www.cnblogs.com/marsggbo/p/9309520.html ---------------------------------------------- ...
- 使用注解注入properties中的值的简单示例
spring使用注解注入properties中的值的简单示例 1.在web项目的src目录下新建setting.properties的文件,内容如下: version=1 2.在spring的xm ...
- toast提示信息获取和Monkey笔记
获取toast toast提示信息出现场景:用户输入用户名和密码后,提示的'登录成功', 用之前的定位方法获取不了,需要Uiautomator2来获取 安装node.js (使用 npm 或 node ...
- 在Excel多个工作表间快速切换的绝招
在Excel多个工作表间快速切换的绝招 几乎每个Excel用户"数据分析师"都应该知道,如果一个Excel工作簿中包括许多个工作表,我们"数据分析师"可以通过单 ...
- FastCGI模式下安装Xcache
PHP执行的时候,会被编译成opcode,然后 zend引擎会执行opcode.也就是说,如果你两次执行同一个php程序,每次执行,他都要把php代码编译成opcodexcache的意义在于,当你第一 ...
- transition css3 渐变效果
div { width:100px; transition: width 2s; -moz-transition: width 2s; /* Firefox 4 */ -webkit-transiti ...