4

我创建了一个HttpHandler,我将在jquery-Ajax调用中使用它。

这个HttpHandler将访问数据库并检查与当前用户相关的内容。

用户被认为是使用 Session 登录的,并带有一个名为user_id的属性。

Session["user_id"] = userId;

我试图在HttpHandler中检索此Session ,但这似乎不起作用。

所以我考虑将 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 访问 Handler。

那么在这种情况下我能做些什么呢?我希望处理程序获取用于数据库访问的 user_id,但我想确保这个 user_id 是登录用户的实际 id。有没有办法在Handler中访问Session?

4

3 回答 3

6

使用 ajax 调用传递会话 ID 听起来不太好。

您应该使用标记IReadOnlySessionStateHttpContext.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();
    }
}
于 2012-12-28T13:42:47.680 回答
2

使您的处理程序实现IRequiresSessionState,这将通知 ASP.NET 您的处理程序使用会话状态。然后,从客户端发送的会话 cookie 将被处理程序识别,您可以在服务器端访问它,例如在任何其他 aspx 页面中。

您也可以IReadOnlySessionState用于只读会话访问。

于 2012-12-28T13:43:14.357 回答
1

您要做的是将其转换为 aPOST并将其添加到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

于 2012-12-28T13:44:03.347 回答