webservice的安全机制2---handler实现
来源:互联网 发布:访问nginx图片显示404 编辑:程序博客网 时间:2024/05/22 15:54
本节摘要:本节介绍使用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配置没任何区别
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.AxisServlet12 </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的基本配置
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 <handler48 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
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
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) messageContext56 .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
1 ##################################IP校验配置##################################2 #IP校验开关 只能填写on或者off,不区分大小写3 ip_switcher=on4 5 #允许调用对应的webservice服务的客户端IP地址 多个IP地址之间用逗号隔开6 #当ip校验开关打开的时候,必须配置IP地址7 ip_allow=10.10.147.124,10.10.147.123,127.0.0.18 9 ##################################IP校验配置##################################
客户端文件
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";// 请求服务的URL23 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方法调用webservice35 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实现
- webservice的安全机制2---handler实现
- webservice客户端handler的处理机制
- webservice的安全机制1---users.lst
- webservice的安全机制3---Filter
- 讨论WebService安全机制的几篇博文
- webservice的安全机制1---users.lst
- webservice的安全机制1---users.lst
- 基于加密机制的WebService访问与通信安全
- handler机制实现ProgressDialog
- Handler实现机制图解
- Android Handler实现机制
- JAX-WS使用Handler实现简单的WebService权限验证
- JAX-WS使用Handler实现简单的WebService权限验证
- 【webservice】基于axis2设计带soaphead安全机制的webservice服务端
- AtomicInteger线程安全的实现机制
- AtomicInteger线程安全的实现机制
- WebService的简单安全
- 线索二叉树及相关函数
- Unity3D-NGUI动态加载图片
- ORACLE多会话同时锁表无法解锁解决办法
- 《算法给轮》第四周作业——图的表示
- WM_CTLCOLOR和OnCtlColor消息的用法
- webservice的安全机制2---handler实现
- 深入学习JDK 线程池(之六)
- JSP知识点
- 类加载器---URLClassLoader类
- etc/hosts file
- webservice系列3---chain
- 黑马程序员:C语言基本知识(1)
- 进程线程的的作用和区别
- CCNA学习笔记之网络互联