一个请求的过程分析

来源:互联网 发布:增加一个字段sql 编辑:程序博客网 时间:2024/05/16 20:40
servlet容器(tomcat) 启动,加载所有web应用程序

web应用程序加载完后,servlet容器创建有且仅有一个servletcontext,并加载到内存当中

然后servletcontext对web.xml进行一次解析(servlet,filter,listener),如果是注解的会去找@WebServlet,@WebFilter,@WebListener,解析完了之后,将它们放入内存当中

接着容器会附加一个web服务用来监听特定端口的(80)的http请求

当用户通过浏览器发送http请求,servlet容器会创建HttpServletRequest和HttpServletResponse对象,并开启一个线程对其进行处理,具体处理是交给匹配的url的filter和servlet实例来处理,所有的处理过程都在同一个线程当中

如果这个请求是来自当前客户端的第一个请求,那么通过request.getSession()获得一个HttpSession,由此生成了一个独一无二的session id,
(通过session.getId()获得),并把它存储在服务器的内存当中同时给头部写入一个JSESSIONID 的cookie,cookie的值就是内存中的sessionid

这个httpsession有一个保存期,而这个保存期是根据web.xml中解析得到的,默认是30分钟

如果过了保存期,原来的session就会被回收,并重新生成一个,因此原来的session中保留的东西都将被清空

在返回第一个的响应当中,将cookie的值写入了浏览器当中,此时sessionid也就保存在了浏览器的cookie当中了

在cookie当中的session,叫session cookie,它也有生命周期,它的生命周期受浏览器影响,当浏览器关闭时,session cookie会被清除

再打开浏览器进行请求时,由于cookie没有关联上session,因此request.getSession会重新返回一个新生成的httpsession,然后把它写入到cookie中,同时更新内存当中的session

对于cookie来说,它是永久保存在客户端的,除非给它设置过期的时间。因此在服务器的内存中是没有的

接着再来说请求,请求中包含了很多信息,请求头,请求体,因此可以通过request中的方法,获取其中的内容,但是无法设置

请求处理完后,会返回一个请求处理结果,而在请求结果中,可以写请求的头部和体部(如jsp)

一旦请求响应完毕,request和response对象将会被回收,线程被释放。

其他请求过程都是在各自的线程当中做同样的事情,因此不用考虑请求之间的相互影响, 但是同一个servlet,可以同时处理多个请求,那么可能会出现线程不安全的问题(如request共享字段域)

如果将容器被关闭,所有的web应用中的servletcontext和servlet,filter,listener对象都将被回收, 并且将内存中的session保存下来,以便下次启动时不会丢失信息

总体来说servletcontext的存活时间不受客户端的影响,是最长的,如果在它上面设置了属性,那么任何其它的对象都可以用(servletcontext,httpservletrequest,httpsession)

cookie保存于客户端且受至于限定时间,因此它的时间不固定,但是总体来说它的存活时间应该排第二位

httpsession,它受浏览器和session cookie的影响,因此只有请求在同一个session当中的,它存储的信息是可以被这些请求获取到的,它的存活时间算排第三

httpservletrequest,它的存活时间,仅在一个请求被处理到完成处理之间,它的存活时间应该是最短的

那么对于Servlet, Filter,Listener可以被任何request,httpsession使用,httpsession则可以被当前session中的request使用
0 0
原创粉丝点击