cookie session application

-------------------------------------------------- cookie ---------------------------------------------------------------

了解 HTTP 的无状态性:

HTTP 是无状态的,每次客户端请求服务器后断开连接,相当于 socket close,那么当我们去买东西,再去结账的时候,怎么知道买了哪些东西呢?这些状态信息就需要保存下来,这就使用了 cookie


cookie 是服务器向客户端写入的一些信息

cookie 分为 2 种:

    一种是以文本的形式保存于客户端(都能访问,超过设置的过期时间就失效)

    一种是保存在客户端所在电脑的内存中(窗口及其子窗口才能访问此 cookie,关闭窗口 cookie 就失效)


cookie 的一些特点:

    ① 客户端可以阻止服务器端写入 cookie

扫描二维码关注公众号,回复: 355069 查看本文章

    ② 每个 webApplication 只能读取到自己写入的 cookie,比如新浪拿不到百度写的 cookie

    ③ 一个 servlet/jsp 设置的 cookie 只能被同路径或者子路径下的 servlet / jsp 读到

        比如路径:/dog 和  /cat/small-cat   ( dog 和 cat 位于同一级目录 )   

        那么 /dog 下设置的 cookie,/cat/small-cat 可以读到,但是 /cat/small-cat 下设置的cookie,/dog 则不能读到


-------------------------------------------------- session ---------------------------------------------------------------

session 和 cookie 一样也是为了记录一系列的客户端的状态

session 是服务器端创建并保存在服务器内存的,每个 session 和一个客户端窗口及子窗口关联,别人的浏览器或者自己的浏览器新起的浏览器是访问不到的


session 实现机制:

在客户端第二次访问服务器端时,客户端怎么知道当前的客户端对应的session是哪个呢?

这就使用到了session ID,在客户端第一次访问服务器端时,服务器会给予客户端和session一个相同的号码,就是 session ID,根据这个 session ID 判断他们的对应关系


session ID 存储在哪?怎么传递给服务器端的呢?

这就涉及到 session 的两种实现方式:

① 基于 cookie,服务器把 session ID 写到 cookie(存于内存的那种cookie) 里,关闭窗口session 就访问不到了

(因为关闭窗口,存于客户端内存的cookie会消失,保存在 cookie 里的 session ID就消失了)

② 重写 URL 的方式

比如客户端禁止服务器向其写入 cookie,这时候每次请求服务器端,就会创建新的 session,这些 session 不会再次被访问到,这时候使用重写的方式 response.encodeURL( ); 此方法2个作用,转码和把 session ID 加在 URL 后面写回客户端


服务器端怎么创建 session ?

request.getSession(true/false);  传 false 就是只拿,传 true 就是有就拿,没有就创建


session 超时:

如果客户端的浏览器关闭了,那么正常情况服务器端保存的 session 应该清除,但是由于HTTP是无状态的,意味着服务器端不知道客户端关闭了浏览器,所以无法清除 session,怎么办呢?

解决办法是记录一个客户端访问 session 的时间 lastAccessedTime,然后给一个超时时间,如果在超时时间内浏览器还没有访问服务器就清除这个 session(每次访问服务器,超时时间重新计),这个超时时间可以修改,在 Tomcat 的 /conf/web.xml 里面 ( 分钟 ):

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

session 访问:

session 不像 cookie 一样有路径访问的限制,session 只要是在同一个 application 下的 servlet/jsp 创建的,其他路径都能访问这个 session(前提是客户端是同一个窗口或子窗口)


-------------------------------------------------- application -----------------------------------------------------------

application 对应的类是 ServletContext,想让所有的客户端都能访问到的东西可以放到这里面 

比如 Tomcat 的 webapps 下面有多个项目,每一个项目就是一个 webapplication,context 的意思就是 webapplication 的运行环境,也叫上下文,Httpservlet 的 getservletContext 方法可以拿到 ServletContext


猜你喜欢

转载自blog.csdn.net/leohe2016/article/details/80220515