我有一个在经过表单身份验证的aspx页面内运行的Java applet.在我的站点的.NET 1.1版本中,applet可以访问会话cookie并且能够从服务器检索文件,但是在.NET 2.0版本中它无法进行身份验证.
我在其他地方看过几个论坛帖子,声明2.0默认情况下会将Hets设置为HttpOnly,但到目前为止给出的解决方案对我来说并不适用.我还在某处读到2.0可能基于用户代理进行区分.
有没有人对此有任何经验或见解?
这个问题很老,但我认为在这里得到正确的答案是有价值的.
Filip将服务器端Java与客户端Java混淆.他是正确的,你不能在不使用自定义方法的情况下在两个服务器端平台之间共享会话,例如Java(J2EE)和ASP.Net.
但是,applet是客户端的,因此应该能够访问主机页面的会话信息.问题是ASP.Net 2.0在会话cookie上添加了HttpOnly标志.此标志可防止JavaScript和Java小程序访问这些cookie.
解决方法是关闭会话cookie上的HttpOnly标志.虽然您可以在较新版本的ASP.Net中进行配置,但在以前的版本中,解决方案是将以下代码添加到Global.asax文件中:
protected void Application_EndRequest(object sender, EventArgs e) { /** * @note Remove the HttpOnly attribute from session cookies, otherwise the * Java applet won't have access to the session. This solution taken * from * http://blogs.msdn.com/jorman/archive/2006/03/05/session-loss-after-migrating-to-asp-net-2-0.aspx * * For more information on the HttpOnly attribute see: * * http://msdn.microsoft.com/netframework/programming/breakingchanges/runtime/aspnet.aspx * http://msdn2.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx */ if (Response.Cookies.Count > 0) { foreach (string lName in Response.Cookies.AllKeys) { if (lName == FormsAuthentication.FormsCookieName || lName.ToLower() == "asp.net_sessionid") { Response.Cookies[lName].HttpOnly = false; } } } }
请注意,即使使用此修复程序,并非所有浏览器/ OS/Java组合都可以访问cookie.我目前正在研究在Windows XP上使用Java 1.6.0_13在Firefox 4.0.1上无法访问会话cookie的问题.
解决方法是使用Dr. Dad建议的方法,其中会话ID作为参数传递给applet,然后嵌入到请求URL中(需要在服务器端配置中打开URL会话)或作为手动设置的cookie发送.