用户会话ID作为Ajax调用中的参数

时间:2012-12-28 13:34:52

标签: c# asp.net ajax jquery httphandler

我创建了一个 HttpHandler ,我将使用 jquery-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访问Handler。

那么在这种情况下我该怎么办?我希望Handler获取user_id以进行数据库访问,但我想确保此user_id是已登录用户的实际ID。没有办法在Handler中访问Session?

3 个答案:

答案 0 :(得分:6)

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

您应该使用标记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();
    }
}

答案 1 :(得分:2)

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

您也可以使用 IReadOnlySessionState 进行只读会话访问。

答案 2 :(得分: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