webservice的安全机制2---handler实现

2024-09-07 17:38

本文主要是介绍webservice的安全机制2---handler实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节摘要:本节介绍使用handler的方式来实现webservice的IP地址的校验。

 

1.引言

前一节介绍了使用users.lst文件来实现webservice的用户名和密码的校验,

本节介绍使用webservice的handler来实现webservice的安全校验。

这里,不用用户名和密码来实现安全校验,换一种方式,采用IP地址校验的方式。

这里通过一个配置文件来控制是否打开IP校验开关以及允许哪些IP地址的客户端可以访问。 

这里的开发还是基于上一节HelloService这个基本的webservice基础上来开发。

 

2.项目环境

   system:win7   

   myeclipse:6.5 tomcat:5.0  JDK:开发环境1.5,编译环境1.4

  axis:1.4

  项目结构图如下:

 

3.示例代码

配置文件

web.xml---web项目的配置文件,和基本的webservice配置没任何区别

web.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.4" 
 3     xmlns="http://java.sun.com/xml/ns/j2ee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 6     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 7 
 8        <servlet>
 9         <servlet-name>AxisServlet</servlet-name>
10         <servlet-class>
11             org.apache.axis.transport.http.AxisServlet
12         </servlet-class>
13     </servlet>
14     <servlet-mapping>
15         <servlet-name>AxisServlet</servlet-name>
16         <url-pattern>/services/*</url-pattern>
17     </servlet-mapping>
18     
19 </web-app>

server-config.wsdd---axis的配置文件,这里的配置就是一个webservice+handler的基本配置

server-config.wsdd
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <deployment xmlns="http://xml.apache.org/axis/wsdd/"
 3     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 4     <globalConfiguration>
 5         <parameter name="sendMultiRefs" value="true" />
 6         <parameter name="disablePrettyXML" value="true" />
 7         <parameter name="adminPassword" value="admin" />
 8         <parameter name="attachments.Directory"
 9             value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" />
10         <parameter name="dotNetSoapEncFix" value="true" />
11         <parameter name="enableNamespacePrefixOptimization"
12             value="false" />
13         <parameter name="sendXMLDeclaration" value="true" />
14         <parameter name="sendXsiTypes" value="true" />
15         <parameter name="attachments.implementation"
16             value="org.apache.axis.attachments.AttachmentsImpl" />
17         <requestFlow>
18             <handler type="java:org.apache.axis.handlers.JWSHandler">
19                 <parameter name="scope" value="session" />
20             </handler>
21             <handler type="java:org.apache.axis.handlers.JWSHandler">
22                 <parameter name="scope" value="request" />
23                 <parameter name="extension" value=".jwr" />
24             </handler>
25         </requestFlow>
26     </globalConfiguration>
27     <handler name="LocalResponder"
28         type="java:org.apache.axis.transport.local.LocalResponder" />
29     <handler name="URLMapper"
30         type="java:org.apache.axis.handlers.http.URLMapper" />
31     <handler name="Authenticate"
32         type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
33     <service name="AdminService" provider="java:MSG">
34         <parameter name="allowedMethods" value="AdminService" />
35         <parameter name="enableRemoteAdmin" value="false" />
36         <parameter name="className" value="org.apache.axis.utils.Admin" />
37         <namespace>http://xml.apache.org/axis/wsdd/</namespace>
38     </service>
39     <service name="Version" provider="java:RPC">
40         <parameter name="allowedMethods" value="getVersion" />
41         <parameter name="className" value="org.apache.axis.Version" />
42     </service>
43 
44     <transport name="http">
45         <requestFlow>
46             <handler type="URLMapper" />
47             <handler
48                 type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
49         </requestFlow>
50         <parameter name="qs:list"
51             value="org.apache.axis.transport.http.QSListHandler" />
52         <parameter name="qs:wsdl"
53             value="org.apache.axis.transport.http.QSWSDLHandler" />
54         <parameter name="qs.list"
55             value="org.apache.axis.transport.http.QSListHandler" />
56         <parameter name="qs.method"
57             value="org.apache.axis.transport.http.QSMethodHandler" />
58         <parameter name="qs:method"
59             value="org.apache.axis.transport.http.QSMethodHandler" />
60         <parameter name="qs.wsdl"
61             value="org.apache.axis.transport.http.QSWSDLHandler" />
62     </transport>
63     <transport name="local">
64         <responseFlow>
65             <handler type="LocalResponder" />
66         </responseFlow>
67     </transport>
68     
69      <!-- 配置一个handler,用来进行IP校验-->
70     <handler name="IPHandler" type="java:server.handler.IpAuthentionHandler">
71         <parameter name="status" value="success" />
72     </handler>
73      
74 
75     <!-- 配置自己的服务 -->
76     <service name="HelloService" provider="java:RPC">
77         <parameter name="allowedMethods" value="*" />
78         <parameter name="className" value="server.service.HelloServiceImpl" />
79 
80         <!-- 引入IP校验的handler -->
81         <requestFlow>
82             <handler type="IPHandler" />
83         </requestFlow>
84 
85     </service>
86 
87 </deployment>

 

服务端文件

服务类:

HelloServiceImpl.java

HelloServiceImpl.java
 1 package server.service;
 2 
 3 public class HelloServiceImpl {
 4 
 5     public String hello(String s) {
 6         System.out.println("我是服务端......");
 7         System.out.println("方法的入参为:"+s);
 8         return "hello," + s;
 9     }
10 }

handler处理类和配置文件:

IpAuthentionHandler.java

IpAuthentionHandler.java
 1 package server.handler;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.Properties;
 6 import java.util.regex.Pattern;
 7 
 8 import javax.servlet.http.HttpServletRequest;
 9 
10 import org.apache.axis.AxisFault;
11 import org.apache.axis.MessageContext;
12 import org.apache.axis.handlers.BasicHandler;
13 import org.apache.axis.transport.http.HTTPConstants;
14 import org.apache.axis.utils.Messages;
15 
16 //利用handler进行客户端IP校验
17 public class IpAuthentionHandler extends BasicHandler {
18 
19     private static final long serialVersionUID = 1L;
20     
21     private static Properties p = new Properties();
22 
23     static {
24         InputStream in = null;
25         try {
26             //注意这里的文件的存放位置和文件路径的书写方式; path 不以'/'开头时默认是从此类所在的包下取资源
27             //这里如果我们把ip.properties放在src根目录下,然后采用src/ip.properties的形式是没法取到此文件的;
28             //此时需要使用        in=IpAuthentionHandler.class.getClassLoader().getResourceAsStream("ip.properties");
29             in = IpAuthentionHandler.class.getResourceAsStream("ip.properties");            
30             p.load(in);
31         } catch (IOException e) {
32             System.out.println("ip.properties配置文件加载失败!");
33             e.printStackTrace();
34         } finally {
35             if (null != in)
36                 try {
37                     in.close();
38                 } catch (IOException e) {
39                     System.out.println("关闭流操作发生异常!");
40                     e.printStackTrace();
41                 }
42         }
43     }
44 
45     public void invoke(MessageContext messageContext) throws AxisFault {
46         String status=(String)this.getOption("status");
47         System.out.println("IpAuthentionHandler's  status is :"+status);
48 
49         String uri = messageContext.getSOAPActionURI();
50         String targetService = messageContext.getTargetService();
51 
52         System.out.println("webservice开始IP认证:service>>" + uri + "/"+ targetService);
53         String name = HTTPConstants.MC_HTTP_SERVLETREQUEST;
54 
55         HttpServletRequest request = (HttpServletRequest) messageContext
56                 .getProperty(name);
57         String remoteAddr = request.getRemoteAddr();
58         System.out.println("客户端IP:" + remoteAddr);
59 
60         String switcher = p.getProperty("ip_switcher");
61         System.out.println("IP校验开关:" + switcher);
62 
63         if ("on".equalsIgnoreCase(switcher)) {
64             System.out.println("服务端IP校验开关处于【打开】状态,需要校验IP");
65 
66             String regx = p.getProperty("ip_allow");
67             System.out.println("允许调用服务的IP地址有:" + regx);
68 
69             if (null != regx && regx.length() > 0) {
70 
71                 String regxArray[] = regx.split(",");
72                 boolean ip_check = false;
73                 for (int i = 0; i < regxArray.length; i++) {
74                     Pattern p = Pattern.compile(regxArray[i]);
75                     boolean flag = p.matcher(remoteAddr).find();
76                     if (flag) {
77                         ip_check = true;
78                         break;
79                     }
80                 }
81 
82                 if (ip_check) {
83                     System.out.println("IP校验通过!");
84                 } else {
85                     throw new AxisFault("",Messages.getMessage("wrong ip:"+remoteAddr),null,null);
86                 }
87             } else {
88                 System.out.println("请指定校验的客户端IP!");
89                 throw new AxisFault();
90             }
91         } else if ("off".equalsIgnoreCase(switcher)) {
92             System.out.println("服务端IP校验开关处于【关闭】状态,不需要校验IP");
93         }
94     }
95     
96 }

ip.properties

ip.properties
1 ##################################IP校验配置##################################
2 #IP校验开关 只能填写on或者off,不区分大小写
3 ip_switcher=on
4 
5 #允许调用对应的webservice服务的客户端IP地址 多个IP地址之间用逗号隔开
6 #当ip校验开关打开的时候,必须配置IP地址
7 ip_allow=10.10.147.124,10.10.147.123,127.0.0.1
8 
9 ##################################IP校验配置##################################

 

客户端文件

Test1.java

Test1.java
 1 package client;
 2 
 3 import java.net.URL;
 4 
 5 import javax.xml.rpc.ParameterMode;
 6 
 7 import org.apache.axis.client.Call;
 8 import org.apache.axis.encoding.XMLType;
 9 
10 public class Test1 {
11 
12     public static void main(String args[]) throws Exception {
13         webservice_user();
14     }
15 
16     public static void webservice_user() throws Exception {
17 
18         // 1.创建service对象,通过axis自带的类创建
19         org.apache.axis.client.Service service = new org.apache.axis.client.Service();
20 
21         // 2.创建url对象
22         String wsdlUrl = "http://localhost:8080/WebService05_Security/services/HelloService?wsdl";// 请求服务的URL
23         URL url = new URL(wsdlUrl);// 通过URL类的构造方法传入wsdlUrl地址创建URL对象
24 
25         // 2.创建服务方法的调用者对象call,设置call对象的属性
26         Call call = (Call) service.createCall();
27         call.setTargetEndpointAddress(url);// 给call对象设置请求的URL属性
28         String serviceName = "hello";// webservice的方法名
29         call.setOperationName(serviceName);// 给call对象设置调用方法名属性
30         call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式
31         call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型
32         // call.setTimeout(new Integer(200));//设置超时限制
33 
34         // 4.通过invoke方法调用webservice
35         String str = new String("pantp");
36         String dept = (String) call.invoke(new Object[] { str });// 调用服务方法
37 
38         // 5.打印返回结果
39         System.out.println("我是客户端.......");
40         System.out.println(dept);
41     }
42 
43 }

 

验证结果

发布工程,启动tomcat服务器:

1.看webservice在浏览器中是否可以正常显示

在浏览器中输入wsdl地址:

                http://localhost:8080/WebService05_Security/services/HelloService?wsdl

 

2.运行webservice客户端,看是否可以正常的访问

   目前IP配置文件中开关是打开的,并且127.0.0.1是允许访问此webservice服务的

  运行后客户端和服务端日志分别如下:

  

  

 3.模拟不能正常访问的IP地址的调用情况

    把ip.properties文件中的

      ip_allow=10.10.147.124,10.10.147.123,127.0.0.1

    改为:

      ip_allow=10.10.147.124,10.10.147.123

然后,重新发布项目,启动tomcat:

此时客户端和服务端的日志如下(此时需要时间稍微长一点,客户端才会出现以下异常):

这篇关于webservice的安全机制2---handler实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145713

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提