cookie揭秘

cookie揭秘
cookie揭秘

Cookies 揭秘

注:本文选自网络

derstsea

2011/3/4

摘要:介绍cookies相关知识。

一前言

Cookies想必所有人都了解,但是未必所有人都精通。本文讲解了Cookies的各方面知识,并且提出来了最佳实践。这是笔者在日常工作中的积累和沉淀。

二基础知识

1.什么是Cookies

Cookie 是一小段文本信息,伴随着用户请求和页面在Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时Web 应用程序都可以读取的信息。

例如,如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的Cookie,用户的浏览器在获得页面的同时还获得了该Cookie,并将它存储在用户硬盘上的某个文件夹中。

以后,如果该用户再次请求您站点中的页面,当该用户输入URL 时,浏览器便会在本地硬盘上查找与该URL 关联的Cookie。如果该Cookie 存在,浏览器便将该Cookie 与页请求一起发送到您的站点。然后,应用程序便可以确定该用户上次访问站点的日期和时间。您可以使用这些信息向用户显示一条消息,也可以检查到期日期。

Cookie 与网站关联,而不是与特定的页面关联。因此,无论用户请求站点中的哪一个页面,浏览器和服务器都将交换Cookie 信息。用户访问不同站点时,各个站点都可能会向用户的浏览器发送一个Cookie;浏览器会分别存储所有Cookie。

Cookie 帮助网站存储有关访问者的信息。一般来说,Cookie 是一种保持Web 应用程序连续性(即执行状态管理)的方法。除短暂的实际交换信息的时间外,浏览器和Web 服务器间都是断开连接的。对于用户向Web 服务器发出的每个请求,Web 服务器都会单独处理。但是在很多情况下,Web 服务器在用户请求页时识别出用户会十分有用。例如,购物站点上的Web 服务器跟踪每位购物者,这样站点就可以管理购物车和其他的用户特定信息。因此,Cookie 可以作为一种名片,提供相关的标识信息帮助应用程序确定如何继续执行。

使用Cookie 能够达到多种目的,所有这些目的都是为了帮助网站记住用户。例如,一个实施民意测验的站点可以简单地将Cookie 作为一个Boolean 值,用它来指示用户

的浏览器是否已参与了投票,这样用户便无法进行第二次投票。要求用户登录的站点则可以

通过Cookie 来记录用户已经登录,这样用户就不必每次都输入凭据。

2.Cookies如何存储

Cookies保存在用户的本地机器上,不同的浏览器存储在不同的文件夹中,并且按照

域名分别保存。即网站之间的Cookies不会彼此覆盖。

IE浏览器的用户可以通过在本地的文档中找到Cookies的txt文件,不同操作系统的位置不同,windows server 2003/xp都保存在:

C:\Documents and Settings\Administrator\Cookies 文件夹下。

其中名称txt按照域名保存,比如localhost域下的cookies为:

administrator@localhost[1].txt 或者administrator@localhost[2].txt

其中后面的[1]和[2]是随着每次保存交替变化的。

3.Cookies如何传递

Cookies的信息是在Web服务器和浏览器之间传递的。保存在Http请求中。

(1)请求页面

在请求一个页面的Http头中,会将属于此页面的本地Cookies信息加在Http头中,注意下面加粗的部分:

(2)页面响应

如果页面要求写入Cookies信息,则返回的Http如下,注意加粗的部分:

4.Cookies如何查看

(1)查看Cookies的txt文件

IE用户可以直接查看Cookies的txt文件。

比如:C:\Documents and

Settings\Administrator\Cookies\administrator@localhost[1].txt

(2)使用插件

FF下使用Web Developer插件可以很方便的查看、删除和修改Cookies:插件截图:

查看页面Cookies:

三. Cookies高级知识

1.Cookie 的限制

大多数浏览器支持最大为4096 字节的Cookie。

浏览器还限制站点可以在用户计算机上存储的Cookie 的数量。大多数浏览器只允许每个站点存储20 个Cookie;注意这里的20个是指主键值,也就是20条Cookies记录,但是每个Cookies记录还可以包含若干子键,下面会详细解释。如果试图存储更多Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的Cookie 总数作出绝对限制,通常为300 个。

