使用cxf时拦截器的使用

nvidia系列教程-AGX-Orin系统刷机及备份 NVIDIA AGX Orin 是一款高性能的嵌入式计算平台,专为边缘计算和 AI 应用而设计。为了确保系统的稳定性和适应不同的应用场景,用户可能需要对 AGX Orin 进行系统刷机和备份操作。本文将详细介绍如何完成这些操作,帮助您更好地管理和维护 AGX Orin 设备。通过以上步骤,您可以成功地为 NVIDIA AGX Orin 刷写系统并创建备份。这些操作不仅能帮助您保持系统的更新和安全,还能在遇到问题时快速恢复系统。 阅读详情
1.在使用cxf时,我们想对客户端发送的请求字符串做一些处理,这个时候可以使用gatewayInInterceptor来处理,代码和配置如下:
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.xml.soap.SOAPException;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
@Service("gatewayInInterceptor")
public class GatewayInInterceptor extends AbstractPhaseInterceptor<Message> {
    private Logger logger = Logger.getLogger(GatewayInInterceptor.class);

    public GatewayInInterceptor() {
        super(Phase.RECEIVE);
    }

    public GatewayInInterceptor(String phase) {
        super(phase);
    }

    @SuppressWarnings("static-access")
    @Override
    public void handleMessage(Message message) throws Fault {
        String reqParams = null;
        if (message.get(message.HTTP_REQUEST_METHOD).equals("GET")) {// 采用GET方式请求
            reqParams = (String) message.get(message.QUERY_STRING);
            try {
                if (!CompareSignatureUtil.compareSignature(this
                        .getParamsMap(reqParams))) {
                    // 如果签名不一样,
                    SOAPException soapEx = new SOAPException("签名错误");
                    throw new Fault(soapEx);
                }
            } catch (UnsupportedEncodingException e) {
                throw new Fault(e);
            }
            message.remove(message.QUERY_STRING);
            reqParams = this.getParams(this.getParamsMap(reqParams));
            message.put(message.QUERY_STRING, reqParams);
            logger.info("QUERY_STRING:" + reqParams);
        } else if (message.get(message.HTTP_REQUEST_METHOD).equals("POST")) {// 采用POST方式请求
            try {
                //
                reqParams = (String) message.get(message.QUERY_STRING);
                try {
                    if (!CompareSignatureUtil.compareSignature(this
                            .getParamsMap(reqParams))) {
                        // 如果签名不一样,
                        SOAPException soapEx = new SOAPException("签名错误");
                        throw new Fault(soapEx);
                    }
                } catch (UnsupportedEncodingException e) {
                    throw new Fault(e);
                }
                message.remove(message.QUERY_STRING);
                reqParams = this.getParams(this.getParamsMap(reqParams));
                message.put(message.QUERY_STRING, reqParams);
                logger.info("》》》》》》》》》QUERY_STRING:" + reqParams);
                //
                InputStream is = message.getContent(InputStream.class);
                reqParams = this.getParams(this.getParamsMap(is.toString()));
                if (is != null && reqParams != null) {
                    message.setContent(InputStream.class,
                            new ByteArrayInputStream(reqParams.getBytes()));
                    logger.info("》》》》》》》》》Content:" + reqParams);
                }
            } catch (Exception e) {
                logger.error("GatewayInInterceptor异常", e);
            }
        }
        
        // only test

        // SOAPException soapEx=new SOAPException("自定义SOAPException错误");
        // throw new Fault(soapEx);

        // /RuntimeException ex=new RuntimeException("自定义RuntimeException错误");
        //throw new Fault(ex);

        // throw new RuntimeException("自定义SOAPException错误");

    }

    private Map<String, String> getParamsMap(String strParams) {
        if (strParams == null || strParams.trim().length() <= 0) {
            return null;
        }
        Map<String, String> map = new HashMap<String, String>();
        String[] params = strParams.split("&");
        for (int i = 0; i < params.length; i++) {
            String[] arr = params[i].split("=");
            if (arr.length > 1) {
                map.put(arr[0], arr[1]);
            }
        }
        return map;
    }

