`

Java自定义URL协议

 
阅读更多

        Java 提供了对 URL 协议进行扩展的能力,通过扩展用户可以自定义 URL 通信协议, JDK 默认提供了对 HTTP,FTP,JAR,FILE 等的实现,而当需要自己定义通信协议的时候,就需要利用 JDK 提供的对 URL 扩展机制进行自定义。

         JDK 主要提供了如下三种方式对 URL 进行扩展,每种方式都有各自的使用场景,下面我们分别看看具体 JDK 都给我们提供了哪些扩展点。

1.         实现 URLStreamHandlerFactory 接口,然后调用 URL.setURLStreamHandlerFactory.

采用这种方式的情况下,需要确保应用的其他地方没有调用 setURLStreamHandlerFactory ,因为此方法只能调用一次,如果多次调用会抛出 java.lang.Error: factory already defined. 比如在一些应用服务器的中使用的时候就要多加注意。

 

2.         创建 URLStreamHandler 的子类,这种方式必须满足如下两个约定:

a)         子类的类名必须是 Handler ,同时最后一级的包名必须是协议的名称,比如你自己定义了名为 mem 的协议,那么 handler 的全名不须是 com.company.protocol.Handler.

b)         JVM 启动的时候,需要设置 java.protocol.handler.pkgs 系统属性,如果有多个实现类,那么中间用 | 隔开。

 

上面两个约定我们可以通过查看 JDK 中的 URL 的源代码,可以清晰的看到为什么要遵循这两个约定。下面我们就看一下 JDK 中关于 URL 的源代码。

static URLStreamHandler getURLStreamHandler(String protocol) {
		  …… ……   
            
            if (handler == null) {
           	 //这里获取java.protocol.handler.pkgs系统属性,同时用“|”隔开 
                String packagePrefixList = null;
                packagePrefixList
                    = (String) java.security.AccessController.doPrivileged(
                    new sun.security.action.GetPropertyAction(
                        protocolPathProp, ""));
                if (packagePrefixList != "") {
                    packagePrefixList += "|";
                }

                // REMIND: decide whether to allow the "null" class prefix
                // or not.
                packagePrefixList += "sun.net.www.protocol";
			
                
                StringTokenizer packagePrefixIter =
                    new StringTokenizer(packagePrefixList, "|");

                while (handler == null &&
                    packagePrefixIter.hasMoreTokens()) {

                    String packagePrefix =
                        packagePrefixIter.nextToken().trim();
                    try {
					//这里packagePrefix就是你自己制定的包名,protocol为你自定义的协议名,这
                        String clsName = packagePrefix + "." + protocol +
                            ".Handler";
                        Class cls = null;
                        try {
                            cls = Class.forName(clsName);// 用加载URL的类加载器加载
                        } catch (ClassNotFoundException e) {
                            ClassLoader cl = ClassLoader.getSystemClassLoader(); //采用系统类加载器加载
                            if (cl != null) {
                                cls = cl.loadClass(clsName);
                            }
                        }
                        if (cls != null) {
                            handler =
                                (URLStreamHandler) cls.newInstance();
                        }
                    } catch (Exception e) {
                        // any number of exceptions can get thrown here
                    }
                }
            }
        }
}

当采用这种方法的时候,需要注意的是自己写的 Handler 类必须放在系统类加载器可以加载到的地方。

 

3   实例化一个 URL 对象的时候传递一个 URLStreamHandler 的实例。这种方式的情况下, JDK 需要一个名为 specifyStreamHandler NetPermission ,这就要求你需要去修改 jdk 安装目录下的 java.policy 文件进行授权。

2
1
分享到:
评论

相关推荐

    Java URL自定义私有网络协议

    Java URL自定义私有网络协议是一项技术,允许开发者创建并使用自定义的协议与网络资源进行交互。在Java中,URL(Uniform Resource Locator)是一种特殊类型的URI(Uniform Resource Identifier),用于定位互联网上...

    18自定义协议.rar

    5. **协议引挚注册**:在Windows系统中,可以通过注册自定义URL协议,使得点击特定链接能启动本地程序。例如,`mailto:`协议用于启动邮件客户端,`tel:`协议用于拨打电话。 6. **安全与权限**:任何尝试从网页调用...

    java使用HttpClient通过url下载文件到本地

    综上所述,通过Java的HttpClient库,可以在Eclipse环境中编写程序,实现从指定URL下载文件到本地的功能。通过理解HttpClient的工作原理和提供的API,开发者可以构建出稳定、高效的文件下载解决方案。

    将内容中的符合url格式的字符串转换为超链接(JAVA版)

    当然,实际应用中可能需要对URL进行更复杂的处理,比如检查其有效性、添加自定义标签文本等。但这个基本实现应该足以解决大多数基础需求。记住,使用正则表达式时要注意避免过度匹配或漏匹配,这可能需要根据具体...

    java访问https网址下载文件(含证书)

    在Java中,HTTPS访问涉及到`java.net.URL`,`java.net.HttpURLConnection`以及可能的`javax.net.ssl.SSLContext`和`TrustManager`类。 1. **配置SSL上下文**: 当你访问HTTPS站点时,Java默认的TrustStore可能不...

    JAVA2网络协议内幕-2

    8. **Java网络编程API**:Java的java.net包包含了所有网络编程相关的类和接口,如InetAddress用于IP地址操作,URL和URI处理网络资源的标识,以及NNTP、SNMP等其他网络协议的实现。 9. **网络异常处理**:网络编程...

    JAVA CEF嵌入式浏览器框架实例及参考资料 一

    7. **优化和定制**:Java CEF提供了丰富的API,可以进行各种定制,如禁用某些特性、设置安全策略、添加自定义协议处理器等。 学习和理解Java CEF实例,有助于开发者深入掌握如何在Java应用中有效利用这一强大的工具...

    Java读URL, 如Q日志

    在Java编程中,读取URL通常涉及到网络编程和文件I/O操作。这篇博客"Java读URL, 如Q日志"可能讲述了如何使用Java从指定的URL读取数据,特别是日志文件。在实际开发中,这可能是为了监控、分析或者处理远程服务器上的...

    java httpcore

    Java HTTPCore是一个重要的开源库,它是Apache HttpClient项目的一部分,专门用于处理HTTP协议的底层细节。这个库提供了核心的HTTP传输机制,使得开发者可以构建高效、灵活的HTTP客户端和服务器应用程序。HTTPCore的...

    Java中的SSL及HTTPS协议实例源码

    Java中的SSL(Secure Socket Layer)和HTTPS(Hypertext Transfer Protocol Secure)协议是网络通信安全的重要组成部分,尤其在处理敏感信息如用户登录凭证、支付数据等时,它们提供了必要的加密和身份验证机制。...

    java URL URLConnection

    在Java编程语言中,`URL`(统一资源定位符)和`URLConnection`是网络编程中的核心类,用于访问和交互互联网上的资源。这篇博客文章可能深入解析了这两个类的使用和内部工作原理。 `URL`类是Java.net包中的一个关键...

    整理后的url工具类

    在Java中,`java.net.URL`类提供了对这些部分的访问和操作,但有时它的功能可能不够全面,因此开发者会创建自定义的工具类来扩展其功能。 这个“整理后的url工具类”可能包含以下关键功能: 1. **URL构建**:允许...

    Http.rar_HTTP java_HTTP协议_http解析

    在Java中,这些可以通过各种库或者自定义解析逻辑来实现。例如,对于JSON格式的数据,可以使用Jackson或Gson库进行解析。 在开发过程中,理解HTTP协议的原理和Java中处理HTTP的方法,对于构建网络应用至关重要。这...

    Java中如何通过https调用Webservice接口_测试环境.rar

    本主题将详细讲解如何在Java环境下通过HTTPS协议来安全地调用Web Service接口,特别是在测试环境中。 首先,我们需要理解HTTPS的核心特性:它基于HTTP协议,但在数据传输层增加了SSL/TLS协议,提供了加密处理、...

    ssl.tar.gz_URL HTTPS_https_https java_https ssl_java https

    总的来说,这个主题涵盖了Java编程中使用HTTPS URL连接的基础知识,涉及到SSL/TLS协议、Java的`java.net`和`javax.net.ssl`包,以及如何处理SSL上下文和证书验证。理解并正确实现这些概念对于开发安全的Web应用程序...

    java 用HttpsURLConnection进行传递中文时错误总结

    在Java编程中,当涉及到网络通信,特别是使用HTTPS协议与远程服务器进行数据交换时,可能会遇到各种问题,尤其是在处理包含中文字符的数据时。本篇文章将深入探讨如何使用`HttpsURLConnection`来正确地发送和接收...

    钉钉对接Java demo

    Java应用需要设置回调地址,当钉钉服务器触发这些事件时,会将事件信息发送到指定的回调URL,应用接收到事件后进行相应的处理。 5. **错误处理与重试机制**:在对接过程中,可能会遇到网络问题或者API调用失败的...

    基于java的WebSocket协议的实现 WebSocket4J.zip

    在Java环境中实现WebSocket协议,开发者通常会利用Java API for WebSocket(JSR 356)或者第三方库,如WebSocket4J。WebSocket4J是一个轻量级的、易于使用的Java WebSocket框架,它提供了对WebSocket协议的全面支持...

    java后台调试URL

    在Java后台开发中,调试URL是一项重要的工作,它涉及到如何通过HTTP请求与服务器进行交互,获取或发送数据。从给出的示例中,我们可以提取出以下几个关键知识点: 1. **URL结构**: - URL(统一资源定位符)是访问...

    例10.03 使用URLConnection对象访问远程文件.rar_remote access java_url_远程文件

    `URLConnection`是Java API的一部分,它提供了连接到任意URL的能力,不仅限于HTTP或HTTPS,还包括FTP和其他网络协议。 1. **URL对象与URLConnection类** - **URL对象**:URL(Uniform Resource Locator)是统一...

Global site tag (gtag.js) - Google Analytics