2016年8月3日 星期三

當從Excel or Word中開啟一個含有session(cookie)的網頁連結,session(cookie)會消失



MS Office是使用一個叫做Hlink.dll的元件來判斷文件中的連結是要開啟一個MS Office檔案, 或是其他東西(browser)。

假設Excel中的目標網頁是http://localhost/manager/EditNews.aspx,這個網頁是需要登入才可以進入的。在沒有登入的情況下會redirect到登入頁http://localhost/login.aspx?ReturnUrl=news.aspx。而我實際上已經有登入過了(session已存在)

所以我從Excel開啟了http://localhost/manager/news.aspx,應該會正常連結到目標網頁才對,但是我總是會連結到http://localhost/login.aspx?ReturnUrl=news.aspx。這是不是就像是session已經消失了......其實session沒有消失

想像Excel(Hlink.dll)是這樣運作的......
當一個連結需要用browser開啟時,在Excel內部會先執行http://localhost/manager/news.aspx,因為在內部執行,所以沒有session,因此就會導向登入頁(http://localhost/login.aspx?ReturnUrl=news.aspx)了。

在參考資料中,有人是使用header refresh的方式來解決這個問題,但是我不適用,有需要的人也可以參考看看。

而我是使用javascript setTimeout的方式。因為我在登入頁有加上ReturnUrl的參數,所以我可以用來當作判斷返回的依據

.cs
if (Request.QueryString["ReturnUrl"].Contains("news") && Session["login"] != null)
{
   news.Value = "true";
   ReturnUrl.Value = Request.QueryString["ReturnUrl"];
}

.aspx
<asp:HiddenField ID="news" runat="server" />
<asp:HiddenField ID="ReturnUrl" runat="server" />
$(function () {
    if ($('#news').val() === "true") {
        setTimeout(function () {
            location.href = "manager/" + $('#ReturnUrl').val();
        }, 100);
    }
});

如果參數設定的適當,在登入頁暫停一下再連結到目標網頁,應該就可以解決問題了


參考資料:http://stackoverflow.com/questions/2653626/why-are-cookies-unrecognized-when-a-link-is-clicked-from-an-external-source-i-e

沒有留言:

張貼留言