    private String getParams(Map<String, String> map) {
        if (map == null || map.size() == 0) {
            return null;
        }
        StringBuffer sb = new StringBuffer();
        Iterator<String> it = map.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            String value = map.get(key);

            /*
             * 这里可以对客户端上送过来的输入参数进行特殊处理。如密文解密;对数据进行验证等等。。。
             * if(key.equals("content")){ value.replace("%3D", "="); value =
             * DesEncrypt.convertPwd(value, "DES"); }
             */
            if (sb.length() <= 0) {
                if (key.toUpperCase().equals("FORMAT"))
                    sb.append("_type" + "=" + value);
                else
                    sb.append(key + "=" + value);
            } else {
                if (key.toUpperCase().equals("FORMAT"))
                    sb.append("&_type" + "=" + value);
                else
                    sb.append("&" + key + "=" + value);
            }
        }
        return sb.toString();
    }

}



<bean id="gatewayInInterceptor"
		class="com.mingdong.b01.test.cxf.restful.intercepter.GatewayInInterceptor" />

	<jaxrs:server id="restServiceContainer" address="/rest">
		<!-- 参数处理的拦截器 -->
		<jaxrs:inInterceptors>
			<ref bean="inMessageInterceptor" />
			<ref bean="gatewayInInterceptor" />
		</jaxrs:inInterceptors>

2.当你想对返回的响应内容做统一的处理的时候,可以使用gatewayOutInterceptor,

import org.apache.commons.io.IOUtils;
import org.apache.cxf.phase.AbstractPhaseInterceptor;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

@Service("gatewayOutInterceptor")
public class GatewayOutInterceptor extends AbstractPhaseInterceptor<Message> {

	private Logger logger = Logger.getLogger(GatewayOutInterceptor.class);

	public GatewayOutInterceptor() {
		super(Phase.PRE_STREAM); // 触发点在流关闭之前
	}

	@Override
	public void handleMessage(Message message) throws Fault {
		try {
			OutputStream os = message.getContent(OutputStream.class);
			CachedStream cs = new CachedStream();
			message.setContent(OutputStream.class, cs);
			
			message.getInterceptorChain().doIntercept(message);
			CachedOutputStream csnew = (CachedOutputStream) message
					.getContent(OutputStream.class);
			InputStream in = csnew.getInputStream();

			String result = IOUtils.toString(in, "UTF-8");
			logger.info("返回给客户端值:" + result);
			System.out.println("返回给客户端值:" + result);
			/**
			 * 这里可以对result做处理,如可以对result进行加密,把密文返回给客户端 处理完后同理,写回流中
			 */
			//result=result+"3222";
			IOUtils.copy(new ByteArrayInputStream(result.getBytes("UTF-8")), os);
			System.out.println("返回给客户端值222222222222:" + result);
			cs.close();
			os.flush();
			message.setContent(OutputStream.class, os);
		} catch (Exception e) {
			logger.error("GatewayOutInterceptor异常", e);
		}
	}

i	@Override
	public void handleFault(Message message) {
		// TODO Auto-generated method stub
		super.handleFault(message);
	}

}

<bean id="gatewayOutInterceptor"
		class="com.mingdong.b01.test.cxf.restful.intercepter.GatewayOutInterceptor" />

<jaxrs:outInterceptors>
			<ref bean="outMessageInterceptor" />
			<ref bean="gatewayOutInterceptor" />
		</jaxrs:outInterceptors>

3.后来我们考虑到异常的处理,是否能把所有的异常都统一的做处理,在出现异常的时候,返回给客户端的响应是比较友好的,格式化的,当然cxf是有这个功能的,刚开始参考了一篇文章 点击打开链接,照着写了,可是没有成功,后来又在网上搜索了其他解决方式,比如写了一个<!-- <jaxrs:outFaultInterceptors> <ref bean="invokeFaultExceptionMapper"  /> </jaxrs:outFaultInterceptors> -->,可后来发现这个拦截器只能拦截除了拦截器之外其他类里面抛出的异常,有没有一中方式,一个拦截器可以拦截业务代码里面的异常,又可以拦截拦截器里面的异常呢?后来看到老外的一些文章,得到解决,在cxf3.0以上版本中,我们可以通过ExceptionMapper来一次性处理所有异常!这不就完美的解决了问题么。那么这个ExceptionMappery要怎么做呢,代码和配置如下:

import java.util.Locale;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

/**
 * 异常的统一处理类
 * 
 * @author songyf
 *
 */

