MS RFC 42:支持cookies转发¶
- 日期
2008/03/26
- 作者
朱利安·塞缪尔·拉克鲁瓦
- 联系方式
可在Mapgears.com上了解更多有关jlacroix的信息
- 最后编辑
2008/04/01
- 状态
通过2008/04/01-完成实施
- 版本
地图服务器5.2
概述¶
此RFC建议在执行OWS请求时扩展MapServer以转发HTTP cookie。
分布式服务器环境中的一种身份验证方法是使用HTTP cookie。Web服务器使用HTTP cookie来区分用户,并在导航期间维护与用户相关的数据,可能是跨多次访问和状态信息。从技术上讲,cookie是由Web服务器选择并发送到浏览器的任意数据块。浏览器将它们原封不动地返回到服务器。对MapServer的增强将允许应用程序将从客户端接收的任何HTTP cookie(从HTTP或HTTPS请求获取或发布)转发到MapServer将请求信息的任何其他服务器或服务。
这将要求MapServer在操作请求(级联)期间接收并转发任何cookie到新服务,例如(但不限于)WMS请求:GetMaps、GetFeatureInfo和WFS请求GetFeature。
实施方法¶
将在mapfile级别添加新的元数据(http_cookie_data),以临时存储http cookie数据。另一个元数据(OWS-HTTP-cookie)也将添加到层和 Mapfile 级别,以控制cookie的使用。后者将设置为“转发”,以转发存储在HTTP cookie数据元数据中的cookie,或将其转发到硬编码cookie值,以仅转发此硬编码值。
元数据中的OWS-HTTP-cookie示例:
LAYER
...
METADATA
"ows_http_cookie" "forward" # This will forward the cookie sent to MapServer
END
...
用户还可以直接传递cookie值,而不是传递给mapserver的cookie。要传递多个cookie,请使用以下语法:
LAYER
...
METADATA
"ows_http_cookie" "cookie1=my_value; cookie2=myvalue; " # This will forward the metadata value
END
...
通过使用元数据配置,mapscript应用程序将能够通过设置正确的元数据来转发HTTP cookie。
目前,只有WMS和WFS代码将使用此代码,因为它们是MapServer请求外部Web服务器的唯一位置。
实施问题¶
在RFC审查期间指出,使用“http-cookie-data”元数据传递和存储cookie数据是对MapServer元数据机制的不良使用。
由于MapServer目前缺乏将应用程序状态信息关联到MapObj的机制,因此目前没有更好的机制来存储从客户端接收的cookie数据并将其传递给调用远程WMS的呈现代码。由于缺乏更好的解决方案,目前我们将使用本RFC中提出的“http_cookie_data”元数据,因为我们知道这是对元数据的糟糕使用,并且一旦有了更好的机制,可以在mapobj中存储和传递应用程序状态,那么该元数据将被否决,并由新的机制取代。钐。设置这个“http-cookie-data”元数据的mapscript应用程序的开发人员应该意识到这一点,并准备在未来的mapserver版本中更改他们的代码。
另一个问题是,目前计划不使用HTTP cookie数据元数据进行编码。格式不正确的元数据可能会破坏请求的HTTP头。如果发现curl不编码cookie值,则只允许32到126(可打印的ASCII字符)之间的字符。
对源代码的修改¶
HTTP cookie数据需要存储在新成员变量的cgirequestobj中,以便能够将其传递到mapfile。如果存在HTTP cookies,cookies将始终存储在那里。然后,如果设置了OWS的http_cookie元数据,那么mapserv.c主函数将在loadmap()函数之后和msowsdatch()之前负责mapfile中的http cookie。当为服务器请求准备URL时,wms和wfs代码将在httprequestobj中设置新创建的变量。
wms/wfs mspreparewmslayerrequest函数将检查层和映射对象中的ows-http-cookie元数据。如果该值设置为Forward,则HTTP cookie数据元数据的内容将作为HTTP cookie转发到WMS/WFS服务器。
curl作为curl_easy_setopt()函数中的一个选项,用于执行一个名为curlot_cookie的请求,以随请求发送cookie。
MapScript¶
通过在mapfile元数据中存储HTTP cookie数据,mapscript将能够使用这个新功能。下面是一个使用http cookie的php/mapscript示例:
foreach($_COOKIE as $szKey => $szValue)
{
$szHTTPCookies .= "$szKey=$szValue; ";
}
$oMap->setMetadata("http_cookie_data", $szHTTPCookies);
$oMap->setMetadata("ows_http_cookie", "forward");
$oMap->draw();
文件影响¶
cgiutil.h (add http_cookies in cgiRequestObj)
cgiutil.c (read and store the http cookies data in cgiRequestObj)
maphttp.c (send cookies with the request via curl option)
mapows.h (add http_cookies to httpRequestObj)
mapserv.c (store cookies in mapfile metadata)
mapwmslayer.c (set cookies in httpRequestObj)
mapwfslayer.c (set cookies in httpRequestObj)
向后兼容性¶
没有。
投票历史¶
2008/04/01通过,法兰克、丹妮尔姆、汤克和阿塞法伊的+1,杰夫姆和佩里克莱斯的+0。