学习JAVA Web必须了解的几个概念(二)[内容很多可以分片]


  • TCP/IPTCP/IP
            Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/ 因特网互联协议,又名网络 通讯协议,是Internet最基本的协议、Internet国际 互联网络的基础,由 网络层的IP协议和 传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入 因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。 通俗而言:TCP负责发现 传输的问题,一有问题就发出信号,要求重新传输,直到所有 数据安全正确地传输到目的地。而IP是给 因特网的每一台联网设备规定一个地址。
            TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。







协议测试
全面的测试应包括局域网和互联网两个方面,因此应从局域网和互联网两个方面测试,以下是在实际工作中利用命令行测试TCP/IP配置步骤:
1. 单击“开始”/“运行”,输入CMD按回车,打开命令提示符窗口。
2.首先检查IP地址、子网掩码、 默认网关、DNS服务器地址是否正确,输入命令ipconfig /all,按回车。此时显示了你的网络配置,观查是否正确。
3.输入ping 127.0.0.1,观查网卡是否能转发数据,如果出现“Request timed out”(请求超时),表明配置出错或网络有问题。
4.Ping一个互联网地址,看是否有数据包传回,以验证与互联网的连接性。
5. Ping 一个局域网地址,观查与它的连通性。
6.用nslookup测试DNS解析是否正确,输入如nslookup ,查看是否能解析。
如果你的计算机通过了全部测试,则说明网络正常,否则网络可能有不同程度的问题。在此不展开详述。不过,要注意,在使用 ping命令时,有些公司会在其主机设置丢弃ICMP数据包,造成你的ping命令无法正常返回数据包,不防换个网站试试。

TCP/IP协议协议重置

如果需要重新安装 TCP/IP 以使TCP/IP 堆栈恢复为原始状态。可以使用NetShell 实用程序重置TCP/IP 堆栈,使其恢复到初次安装操作系统时的状态。具体操作如下:
1.单击 开始--> 运行,输入"CMD" 后单击"确定";
2.在命令行模式输入命令
netsh int ip reset C:\resetlog.txt
(其中,Resetlog.txt记录命令结果的日志文件,一定要指定,这里指定了Resetlog.txt 日志文件及完整路径。)
运行结果可以查看C:\resetlog.txt
运行此命令的结果与删除并重新安装TCP/IP 协议的效果相同。
注意
本操作具有一定的风险性,请在操作前备份重要数据,并根据操作熟练度酌情使用

  • 网络分层结构(了解概念即可,暂时不需要记住各层是咋回事儿)
       网络分层就是将 网络节点所要完成的数据的发送或转发、打包或拆包,控制信息的加载或拆出等工作,分别由不同的硬件和软件模块去完成。这样可以将往来通信和网络互连这一复杂的问题变得较为简单。
       因特网协议栈共有五层:应用层、传输层、网络层、链路层和物理层。不同于 OSI七层模型这也是实际使用中使用的分层方式。
ISO提出的OSI(Open System Interconnection)模型将网络分为七层,即物理层( Physical )、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)和应用层(Application)。(有没有很眼熟,看下上面一个分点哈~)

  • 浏览器
       浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。
      它用来显示在万维网或局域网等内的文字、图像及其他信息。这些文字或图像,可以是连接其他网址的超链接,用户可迅速及轻易地浏览各种信息。大部分网页为HTML格式。
      一个网页中可以包括多个文档,每个文档都是分别从服务器获取的。大部分的浏览器本身支持除了HTML之外的广泛的格式,例如JPEG、PNG、GIF等图像格式,并且能够扩展支持众多的插件(plug-ins)。另外,许多浏览器还支持其他的URL类型及其相应的协议,如FTP、Gopher、HTTPS(HTTP协议的加密版本)。HTTP内容类型和URL协议规范允许网页设计者在网页中嵌入图像、动画、视频、声音、流媒体等。
  • HTTP(需要理解GET/POST的意义、差别---这个下次在补充)
       超文本传输协议(HTTP,HyperText Transfer Protocol)是 互联网上应用最为广泛的一种 网络协议。所有的 WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收 HTML页面的方法。
HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
       HTTP协议是基于请求/响应 范式的。一个客户机与 服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是 MIME信息包括服务器信息、实体信息和可能的内容。
http运作方式的一种            http运作方式的一种
其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由 IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。
工作原理
        一次HTTP操作称为一个事务,其工作过程可分为四步:
首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
       建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议 版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
       服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。   
       客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客

户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
  • HTML

       超级文本标记语言是 标准通用标记语言下的一个应用,也是一种规范,一种 标准,它通过标记符号来标记要显示的网页中的各个部分。网页 文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉 浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)。 浏览器按顺序阅读网页 文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的 浏览器,对同一标记符可能会有不完全 的解释,因而可能会有不同的显示效果。



元素
<html></html> 创建一个超文本标记语言文档。
<head></head> (头)设置文档标题和其它在网页中不显示的信息,比如direction方向、语言代码Language Code(见实体定义!ENTITY % i18n)、指定字典中的元信息、等等。
<BASE> 文档中不能被该站点辨识的其它所有链接源的 URL(统一资源定位器)
<LINK> 定义一个链接和源之间的相互关系,比如引用一个 层叠样式表(英文缩写: css)、做一个链接到一个脚本、为某文件做一个链接(可打印的版本)、文档特定的工具栏/菜单。
<script></script>脚本语句标签,比如引用一个 javascript脚本。
<body></body>文档体,文档的可见部分。
<title></title> 设置文档的标题。
当然,如果不使用以上基本框架结构,而直接使用在实体部分中出现的标记符,在 浏览器下也可以 解释执行
内容描述
<h1></h1> 最大的标题(一号标题)
<pre></pre> 预先格式化文本 (英文全称: PRE formatted
<u></u> 下划线(英文全称:Underline)
<b></b> 黑体字 (英文全称:Bold)
<i></i> 斜体字 (英文全称:Italics)
<tt></tt>打字机风格的 字体
<cite></cite>引用,通常是斜体
<em></em> 强调文本(通常是斜体加黑体、英文全称: EM phasize
<strong></strong> 加重文本(通常是斜体加黑体)
<font size="" color=""></font> 设置字体大小从1到7,颜色使用名字或 RGB(中文全称:红绿蓝)的十六进制值
<BASEFONT></BASEFONT>基准字体标记
<big></big> 字体加大
<SMALL></SMALL> 字体缩小
<DELECT></DELECT> 加删除线
<CODE></CODE>程式码
< KBD></KBD>键盘字(英文全称: K ey B oar D
<SAMP></SAMP> 范例(英文全称: SAMPle)
<VAR></VAR> 变量(英文全称:VARiable)
<BLOCKQUOTE></BLOCKQUOTE> 向右缩排(向右缩进、块引用)
<DFN></DFN> 述语定义(英文全称:DeFiNe)
<ADDRESS></ADDRESS>地址标记
<sup></SUP> 上标字 (英文全称:SUPerscript)
<SUB></SUB> 下标字(英文全称:SUBscript)
<xmp>...</xmp>;固定宽度 字体(在 文件中空白、换行、定位功能有效)
<plaintext>...</plaintext>;固定宽度 字体(不执行标记符号)
<listing>...</listing> 固定宽度小 字体
<font color=00ff00>...</font>;字体 颜色
<font size=1>...</font>;字体 大小等于1(最小)。
<font style ='font-size:100 px'>...</font>;字体 样式等于无限增大(100像素)
格式标志标签
<p></p> 创建一个段落 (英文全称: P aragraphs
<p align=""> 将段落按左、中、右对齐
<br/>定义新行
<blockquote></blockquote> 从两边缩进文本
<dl></dl> 定义列表(英文全称: D efinition L ist
<dt> 放在每个定义术语词前(定义术语、英文全称:D efinitionT erm
<dd> 放在每个定义之前(定义说明、英文全称:D efinitionD escription
<ol></ol> 创建一个标有序的列表,默认前面有数字,从数字“1”开始计数,依次叠加,也可以设置为字母或从任何自然数开始计数的列表项 (有序列表、外语全称:O rderedL ist
<ul></ul> 创建一个无序的列表,默认前面标有圆点,也可以自己设置为none或者其他形状,如空心圆、方块等。(无序列表、外语全称:U norderedL ists
<li> 放在每个列表项之前,若在<ol></ol>;之间则每个列表项加上一个数字,
若在<ul></ul>;之间则每个列表项加上一个圆点
<div align=""></div> 用来排版大块HTML段落,也用于格式化表
<MENU> 选项清单
<DIR> 目录清单
<nobr></nobr> 强行不换行(英文全称:nobr eaking)
<hr size='9' width='80%' color='ff0000'>;水平线(设定宽度、外语全称:horizontalrule)
<center></center> 水平居中
网页表格标签
由于表格可以精确控制文本和图像在网页中的显示位置,所以在很多网站的主页中一般都使用表格来进行布局。
  表格的基本结构如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
< Table >
 
 < caption ></ caption >
 
 < tr >
 
 < th ></ th >< th ></ th >...
 
 </ tr >
 
 < tr >
 
 < td ></ td >< td ></ td >...
 
 </ tr >
 
 < tr >
 
 < td ></ td >< td ></ td >
 
 </ tr >
 
 < tr >
 
 < td ></ td >< td ></ td >
 
 </ tr >
 
 ...
 
 </ Table >

  <Table>定义整个表格,即表格的内容要放在<Table>和</Table>标记中;在<Table>中的主要属性:border属性显示表格的边框,width, height属性定义表格的大小。<caption>标记符用来定义表格的标题。
  表格的表示以行为单位,在行中包含列。其中:一个<tr>...</tr>标记表示一行;一个<td>...</td>标记表示一列;<th>... </th>定义表头,一般可以不用。
链接标志表格标志
?
1
2
< a
  href = "一个统一资源定位器" ></ a >
:创建超文本链接。
?
1
2
< a
  name = "书签页" ></ a >
:创建位于文档内部的书签。
?
1
2
< a
  href = "#书签页" ></ a >
:创建指向位于文档内部 书签的链接。
使用
每种HTML标记符在使用中可带有不同的属性项,用于 描述该标记符说明的内容显示不同的效果。 正文标记符中提供以下属性来改变文本的颜色及 页面背景
BGCOLOR(外语全称:BackgroundColor)用于定义网页的 背景色BACKGROUND用于定义 网页背景图案的图像 文件
TEXT用于定义 正文字符的颜色, 默认为黑色
LINK用于定义网页中 超级链接字符的颜色, 默认为蓝色
VLINK(外语全称:V isitedLINK)用于定义网页中 访问过的超接 链接字符的颜色, 默认为紫红色
ALINK(中文全称:活动链接)用于定义被鼠标选中,但未使用时 超链字符的颜色, 默认为红色
例如:标记将定义 页面的背景色为黑色, 正文 字体显示为白色。
以上属性使用中,需要对颜色进行说明,在HTML中对颜色可使用3种方法说明颜色属性值,即直接颜色名称、 16进制颜色代码、10进制 RGB码。
直接颜色名称,可以在代码中直接写出颜色的英文名称。如<font color="red">我们</font>,在 浏览器上显示时就为红色。
16进制颜色代码,语法格式: #RRGGBB 。16进制颜色代码之前必须有一个“#”号,这种颜色代码是由三部分组成的,其中前两位代表红色,中间两位代表绿色,后两位代表蓝色。不同的取值代表不同的颜色,他们的取值范围是00--FF。如<font color="#FF0000">我们</font>,在浏览器上显示同样为红色。
10进制 RGB码,语法格式: RGB(RRR,GGG,BBB) 。在这种表示法中,后面三个参数分别是红色、绿色、蓝色,他们的取值范围是0--255。以上两种表达方式可以相互转换,标准是16进制与10进制的相互转换。如<font color="rgb(255,0,0)">我们</font>,在浏览器上显示字体为红色。
使用图案代替背景颜色,可以使 页面更生动、美观。
如今用一张大图当做网页的背景已经成为一种流行趋势,高质量的精美照片和抽象的设计图片能够给网站的外观带去深刻的影响。
可将图像 文件“图像.gif”所表示的一幅图像作为 页面的背景,若图像幅面不够大,将会将图像重复平铺在窗口中。
注释
?
1
<!--百度百科:这是壹条注释,且不会呈现在渲染器或者网络浏览器之上。-->


  • Session(会话)
        Session直接翻译成中文比较困难,一般都译成 时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的 服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
session的工作原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数, PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。(其中Hibernate的部分在下面)


使用方法
Session 是 用于保持状态的基于 Web 服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。
Session 通常用于执行以下操作
存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。
存储只需要在页重新加载过程中或按功能分组的一组页之间保持其状态的对象。
Session 的作用就是它在 Web服务器上保持用户的 状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。
持久性方法的限制
随着越来越多用户登录,Session 所需要的 服务器内存量也会不断增加。
访问 Web应用程序的每个用户都生成一个单独的 Session 对象。每个 Session 对象的持续时间是用户访问的时间加上不活动的时间。


认识
1,对于 值类型的变量,Session中保存的是值类型的 拷贝
Session["__test0"] = 1;
int i = (int)Session["__test0"]+1;
int j = (int)Session["__test0"];
结果:i=2,j=1
2,对于引用类型的变量,Session中保存的是引用
CDACommon cda = new CDACommon();
Session["__test"] = cda.GetDataSet("select top 1 * from tb_customer");
DataSet ds = (DataSet)Session["__test"];
DataSet ds2 = (DataSet)Session["__test"];
ds.Tables[0].Rows[0][0]="9999";
结果:
ds.Tables[0].Rows[0][0]=="9999"
ds2.Tables[0].Rows[0][0]=="9999";
3,Session周期
新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗口不启动新的Session。Session过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session。
4,调用Session
对于Web Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个Session里  CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System Net.CookieContainer(); CWSSyscfg是一个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web Service的调用在同一个Session。可以用单例模式来实现。
5,Session数据有效期
只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个 数据项是整体失效的。
6,Session的保存
在Session中如果保存的是非序列化的类比如DataView,在用SQLServer保存Session的模式下,无法使用。查看一个类是否是序列化的方法是,需看是否用[Serializable]来标记了该类.


Hibernate 编辑
Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API,
注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之与Hibernate,相当于JDBC Connection相对与JDBC。
Session对象是有生命周期的,它以Transaction对象的 事务开始和结束边界
Session作为贯穿Hibernate的持久化管理器核心,提供了众多的持久化的方法,如save(),update,delete,find(Hibernate 3中已经取消了此方法,)等,通过这些方法我们可以透明的完成对象的增删改查(CRUD-- create read update delete),这里所谓的透明是指,Session在读取,创建和删除映射的实体对象的实例时,这一系列的操作将被转换为对数据库表中数据的增加,修改,查询和删除操作。
Session有以下的特点:
1,不是 线程安全的,应该避免多个线程共享同一个Session实例
2,Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源
3,Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。
org.hibernate Interface Session
public interface Session extends Serializable : 是一个Java application 和Hibernate之间主要的运行时接口,这是执行持久化服务的中心API
主要方法:
public Transaction beginTransaction() throws HibernateException:返回和当前Session对象相互联系的Transaction对象(表示在数据库中重新开始一个 事务)
public Transaction getTransaction():返回和当前session联系的Transaction对象
public Connection connection close() throws HibernateExcepton:结束当前的Session对象
public void clear() :清空Session,清除所有保存在当前Session缓存中的实体对象,终止所有正在执行的方法(eg: save(),update(),delete() .....)
public Serializable save(Object object)throws HibernateException 对当前参数指定的对象进行持久化(系统会首先赋予参数对象一个 标识符OID),他相当于insert语句 后面在详细介绍
public Connection connection() throws HibernateException 得到当前Session 中包含的 Connection对象
public boolean contains(Object object):判断参数给出的对象( 持久化类)是否在当前Session的缓存中
public void evict(Object object) throws HibernateException :将参数给出的Object从当前Session对象类中删除,使这个对象从持久态变成游离态,这种状态的改变不会引起对数据库的同步,后面详细介绍
public Object load(Class theclass,Serializable id) throws HibernateException 返回第一个参数指定类对应的表中,第二个参数指定的行(第二个参数就是要取得对象的OID,他对应表中主键列的值)
public void update(Object object) throws HibernateException :更新一个对象到数据库中,后面在详细介绍
public void delete (Object object)throws HibernateException:从数据库中删除和参数指定的对象对应的记录
public Object get(Class class,Serializable id) throws HibernateException:和load()方法一样区别在于,如果数据库表中没有对应的记录,get()方法返回null,load()方法将报异常

sessionTransaction

编辑
Transaction接口是Hibernate的数据库 事务接口,用于管理事务,他对底层的事务作出了封装,用户可以使用Transaction对象定义自己的对数据库的 原子操作,底层事务包括:JDBC API,JTA(Java Transaction API)。
一个Transaction对象的事务可能会包括多个对数据库进行的操作
org.hibernate Interface Transaction
public interface Transaction
常用方法
public void commit() throws HibernateException 刷新当前的Session以及结束 事务的工作,这个方法将迫使数据库对当前的事务进行提交
public void rollback() throws HibernateException :强迫 回滚当前事务
public boolean isActive() throws HibernateException:这个事务是否存活
----------------------------------------------------------------------------------------
Session:当中包含一个Connection对象
Connection c =session.getConnection();
Session的缓存用于临时保存持久化的对象,等到一定时候,再将缓存中的对象保存到数据库中。
应用程序 事务:如果一个Session中包含有多个Transaction(数据库事务),这些Transaction的集合称为应用程序事务
标准使用形式:
Configuration config=new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionfactory=config.buildSessionFactory();
Session session=sessionfactory.openSession();
Transaction tx=session.beginTransaction();
try
{
session.save();
tx.commit();
}
catch(Exception e)
{
if(tx!=null) tx.rollback();
}
finally
{
session.close ();
}


session的使用详情

如何防止session超时
众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时。
那么,如何解决用户登录后较长时间未操作而导致的session失效的问题呢? [3]  
导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。
  1、如果用户未操作的「长时间」超过了 服务器配置的session超时时间,并导致session失效,那么我们延长session的超时时间,让用户原来的「长时间」与超时时间相比,变得不「长」,不就可以解决了吗?
  2、如果用户是长时间「未操作」导致session失效,那么我们想办法产生「操作」,让用户每隔一小段时间就「操作」一次,与服务器产生交互,那么session自然也不会失效。一般情况下下,我们首先想到的是,通过改变服务器的配置,延长服务器的session超时时间。例如,在Tomcat服务器的web.xml文件中有如下节点内容:
<session-config><session-timeout>30</session-timeout></session-config>
这里的30表示session的超时时间,单位为分钟,如果用户登录后在30分钟内没有与 服务器交互,那么当前用户的session将失效。我们可以配置一个更大的数值(比如60),就可以延长session的超时时间,如果将该值改为0或负数的话,则表示session永不失效。
不过在实际的工作应用中,一味地上调session的超时时间设置并不怎么常见,大多数需要实现该功能的网站都将解决问题的焦点集中在第二条思路上。例如:一些在线网站均采用定时刷新页面的方法来防止session超时。
定时刷新页面,最常见的有两种实现方式:一种是通过JavaScript+HTMLDOM,另一种则是通过meta标签来实现。
1、JavaScript+HTMLDOM,示例代码如下:
?
1
2
3
4
functionrefresh(seconds){
setTimeout( "self.location.reload()" ,seconds*1000);
}
refresh(600); //调用方法启动定时刷新,数值单位:秒。
2、通过meta标签来实现(在页面中添加meta标签refresh也可以指定每隔指定时间就刷新当前页面),示例代码如下:
?
1
< metahttp-equiv = "refresh" content = "600" />
上述meta标签可以实现每过600秒就刷新一次当前页面。
在上述两种方案中,较好的为第二种,因为如果当前页面是在IE浏览器的模式窗口中打开的,默认情况下,self.location.reload()方法将会失效,而refreshmeta标签在IE模式窗口下仍然有效。
上述两种方式都实现了刷新当前页面,并且使用起来非常简单,不过很遗憾的是,它们存在一种几乎致命的缺陷。试想一下,如果在论坛发帖等需要用户输入内容的页面,用户花费较长的时间输入了许多文本内容,可是突然遇到了一个定时页面刷新,结果用户输入的所有内容都没了,估计这个时候用户连掐死你的心都有了……
因此我们需要在当前页面本身不刷新、不影响用户的任何操作的情况下实现定时刷新。最常见的解决方法仍然有两种。一种是在当前页面添加一个隐藏的iframe,然后在该iframe里面实现定时刷新。
?
1
< iframeid = "hidden_iframe" style = "display:none;" scrolling = "no" frameborder = "0" name = "hidden_iframe" src = "ping.php" ></ iframe >
此外,我们需要在服务器上编写对应的请求响应代码,例如ping.php中可以编写如下代码:
?
1
2
3
4
<?php
//每隔600秒刷新当前页面
echo '<html><head><metahttp-equiv="refresh"content="600"/></head><body></body></html>' ;
?>
另外一种则是使用JavaScriptImage对象来实现定时刷新,JavaScript代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
functionautoRefresh(seconds){
if (typeofperiod== "undefined" ){ //如果是第一次执行
period=seconds*1000; //定义全局变量period
varbodyDOM=document.getElementsByTagName( "body" )[0];
if (bodyDOM){
bodyDOM.innerHTML+= '<imgid="auto_refresh_img"src=""style="display:none"/>' ; //添加隐藏的图片
imgDOM=document.getElementById( "auto_refresh_img" ); //定义全局Image对象
}
}
if (typeofimgDOM!= "undefined" ){
imgDOM.src= "ping.php?sid=" +newDate().getTime(); //防止缓存
setTimeout( "autoRefresh(" +seconds+ ")" ,period);
}
}
autoRefresh(600); //调用方法启动定时刷新
和使用iframe来实现定时刷新一样,使用JavaScriptImage对象实现定时刷新,也需要在 服务器端编写类似的请求响应代码。服务器的响应可以是文字等非图片内容,非图片内容只会造成图像加载失败,而我们的图像标签本身就是隐藏的,不管是加载成功还是失败都不会显示,毕竟我们的主要目的是发送请求给服务器,让服务器保持session处于活动状态。
当然,还可以使用Ajax来实现定时刷新,不过使用Image对象会更好一些,因为有些老式浏览器的JavaScript无法实现Ajax,但是却可以使用Image对象。此外,使用Ajax需要编写更多的代码来处理XMLHttpRequest等对象的活动。
在上述两种方式中,各有其优缺点。
使用iframe标签实现定时刷新的优点是:不需要编写JavaScript代码,可以在浏览器禁用JavaScript的情况下实现定时刷新;其缺点是:在某些不支持iframe标签的老式浏览器中没有效果,此外,iframe 标签在浏览器中新增加了一个独立的页面,即使没有显示出来,不过其内部解析的window、document等对象仍然存在,占用的浏览器内存相对较多。
使用Image对象的优点是:与iframe相比,占用的内存相对较少,支持Image的浏览器也相对较多(现代浏览器均支持);缺点是:在浏览器禁用JavaScript的情况下就毫无用武之地了。
开发人员应根据实际需求情况来确定使用何种实现方式更好。此外, 服务器在响应定时刷新的请求时,在满足要求的情况下,应返回尽可能少的数据,以节省带宽。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值