一、需求分析

  • 客户端在调用服务端的方法时,需要进行用户名和密码验证。此时分为:
  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. GO -- 遍历删除 数组 slice

    删的继续, 没删的i++

  2. 记一次用WireShark抓包摆脱Si服后台限制的过程

    背景:闲着无聊找了个小众的手游,因为手游都是比较吃金的,所以就找了个Si服,鉴于小时候宝可梦的情怀,就TB买了个GM后台.谁知这玩意有限制,到了100级之后升级超级难,最多只能发送99999W点经验, ...

  3. 《高性能mysql》笔记(第一章,mysql的架构与历史)

    mysql的服务器逻辑架构图如下: 目前工作用的5.5版本,5.5版本开始mysql开始将innoDB作为默认的存储引擎,innoDB的表是基于聚簇索引建立的. mysql的存储引擎锁管理非常重要,在 ...

  4. QML最大化

    Component.onCompleted: { root.visibility = Window.Maximized} Component.onCompleted: { root.showMaxim ...

  5. REUSE_ALV_POPUP_TO_SELECT使用技巧

    可以实现弹出一个对话框,提供选择数据的功能…… 栗子1: CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT' TYPE-POOLS slis. DATA: selec ...

  6. php-fpm优化参数介绍

    1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_servers.pm.min_spare_servers.pm.max_spare_servers. ...

  7. JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari……

    1.JavaScript 方法: <script>      document.onkeydown=function(event){          e = event ? event  ...

  8. css实现可伸缩的搜索框

    效果图: 代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  9. HTML让字体闪动和滚动显示

    存粹的HTML让字体闪动显示: <html> <head> <title>TEST</title> <style type="text/ ...

  10. GitLab基本使用

    一.引言 在微服务架构中,由于我们对系统的划分粒度足够小,服务会很多,而且也存在经常迭代的情况.如果还按照以前的部署方式显得非常吃力和复杂,并且很容易出现错误.而随着容器技术的发展,这个时候持续集成( ...