项目背景: 2002年的某保险老项目,项目是部署了多个服务器,每个服务器有2到多个服务(每个服务的日志对应一个日志文件),外部对接是通过F5分发到随机服务器上来进行访问,正式出现问题或者看一些问题就需要一个服务器一个服务器去找日志(运气不好直接看遍所有的服务器日志文件),所以考虑做个接口调用时调用的IP和端口的记录,来方便查找问题日志

web.xml增加拦截器是最简单的方法,不过leader害怕影响了整个项目不让修改,所以只能改自己涉及的接口,

接口是通过axis2的aar包方式发布(WEB-INFO下servers文件夹下所有aar包),这里全局axis2.xml也没有直接加载的是jar包里面默认的配置,leader这里也不让加全局的文件,也是担心影响整个项目(吐槽下,太事),所以只能通过moudle.xml来配置,然后修改自己接口的aar包里面的services,xml配置文件来拦截获取了

百度了老半天,终于解决了(这里参考): https://blog.csdn.net/u013313550/article/details/53285011

先来程序代码

  

package com.axis2.module;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.AxisDescription;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.modules.Module;
import org.apache.neethi.Assertion;
import org.apache.neethi.Policy;

/**该类虽然没有实现实际的功能,但是必须要存在的,因为模块的初始化与销毁都必须在该类中完成,*/
public class RMPhaseModule implements Module{ /**初始化模块类 */
public void init(ConfigurationContext paramConfigurationContext,
AxisModule paramAxisModule) throws AxisFault {
System.out.println("axis2[RMPhaseModule] 模块初始化完成!!!"); } public void engageNotify(AxisDescription paramAxisDescription)
throws AxisFault { } public boolean canSupportAssertion(Assertion paramAssertion) {
return false;
} public void applyPolicy(Policy paramPolicy,
AxisDescription paramAxisDescription) throws AxisFault { } public void shutdown(ConfigurationContext paramConfigurationContext)
throws AxisFault { System.out.println("axis2[RMPhaseModule] 模块已停止执行。。。");
} }

  

package com.axis2.handler;

import javax.servlet.http.HttpServletRequest;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.axis2.transport.http.HTTPConstants; import com.axis2.ServerInfo;

/**该类拦截请求,将自己需要的信息保存到线程变量里面,该类的调用在modules.xml里面配置*/
public class ServerInfoHandler extends AbstractHandler implements Handler{ public InvocationResponse invoke(MessageContext paramMessageContext)
throws AxisFault {
HttpServletRequest request = (HttpServletRequest)paramMessageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
System.out.println("ServerInfoHandler invoke() 初始化服务的信息到ThreadLocal");
ServerInfo serverInfo = new ServerInfo();
serverInfo.setIp(ServerInfo.getIpAddress(request, true));
serverInfo.setPort(request.getServerPort());
ServerInfo.local_thread.set(serverInfo);
return InvocationResponse.CONTINUE;
} }

  

package com.axis2.handler;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.engine.Handler;
import org.apache.axis2.handlers.AbstractHandler; import com.axis2.ServerInfo;

/** 程序处理完后,清楚线程变量的值 */
public class ServerInfoRevokeHandler extends AbstractHandler implements Handler{ public InvocationResponse invoke(MessageContext paramMessageContext)
throws AxisFault {
ServerInfo.local_thread.remove();
System.out.println("销毁ThreadLocal-ServerInfo");
return InvocationResponse.CONTINUE;
} }

  

package com.axis2;

