Session 机制和 Cookie 机制

HTTP协议是无状态的, 而Cookie和Session都是在无状态的基础上希望实现有状态的效果, 两者是在客户端或者是服务端使用缓存等手段来实现状态的维护.

Session : 意指从某个操作的行为开始到结束之间持续的时间, 希望在该时间内对某一会话是有状态的.

Cookie的做法是在客户端内部做缓存, 需要用的时候就从cookie里面取, 并跟其他信息一样发回服务端, 做到状态的保存. 但是如果是客户端不支持cookie, 就无法使用这种机制.

session在服务端实现的关键点在于生成一个session id, 一般是以http中信息做一个类似散列表或者本来就是散列表的结构, 给每一个请求做一个散列, 如果本来已经在散列表中就取出session id, 如果没有就重新分配一个session id, 并存入散列表以便下次使用.

Servlet 3.0 Doc

和Servlet 2.5 的区别

  1. Servlet2.5中Listener的调用顺序是随机的, 现在不是
  2. 如果没定义metadata-complete=true, 就会对配置的注解进行扫描, 之前所有的模块都要定义在web.xml上, 现在可以在各自的模块里面定义.

Servlet是一个interface, 在Java API中有两个类实现了该接口, 分别是GenericServlet, HttpServlet, 一般是直接拓展HttpServlet类.

public interface Servlet {
// Life Cycle Function
public void init(ServletConfig config) throws ServletException;
public void destroy(); // Service Function
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException; // Info Fucntion
public String getServletInfo();
public ServletConfig getServletConfig();
}

生命周期函数从Web Server中初始化和销毁, 所有的request和response都走service函数, 其他函数是提供信息的.

GenericServlet是Servlet一个协议无关的实现, 有简单的生命周期管理,还实现了ServletConfig和java.io.Serializable. 如果需要使用GenericServlet仅仅需要重写service()方法.

HttpServlet是Servlet的一个关于Http协议的实现, 同样也实现了ServletConfig和java.io.Serializable. 一般的Servlet类应当继承于HttpServlet, 并重写以下方法:

    doGet, if the servlet supports HTTP GET requests
doPost, for HTTP POST requests
doPut, for HTTP PUT requests
doDelete, for HTTP DELETE requests
init and destroy, to manage resources that are held for the life of the servlet
getServletInfo, which the servlet uses to provide information about itself

但是一般不推荐重写service方法, service方法中将每一个Http Request dispatch 到每一个http request type的handler, 也不要重写doOptions和doTrace方法.

需要注意多线程的问题, 访问静态资源或者是共享资源的时候需要注意.

service函数就是一个分发函数, 对get有lastModified的优化, 主要针对浏览器的缓存和Proxy.

一般的服务器上应该只有某个声明的servlet的一个实例, 但是如果一个servlet实现了SingleThreadModel的接口, Servlet Container会针对每一个线程保有一个servlet对象.但是这个接口并不推荐, 以后也会被废弃.

Servlet的生命周期

Loading And Instantiation

Servlet的容器需要负责ervlet的Loading And Instantiation, 可以在容器启动的时候或者延迟到request到来的时候, Servlet的容器启动时, 必须locate到所有注册的servlet class, 可以通过本地/远程文件系统, 或者网络服务.

Initialization

在Servlet实例建立后, 还需要进行init(), 主要工作是确定Servlet Config和Servlet Context是否都可以访问到. Servlet Config可以通过Web Applciation的Configuration得到.

当init()出错时, container应该保证servlet不能放入容器, 且这里不会调用servletg的destory(), container会进行再次尝试并抛出异常.

静态方法中不应该包括调用JDBC等资源, 因为并不能保证静态方法在init()之后调用.

Service

在Init之后, Servlet可以service每一个Request

Asynchronous processing

如果在Servlet中有一些需要等待的过程, 如数据库连接, 网络消息返回等等, 可以进行异步操作, 先返回到container并释放线程, 后面当资源可用时在根据AsyncContext.dispatch来重新分配, 由另一个线程或者callback来给出返回.

一个典型的异步处理的过程如下:

  1. 收到请求, 通过filter或者是验证, 传递给一个servlet对象.
  2. servlet进行处理.
  3. the servlet issues request发生, 出现耗时操作.
  4. Servlet返回并未生成任何response.
  5. 当资源可用时, 线程继续在当前线程中处理或者是将资源通过AsyncContext调度到其他线程或者回调处理

