(六)CXF之自定义拦截器

本文介绍了一种通过在WebService客户端和服务端使用自定义拦截器实现用户名密码验证的方法。具体包括服务端如何验证客户端发送的SOAP消息中的认证信息,以及客户端如何在请求中添加这些信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求分析

  • 客户端在调用服务端的方法时,需要进行用户名和密码验证。此时分为:
  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));

    }

}
  • 结果:

  • 可知,服务端拦截器是生效的。

 

 

 

 

 

 

 

服务端代码在: 点击

客户端代码在: 点击

转载于:https://www.cnblogs.com/shyroke/p/7966575.html

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值