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

我已经创建了一个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。

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

使用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(); } } 

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

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

您要做的是将其转换为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