碰到https请求下发送http请求问题

HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。

SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。

HTTP工作原理

网络爬虫抓取过程可以理解为模拟浏览器操作的过程

URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。


在https页面下的带有相对路径的请求都会与页面的协议保持一致。如果想在https页面下发送http的请求,如果只把链接写死成为http的绝对路径是不够的,这样会导致http的请求与总页面https的请求的session不一致。

为什么呢?原因是https的请求中服务器发回的cookie是标记为"secure"的,而http的请求时非"secure","由于在服务器端secure"的cookie不会兼容非"secure"的,所以当http的请求携带着同一jsessionid的cookie到达服务器时,服务器拒绝非"secure",进而返回的结果是一个新的非"secure"的cookie,于是两个session就不同了。

 怎么解决呢?由原因分析可知,两个session不同,更具体说是cookie的状态不同。那么办法是,在接收到第一个https请求的响应后 到 发送下面的http请求之前,将cookie去"secure"状态,但是又要保证jsessionid不变。具体操作可以新建一个cookie(新建的是非"secure"状态),然后赋予同一个jessionid,然后加入response中。


代码如下:

Cookie cookie = new Cookie("JSESSIONID", req.getSession().getId());
cookie.setPath(req.getContextPath());
resp.addCookie(cookie);


你可能感兴趣的:(碰到https请求下发送http请求问题)