@Provider
public class XxInvokeFaultExceptionMapper implements
		ExceptionMapper<Throwable> {

	public XxInvokeFaultExceptionMapper per() {
		super();
	}

	public Response toResponse(Throwable ex) {
		StackTraceElement[] trace = new StackTraceElement[1];
		trace[0] = ex.getStackTrace()[0];
		ex.setStackTrace(trace);
		ResponseBuilder rb = Response
				.status(Response.Status.INTERNAL_SERVER_ERROR);
		// rb.type("application/json;charset=UTF-8");//返回json格式
		rb.type("application/xml;charset=UTF-8");//返回xml格式

		if (ex instanceof MingdongException) {// 自定义的异常类,
			XxException e = (XxException) ex;
			ExceptionEntity entity = new ExceptionEntity(e.getErrCode(),//这里可以根据你想返回的内容去定义自己的异常实体类
					e.getErrSubCode(), e.getMessage());
			rb.entity(entity);
		} else {
			rb.entity(ex);
		}
		rb.language(Locale.SIMPLIFIED_CHINESE);
		Response r = rb.build();
		return r;
	}

}
配置:

<jaxrs:providers>
			<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />//转换json
			<bean
				class="org.apache.cxf.jaxrs.provider.xmlbeans.XMLBeansElementProvider" />//转换xml
			<bean
				class="com.xx.b01.test.cxf.restful.intercepter.XxInvokeFaultExceptionMapper" />
		</jaxrs:providers>
请注意,这里的cxf版本最好是3.0以上,我的版本是3.1.0





怀旧版电脑GBC模拟器 再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。 立即下载

相关推荐

在Unity3d使用yolov8的onnx模型

输出OUTPUTS是float32[1,35,8400],表示它会输出一个大小为[1, 35, 8400]的浮点数张量。这个输出张量的维度表示了检测到的目标的数量、每个目标的预测参数以及网格单元的数量。输出张量的第一个维度1表示检测到的目标数量。每个目标由35个值组成,表示目标的类别、置信度、边界框的坐标及10个特定点的位置。要取得8400个数据中置信度最高的数据,然后获取该数据其他channel的数据。运行结果:(蓝色是检测手的边框,红点是自定义的点),其中的四个数字分别表示不同的维度。

shenqingyu0605202324的博客 5603

CXF Interceptor中Phase的先后顺序

[code="java"] org.apache.cxf.phase.PhaseManagerImpl中 final void createInPhases() { int i = 0; inPhases = new SortedArraySet(); inPhases.add(new Phase(Phase.RECEIVE, ++i ...

iteye_14264的博客 2297

西门子AI面试问答(STAR法则回答实例)

通过建立良好的沟通渠道、倡导透明和积极的沟通,并建立信任和共享目标的文化,我成功地改善了团队合作的氛围和效果。对于一些存在分歧和冲突的情况,我采用了积极的解决问题的态度,促进双方的沟通和理解,寻找共同的利益点和解决方案。我的成果得到了评委和观众的认可,并为我的学术发展和进一步的科学研究奠定了基础。首先,我主动与团队成员进行一对一的沟通,倾听他们的观点和意见,了解他们在合作中遇到的问题和需求。我还参加了学校组织的科学俱乐部和研究小组,与其他热衷科学的同学一起进行讨论和实验,加深我的理解和实践技能。

kashine的博客 7249

CXF异常处理

本文将讨论一下,在CXF服务端的异常处理,主要包括服务实现类抛出异常与拦截器中抛出异常,抛出异常后CXF的处理流程。其实在CXF中,异常无论是在服务实现类还是拦截器中抛出,其处理方式是一样的,当服务方法中的异常抛出后,CXF会将异常包装为org.apache.cxf.interceptor.Fault类型,而拦截器中只能抛出Fault类型异常,其间接继承于java.lang.RuntimeExce

云原生之家 7615

dq轴坐标系下的电路方程

dq轴坐标系下的电路方程 dq轴坐标系是一种常见的电路方程,但是再dq轴坐标系下电路元件的电压电流dq轴存在一定的耦合,本文针对三相电路推导了dq轴坐标系下的电路电路方程进行一个推导,首先先列出来派克变换的公式 派克变换 [AdAqA0]=23[cos⁡(θ)cos⁡(θ−2π/3)cos⁡(θ+2π/3)−sin⁡(θ)−sin⁡(θ−2π/3)−sin⁡(θ+2π/3)1/21/21/2][AaAbAc]\left[\begin{array}{c}A_d\\A_q\\A_0 \end{array}\ri

Mr.Young的博客 1万+

word 2013 长篇文档排版案例教程

office 2013 制作长文格式模板

1万+

@service报错_CXF使用及常见报错

Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP、POST/HTTP、HTTP ,CXF 大大简化了WebService并且可以天然地和 Spring 进行无缝集成。CXF是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,核心是org.apache.cxf....

weixin_31727937的博客 1044

【驱动适配】高通sa522平台tac5x1x驱动适配全指南

本手册详细介绍了TAC5301-Q1音频编解码器在高通sa525平台Linux系统下的驱动适配流程。主要内容包括:1)TAC5301-Q1核心特性(车载级音频Codec、关键接口和功能);2)驱动适配依赖(高通声卡驱动、ALSA SoC框架等);3)I2S协议原理及主从模式说明;4)硬件准备与检查要点;5)完整的驱动移植步骤(代码移植、Kconfig/Makefile修改、设备树配置)。该手册适用于嵌入式音频开发工程师快速完成TAC5301-Q1芯片的驱动移植与验证工作。

