2012-12-28 76 views
4

我已經創建了一個HttpHandler,我將使用帶有的jquery-Ajax調用。用戶會話ID作爲Ajax調用中的參數

的HttpHandler將訪問數據庫,並檢查與當前用戶燒焦的東西。

用戶被認爲是通過使用會話登錄的,具有名爲user_id的屬性。

Session["user_id"] = userId; 

我試圖找回這會議的HttpHandler,但似乎並沒有工作。

所以我想過發送USER_ID作爲參數

var user_id = //Retrieved in some way... 
    $.ajax({ 
     url: 'QuestionRate.ashx?id=user_id', 
     success: function (msg, status, xhr) { 
      alert(msg); 
     }, 
     error: function() { 
      alert(msg); 
     } 
    }); 

但這似乎真的像一個壞主意,誰將會讀取代碼可以簡單地與他想要的ID訪問處理程序。

所以我能在這種情況下怎麼辦?我希望處理程序以獲取數據庫訪問user_ID的,但我想確保這個user_id是在用戶簽訂的實際ID。在處理程序中無法訪問會話?

回答

6

傳遞會話ID與Ajax調用不好聽。

您應該用標記IReadOnlySessionState標記您的處理程序接口並通過HttpContext.Current.Session實例以只讀方式訪問會話。


代碼示例:

public class FooHandler : IHttpHandler, IReadOnlySessionState 
{ 
    public bool IsReusable 
    { 
     get { return false; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     string user_id = context.Session["user_id"].ToString(); 
    } 
} 
+0

可以請你的這個處理程序將如何看起來像一個小例子,更新你的答案?我在C#中真的不太好。 – user1665700

+0

BRILLIANT,它的工作,我試圖使用上下文。會話[「user_id」]但它沒有工作,我需要實現這個接口,但我不知道如何實現接口:DI在Java上工作了很多,我討厭當我需要移動到另一種語言非常相似,一切feels..weird .. – user1665700

2

讓你的處理函數中實現IRequiresSessionState,將通知您的處理程序使用會話狀態ASP.NET。然後從客戶端發送的會話cookie將被處理的認可,你可以訪問它的服務器端在任何其他aspx頁面爲例。

此外,您可以使用IReadOnlySessionState進行只讀會話訪問。

+0

看起來你的答案是正確的太到底,謝謝! – user1665700

1

你要做的是將它變成POST並將其添加到POST數據。然後,當與SSL密鑰耦合時,POST數據將自動加密。那麼,你可以嘗試是:

var user_id = //Retrieved in some way... 
$.ajax({ 
    type: "POST" 
    url: 'QuestionRate.ashx', 
    data: { userid: user_id } 
    success: function (msg, status, xhr) { 
     alert(msg); 
    }, 
    error: function() { 
     alert(msg); 
    } 
}); 

然後在HTTP處理程序,你可以只使用Request對象是拉斷。

jQuery AJAX API

+0

好主意,實現SSL的可能是一個麻煩,但如果你還沒有拿到證書。 – Liam

+1

@Liam,沒錯,但是現在當Windows Server 2008是自己的證書服務器時,這很容易。此外,如果OP擔心安全問題(即會話密鑰遭到破壞),那麼在沒有SSL的情況下運行網站會使安全成爲一個有爭議的問題,因此如果您不使用SSL,只需將它傳遞到查詢字符串中即可。 –

+0

V真正的,SSL是保證連接的唯一** **真實的方式。 – Liam