请教关于HTTP响应头的设置

请教关于HTTP响应头的设置,第1张

有的网站会在服务器运行一段时间后down掉,有很多原因可能造成这种现象:比如tomcat堆和非堆内存设置不足,程序没能释放内存空间造成内存溢出,或者某些进程一直运行没能释放,造成cup资源大量消耗。但除了程序本身的原因,还有可能是客服端访问造成(当然这个客户端也包含如蜘蛛软件等搜索引擎),如果服务器和客户端建立的是长链接(可以用”netstat -a”命令查看网络访问信息),这就需要对http响应头的connection做一定的设置。

在http1.1中request和reponse header中都有可能出现一个connection头字段,此header的含义是当client和server通信时对于长链接如何进行处理。在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。

不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

HTTP Connection的close设置允许客户端或服务器中任何一方关闭底层的连接双方都会要求在处理请求后关闭它们的TCP连接。

如何在程序中设置:可以在过滤器中加入:response.setHeader(“connection”, “close”)

以下内容来自: HTTP Keep-Alive详解

HTTP Keep Alive

HTTP Keep-Alive 很大程序上被误解了,下面介绍一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的,以及其在JAVA中的运行原理。

HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求。这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现;它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题。

HTTP/1.0

在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接

HTTP/1.1

在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不同,默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close ,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。另外,还添加了一个新的字段Keep-Alive:,因为这个字段并没有详细描述用来做什么,可忽略它

Not reliable(不可靠)

HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接特性,否则会有意想不到的后果

Keep-Alive和POST

在HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(比如在POST消息体的后面放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求头中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,但是在未经测试之前是不可能知道一个服务器是否会这样做。

以下内容来自: http://liuzhigong.blog.163.com/blog/static/178272375201141344312315/

HTTP无状态协议和Connection:Keep-Alive容易犯的误区

名词解释:

HTTP无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系

如果你要实现一个购物车,需要借助于Cookie或Session或服务器端API(如NSAPI and ISAPI)记录这些信息,请求服务器结算页面时同时将这些信息提交到服务器

当你登录到一个网站时,你的登录状态也是由Cookie或Session来“记忆”的,因为服务器并不知道你是否登录

优点:服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,以更高效地去处理WEB业务

缺点:客户端的每次请求都需要携带相应参数,服务器需要处理这些参数

Keep-Alive:参考另外一篇文章HTTP Keep-Alive 详解

容易犯的误区:

1、HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)

2、从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

3、Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间

以下内容来自:http://www.l99.com/EditText_view.action?textId=446020&src=

Keep-Alive简介及在Tomcat中配置

Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。市场上 的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive功能对资源利用的影响尤其突出。 此功能为HTTP 1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。

Keep-Alive: timeout=5, max=100

timeout:过期时间5秒(对应httpd.conf里的参数是:KeepAliveTimeout),max是最多一百次请求,强制断掉连接

就是在timeout时间内又有新的连接过来,同时max会自动减1,直到为0,强制断掉。

Tomcat中的相关设置,在server.xml 中的Connector 元素中。

keepAliveTimeout:

此时间过后连接就close了,单位是milliseconds

maxKeepAliveRequests:

最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间).

maxKeepAliveRequests=”1″就可以避免tomcat产生大量的TIME_WAIT连接,从而从一定程度上避免tomcat假死。

<Connector executor=”tomcatThreadPool”

port=”80″ protocol=”HTTP/1.1″

connectionTimeout=”60000″

keepAliveTimeout=”15000″

maxKeepAliveRequests=”1″

redirectPort=”443″

maxHttpHeaderSize=”8192″ URIEncoding=”UTF-8″ enableLookups=”false” acceptCount=”100″ disableUploadTimeout=”true”/>

要设置Geoserver响应头,可以按照以下步骤进行:

1、进入Geoserver的管理页面,在“GlobalSettings”中找到“HTTPHeaders”选项卡。

2、在“HTTPHeaders”选项卡中,可以看到一些默认的响应头设置,如“Cache-Control”,“Expires”等。

3、要添加新的响应头,可以点击“Add”按钮,在d出的对话框中输入响应头的名称和值。

4、点击“Save”按钮保存设置。

在头文件中添加

afx_msg

void

OnNetPortSet(void)

在源文件中添加

BEGIN_MESSAGE_MAP(CMainFrame,

CFrameWndEx)

ON_COMMAND(ID_MODIFYPORT,

CMainFrame::OnNetPortSet)

END_MESSAGE_MAP()

ID_MODIFYPORT是菜单项的ID号,OnNetPortSet()菜单项的消息处理函数。你就可以在这里面添加用户选择该菜单项后所做的事情了啊

如果要让d出式菜单的某个菜单项,灰化,使用下面这个函数吧EnableMenuItem(m_hMainMenu,

i,

MF_BYPOSITION

|MF_GRAYED)

具体函数使用说明如下

允许或禁止指定的菜单条目

BOOL

EnableMenuItem(HMENU

hMenu,UINT

uIDEnableItem,

UINT

uEnable)

返回值

BOOL

判断是否成功

参数表

参数

类型及说明

hMenu

,菜单句柄

wIDEnableItem

,欲允许或禁止的一个菜单条目的标识符。如果在wEnable参数中设置了MF_BYCOMMAND标志,这个参数就代表欲改变菜单条目的命令ID。如设置的是MF_BYPOSITION,则这个参数代表菜单条目在菜单中的位置(第一个条目肯定是零)

wEnable

,参考ModifyMenu函数中的菜单常数标志定义表,其中列出了允许使用的所有常数。对于这个函数,只能指定下述常数:MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,MF_DISABLED以及MF_GRAYED

这些值有下列含义:

·

MF_BYCOMMAND

指定参数给出已存在的菜单项的命令ID号。此为缺省值。

·

MF_BYPOSITION

指定参数给出已存在菜单项的位置。第一项所在的位置是0。

·

MF_DISABLED

使菜单项无效,以便它不能被选择,但不变灰。

·

MF_ENABLED

使菜单项有效,以便它能够被选择,并可从变灰的状态中恢复出来。

·

MF_GRAYED

使菜单项无效,以便它不能被选择并同时变灰。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11433150.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存