很明显,浏览器在渲染html页面之前发送了多个请求。假设用户打开一个页面并且浏览器发送3请求,该请求由servlet Filter:
捕获public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
saveVisitorQueue = new SaveVisitorQueue();
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (req.getSession().getAttrbute("name")!=null) {
req.getSession().setAttrbute("name", "helloValue" + new Date());
}
}
}
第一个请求“初始化”会话atrribute,但其他人呢?如果用户第一次访问页面时请求没有任何具有会话ID的cookie。只有在处理完第一个请求后才会设置此ID。
其他发送的请求是否具有相同的会话和相同的属性?服务器如何“建立”几个“第一”请求的会话?
答案 0 :(得分:4)
通常不会有几个"第一个"要求。浏览器需要首先显示它所显示的页面,然后在解析该页面时,会请求该页面引用的资源(图像,样式表,JavaScript等),通常是在遇到时它们(尽管有各种方法可以修改)和并行(最多可达某些特定于浏览器的限制)并且通常在相同的TCP / IP连接上(取决于浏览器和服务器)。因此,第一页请求应设置会话ID,后续请求将具有会话cookie。
答案 1 :(得分:0)
它在浏览器中如何工作?
fisrt请求要求一些HTML
服务器发回一些Html和... sessionId
浏览器解析html并执行一些请求(css,js,images)以便能够正确呈现页面并将sessionId发送回服务器。
答案 2 :(得分:0)
浏览器在呈现HTML时会向服务器发送多个请求。 服务器第一次将HTML返回到浏览器,然后浏览器开始渲染。当浏览器看到类似的标签时,或者,这意味着他必须再次发出获取相关资源的请求,但他不会再次发送对整个网页的请求,仅针对资源。 关于Session对象,第一次调用request.getSession()时,它将创建一个新会话和一个带有会话ID的cookie,仅当客户端支持cookie时。下次用户发出请求时,request.getSession()将返回与请求关联的当前会话。因此,您的问题的答案是:是的,其他发送的请求将具有相同的会话和相同的会话属性,直到会话无效或超时。 有关更多信息,我建议阅读“Head First Servlets and JSP”一书,我发现它非常有用且有趣。在其中,您对servlet如何工作有广泛的解释。