我有一个MVC项目I,用户可以从菜单中更改语言。控制器代码:
[HttpGet]
public ActionResult ChangeLanguage(string Language)
{
Response.Cookies[SessionParams.LANGUAGE].Value = Language;
Response.Cookies[SessionParams.LANGUAGE].Expires = DateTime.Now.AddDays(7);
return Redirect(Request.UrlReferrer.PathAndQuery);
}和Global.asax.cs代码:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (Request.Cookies[SessionParams.LANGUAGE] != null)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.Cookies[SessionParams.LANGUAGE].Value);
}
}这个很好用。现在,我添加了一个实现IAuthorizationFilter的类,以确保可以在每个请求(FilterConfig.cs)之前检查会话是否仍然有效:
public class ConnectedUserValidAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
UrlHelper urlHelper = new UrlHelper(filterContext.HttpContext.Request.RequestContext);
string loginUrl = urlHelper.Action("Login", "Account");
if (filterContext.HttpContext.Request.Url.AbsolutePath != loginUrl)
{
if (filterContext.HttpContext.Session[SessionParams.CONNECTED_USER] == null)
filterContext.HttpContext.Response.Redirect("~");
}
}
}由于某种原因,在我将过滤器添加到全局过滤器之后:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new ConnectedUserValidAuthorizationFilter());
}调试表明,Request.Cookies在Global.asax.cs中不再保留language cookie的值。
删除筛选器会使值返回。
知道怎么解决吗?我尝试将筛选器代码移动到Application_BeginRequest,但是会话在这个上下文中还不存在。
发布于 2018-11-07 10:31:47
最后,我实现了IActionFilter而不是IAuthorizationFilter接口,在OnActionExecuting函数中使用了与OnAuthorization相同的逻辑。
这似乎更适合于任务,因为OnActionExecuting是在每个Action之前调用的。它似乎也能保持饼干完好无损。
https://stackoverflow.com/questions/53150128
复制相似问题