iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用webservice自定义注解处理参数加解密问题
  • 493
分享到

如何使用webservice自定义注解处理参数加解密问题

2023-06-22 03:06:23 493人浏览 薄情痞子
摘要

小编给大家分享一下如何使用WEBservice自定义注解处理参数加解密问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!webservice自定义注解处理参数加解

小编给大家分享一下如何使用WEBservice自定义注解处理参数加解密问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

webservice自定义注解处理参数加解密

前一段项目中用到了webservice,正好自己之前也了解过一点apache的cxf框架,所以就采用了cxf来实现webservice服务端,本身实现并没技术难点,但是项目为了保证安全性,采用了传输加密的过程,所以大部分请求参数需要加密,返回参数也需要加密,大致流程是:

  • 请求参数对称加密+对称秘钥非对称加密

  • 返回参数堆成加密+对称秘钥非对称加密

参数加密本身并不复杂,但是有些服务并不需要加密,有些则需要,加密工具类并不通用

string,datahandler等不能重用,虽然本质都是对字节数据加密,但是要写许多方法,还要方法参数,检查需要加解密处理的参数,然后寻找对应的类型处理方法调用.

逻辑很清晰,但是过程实现很恶心,最终这样实现了一版,但是并不合我的意.

如果能在拦截器中获取到参数列表,然后寻找对应的解码器解码,这样就比较简单了.但是难点是,如果标记参数,并指定被标记参数的解码器尼?

我想到了注解,注解就可以标记,参数,然后通过反射获取到注解,解析出内容.

本来想标记到参数上,但是一个个标记太麻烦,而且获取也不太方便,索性就放在方法上,用数组来接收.

问题解决.

代码实现

自定义注解:

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface RequestHanleAnnotation {    Class[] handler() default {};    int[] index() default {};}

参数解码器接口

