一、需求分析

  • 客户端在调用服务端的方法时,需要进行用户名和密码验证。此时分为:
  1. 客户端请求的时候,要发送用户名密码到服务端
  2. 服务端检验用户名密码。

二、案例

  • 前提:本章案例是基于前一章节的例子进一步讲解自定义拦截器

  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之自定义拦截器的更多相关文章

  1. CXF之六 自定义拦截器

    CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承Abstrac ...

  2. Apache CXF自定义拦截器

    为什么设计拦截器?1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器 拦截器分类: 1.按所处的位置分:服务器端拦截器,客户端拦截器. 2.按消息的方向分:入拦截器 ...

  3. CXF添加拦截器和自定义拦截器

    前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器. 服务端代码: HelloWorld implementor=new HelloWorldImpl(); Stri ...

  4. Spring Mvc 的自定义拦截器

     spring mvc的拦截器 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户 ...

  5. (六)Struts2的拦截器

    一.简介 拦截器体系是struts2重要的组成部分.正是大量的内建拦截器完成了该框架的大部分操作. 比如params拦截器将请求参数解析出来,设置Action的属性.servletConfig拦截器负 ...

  6. spring mvc <mvc:annotation-driven/> 自定义拦截器不走

    <mvc:annotation-driven/> 这个便签会注册2个自定义拦截器,所以导致请求过来就会自己去走注册的这2个拦截器和定义的一堆bean 但是这个便签是必须得定义的 直接贴代码 ...

  7. 12.Struts2自定义拦截器

    12.自定义拦截器        拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...

  8. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  9. SpringMVC——自定义拦截器、异常处理以及父子容器配置

    自定义拦截器: 一.若想实现自定义拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口. 二.HandlerIntercepto ...

随机推荐

  1. js的一些兼容性易错的的问题

    一.属性相关 我们通常把特征(attribute)和属性(property)统称为属性,但是他们确实是不同的概念,特征(attribute)会表现在HTML文本中,对特征的修改一定会表现在元素的out ...

  2. go struct 自定义标签获取

    package main import ( "fmt" "reflect" ) type Test struct { Id int `json:"us ...

  3. 个微信小程序云开发云函数

    1. project.config.json写上云函数所在目录"cloudfunctionRoot": "cloudfunctions/",如图 2. app. ...

  4. python 设计模式之备忘录模式

    1.为什么用备忘录模式 假设大战僵尸游戏共10关,越是往后关卡越难,越难就越是费时间费钱费精力. 开始大战僵尸,玩了好久好久终于玩到了第9关,真是不容易. 这个时候开始玩第9关了,哇,好难啊,真不幸, ...

  5. LoadRunne遇到的一些问题FAQ(持续更新...)

    1.LR11破解完成,添加License失败,报错License security violation Loadrunner11破解成功后,用deletelicense.exe工具把License全删 ...

  6. pytorch常用normalization函数

    参考:https://blog.csdn.net/liuxiao214/article/details/81037416 归一化层,目前主要有这几个方法,Batch Normalization(201 ...

  7. IFC数据模型构件控制

    控制ifc构件的隐藏与显示.着色 osg::ref_ptr<osg::Geode> geode1 = new osg::Geode(); osg::ref_ptr<osg::Stat ...

  8. APPSCAN使用外部浏览器的方法

    在使用appscan扫描时,自带浏览器可能存在兼容性问题(比如HTML5),故需要用到其他浏览器.在做139邮箱HTML5项目,需要使用chrome浏览器进行扫描.因此分享下如何使用外部浏览器,将之前 ...

  9. ORM学习笔记

    19周 11章 django ORM基本创建类型以及生成数据库结构 类型: dbfirst :通过数据库创建类 codefirst:先创建类 再创建数据库 --最常用 ORM的意思: 通过类创建数据库 ...

  10. iOS-ASI异步下载图片

    异步下载图片 异步下载图片ASIHTTPRequest *requestX = [ASIHTTPRequest requestWithURL:url];                 self.re ...