2.Cookies的存储格式

Cookies可以包含一个主键,主键再包含子键。比如https://www.360docs.net/doc/504839717.html,中获取Cookies的格式是:

其中的key就是主键,subkey就是主键关联的子键。

(1)本地磁盘存储格式:

其中的Pkid=999&TestValue=aaabbbcccdddeee 是Cookies的值,由于使用了subkey=subvalue的格式,所以此Cookies是包含子键的。

(2)Javascript中的Cookie格式

在Javascript中给的Cookie是一个字符串,通过document.cookies获取。字符格式如下:

上面的字符串包含了两个Cookies,一个是不包含子键的SingleKey,一个是包含pkid 和TextValue两个子键的https://www.360docs.net/doc/504839717.html,mon.SubKey,两个Cookie通过“;”分割。

(3)https://www.360docs.net/doc/504839717.html,中的Cookies格式

和所有的服务器端语言一样,https://www.360docs.net/doc/504839717.html,中使用集合类保存Cookies集合:

通过HttpResquest和HttpResponse对象的Cookies属性,可以获取和写入当前页面的Cookies。

3.Cookies的内容编码格式

Cookies的值中可以保存除了“;”以外的标点符号。但是不能保存汉字。保存汉字会出现乱码。

所以对于Cookies中的内容要进行统一的编码和解码。为了在浏览器端和服务器端都能够进行解码和编码,所以要统一使用UTF编码格式。

主要是因为javascript中只能使用UTF编码格式。

4.Cookies的Path属性

Cookies的Path属性表示当前的Cookies可以作用在网站的那个路径下。

比如下面的两个同名的Cookies:

允许存在两个同名但是Path不同的Cookies。

无论是服务器端还是客户端,在获取时优先获取本页路径下面的Cookies。

也就是说如果在、/chapter10/路径下面的页面,获取testKey这个Cookies的值,则只能获取到testValue222222这个值。

5.Cookies的过期时间

如果保存Cookies时未设置过期时间,则Cookies的过期时间为“当前浏览器进程有效”,即和Session一样关闭浏览器后则消失。在https://www.360docs.net/doc/504839717.html,中还可以通过设置HttpCookie对象的过期时间为DateTime.MinValue来指定此Cookies为跟随浏览器生效。(这句话来之不易啊,在脑袋等人的帮助下才查到的。)

如果设置了过期时间并且大于当前时间,则会保存Cookies值。

如果设置了过期时间但是小于等于当前时间,则清除Cookies值。

6.Cookies与Session

有时我们会忽略Cookies与Session的关系。但是两者是密不可分的。

Session的唯一标示:SessionID是通常保存在Cookies中的(也可以保存在URL中)。对于https://www.360docs.net/doc/504839717.html,而言,SessionID保存在键值为“https://www.360docs.net/doc/504839717.html,_SessionId”的Cookies中,如图:

因为Cookies的存储数量是有限制的,所以我们的系统在保存Cookies的时候一定要注意防止冲掉这一个关键的Cookies。在下文介绍的最佳实践-以强对象方式保存Cookies的代码中特意对这个Cookies做了处理。

注意,在客户端使用javascript脚本无法获取“https://www.360docs.net/doc/504839717.html,_SessionId”的Cookies,因为此Cookies在服务器端设置了HttpOnly属性为true。

https://www.360docs.net/doc/504839717.html,中HttpCookie对象的HttpOnly 属性指定一个Cookie 是否可通过客户端脚本访问。不能通过客户端脚本访问为true;否则为false。默认值为false。此属性并不能完全阻止客户端在本地获取cookies,但是可以增加通过脚本直接获取的难度。Microsoft Internet Explorer 版本6 Service Pack 1 和更高版本支持Cookie 属性HttpOnly。

7.Cookies加密

在设置Cookies的属性时,有一个选项Secure用来控制Cookie的加密特性。

如果通过SSL 连接(HTTPS) 传输Cookie,则为true;否则为false。默认为false。

如果我们保存一个Cookies并设置加密,那么在非HTTPS的页面中,无论是使用javascript还是服务器端都无法获得此Cookies。但是在本地依然可以看到此Cookies的存在。