嵌入式博哥的博客 303

【Apache CXF】Interceptor与Phase

server端和client端都可以使用拦截器做一些记录、转换、验证、错误处理什么的。比如处理传输的对象较大时使用GZIPIn/OutInterceptor。interceptor以phase方式组织起来,相似功能的interceptor属一个phase。phase实现Comparator接口,以priority属性进行排序,phaseManager将其依次添加至Sorted...

weixin_33885253的博客 1544

Selenium|通过更改亚马逊amazon的配送地获取当地的cookie

如果我们需要拿到国外配送地的商品信息,这个时候就需要用到selenium或者pypputeer自动化的方法去更改配送地,拿到当地的cookie信息,之后,携带当地的cookie使用requests发送请求,就可以拿到国外配送地的商品数据信息。一般来说,我们访问亚马逊,亚马逊的配送地一般显示的是国内,但是国内的商品信息和国外的商品信息其实是存在很大差别的,比如你在搜索框输入某个关键词,看到的

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 993

Matlab R2018b简体中文版完整安装图文教程(附安装包下载)

目 录 一、安装过程 二、下载地址 matlab R2018b安装包如下所示,包括主程序和补丁文件两部分。 一、安装过程 双击安装包中的setup.exe。 选择使用文件安装MIYAO,点击下一步。 接受协议,选择是,点击下一步。 输入序列号:09806-07443-53955-64350-21751-41297,点击下一步。 修改安装路径,点击下...

智慧空间实验室 1万+

(三)cxf的拦截器使用

在webservice的客户端和服务端的请求和响应的过程中,能动态的操作请求和响应的数据,能够拦截请求和响应的数据并进行响应的操作,设计了cxf的拦截器,注意JDK中支持webservice,但不支持拦截器,所以开发强大的webservice通信,推荐cxf框架。拦截器分类: 1. 按所处的位置分:服务器端拦截器,客户端拦截器 2. 按消息的方向分:入拦截器,出拦截器 3. 按定义者分:

u010502101的博客 1544

从零开始玩转边缘 AI:Jetson Nano 深度学习环境搭建与 YOLOv5 部署指南

Jetson Nano是NVIDIA推出的嵌入式AI开发板,凭借其强大的GPU计算能力和完善的软件生态系统,成为边缘AI部署的理想平台。本教程源于作者团队参加2024中国机器人大赛暨RoboCup机器人世界杯中国赛机器人先进视觉3D识别赛道的实战经验,是一份经过验证的环境部署指南。

LXY_LOVE36的博客 234

使用CXF发布的webservice服务并且忽略targetnamespace校验

场景:CXF发布的webservice的服务端一定会去校验targetnamespace,如果客户端没有携带targetnamespace则会报错,比如说我用的axis2客户端没有携带targetnamespace,那么就无法访问使用CXF发布的webservice服务了。 解决方案:发布CXF的webservice服务端时忽略掉targetnamespace的校验,即添加cxf的拦截器设置字段soap.force.doclit.bare为true CXF发布webservice服务: impo

qq_37549757的博客 4672

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ServerSWebService之CXF

         前言:WebService就目前来讲已经是一种成熟的技术了,目前对WebService支持的框架也很多,虽然本人并没有对各框架做个测试,但分析比较各框架的优缺点(较为主观),最后还是选择了CXF作为样例框架进行分析,主要是因为性能较佳,支持JAX-WS,Spring无缝集成,上手快等特点,本文旨在提供CXF基本入门demo,帮助快速入门了解CXF的使用。 本篇文章重点关注以...

