接收器Acceptor在接收连接的过程中,根据不同的使用场合可能需要不同的安全级别,例如在支付相关的交易就必须对信息加密后再发送,这其中还涉及到密钥协商的过程,而在另外一些普通场合则无需对报文加密。反应到应用层则是使用http与https的问题,具体跟http/https相关的一些知识请到前面相关章节温习。

看一张跟https协议的组成层次图,它在应用层添加了一个TLS\SSL协议,于是组成了https协议。简单讲TLS\SSL协议给每次通信①提供认证服务,认证本次会话实体身份的合法性。②提供加密服务,强加密机制能保证通信过程中的消息不会被破译。③提供防篡改服务,利用Hash算法对消息进行签名,通过验证签名保证通信内容不被篡改。Java为开发者提供了方便的手段实现TLS\SSL协议,这就是安全套接字,它是Socket的安全升级版。Tomcat作为web服务器必须要实现对两种协议的支持,在java语言中,http协议对应Socket,而https则对应SSLScoket,在程序里根据不同的协议产生不同的套接字,于是引入了工厂模式处理套接字的相关操作,这个便是ServerSocketFactory工厂类。再一个由于不同厂商可自己定制SSL的实现,所以在具体程序实现时还有一些关于SSL实现的相关类,这些在前面的“Tomcat中的ssl安全信道的实现”章节有很详细的说明,可移步前往重新查阅。

ServerSocketFactory作为tomcat一个重要的组件,先看看它的运行逻辑是怎样的。首先说明下Tomcat中有两个工厂类DefaultServerSocketFactory和JSSESocketFactory,它们都实现了ServerSocketFactory接口,分别对应http协议套接字通道与https协议套接字通道。根据实际需求,假如机器的某端口使用加密通道则由JSSESocketFactory作为套接字工厂,反之则使用DefaultServerSocketFactory作为套接字工厂,于是tomcat中存在一个变量SSLEnabled用于标识是否使用加密通道,通过对此变量的定义就可以决定使用哪个工厂类,tomcat提供了外部配置文件供开发者和运维人员自定义。

实际上我们通过对server.xml进行配置就可以定义某个端口开放并是否使用安全通道,例如,

①   http协议对应的非安全通道

<service>

<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />

</service>

②    https协议对应的安全通道

<service>

<Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true"maxThreads="150" scheme="https" secure="true"clientAuth="false" sslProtocol="TLS" />

</service>

第一种配置告诉tomcat开放8080端口并使用http1.1协议进行非安全通信。第二种配置告诉tomcat开放8443端口并使用http1.1协议进行安全通信,其中安全协议是使用TLS协议。需要很注意的是加红加粗字体的SSLEnabled=”true”,此变量值会在tomcat启动初始化时读入自身程序中,运行时也正是通过此变量判断使用哪个套接字工厂,DefaultServerSocketFactory还是JSSESocketFactory。

把ServerSocketFactory工厂组件引入后整个结构图变为如下:

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

套接字工厂——ServerSocketFactory的更多相关文章

  1. 以Server模式启动Derby服务竟然抛套接字权限异常

    以Server模式启动Derby服务竟然抛套接字权限异常:access denied ("java.net.SocketPermission" "localhost:15 ...

  2. Python套接字

    1.客户端/服务器架构 什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统.在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件 ...

  3. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  4. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  5. WebSocket异常 通常每个套接字地址(协议/网络地址/端口)只允许使用一次

    websocket的实例:http://blog.csdn.net/for_cxc/article/details/51500185 问题: 新建一个连接通信没有问题,但是如果关闭再建立就会报错:通常 ...

  6. Apache报错信息之通常每个套接字地址(协议/网络地址/端口)只允许使用一次(could not bind to address 0.0.0.0:80)

    我们常常在执行 httpd –k restart 重启Apache时报错提示: (OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次.  : AH00072: make_soc ...

  7. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  8. 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket

    这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...

  9. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

随机推荐

  1. VGG网路结构

    VGG网络的基本结构 如图所示,从A到E网络的深度是逐渐增加的,在A中有11个权重层(8个卷积层,3个全连接层),在E中有19个权重层(16个卷积层,3个全连接层),卷积层的宽度是十分小的,开始时在第 ...

  2. 使用svn无法cleanup和lock问题

    step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe 找到 Precompiled Binaries for W ...

  3. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  4. 牛客网编程练习之PAT乙级(Basic Level):1032 选大王

    典型的约瑟夫环问题 AC代码: import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @ ...

  5. Android Design Support Library使用详解——TextInputLayout与TextInputEditText

    TextInputLayout 在谷歌的Material Design中,文本输入是这样表现的:当用户点击输入框想要输入文字时,如果输入框是空的,那么它的提示文字(hint)就会变小并且同时移动到输入 ...

  6. Mysql 统一设置utf8字符

    无聊的关于有效配置文件路径的备忘 原来阿里云服务器的mysql 5.5 , 配置/etc/my.cnf是没有任何作用的,需要编辑/etc/mysql/my.cnf 妈的, 就是这一点让我测试了两天, ...

  7. [Angular2]eclipse中angular2开发环境的搭建

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan 环境准备 1.eclipse neon 2.网络连接 插件地址 eclipse的插件市场地址: htt ...

  8. VirtualBox: How to config higher screen resolution

    Issue: Default Screen Resolution in Virtualbox instance is 800*600 which might be too small for gene ...

  9. Android简易实战教程--第四十二话《Spinner下拉级联效果》

    本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...

  10. [OpenCV] 编译源程序 2.4.10 以支持 CUDA

    对源代码进行如下修改: H:\Software\opencv\sources\modules\gpu\src\nvidia\core\NCV.cu中添加 #include <algorithm& ...