8.Cookies与Ajax

如果Ajax请求访问一个服务器页面,此服务器页面是可以向用户浏览器写入Cookies和Session的。

四. Cookies最佳实践

在了解了Cookies的相关知识后,下面提出最佳的事件方法。其中包括客户端和服务器端两部分。

(1)https://www.360docs.net/doc/504839717.html, 中保存Cookies

通常,我们使用Request和Response对象来直接操作Cookies:

写入Cookies:

读取Cookies:

注意Request["k1"]这个大家熟悉的获取get和post参数的方法,同时还能够获取Cookies的值!

另外上面语句中的有些是必须通过Value属性访问的,有些则不需要。

(2)以对象方式保存Cookies

下面提供一个可以以对象方式整体保存Cookies的工具类。并且只占用一条Cookies,所有的属性都存在子键上。

源代码:

使用

首先说明如何使用此类。

为想要保存在Cookies中的类建立模型,并且继承自CookieInfo即可。比如下面建立了MyCookieInfo类,其中包含属性pkid,TestValue和TestDateTime:

接下来就可以使用对象的Save和Load方法保存和读取Cookies:

?保存

Save方法有两个重载,不带参数的Save方法表示Cookies的过期时间与浏览器相同,即浏览器关闭则Cookies消失。否则需要传入Cookies过期时间。

现在我们已经可以将一个强类型的对象读取和保存Cookies了。

(3)使用Javascript操作Cookies

在客户端我们同样需要操作Cookies。

下面是封装了的专门用于操作Cookies的jQuery工具函数。如果还有人不知道jQuery 是什么,请参考我的“从零开始学习jQuery”系列教程:

https://www.360docs.net/doc/504839717.html,/zhangziqiu/archive/2009/04/30/jQuery-Learn-1.htm l

当然此工具函数稍加修改,就可以变成标准的Javascript函数。

下载地址:https://www.360docs.net/doc/504839717.html,/zhangziqiu/jquery.extend-lastest.js 工具函数说明:

方法签名:jQuery.cookie(name, subName, value, options)

方法说明:读取、写入、删除Cookies

方法参数:

Cookie用法大全

COOKIE用法大全ASP中的Cookie用法:Cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持久地保持数据。Reque st和Response对象都有一组Cookie。Request.cookie集合是一系列Cookie,从客户端与HTTP Request一起发送到Web服务器。反过来,如果你希望把Cookie发送到客户机,就可以使用Response.Cookies. 1、Expires属性该属性可以赋一个日期,过了这个日期Cookie就不能再被使用了。通过给Expires属性赋一个过期的日期,就可以删除Cookie。如:<%Response.cookies("passtime").Expires=DateAdd("m", 1, NOW)%> 这样设置Cookie在一个月后过期。2、Domain属性该属性定义Cooki e要传送的唯一域。如:Cookie只传送给Microsoft的人,则可以使用以下代码。<%R esponse.Cookies("domain").Domain="https://www.360docs.net/doc/504839717.html,/"%> 3、ASP 用来写入Cookie即向客户机发送Cookie的语法如下:Response.Cookies("C ookie名").[("键名").属性]=内容如果某个ASP文件要创建一个Cookie,则下面的代码可以放在ASP文件的第一个之前,以避免产生错误. <%Response.Cookie s("CookieName")="NewCookie" %> ...... 4、同样ASP用Re quest对象的Cookies集合来读取Cookie,如:<%Response.write Request.Cooki es("CookieName")%> 下面以一个完整的例子来说明Cookie:<% dim Num Num=Request.Cookies("Visit_num") if Num>0 then Num=Num+1 Response. write "您已是第" & Num & "次访问本站点了。" else Response.write "欢迎您首次访问本站。" Num=1 end if Response.Cookies("Visit_num")=Num %> 在该例子中,首先读取Cookies变量Visit_num,看用户端计算机是否保存有Cookies变量。如果有该变量,则说明用户已经访问过该页面,同时输入出访问次数。如果用户是首次访问该页面,则其计算机内不会有Cookies变量,程序会显示“欢迎”字样,然后将Cookies变量Visit_num存到用户计算机中,以便该用户下一次访问该页面时给出“访问的次数”信息。 5、Cookie字典有时在一个页面中可能需要定义很多个Cookies变量,为了更好地管理它,在Cookies组件中常引入一人的概念“子键”。引用它的语法如下:Request. Cookies("变更名")("子键名")如下面的Cookie创建一个名为"Dictionary"的字典,其中保存了三个键值:<% Response.Cookie("info")("Myname")="jeff" Resp onse.Cookie("info")("Gender")="male" Response.Cookie("info")("Myheight")= "172" %> 事实上客户机上的Cookie字典是以字符串的形式存在:info=Myname

