我就写了一个很简单很简单的Servlet,用户在页面上输入用户名和密码,提交到Servlet这边来,doGet()方法就直接跟据传过来的用户名在DB里查找想要的数据,然后再把数据在页面上展现出来。就这样一个很简单的功能,但是我想问一个小问题,我在电脑上同时开两个浏览器,一个用UserA登录,一个用UserB登录,Servlet是怎么保证把serA的数据发只给UserA的浏览器,然后把UserB的数据只发给UserB的浏览器的呢?为什么没有出现发乱了的情况呢,即UserA,UserB同时访问Servlet,UserA的结果发给了UserB,而UserB的结果却发给了UserA。谢谢。
码了半天字,一提交没了郁闷跟Cookie没有啥关系,Cookie主要是跟会话有些关系,你的问题还不涉及到会话。你的问题仅仅是单次请求之间为什么不会发生混淆,这个其实说明你的基础知识确实比较薄弱。首先,中间件(Tomcat)准备了N个服务线程,专门为每个请求提供服务;
其次,浏览器发送请求给服务器时,就会建立一个TCP长连接,而且任何一个请求都是相互独立的长连接,即便是来自同一个浏览器;
那么,中间件会为这个TCP连接分配一个服务线程,提供一对一服务,该服务线程会根据请求信息准备好干净的上下文环境,比如request、response等;直到该请求服务完毕,该线程与TCP连接之间的关系都是一对一的,从一而终,不是玩3P的;当然服务完毕又会释放回中间件的线程池,等待下一次服务。
所以,你所说的什么混淆啥的,根本不可能发生好吧。
是的,Servlet是单例模式,无论有多少个客户端同时发起请求,都只会有一个实例。但是这并不会导致一个个等待。执行是线程的概念,而Servlet可以理解为只是提供了执行的脚本:
类似于大合唱:线程就是合唱人,傻傻的对着Servlet这个大屏幕上的歌词照着唱就完了。