一、修改端口号
方法一:通过console进入,servers—>点击需要修改端口号的Server—>修改Listen Port项。
方法二:修改bea\user_projects\domains\base_domain\config\config.xml。
初始
<server>
<name>AdminServer</name>
<listen-address></listen-address>
</server>
修改
<server>
<name>AdminServer</name>
<ssl>
<enabled>false</enabled>
</ssl>
<listen-port>80</listen-port>
<listen-address></listen-address>
</server>
ssl是和HTTPS,即HTTP的安全版有关,也可以使用方法一配置。推荐方法一。
二、省略端口号
HTTP协议的默认端口是80,采用上述方法将WebLogic的端口号修改为80即可。
参考地址:http://blog.csdn.net/davidhsing/article/details/7977787
现在记录HTTPS服务端的编写。
import ssl, socket, time
if __name__ == "__main__":
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
#context.load_cert_chain(certfile=‘key_pub.pem’, keyfile=‘key_priv.pem') #可以分开定义公钥和私钥文件,也可以合并成一个文件
context.load_cert_chain(certfile=’cert.pem')
bindsocket = socket.socket()
bindsocket.bind(('127.0.0.1', 443))
bindsocket.listen(5)
newsocket, fromaddr = bindsocket.accept()
connstream = context.wrap_socket(newsocket, server_side=True)
try:
data = connstream.recv(1024)
print(data)
buf = 'Hi NN%f\n\n\n\n'%time.time()
buf = buf.encode()
connstream.send(buf)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
bindsocket.close()
此例没有使用socketserver框架,目的在于测试ssl模块的用法。
继续,用框架实现HTTPS服务
import socketserver, ssl, time
class MyHTTPSHandler_socket(socketserver.BaseRequestHandler):
def handle(self):
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.load_cert_chain(certfile="cert.pem")
SSLSocket = context.wrap_socket(self.request, server_side=True)
self.data = SSLSocket.recv(1024)
print(self.data)
buf = 'test HTTPS Server Handler<br>%f'%time.time()
buf = buf.encode()
SSLSocket.send(buf)
if __name__ == "__main__":
port = 443
httpd = socketserver.TCPServer(('localhost‘, port), MyHTTPSHandler_socket)
print(’https serving at port', port)
httpd.serve_forever()
说明:handle()函数负责所有与客户端的通信。客户端连接过来之后,ssl模块载入证书,并用SSLSocket对socket进行封装,屏蔽底层的加密通信细节。
下面再给出HTTPS文件服务器代码,文件访问功能由SimpleHTTPRequestHandler实现,数据加密传输由ssl实现。
import socketserver, ssl, time, http.server
class MyHTTPS_SimpleHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def setup(self):
print('setup')
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.load_cert_chain(certfile=‘cert.pem’)
SSLSocket = context.wrap_socket(self.request, server_side=True)
self.rfile = SSLSocket.makefile('rb', self.rbufsize)
self.wfile = SSLSocket.makefile('wb', self.wbufsize)
if __name__ == "__main__":
port = 443
httpd = socketserver.TCPServer(("localhost", port), MyHTTPS_SimpleHTTPRequestHandler)
print('https serving at port', port)
httpd.serve_forever()
最后,要指出的是setup()和handle()都是在客户端开始连接之后才被调用,从顺序上来说setup()先于handle()。
之前在网上看到了有人关于Session详解,感觉不错,的确很多人对Cookie与Session一直处于混淆状态,因此,我在这里借用了一部分前辈的总结,经过自己的理解进行修改和完善,并补充了二者之间的区别和联系,如有不妥当之处还请各位批评指正。
一、Session概念
Session,中文翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个会话。在这里Session是指一个浏览器从打开访问一个WEB站点到关闭对这一WEB站点的访问的全过程。
二、HTTP协议与状态保持
HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的。
Cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的Session机制则是又一种在客户端与服务器之间保持状态的解决方案。
让我们用几个例子来描述一下Cookie和Session机制之间的区别与联系。
比如一家咖啡店有优惠活动:喝5杯咖啡免费赠一杯咖啡,然而顾客一般不可能一次性消费5杯咖啡,这时就需要某种方式来纪录某位顾客的消费数量。因此有下面的几种方案:1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客
户端保持状态,即Cookie机制。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就
是在服务器端保持状态,即Session机制。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以Session机制可能需要借助于Cookie机制来达到保存标识的目的,但实际上它还有其他选择。
三、理解Cookie机制
Cookie机制的基本原理就如上面的例子一样,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。
Cookie分发机制:
正统的Cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的Cookie。并存储在Internet临时文件里,然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成Cookie。而Cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的Cookie,如果某个Cookie所声明的作用范围(是由Cookie中的路径与域合组成)大于等于将要请求的资源所在的位置(例如资源所在的位置为www.google.com/foo而Cookie中的范围可能是www.google.com/即大于或者www.google.com/foo即等于),则把该Cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。
Cookie内容:
Cookie的内容主要包括:名字,值,过期时间,路径和域。
1.域:可以指定某一个域比如.google.com,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com。
2.路径:就是跟在域名后面的URL路径,比如/或者/foo等等。
路径与域合在一起就构成了Cookie的作用范围。
如果不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,因为它只是保存在客户端内存中,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。存储在硬盘上的Cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的Cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl+N(或者从文件菜单)或者其他IE内核的浏览器(如360或搜狗)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存Cookie;对于 Mozilla Firefox8.0,所有的进程和标签页都可以共享同样的Cookie。
一般来说是用JavaScript的window.open打开的窗口会与原窗口共享内存Cookie。浏览器对于会话Cookie的这种只认Cookie不认人的处理方式,经常给采用Session机制的web应用程序开发者造成很大的困扰。
下面就是一个Goolge设置Cookie的响应头的例子
HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html
当浏览器再次访问Goolge的资源时自动向外发送Cookie
四、理解Session机制
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含