风清扬 434

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

当接口被调用时使用Spring拦截器注入运行时数据

开发背景使用CXF暴露与调用接口,为了方便追踪错误,所以想要在接口被调用时将一些运行时数据记录起来,所以就想到了拦截器。CXF自带拦截器,但是据我初步了解,自带的拦截器都是经过封装,用来打印日志什么的,好像没有提供给开发者定制功能的方式(没有深入了解,如果有说错请方便斧正)流程其实Spring的拦截器使用挺方便的,实现org.aopalliance.intercept.MethodIntercept

夕下奕林的专栏 2928

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CXF客户端请求服务流程

CXF(使用版本2.7.6)对Web服务封装度已经非常高了,你只需要像正常写代码一样,附加几个额外的注解直接发布,服务端差不多就完成了;对于客户端更简单,只需要知道Web服务的URL地址和接口,就能如调用本地代码一样,几乎感觉不到与本地代码有什么区别。这就是封装的威力,虽然高度封装简化了我们对Web服务的使用,但也间接地阻挡了我们对其深入了解。本文就将源码层面来分析CXF其内部是如何完成客户端对W

云原生之家 7821

1.服务端拦截器:发布Web Services,拦截器不能正常工作

服务端发布Web Services:   /** * */ package lee; import java.io.FileNotFoundException; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.int

1150

创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

下面具体的webservice实现类直接用的是上面的,这里不再说明 CXF拦截器使用,创建一个使用SOAPHeader的安全验证 xml格式: 1 test test 一,首先在服务端创建一个拦截器(被调用端),需要继承org.apache.cxf.phase.AbstractPhaseInterceptor 代码如下: import java.util.Lis

majian_1987的专栏 2507

CXF 拦截器预处理request、response消息

在接受soap消息的时候,可能需要对消息做预处理!可以使用拦截器实现这一目的! cxf有2种拦截器,InInterceptor、OutInterceptor,顾名思义,InInterceptor可以处理soap请求消息,OutInterceptor可以处理soap响应消息。 所有的拦截器都继承自AbstractPhaseInterceptor,此抽象拦截器实现了Interceptor接...

tigerl2008的专栏 494

CXF随笔(三):CXF参考与可能遇到的bug

  (1)Please enable FINE/TRACE log level for more details.   用HttpClient(版本4.0)方式访问cxf-webservice,我用Get方式访问没有问题,但是改成Post方式就出错。   参考:http://bbs.csdn.net/topics/390064922   (2)CXF拦截器实现过程中   ...

You can call me Seven 599

采用CXF框架发布WebService

1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache      * CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext    * CXF默认是依赖于Spring的    * Apache CXF 发行包中的jar,如果全部放...

sinat_35821285的博客 767

apache cxf_Wildfly,Apache CXF和@SchemaValidation

apache cxf 在过去的几天中,我一直在进行从JBoss 4到Wildfly 8的应用程序迁移。 该应用程序使用了不同的技术,但是我们这里将重点放在XML Web Services JAX-WS上 。 是的,我知道它们不再流行了,但是它们是很久以前开发的,因此需要维护以解决兼容性问题。 无论如何,迁移这些服务的途径并不容易。 我正在分享一些问题和修补程序,希望它们可以帮助其他在那里遇...

最佳 Java 编程 316

cxf拦截器

一 编写服务端 1 编写接口,在接口上面有@webService注解,表示该类是webService,接口里面方法注解为@webMethod,表示该方法是webService的方法   2 编写接口的实现类 3 编写拦截器,继承AbstractPhaseInterceptor类,实现handleMessage方法,在该方法里面实现拦截器的业务逻辑,在这里我实

Erica_1230的专栏 793

CXF添加自定义拦截器

前面我们说到CXF添加内置的拦截器,今天的话,我们来实现如何添加自定义拦截器 实例是客户端访问服务端webservice接口要加权限认证 我们可以通过在SOAP消息的Header头信息中添加自定义信息,然后发送到服务端端,服务器端通过获取 Header头消息,然后进行认证;这里的添加消息,和获取消息认证,我们都是通过自定义拦截器来实现 我们自定义

GaoChenXi 485
上一篇: svn提交出错提示:svn locked; try performing 'cleanup'的解决方法
下一篇: maven的scope标签的用法
leffleft
博客等级 码龄12年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值