我创建了一个 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?
答案 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
对象将其关闭。