Session 机制和 Cookie 机制
Session 机制和 Cookie 机制
HTTP协议是无状态的, 而Cookie和Session都是在无状态的基础上希望实现有状态的效果, 两者是在客户端或者是服务端使用缓存等手段来实现状态的维护.
Session : 意指从某个操作的行为开始到结束之间持续的时间, 希望在该时间内对某一会话是有状态的.
Cookie的做法是在客户端内部做缓存, 需要用的时候就从cookie里面取, 并跟其他信息一样发回服务端, 做到状态的保存. 但是如果是客户端不支持cookie, 就无法使用这种机制.
session在服务端实现的关键点在于生成一个session id, 一般是以http中信息做一个类似散列表或者本来就是散列表的结构, 给每一个请求做一个散列, 如果本来已经在散列表中就取出session id, 如果没有就重新分配一个session id, 并存入散列表以便下次使用.
Servlet 3.0 Doc
和Servlet 2.5 的区别
- Servlet2.5中Listener的调用顺序是随机的, 现在不是
- 如果没定义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来给出返回.
一个典型的异步处理的过程如下:
- 收到请求, 通过filter或者是验证, 传递给一个servlet对象.
- servlet进行处理.
- the servlet issues request发生, 出现耗时操作.
- Servlet返回并未生成任何response.
- 当资源可用时, 线程继续在当前线程中处理或者是将资源通过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 机制的更多相关文章
- session机制、cookie机制
一.Cookie机制 在web程序中是使用HTTP协议来传输数据的,因为http是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,co ...
- JWT的初步了解以及session、cookie机制
1.什么是状态保持? 想要了解JWT,首先需要知道什么是状态保持,举一个例子来说:无论是在web上还是在手机app上,我们都可以以游客的身份访问,此时都会有登录/注册字眼,当我们登录之后,就会是我们的 ...
- HTTP协议中的COOKIE机制简单理解
1.为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢, HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一次 ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- HTTP Session、Cookie机制详解
一.什么是http session,有什么用 HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,于是,Web Server中引入了session的概念,用来保存客户端的状态信息. ...
- cookie机制和session机制的原理和区别[转]
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...
- cookie机制和session机制的区别(面试题)
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
随机推荐
- Excel2007格式分析和XML解析
1. excel2007是使用xml格式来存储的,把一个excel文件后缀改为.zip,打开之后就直接可以看到一个excel文件对应的xml格式的文件了. 这里面有几部分 对于docProps目 ...
- 洛谷 - P2568 - GCD - 欧拉函数
https://www.luogu.org/problemnew/show/P2568 统计n以内gcd为质数的数的个数. 求 \(\sum\limits_p \sum\limits_{i=1}^{n ...
- android摄像头获取图像——第一弹
http://www.cnblogs.com/mengyan/archive/2012/09/01/2666636.html 安卓读取视频的几种方式: 详细讲述请参考网址:http://www.cnb ...
- 2014-6-28 NOIP模拟赛
[今天我出的三道题目全部是图论哦,请大家轻虐] 1.魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的 ...
- [Xcode 实际操作]九、实用进阶-(19)重写父类的绘图方法,使用图形上下文绘制自定义图形
目录:[Swift]Xcode实际操作 本文将演示如何使用图形上下文,绘制自定义图形. 使用快捷键[Command]+[N]创建一个新的类文件. (在项目文件夹[DemoApp]上点击鼠标右键[New ...
- perl C/C++ 扩展(一)
通过h2xs 中间件,我们可以快速的使用c或则C++ 库来实现perl 扩展功能 第一讲:跑通hello world 程序******************************我们使用命令:h2 ...
- ZooKeeper应用案例
我们通过学习借鉴,哪些项目或应用都使用了ZooKeeper,可以了解我们的应用使用ZooKeeper是否能真正地带来价值,当然,有些项目可能也未必非常适合使用ZooKeeper,我们要批判地学习.借鉴 ...
- Linux 软连接和硬连接(转)
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...
- get 和 post 请求的区别(转)
转自 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html http://www.nowamagic.net/librarys/ve ...
- JSP | 基础 | Button跳转页面
<input type = "button" value = "登陆" onclick = "window.location.href = 'L ...