无状态的根本原因

根本原因是:因为,HTTP协议使用的是Socket套接字TCP连接的,每次监听到的套接字连接是不可能一个个保存起来的。(很消耗资源,假如一个人服务器只保存一个通信连接,一万个岂不是要保存一万个?服务器扛不住啊!)

虽然TCP虽然能保证数据的正确性和完整性,但是不利于长期保存,所以HTTP协议规定,页面访问完成后,需要断开TCP连接,所以服务器在也不知道谁上次访问过来了。

解决方案

1.服务器端

Session(相当于一个静态的字典集合) , Application Object,Caching,Database

2.客户端

ViewState,hidden控件,Cookies(两种,服务器缓存,硬盘中),Control State,Query string

本质只有三种【 ViewState,hidden控件,Control State (隐藏域)】;【Cookies(两种,服务器缓存,硬盘中)】,【Query string】

ViewState

注意

要使用ViewState,form 表单的runat="server" 一定不能除去!

要不然在客户端不会生成一个name="__VIEWSTATE" 的隐藏控件<input type="hidden" value="/......" /> value值可以用ViewStateDecoder.exe软件查看。

ViewState 类型 StateBag

这个StateBag继承了IDictionary,接口

ViewState["name"]="admin";
//向ViewState中添加一个键值对,ASP.NET机制会自动帮我们将ViewState里的所有键值对存入页面的一个隐藏域中
//在页面的生命周期中,有两个方法 LoadState PageLoad SaveState,一个加载解码一个保存ViewState。

LoadAllState

1.尝试从请求报文中获取名为__VIEWSTATE的值

2.如果有,则将这个值反base64编码,然后反序列化。

3.将获取的对象键值对,存入页面类的ViewState属性中(StateBag 本质差不多是个Dictionary集合)。

StateBag的出处:aspx页面前台类 :aspx.cs 后台页面类 :Page类:TemplateControl:Control (public StateBag ViewState{get;set;})

Cookie

在浏览器长久保存数据的一种机制(分为两种,1.浏览器缓存Cookie,2.硬盘Cookie)本质就是在浏览器端的一个txt文件

使用场景:最近浏览,保存密码免登录

登录成功后,创建一个Cookie给客户端,保存起来,下次方法访问相同站点时,自动将该站点发布的Cookie发送给服务器。服务器那边会检查浏览器发送的请求报文,看其中是否包含Cookie数据,有则继续浏览,没有,则拒接访问并强制性跳转到登录页面。

使用

//服务端创建Cookie对象,并设置键值对,只放登录名即可,不要2b似的放密码!
HttpCookie cookie = new HttpCookie("Loginame","strName");
//将Cookie对象添加到响应对象的Cookie集合中
Respone.Cookies.Add(cookie);
//生成响应报文的时候,.NET会自动检查这个属性并生成相应的响应报文命令
//响应报文中会多出一行 Set-Cookie: Loginname=strName;path=/

注意 :

只有给Cookie设置了失效时间,Cookie才会存在硬盘中,要不然它只在浏览器缓存中

cookie.Expires = DateTime.Now.AddDay();

响应报文会多一个失效属性

Set-Cookie: Loginname=strName;expires=Wed,5-Nov-2013 17:25:10 GMT;path=/ 

下次访问访问相同站点的时候,请求报文中会多一个属性

Cookie:Loginname=strName 

服务器取得客户端浏览器发送过来的

Cookie Request.Cookies["Loginame"].Value; 

注意:(客户端发什么服务器就有什么)

客户端浏览器向服务器发送的只是cookie里的键值对,并没有发送cookie的失效时间 ;

如果要接收到Cookie的失效时间,可以新建一个Cookie,设置键值对。cookie的值,就是上一个cookie的失效时间,并且记得设置先建的失效时间等于上一个cookie的失效时间

注意

cookie是不论浏览器请求服务器什么类型的资源,也会被发送到服务器的,哪怕是图片,css,js

问题

如果服务器两次输出一个同名的cookie,浏览器会怎么办?

:直接覆盖原来的cookie文件

如果服务器输出两个不同名的cookie,浏览器怎么办?

:同时存入一个文件中,用特殊符号分开

如何删除cookie?

:创建一个同名的cookie,设置时间时间为负数。原理是,用同名文件覆盖之前的cookie,已经过期的cookie不会发送到服务器,目的达到了。。

cookie.Path="/admin/"

如果访问admin文件夹下面的页面才会向服务器发送cookie,访问admin文件外的页面,将不发送。

cookie.Domain="二级域名"

如果访问的 是主站将不发送,访问指定的二级域名才向服务器发送cooie,用法和cookie.Path差不多。

Cookie机制:

是指服务器和浏览器间一种相互交互数据的一种方式。

1.服务器通过响应报文 Set-Cookie 的方式向浏览器发送Cookie键值对和失效时间,path,domain等数据

2.浏览器解析到响应报文中Set-Cookie文本行时,会自动的根据内容在浏览器端创建Cookie文本。

3.浏览器会根据Cookie的失效时间,自动清除过期的Cookie文件

4.当浏览器对一个网站发送请求时,会自动加载属于该网站的cookie文件的值,放在请求报文的Cookie中,发送给服务器

5.当服务器接受到浏览器的请求报文中的cookie时,会自动将里面的值封装到Request.Cookie集合中,工供程序员使用。