跨域获取cookie,多个网站实现一键登录

A网站首页PHP(也可以在登录页面加入下面的代码)加入如下代码 view plaincopy to clipboardprint? 1. A网站增加文件getcookies.php,目的是为了让B网站可以以ajax方式来查询A网站的cookie getcookies.php 代码如下 view plaincopy to clipboardprint? 1.$winduid,'msg'=>$msg)); 4.//可以用json_encode自动转换,也可以手写json格 式 $json_data = '{"mywinduid":'.$mywinduid.'}'; 5.$json_data = json_encode(array('mywinduid'=>$mywinduid)); 6.//必需以下这样形式输出,重点就是发送请求的网页的参数中要有jsoncallback参 数 7.echo $callback.'('.$json_data.')'; 8.?> 在需要查询A网站cookie的B网站页面中增加如下代码 view plaincopy to clipboardprint? 1. 2.

英语中通常使用that

英语中使用that 1.先行词如果有all, every, only, very, any (任何的),one of few,any,little, no等词修饰时, 2.先行词是不定代词,some(something,somebody,someone),any(anything,anybody,anyone),no(nothing,nobody,no one),every(everything,everybody,everyone 3.先行词有最高级修饰 4.先行词有序数词修饰, 5.先行词如果既有人又有事物 6. 主句以There be…开头,先行词为物时用that,先行词为人的句子中,常用who引导定语从句. . There is a room in the building that is still free. There is a pretty girl who wants to see you. 7. 句子中如果已经有了who,引导词代替人,为了避免重复,要使用that;或者句子中如果已经有了which,引导词代替事物,为了避免重复,要使用that; 8. 先行词如果在主句中做表语,或引导词在从句中做表语,代替事物,多使用that;eg. 这是我昨天买的书。This is the book that I bought yesterday. as作为定语从句引导词的三点用法 (1)代替主句整句话内容; (2)先行词有such修饰,要使用as; eg. He is such a good teacher __as__ we all like. He is such a good teacher __that___ we all like him. (such…that 如此…以至于…,引导结果状语从句); (3)先行词有the same修饰, the same……as表示同类不同一个:I want to buy the same bicycle as my friend did. the same……that表示同类同一个:The police has found the same bicycle that Jack lost. 引导词代替主句整句话内容,在从句中做主语或宾语,要使用as或which来引导 ?as和which的区别: 1.结构上as的从句既可以放于主句前,也可以放于主句后;which的从句只能放于 主句后; 2.as如果在从句中做主语,谓语动词只能是be动词结构; eg. 她数学考试不及格,这让她的爸爸很生气。

C++ #pragma code_seg用法

#pragma code_seg 格式如: #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) 该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节,如果code_seg 没有带参数的话,则函数存放在.text节中。 push (可选参数)将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名 pop(可选参数)将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名identifier(可选参数)当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈 "segment-name" (可选参数)表示函数存放的节名 例如: //默认情况下,函数被存放在.text节中 void func1() {// stored in .text } //将函数存放在.my_data1节中 #pragma code_seg(".my_data1") void func2() {// stored in my_data1 } //r1为标识符,将函数放入.my_data2节中 #pragma code_seg(push, r1, ".my_data2") void func3() {// stored in my_data2 } int main() { } 例如 #pragma code_seg(“PAGE”) 作用是将此部分代码放入分页内存中运行。 #pragma code_seg() 将代码段设置为默认的代码段 #pragma code_seg("INIT") 加载到INIT内存区域中,成功加载后,可以退出内存

Kristenscookiecompany案例分析

Kristen’s cookie company案例分析 一、案例背景介绍 本案例主要介绍的是好室友1和好室友2要在学校里开一家饼干公司。该公司根据订单情况,提供定制化的产品。并且,公司的订单必须是完全新鲜的,因此在接到订单之前不能烘烤饼干。Kristen饼干的制作流程很简单,第一个步骤是接到订单,接订单的时间忽略不计;然后是清洗制作上一批产品时,用于混合原材料的碗,接着进行搅拌,清洗和搅拌的过程需要6分钟;将饼干放入烤盘,需要2分钟;接着把饼干放入烤箱并设定时间和温度,这个过程需要1分钟的时间;烤制饼干需要9分钟;饼干烤熟之后,进行5分钟冷却;继而进行包装,需要2分钟;最后收钱需要1分钟。 在这个过程中,好室友1需要做的是清洗和搅拌工作以及把饼干放入烤盘;好室友2需要做的是讲饼干放入烤箱并设定时间和温度,把烤好的饼干进行包装,以及最后的收费工作。 在这个过程中涉及到的成本主要有:原料成本——0.6美元/打;用来包装饼干的盒子成本——0.1美元/打,这种盒子每个只能装1打饼干;好室友1和好室友2的时间成本。 二、案例说明 1、时间以及成本 根据案例,我们对饼干制作流程以及制作过程中的人员分配进行简单归纳,见表1. 表1:各项流程耗时及人员说明 2、流程分析 为了更好的理解Kristen饼干制作时的过程,我们绘制出整个饼干产品生产的流程图。

6分钟/次 2分钟/盘 9分钟/次5分钟/次2分钟/打1分钟/单 图1:饼干制作流程图 3、其他 饼干是完全新鲜的,因此在接到订单之前不能烘烤饼干。 三、案例分析 1、你需要多长时间来处理一个紧急的订单? 为了简化分析,我们首先来考虑一种比较简单的情况,即对问题做出如下基本假设: 假设1:仅分析订单单位均为1打的情况,即我们假设,紧急订单都需要的是1打饼干。 假设2:如果紧急订单到达时有正在处理的订单,则正在处理的订单之后无订单。(即正在处理的订单之后就马上是紧急订单) 假设3:烤箱、烤盘、搅拌器均只有一个。 在分析之前,我们定义一个函数()y i 。()y i 表示完成每一个生产流程所需要的时间。其中,i 表示的是根据图1所表示的生产流程进行到第i 个步骤,取值为1,2,...,7i 。根据案例背景,我们很容易得到()y i 的表达式如下: (1)紧急订单之前,好室友1和好室友2是闲暇的,即不存在排队情况。那么

使用Cookie记录用户名和密码

使用Cookie记录用户名和密码 一、用户登录操作 在用户填写登录数据后,提交表单进行登录验证,如果用户名和密码正确,则把用户名和密码保存在客户端。页面如图1所示 实现代码如下所示。 ... response.setContentType("text/html;charset=gbk"); //获取用户名 String userName = request.getParameter("username"); //获取用户密码 String password = request.getParameter("password"); //验证用户是否合法 if ("accp".equals(userName) && "accp".equals(password)) { //如果合法,把用户名和密码保存在客户端Cookie中 //获取客户选择的Cookie保存时间 String cookieDate = request.getParameter("cookieDate"); int date = 0; if (cookieDate != null && cookieDate != "") date = Integer.parseInt(cookieDate); //创建用户名Cookie对象 Cookie cookieName = new Cookie("accpLoginName", userName); //设置Cookie保存时间 cookieName.setMaxAge(date); //添加到客户端 response.addCookie(cookieName);

Cookie cookiePass = new Cookie("accpLoginPass", password); //设置保存Cookie时间 cookiePass.setMaxAge(date); //添加到客户端 response.addCookie(cookiePass); response.sendRedirect("success.jsp"); } else { response.sendRedirect("fail.jsp"); } ... 二、用户再次登录时操作 服务器首先读取客户端Cookie信息,如果存在用户名和密码数据,则直接登录,否则显示登录页面。 实现代码如下所示。 response.setContentType("text/html;charset=gbk"); //用户名和密码是否存在以及合法的判断参数 boolean bool=false; //获取客户端Cookie数组 Cookie[] cookies = request.getCookies(); //判断客户端是否存在Cookie对象 if (cookies != null) { //预定义保存用户名和密码的变量 String userName = ""; String password = ""; //遍历Cookie数组 for (int i = 0; i < cookies.length; i++) { //取得每一个Cookie对象 Cookie cookie = cookies[i]; //判断Cookie的名称是否等于"accpLoginName" if ("accpLoginName".equals(cookie.getName())) { userName = cookie.getV alue(); } //判断Cookie的名称是否等于"accpLoginPass" if ("accpLoginPass".equals(cookie.getName())) { password = cookie.getV alue(); } }

深入理解ServletJSP之Cookie和Session原理

由于H T T P协议的无状态特征,W e b应用中经常使用C o o k i e和S e s s i o n来保存用户在与系统交互过程中的状态数据。下面通过分析H T T P协议对C o o k i e和S e s s i o n的工作原理加以了解。 一、C o o k i e C o o k i e的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的C o o k i e通过请求信息带到服务器端。 下面的S e r v l e t展示了C o o k i e的功能。 ......... p u b l i c v o i d d o G e t(H t t p S e r v l e t R e q u e s t r e q u e s t,H t t p S e r v l e t R e s p o n s e r e s p o n s e) t h r o w s S e r v l e t E x c e p t i o n,I O E x c e p t i o n{ r e s p o n s e.s e t C o n t e n t T y p e("t e x t/h t m l"); P r i n t W r i t e r o u t=r e s p o n s e.g e t W r i t e r(); S t r i n g o p t i o n=r e q u e s t.g e t P a r a m e t e r("o p t i o n"); i f("s h o w".e q u a l s(o p t i o n)){ //获得请求信息中的C o o k i e数据 C o o k i e[]c o o k i e s=r e q u e s t.g e t C o o k i e s(); i f(c o o k i e s!=n u l l){ //找出名称(键)为“c o o l”的C o o k i e f o r(i n t i=0;i"+c o o k i e s[i].g e t N a m e()+":" +c o o k i e s[i].g e t V a l u e()+""); } } } }e l s e i f("a d d".e q u a l s(o p t i o n)){ //创建C o o k i e对象 C o o k i e c o o k i e=n e w C o o k i e("c o o l","y e a h!"); //设置生命周期以秒为单位 c o o k i e.s e t M a x A g e(20); //添加C o o k i e r e s p o n s e.a d d C o o k i e(c o o k i e); }

THAT用法情况总结

THAT用法总结 第一、that 用作形容词(后接复数名词时用those) 它用来指已被提到的人或物;也可表对比,指两个中较远的那个。 What about that book you borrowed from me last month? 请注意,that 有时候在句子中具有喜欢或轻蔑等感情色彩。 that little son of his 他那个小宝贝儿子 That George!乔治那家伙!(含有轻蔑语气) 第二、that 用作代词。 1. that 用作指示代词(复数形式是those),其指代意义同形容词用法,同时它还可以用作定语从句中的先行词;还可为了避免重复,代替前述名词。 .that用来替代前面提到的特指的事物,所代替的名词可以是可数名词,也可以是不可数名词.代替可数名词可以用the one替换.但其前面不可用任何限定词修饰.例如: 1)The population of China is larger than that of Japan.(that代替不可数名词population,不可用the one替换) 2)The headteacher in your class is younger and more active than that in theirs.(that代替可数名词headteacher,可用the one替换) that 代替指物的单数可数名词或抽象不可数名词,一般是特指的 those 代替指人或指物的复数名词,一般是特指的=the ones one 代替指人或指物的单数可数名词,一般是泛指的 ones 代替指人或指物的复数名词,一般是泛指的 That is what he told me. What is that (which) you have got in your hand? The price of rice is higher than that of flour. 2. that 用作关系代词,引导限制性定语从句。先行词可人可物,用法相当于who或which。(但是在下列情况下多用that:先行词既有人又有物时;先行词有形容词最高级、序数词、不定代词、very,only等修饰时;先行词是不定代词时)He talked about the teachers and schools that he had visited. I think it one of the most wonderful films that the film company has ever produced. She has little information that is useful for our research. Is there anything that I can do for you? 请注意,that 在定语从句中作宾语时通常可省略。 The books (that) I sent you will help you in your studies. 第三、that 用作连词,引导名词性从句,状语从句和强调句。 1. that名词性从句。 ①引导宾语从句。及物动词后的引导词that可省略。 I didn't expect (that) he could win the championship. The teacher pointed out that Tom was not working hard enough.

语法中that的用法

“that”在英文中是一个使用频率很高的单词。它有四种词性,并且句法及语法功能纷繁复杂。同学们如果不能熟练掌握其用法,很可能会形成英语学习的一种障碍,从而影响其学习兴趣和效率。现将that的用法总结归纳如下: 第一、that 用作形容词(后接复数名词时用those)。 它用来指已被提到的人或物;也可表对比,指两个中较远的那个。 What about that book you borrowed from me last month? 请注意,that 有时候在句子中具有喜欢或轻蔑等感情色彩。 that little son of his 他那个小宝贝儿子 That George!乔治那家伙!(含有轻蔑语气) 第二、that 用作代词。 1. that 用作指示代词(复数形式是those),其指代意义同形容词用法,同时它还可以用作定语从句中的先行词;还可为了避免重复,代替前述名词。That is what he told me. What is that (which) you have got in your hand? The price of rice is higher than that of flour. 2. that 用作关系代词,引导限制性定语从句。先行词可人可物,用法相当于who或which。(但是在下列情况下多用that:先行词既有人又有物时;先行词有形容词最高级、序数词、不定代词、very,only等修饰时;先行词是不定代词时) He talked about the teachers and schools that he had visited. I think it one of the most wonderful films that the film company has ever produced. She has little information that is useful for our research. Is there anything that I can do for you? 请注意,that 在定语从句中作宾语时通常可省略。The books (that) I sent you will help you in your studies. 第三、that 用作连词,引导名词性从句,状语从句和强调句。 1. that名词性从句。 ①引导宾语从句。及物动词后的引导词that可省略。I didn't expect (that) he could win the championship. The teacher pointed out that Tom was not working hard enough. ②引导主语从句。通常采用it作形式主语的句型。 That the earth goes around the sun is known to everyone. (It is known to everyone that the earth goes around the sun.) ③引导表语从句。 The trouble is that we are short of money. ④引导同位语从句。 引导同位语从句的that和引导定语从句的that是不同的。前者只起语法作用,在从句中不作任何成分;而后者在定语从句中作主语、宾语或表语。举例说明: The news that he resigned from office surprised us. The idea that he holds is very common nowadays on campus. 2. that引导状语从句①引导目的状语从句。 Bring it nearer that I may see it better. ②引导结果状语从句。What have I done that he should be so angry with me? ③引导原因状语从句。 I am afraid that I will fail in the driving test. ④引导让步状语从句。意为“虽然、尽管”。

C++ #pragma预处理命令

#pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma 指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。 #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma once 表示这个文件只被包含一次 #pragma warning(disable:4705) 表示屏蔽警告4705 C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。例如,有些程序需要精确控制数据存放的内存区域或控制某个函数接收的参数。#pragma为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。#pragma是由机器和相关的操作系统定义的,通常对每个编译器来说是不同的。 如果编译器遇到不认识的pragma指令,将给出警告信息,然后继续编译。Microsoft C and C++ 的编译器可识别以下指令:alloc_text,auto_inline,bss_seg,check_stack,code_seg,comment,component,conform,const_seg,data_seg,deprecated,fenv_access,float_control,fp_contract,function,hdrstop,include_alias,init_seg,inline_depth,inline_recursion,intrinsic,make_public,managed,message,omp,once,optimize,pack,pointers_to_members,pop_macro,push_macro,region, endregion,runtime_checks,section,setlocale,strict_gs_check,unmanaged,vtordisp,warning。其中conform,init_seg, pointers_to_members,vtordisp仅被C++编译器支持。 以下是常用的pragma指令的详细解释。 1.#pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef 则是基于宏的。

Java基础-关于session的详细解释

Java基础-关于session的详细解释 session, Java, 基础, 解释 一、术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的 含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差 别只能靠上下文来推断②。 然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了

电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP s ession”或者“一个POP3 session”③。 而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java 里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用 具体的“HttpSession”来表达含义⑥

#pragma data code ICCAVR的使用

#pragma data:code 在Keil中为了节省数据存储器的空间,通过“code”关键字来定义一个数组或字符串将被存储在程序存储器中: uchar code buffer[]={0,1,2,3,4,5}; uchar code string[]="Armoric" ; 而这类代码移值到ICCAVR上时是不能编译通过的。我们可以通过"const" 限定词来实现对存储器的分配: #pragma data:code const unsigned char buffer[]={0,1,2,3,4,5}; const unsigned char string[]="Armoric"; #pragma data:data 注意: 《1》使用ICCAVR6.31时,#pragma data :code ;#pragma data:data ; 这些语法时在"data:cod"、"data:data"字符串中间不能加空格,否则编译不能通过。 《2》const 在ICCAVR是一个扩展关键词,它与ANSIC标准有冲突,移值到其它的编译器使用时也需要修改相关的地方。 在ICCAVR中对数组和字符串的五种不同空间分配: const unsigned char buffer[]={0,1,2,3,4,5}; //buffer数组被分配在程序存储区中 const unsigned char string[]="Armoric" ; //stringp字符串被分配在程序存储区中 const unsigned char *pt //指针变量pt被分配在数据存储区中,指向程序存储区中的字符类型数据 unsigned char *const pt //指针变量pt被分配在程序存储区中,指向数据存储区中的字符类型数据 const unsigned char *const pt //指针变量pt被分配在程序存储区,指向程序存储区中的字符类型数据 unsigned char *pt //指针变量pt被分配在数据存储区中,指向数据存储区中的数据 请问#pragma data:code和#pragma data:data是什么意思? 前者表示:随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。

WINDOW.OPEN各属性及用法详解

一、window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+二、基本语法:window.open(pageURL,name,parameters)其中:pageURL为子窗口路径name为子窗口句柄parameters为窗口参数(各参数用逗号分隔)三、示例:脚本运行后,page.html将在新窗体newwindow中打开,宽为100,高为400,距屏顶0象素,屏左0象素,无工具条,无菜单条,无滚动条,不可调整大小,无地址栏,无状态栏。请对照。上例中涉及的为常用的几个参数,除此以外还有很多其他参数,请见四。四、各项参数其中yes/no也可使用1/0;pixel value为具体的数值,单位象素。参数|取值范围|说明alwaysLowered|yes/no|指定窗口隐藏在所有窗口之后alwaysRaised|yes/no|指定窗口悬浮在所有窗口之上depended|yes/no|是否和父窗口同时关闭directories| yes/no|Nav2和3的目录栏是否可见height|pixel value|窗口高度hotkeys|yes/no|在没菜单栏的窗口中设安全退出热键innerHeight| pixel value|窗口中文档的像素高度innerWidth|pixel value|窗口中文档的像素宽度location|yes/no|位置栏是否可见menubar|yes/no|菜单栏是否可见outerHeight|pixel value|设定窗口(包括装饰边框)的像素高度outerWidth|pixel value|设定窗口(包括装饰边框)的像素宽度resizable|yes/no|窗口大小是否可调整screenX|pixel value|窗口距屏幕左边界的像素长度screenY|pixel value|窗口距屏幕上边界的像素长度scrollbars|yes/no|窗口是否可有滚动栏titlebar|yes/no|窗口题目栏是否可见toolbar|yes/no|窗口工具栏是否可见Width|pixel value|窗口的像素宽度z-look|yes/no|窗口被激活后是否浮在其它窗口之上 =================================== ==================【1、最基本的弹出窗口代码】其实代码非常简单:因为着是一段javascripts代码,所以它们应该放在之间。是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。Window.open ('page.html')用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以,只是不要混用。这一段代码可以加入HTML的任意位置,和之间可以,间也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。【2、经过设置后的弹出窗口】下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。