import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public abstract class  ParamHandler<T> {//解码器实例缓存public static final Map<Class,ParamHandler> hanlers=new ConcurrentHashMap<>();//处理方法     abstract T handle(T t);}

解码器实现,这里并没有真正解码,只是在参数后面加了123

public class StringHandler extends ParamHandler<String> {    @Override    public String handle(String t) {        return t+"123";    }}

服务方法注解使用

//表示第一个参数需要StringHandler处理    @RequestHanleAnnotation(index=0,handler=StringHandler.class)    public String test(String test, String test2) throws Exception {        System.out.println(test);        System.out.println(test2);        return "cesshi";    }

拦截器实现

import java.io.File;import java.lang.reflect.Method;import java.util.Map;import org.apache.commons.io.FileUtils;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.message.MessageContentsList;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.log4j.Logger;import com.alibaba.fastJSON.jsON;import com.alibaba.fastjson.JSONObject;public class EcrInInterceptor extends AbstractPhaseInterceptor<SoapMessage>{    private Logger log = Logger.getLogger(ContractLogicImpl.class);      public EcrInInterceptor(){            // 在调用方法之前调用拦截器            super(Phase.PRE_INVOKE);        }    @Override    public void handleMessage(SoapMessage msg) throws Fault {            //获取正在执行的方法         Method method = MsgUtil.getSoapMethod(msg);         //解析注解,并处理参数         MessageContentsList contentsList = MessageContentsList.getContentsList(msg);         MsgUtil.handle(method,contentsList);    }    @Override    public void handleFault(SoapMessage message) {    super.handleFault(message);    }

注解解析工具类实现

import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.message.Exchange;import org.apache.cxf.message.MessageContentsList;import org.apache.cxf.service.Service;import org.apache.cxf.service.invoker.MethodDispatcher;import org.apache.cxf.service.model.BindinGoperationInfo;public class MsgUtil {        public static Method getSoapMethod(SoapMessage msg){         Exchange exchange = msg.getExchange();              BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);              MethodDispatcher md = (MethodDispatcher) exchange.get(Service.class)                      .get(MethodDispatcher.class.getName());              Method method = md.getMethod(bop);            return method;     }    public static void handle(Method method, MessageContentsList contentsList) {        if(method==null)return;        RequestHanleAnnotation reqAnno= method.getAnnotation(RequestHanleAnnotation.class);        int[] indexs = reqAnno.index();        if(indexs==null||indexs.length==0)return;        Class[] handlers = reqAnno.handler();        try {            //处理器实例            ParamHandler handler=null;        for(int i=0,len=indexs.length;i<len;i++){                //获取需要处理的参数                Object obj = contentsList.get(indexs[i]);                //从缓存中获取处理器实例                handler=ParamHandler.hanlers.get(handlers[i]);                if(handler==null){                    //创建处理器实例                    handler=(ParamHandler) handlers[i].newInstance();                    //缓存处理器实例                    ParamHandler.hanlers.put(handlers[i], handler);                }                 contentsList.set(indexs[i], handler.handle(obj));        }        }catch (Exception e) {            e.printStackTrace();        }    }}

返回参数同样也可以注解实现,这里就不在赘述了,实现也比较简单.

**需要注意的是,拦截器拦截顺序不一样拦截器统一继承AbstractPhaseInterceptor类,请求拦截 :super(Phase.PRE_INVOKE);返回拦截: super(Phase.PRE_STREAM);**

webservice注解汇总

@WebService

  • serviceName:对外发布的服务名,指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service。(字符串

  • endpointInterface:服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口

  • name:此属性的值包含XML Web Service的名称。在默认情况下,该值是实现XML Web Service的类的名称,wsdl:portType 的名称。缺省值为 Java 类或接口的非限定名称。(字符串

  • portName:wsdl:portName。缺省值为 WebService.name+Port。

  • targetNamespace:指定你想要的名称空间,默认是使用接口实现类的包名的反序

  • wsdlLocation:指定用于定义 Web Service 的 WSDL 文档的 Web 地址。Web 地址可以是相对路径或绝对路径。(字符串)注意:实现类上可以不添加Webservice注解

@WebMethod

注释表示作为一项 Web Service 操作的方法,将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。

要点:

仅支持在使用 @WebService 注释来注释的类上使用 @WebMethod 注释

  • operationName:指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。(字符串)

  • action:定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。(字符串)

  • exclude:指定是否从 Web Service 中排除某一方法。缺省值为 false。(布尔值)

@Oneway

注释将一个方法表示为只有输入消息而没有输出消息的 Web Service 单向操作。

将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类

@WebParam

注释用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射。

将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。

  • name:参数的名称。如果操作是远程过程调用(rpc)类型并且未指定partName 属性,那么这是用于表示参数的 wsdl:part 属性的名称。如果操作是文档类型或者参数映射至某个头,那么 -name 是用于表示该参数的 XML 元素的局部名称。如果操作是文档类型、参数类型为 BARE 并且方式为 OUT 或 INOUT,那么必须指定此属性。(字符串)

  • partName:定义用于表示此参数的 wsdl:part属性的名称。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为BARE 时才使用此参数。(字符串)

  • targetNamespace:指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 Web Service的targetNamespace。(字符串)

  • mode:此值表示此方法的参数流的方向。有效值为 IN、INOUT 和 OUT。(字符串)

  • header:指定参数是在消息头还是消息体中。缺省值为 false。(布尔值)

@WebResult

注释用于定制从返回值至 WSDL 部件或 XML 元素的映射。将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。

  • name:当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的 XML 元素的局部名。对于 RPC 和 DOCUMENT/WRAPPED 绑定,缺省值为 return。对于 DOCUMENT/BARE 绑定,缺省值为方法名 + Response。(字符串)

  • targetNamespace:指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。(字符串)

  • header:指定头中是否附带结果。缺省值为false。(布尔值)

  • partName:指定 RPC 或 DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name。(字符串)

@HandlerChain

注释用于使 Web Service 与外部定义的处理程序链相关联。只能通过对 SEI 或实现类使用 @HandlerChain 注释来配置服务器端的处理程序。但是可以使用多种方法来配置客户端的处理程序。可以通过对生成的服务类或者 SEI 使用 @HandlerChain 注释来配置客户端的处理程序。此外,可以按程序在服务上注册您自己的 HandlerResolver 接口实现,或者按程序在绑定对象上设置处理程序链。

  • file:指定处理程序链文件所在的位置。文件位置可以是采用外部格式的绝对 java.net.URL,也可以是类文件中的相对路径。(字符串)

  • name:指定配置文件中处理程序链的名称。

以上是“如何使用webservice自定义注解处理参数加解密问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用webservice自定义注解处理参数加解密问题

本文链接: https://www.lsjlt.com/news/302202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用webservice自定义注解处理参数加解密问题
    小编给大家分享一下如何使用webservice自定义注解处理参数加解密问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!webservice自定义注解处理参数加解...
    99+
    2023-06-22
  • 使用webservice自定义注解处理参数加解密问题
    目录webservice自定义注解处理参数加解密代码实现webservice注解汇总@WebService@WebMethod@Oneway@WebParam@WebResult@H...
    99+
    2024-04-02
  • 如何使用RequestHeaders添加自定义参数
    目录RequestHeaders添加自定义参数问题一原因解决方案修改request中header的值RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到r...
    99+
    2024-04-02
  • 使用自定义注解实现加解密及脱敏方式
    目录自定义注解实现加解密及脱敏定义自定义注解构造AOP逻辑测试脱敏逻辑自定义一种字符串的加密与解密自定义注解实现加解密及脱敏 定义自定义注解 @Documented @Targe...
    99+
    2024-04-02
  • springboot中如何使用自定义注解实现加解密及脱敏方式
    这篇文章主要介绍springboot中如何使用自定义注解实现加解密及脱敏方式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!自定义注解实现加解密及脱敏定义自定义注解@Documented@Target({Element...
    99+
    2023-06-22
  • SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解
    目录spring boot 常见http get ,post请求参数处理PathVaribale 获取url路径的数据RequestParam 获取请求参数的值注意GET参数校验PO...
    99+
    2024-04-02
  • Java中自定义注解如何使用
    本文小编为大家详细介绍“Java中自定义注解如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中自定义注解如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是注解在早期的工作的时候 ,自定义...
    99+
    2023-07-05
  • PHP8中如何使用Attributes为类添加自定义注解?
    PHP8中如何使用Attributes为类添加自定义注解?自定义注解是一种在类或方法上添加元数据的方式,它可以帮助我们在运行时获取和处理特定的类或方法上的附加信息。在PHP8中,引入了Attributes的概念,它使我们可以轻松地为类添加自...
    99+
    2023-10-22
    PHP Attributes
  • SpringBoot如何通过自定义注解实现参数校验
    今天小编给大家分享一下SpringBoot如何通过自定义注解实现参数校验的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. ...
    99+
    2023-07-04
  • SpringBoot自定义注解API数据加密和签名校验
    api数据数据签名(MD5,SHA1) 签名枚举类SginEnum.java package com.jx.app.api.framework.annotation.enum...
    99+
    2024-04-02
  • 使用Spring AOP 如何实现自定义注解
    这期内容当中小编将会给大家带来有关使用Spring AOP 如何实现自定义注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Maven中加入以下以依赖:<!-- Spring AOP + Aspe...
    99+
    2023-05-31
    springaop 注解
  • 创建自定义 PHP 函数时如何处理参数?
    本文探讨了 php 函数参数处理技巧。类型限定:使用类型提示强制参数类型。默认参数值:为可选参数设置默认值。强制参数传递:使用 null 联合类型强制参数传递。可变数量参数:使用 ......
    99+
    2024-04-22
    php 参数处理
  • 在MySQL中自定义参数的使用详解
    MySQL变量包括系统变量和系统变量。这次的学习任务是用户自定义变量。用户变量主要包括局部变量和会话变量。 用户自定义变量的声明方法形如:@var_name,其中变量名称由字母、数字、“.”、“_”和“$”...
    99+
    2024-04-02
  • 使用自定义注解+springAop实现参数非空校验方式
    目录自定义注解+springAop参数非空校验新建注解类@interface ParamsVerify利用springAop来实现切面新建一个切面类使用注解统一校验参数非空1. 待校...
    99+
    2024-04-02
  • 详解如何在SpringBoot中自定义参数解析器
    目录前言1.自定义参数解析器2.PrincipalMethodArgumentResolver3.RequestParamMapMethodArgumentResolver4.小结前...
    99+
    2024-04-02
  • 怎么用Spring的spel获取自定义注解参数值
    这篇文章主要介绍了怎么用Spring的spel获取自定义注解参数值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Spring的spel获取自定义注解参数值文章都会有所收获,下面我们一起来看看吧。spel获...
    99+
    2023-06-29
  • 使用自定义注解进行restful请求参数的校验方式
    目录自定义注解进行restful请求参数的校验1、首先我们使用@interface定义一个注解2、实现注解实现类(和@interface定义的注解在同一个包下)3、在需要校验的对象的...
    99+
    2024-04-02
  • Android Studio如何为Activity添加自定义注解信息
    普通Java-Kotlin类添加注释 添加类时注释作者信息和日期时间 依次打开 File—>Settings—>editor—>File and Code Tem...
    99+
    2024-04-02
  • 自定义@RequestBody注解如何获取JSON数据
    目录自定义注解自定义解析器包装请求注册解析器用法总结Spring MVC 的 @RequestBody 注解只能将请求体中的 JSON 数据封装成 Bean,而无法对单一字段实施管理...
    99+
    2023-05-15
    自定义@RequestBody注解 @RequestBody注解 @RequestBody注解获取JSON数据
  • Spring MVC如何通过添加自定义注解格式化数据
    这篇文章主要为大家展示了“Spring MVC如何通过添加自定义注解格式化数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring MVC如何通过添加自定义注解格式化数据”这篇文章吧。sp...
    99+
    2023-05-30
    springmvc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作