Session

场景假设,假如你有3000w,你一定不会抱在手中或者放在家里。你会存入银行,然后银行给你一个开个户头,将钱存进去,然后给你一张卡或者存折做为依据。

那么网页登录也是差不多的,你输入了登录名,密码为了记录访问状态,你可能会用Cookie,ViewState 保存,但是不安全,因为放在了客户端,可以被别人伪造。所以出现了Session。

Session 是将值保存在服务器的Session池中的,以键值对的方式存储。保存后,将会把键值对的key发送给客户端浏览器以Cookie的方式存储。

因为保存的Cookie没有设置失效时间,所以这个Cookie是以浏览器缓存的方式存储的。关闭浏览器就会丢失!

Session["UserInfo"]=userLoginNmae 

将数据存入Session 此时:

服务器帮我们创建了一个HttpSessionState对象,并将这个Session对象存入了Session池中,并且自动分配了一个SessionId。这个SessionId会以浏览器缓存Cookie的方式,发给浏览器。

Session的过期销毁

Session默认在服务器端保存20分钟,如果20分钟内没有浏览器使用它,那么服务器就会把他销毁掉。滑动过期时间。

失效时间可以在web.config文件中配置整个网站的失效时间

<system.web>
<sessionState timeout="20"></sessionState>
</system.web>

还可以配置单个Session对象失效事件。

Sessin.Timeout = ; 

//销毁当前Session对象 

Session.Abandon(); 

//清空当前Session对象里的键值对。 

Session.Clear();

当客户端浏览器设置了禁止Cookie功能时,Session不可用了。这是必须的,因为SessionId就是用Cookie保存在浏览器缓存中的!

解决方案

可以在配置文件中设置Cookie自动检测,如果客户端浏览器已禁用了Cookie功能,SessionId将出现在浏览器输入框中!

<sessionState cookieless="AutoDetect"></sessionState> 

注意

一般处理程序要使用Session时,必须实现IRequiresSessionState接口,这个接口是个空的,目的是为了标识。

命名空间在using System.Web.SessionState。

Application

其类型是 HttpApplicatinState 属于Page类的集合中,整个服务器共享。它也是一个键值对集合。 注意加上锁。HTTP 无状态啊无状态啊

HTTP 无状态啊无状态啊的更多相关文章

  1. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  2. REST有状态与无状态的理解

    1. 什么是REST? REST(REpresentation State Transfer)表述性状态传递,是一种软件架构风格,是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可 ...

  3. SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系

    刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...

  4. http协议无状态中的 "状态" 到底指的是什么?!

    引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的, ...

  5. SSH深度历险(三) EJB Session Bean有状态和无状态的区别与联系

    刚开始对两种sessionbean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后,会发现,事实 ...

  6. 线程安全,有状态,无状态的对象<转>

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.另外 ...

  7. java 无状态和有状态区别

     诸位Java程序员,想必大家对SimpleDateFormat并不陌生.不过,你是否知道,SimpleDateFormat不是线程安全的(thread safe).这意味着,下面的代码是错误的: ...

  8. http协议无状态中的 "状态" 到底指的是什么?!(转载)

    转载自:https://www.cnblogs.com/bellkosmos/p/5237146.html   引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无 ...

  9. ServiceFabric极简文档-5.0 Service Fabric有状态与无状态

    Service Fabric 应用程序方案 2017/08/14 作者 Edward Chen Jack Zeng Azure Service Fabric提供了一个可靠而灵活的平台,可用于编写和运行 ...

随机推荐

  1. Java开发工程师学习路线

    贴一个比较出名的Java开发工程师学习路线图 好好学习提升中 这个貌似也不是特别全,算法,设计模式,架构好像都没有

  2. 程序设计实习MOOC / 程序设计与算法(一)第二周测验(2018春季)

    编程题: 1:对齐输出 总时间限制:  1000ms 内存限制:  65536kB 描述 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们. 输入 只有一行,包含三个整数,整数之间以一个空格分 ...

  3. loadrunner学习笔记之参数设置

    一.关于参数的定义 在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本.函数中参数的值就是在录制过程中输入的实际值. 例如,你录制了一个Web应用程序的脚本.脚本生成器生成了一个声明,该 ...

  4. Java学习笔记之:Struts2.0 环境搭建

    一.介绍 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 二 ...

  5. 使用ASP.NET MVC+Entity Framework快速搭建系统

    详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...

  6. Git配置用户名密码

    配置Git 在Linux下和windows下配置Git的方法差不多,只是在Linux下,可以在命令行里直接使用git config进行配置, 而在windows下则要先打开“Git Bash”,进入m ...

  7. QTableView和QTableWidget翻页功能实现

    主要使用QTableView和QTableWidget中的三个函数实现 QTableView::verticalScrollBar()->setSliderPosition():  //设置当前 ...

  8. HP电脑的增霸卡功能操作详解

    机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...

  9. 前端安全系列之二:如何防止CSRF攻击?

    背景 随着互联网的高速发展,信息安全问题已经成为企业最为关注的焦点之一,而前端又是引发企业安全问题的高危据点.在移动互联网时代,前端人员除了传统的 XSS.CSRF 等安全问题之外,又时常遭遇网络劫持 ...

  10. NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入

    上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...