import java.net.InetAddress;
import java.net.UnknownHostException; import javax.servlet.http.HttpServletRequest; /** 简单的pojo类,来保存信息 */
public class ServerInfo { public static final ThreadLocal<ServerInfo> local_thread = new ThreadLocal<ServerInfo>(); private String ip; private int port; public String getIp() {
return ip;
} public void setIp(String ip) {
this.ip = ip;
} public int getPort() {
return port;
} public void setPort(int port) {
this.port = port;
} /**
* 获取Ip地址
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request,boolean isLocal) {
String ipAddress = null;
try {
if(isLocal){
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return inet.getHostAddress();
}
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0
|| "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0
|| "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0
|| "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if (ipAddress.equals("127.0.0.1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress = inet.getHostAddress();
}
}
// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
// = 15
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}
} catch (Exception e) {
ipAddress = "";
}
// ipAddress = this.getRequest().getRemoteAddr(); return ipAddress;
} }

  这里涉及的程序代码就没有了,当时让我头疼的是配置这块的问题,不是项目启不来,就是module类加载不了,各种报错

配置


  编写modules.xml, RMPhase是默认axis2.xml配置里面预留出来的,可以直接用,这样不用重新整axis2.xml(这里是leader最忌讳的,其实是瞎担心)

<?xml version="1.0" encoding="UTF-8"?>
<module name="serverInfo" class="com.axis2.module.RMPhaseModule">
<InFlow>
<handler name="InFlowLogHandler" class="com.axis2.handler.ServerInfoHandler">
<order phase="RMPhase"/>
</handler>
</InFlow>
<OutFlow>
<handler name="OutFlowLogHandler" class="com.axis2.handler.ServerInfoRevokeHandler">
<order phase="RMPhase"/>
</handler>
</OutFlow>
<!-- <OutFaultFlow>
<handler name="FaultOutFlowLogHandler" class="com.test.module.handler.LoggingHandler">
<order phase="RMPhase"/>
</handler>
</OutFaultFlow>
<InFaultFlow>
<handler name="FaultInFlowLogHandler" class="com.test.module.handler.LoggingHandler">
<order phase="RMPhase"/>
</handler>
</InFaultFlow> -->
</module>

 自己对应接口的***.aar包里面的services.xml添加module

<service name="YTBWasForwardXmlProxy">
<description>YTBWasForwardXmlProxy</description>
<parameter name="ServiceClass">
com.sinosoft.wasforwardxml.project.padcheck.services.YTBWasForwardXmlProxy
</parameter>
<!-- 引入这个module-->
<module ref="serverInfo"/>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>

aar包是之前已经发布的,这里只需要重新修改下xml文件就行,我是没解压的情况下直接winrar里面修改的

剩下就是发布mar包了(这里要感谢参考文章的大神了)

目录结构

test(随便一个文件名都行,路径也无所谓)

------com
------com/axis2
------com/axis2/ServerInfo.class
------com/axis2/module
------com/axis2/module/RMPhaseModule
------com/axis2/handler
------com/axis2/handler/ServerInfoHandler
------com/axis2/handler/ServerInfoRevokeHandler
------META-INF
------META-INF/modules.xml

  

黑窗口(DOS命令进入test文件夹),打包文件名为serverInfo,jar,然后修改.jar为.mar

将serverInfo.jar修改为serverInfo.mar.复制到项目目录WEB-INFO下的modules文件夹下即可(无此文件夹新建)

这里注意命令 ( jar cvf serverInfo.jar .) 最后有个.别漏了

程序里面使用相应信息的时候直接 获取即可

弊端是如果其他arr也需要修改相应的配置文件,这个项目里面有相当多的aar,这也是个繁琐的过程,

最后leader针对业务最后只获取了服务器的IP(程序直接可以获取,无需请求对象),没有要其他的信息

我也只更新了自己的接口,方便自己查找日志,只更新了一个aar

axis2添加拦截器的更多相关文章

  1. spring boot 添加拦截器

    构建一个spring boot项目. 添加拦截器需要添加一个configuration @Configuration @ComponentScan(basePackageClasses = Appli ...

  2. javaweb添加拦截器

    js请求后台代码添加拦截器: package com.ctzj.biz.isale.deploy.controller; import java.io.IOException; import java ...

  3. (七)CXF添加拦截器

    今天开始讲下拦截器,前面大家学过servlet,struts2 都有拦截器概念,主要作用是做一些权限过滤,编码处理等: webservice也可以加上拦截器,我们可以给webservice请求加权限判 ...

  4. 使用CXF为webservice添加拦截器

      拦截器分为Service端和Client端 拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理.分为CXF自带的拦截器和自定义的拦截器 1.Servi ...

  5. SpringBoot如何添加拦截器

    在web开发的过程中,为了实现登录权限验证,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢? 步骤如下: 1.继承Web ...

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

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

  7. (八)CXF之用spring添加拦截器

    一.案例 本章案例是基于CXF之自定义拦截器基础之上改造的,目的是在服务端中用spring添加拦截器 配置web.xml <?xml version="1.0" encodi ...

  8. (五)CXF之添加拦截器

    一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...

  9. 在Java后端如何添加拦截器

    在安全编码规范中,在Java后端controller层接口需要对调用者的身份进行确认,以防非法用户进行访问.若是在controller层的每个接口处都添加逻辑判断,那么代码重复度高,并且费力费时.此时 ...

  10. Spring Boot 2.X 如何添加拦截器?

    最近使用SpringBoot2.X搭建了一个项目,大部分接口都需要做登录校验,所以打算使用注解+拦截器来实现,在此记录下实现过程. 一.实现原理 1. 自定义一个注解@NeedLogin,如果接口需要 ...

随机推荐

  1. 面试官:Dubbo一次RPC调用会经过哪些环节?

    大家好,我是三友~~ 今天继续探秘系列,扒一扒一次RPC请求在Dubbo中经历的核心流程. 本文是基于Dubbo3.x版本进行讲解 一个简单的Demo 这里还是老样子,为了保证文章的完整性和连贯性,方 ...

  2. oeasy教您玩转vim - 35 - # 正则表达

    ​ 查找进阶 回忆上节课内容 实时搜索 :set incsearch 大写小写 ignorecase 查找当前单词 * 正向按单词 # 反向按单词 g* 正向不按单词 g# 反向不按单词 继续查找 n ...

  3. oeasy教您玩转vim - 82 - # 函数function

    ​ 函数 function 回忆 关于宏,我们回忆一下 qa 开始录制宏 q 结束录制宏 @a 应用宏 qA 追加录制宏 控制寄存器内容其实就是控制宏 宏还有一些特性 可以多文件执行宏 可以并发运行宏 ...

  4. 【游记】CSP 2023

    day 0 和 printfmingren 整理了一下不会的知识点,发现有点多,遂开摆 音游真的太好玩了 对着<算法竞赛进阶指南>复习了下对拍器的写法,把部分算法的模板又打了一遍 感觉前途 ...

  5. 学习笔记--Java中final关键字

    Java中final关键字 关于Java语言中的final关键字: final是一个关键字,表示:最终的,不可改变 final修饰的类无法被继承 final修饰的方法无法被覆盖 final修饰的变量一 ...

  6. odoo 开发入门教程系列-基本视图

    在上一章中已经看到,odoo能够为给定模型生成默认视图.实际上,默认视图对于业务应用程序来说是不可接受的.相反,我们至少应该以逻辑的方式组织各个字段. 视图是在带有操作和菜单的XML文件中定义的.它们 ...

  7. php环境-2024年3月19日

    laravel 6[laravel的orm比其他框架的好用,可以写很少的代码就能完成] php 7.4 mysql 5.7 centos7 redis jwt 队列(laravel的redis队列,或 ...

  8. Jmeter函数助手29-dateTimeConvert

    dateTimeConvert函数用于将源格式进行目标格式的转换. 格式化时间:传入时间参数,此处格式需要与源时间格式一致 源时间格式:传入参数的时间格式 目标时间格式:想要转换成的格式 1.将源格式 ...

  9. Jmeter函数助手8-counter

    counter函数用于线程计数,类似计数器. TRUE每个用户有自己的计数器:FALSE使用全局计数器:即线程之间是否需要共享累加计数器,TRUE否,FALSE是 存储结果的变量名(可选) 1.线程之 ...

  10. 【MongoDB】Re05 分片集群(Win平台搭建)

    分片副本集1 (3实例)  主1 从1 裁1 分片副本集2 (3实例)  主1 从1 裁1 配置副本集(3实例) 主1 从2 路由(2配置) 用Windows平台搭建 配置目录设置: ├─config ...