从asyncSupported=true的Servlet Dispatch 到一个asyncSupported=false的Servlet, Response会在不支持异步的Servlet的service method(如doGet, doPost)执行完时返回, 但是servlet容器需要保证调用AsyncContext中的complete函数来通知AsyncListener, 而AsyncListener.onComplete会负责释放资源

但是不能从同步的Servlet Dispatch到异步的Servlet, 异步的任务会在接受Request的Servlet中直接返回Waiting, 而有可能会经过一个或者多个filter,将response包装, 最终传递到另一个Servlet, 中间会对Response加wrapper, 并将信息写入或读出wrapper.

在ServletContext中增加了AsyncContext的内容:

有关AsyncContext, 是真正在不同线程中可以共享访问的内容(或者线程传递的内容), 当使用了异步之后, 对Response真正的返回可以认为是Commited, 保存在AsyncContext中, 接受Request的线程不会把Response Commited, 而只会在AsyncContext.complete被调用, 或者是异步时间Timeout, 且针对这个Timeout没有handle.

AsyncContext是被ServletRequest.startAsync调用之后创建并且初始化的.

End of Service

如果servlet容器需要停止一个Servlet实例, 不管是需要交换内存或者关闭, 容器本身都需要保证当前所有由servlet的service处理的线程都退出或者是由一个默认的servlet timeout.

Session 机制和 Cookie 机制的更多相关文章

  1. session机制、cookie机制

    一.Cookie机制 在web程序中是使用HTTP协议来传输数据的,因为http是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,co ...

  2. JWT的初步了解以及session、cookie机制

    1.什么是状态保持? 想要了解JWT,首先需要知道什么是状态保持,举一个例子来说:无论是在web上还是在手机app上,我们都可以以游客的身份访问,此时都会有登录/注册字眼,当我们登录之后,就会是我们的 ...

  3. HTTP协议中的COOKIE机制简单理解

    1.为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢, HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一次 ...

  4. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. HTTP Session、Cookie机制详解

    一.什么是http session,有什么用 HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,于是,Web Server中引入了session的概念,用来保存客户端的状态信息. ...

  6. cookie机制和session机制的原理和区别[转]

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...

  7. cookie机制和session机制的区别(面试题)

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  8. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  9. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

随机推荐

  1. Untiy PoolManager随手记

    用法,1是获取,2是清除, 问题是这个池到底能做什么用 首先用这个池生成的对象是在池节点下使用,而不是取出来用(可以取出来用,直接transform.parent赋值就可以) 疑问,池里面的节点时什么 ...

  2. [Xcode 实际操作]九、实用进阶-(2)遍历设备(输出系统)上的所有字体

    目录:[Swift]Xcode实际操作 在实际工作中,经常需要调整界面元素的字体种类. 本文将演示输出系统提供的所有字体,方便检索和使用. 在项目导航区,打开视图控制器的代码文件[ViewContro ...

  3. 15.split分割注意事项

    1.v = 'k1,v1- k2,v2- k3,v3-'变成一个字典{'k1':'v1','k2':'v2','k3:'v3'...} 变成一个字典 {'k1':'v1','k2':'v2','k3: ...

  4. 2019最好用的自动化测试工具Top 10,果断收藏!

    经常有人在公众号留言或是后台问我,做自动化测试用哪个工具好,或是学哪门编程语言好呢? 这个时候总是无奈的说: 你应该学习Python 或是Java. 你应该掌握Selenium. 又或者你需要学会jm ...

  5. day02 多态

  6. 关于maven项目导入后缺jar包问题的处理方法

    1.maven项目的好处:方便,我们在把自己写好的代码发送给目标人物时可以精简代码——把target目录,一些设置目录之类的都删除掉,接下来要做的就是尽可能的只留下一个src文件夹及pom.xml文件 ...

  7. 最新Centos7安装python3并与python2共存

    1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...

  8. Codeforces Round #542(Div. 2) B.Two Cakes

    链接:https://codeforces.com/contest/1130/problem/B 题意: 给定n和 2 * n个数,表示i位置卖ai层蛋糕, 有两个人在1号,必须严格按照1-n的顺序买 ...

  9. Codeforces 1137D(技巧)

    一开始写的第一步让0和1一起走然后第二步再让0走会挂最后一个点--然后探索一下觉得主要问题在于我模拟的一步一步地走.如果这样的话9 2这个数据会使第17步他俩就碰在final点了,而实际上我们想要的效 ...

  10. 洛谷 P1463 [HAOI2007]反素数

    https://www.luogu.org/problemnew/show/P1463 注意到答案就是要求1-n中约数最多的那个数(约数个数相同的取较小的) 根据约数个数的公式,在约数个数相同的情况下 ...