JavaWeb之【Session】

B/S结构系统的会话机制(Session机制)

一、什么是会话?

1、会话对应单词:session

2、用户打开浏览器,进行一系列操作,最终浏览器被关闭,这整个过程叫做:会话。会话在服务器端也有一个对应的Java对象,这个java对象叫做session

3、一个会话当中包含多次请求。

二、在java的Sevlet规范中,session对应的包名

1、HttpSession(jakarta.servlet.http.HttpSession)

2、session机制属于B/S结构的一部分,不同语言都会对session机制进行实现。

3、session对象的最主要作用:保存会话状态。

三、为什么需要session对象来保存会话状态

1、因为Http协议是一种无状态协议。

2、什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就会断开。

3、这样的无状态协议可以降低服务器端的压力。

四、为什么不使用request对象或ServletContext对象保存会话状态?

1、request是一次请求一个对象,域太小。

2、ServletContext对象是服务器启动的时候创建,服务器关闭的时候才销毁。这个ServletContext只有一个,它的域太大。

3、request<session<application

五、session对象的说明

1、session对象是存储在服务器端的

2、一个session对象对应一个会话

3、一次会话中包含多次请求

六、session对象的获取

1、HttpSession session = request.getSession();

(1)从服务器中获取当前的session对象,如果没有session对象,则新建

2、HttpSession session = request.getSession(false);

(1)从服务器中获取当前session对象,如果获取不到session,则不会新建,返回一个null

七、session实现原理

1、在Web服务器中有一个session列表,类似于map集合,在这个map集合的key存储的是sessionid,value存储的是对应的session对象。

2、用户发送第一次请求时,服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器会将session的id发送给服务器,浏览器会将session的id保存在浏览器的缓存中。

3、用户发送第二次请求时,会自动将浏览器缓存中的sessionid自动发送给服务器,服务器获取到sessionid,然后从session列表中查找到对应的session对象。

4、关闭浏览器,为什么会话结束。

(1)关闭浏览器,浏览器中的sessionid消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionid,自然找不到服务器中对应的session对象。session对象找不到等同于会话结束。

5、JSESSIONID=xxxxxxx,这个是以Cookie的形式保存在浏览器中,浏览器只要关闭,这个Cookie就没有了。

八、session对象什么时候被销毁

1、超时销毁

(1)可在web.xml中使用<session-config>标签的<session-timeout>进行配置

2、手动销毁

(1)session.invalidate();

九、Cookie禁用

1、浏览器禁用Cookie时,表示服务器正常发送cookie给浏览器,但是浏览器拒收了。【服务器仍旧发送】

2、每一次请求都会获得新的session对象。

3、cookie禁用了,session机制仍可以实现。

(1)可以,需要使用URL重写机制

(2)URL重写机制会提高开发者的成本,在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; public class HttpTest { private HttpURLConnection hc = null; private static final String oneUrlString = "http://xxx.jsp"; private static final String twoUrlString = "http://xxx.action"; public String getSessionId() { String sessionId = ""; try { URL url = new URL(oneUrlString); hc = (HttpURLConnection) url.openConnection();//默认的用GET提交 hc.setDoOutput(true); hc.connect(); Map map = hc.getHeaderFields(); //得到Cookie的所有内容,包括SESSIONID,在进行下次提交的时候 直接把这个Cookie的值设到头里头就行了 //淡然只得到SESSIONID也很简单的 ,但是有时候Set-Cookie的值有几个的 List list = (List) map.get("Set-Cookie"); if(list.size() == 0||list == null) { return null; } StringBuilder builder = new StringBuilder(); for(String str : list) { sessionId = builder.append(str).toString(); } hc.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sessionId; } public String getResponseContext(String parameters) { String responseContext = ""; try { URL url = new URL(twoUrlString); hc = (HttpURLConnection) url.openConnection();//使用POST提交 hc.addRequestProperty("Cookie", getSessionId()); hc.setDoOutput(true); hc.connect(); OutputStream out = hc.getOutputStream(); //参数是a=""&b=""这样拼接的一个串 out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb2312"); BufferedReader read = new BufferedReader(reader); StringBuilder builder = new StringBuilder(); String str = ""; while((str = read.readLine()) != null) { builder = builder.append(str); } read.close(); reader.close(); in.close(); hc.disconnect(); responseContext = builder.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return responseContext; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值