尝试从局部视图重定向用户时出现 CORS 错误
CORS error when trying to redirect user from a partial view
我正在开发一个用 ASP.NET MVC5 编写的应用程序,它要求用户登录。身份验证与中央身份验证服务 (CAS) 一起工作。在主页上,我有几个局部视图:
Home page with partial views
当我想更新用户数据时调用控制器的动作。
它运行良好,直到 CAS 会话过期。如果我尝试刷新局部视图,则会出现错误:
"OPTIONS https://example.com/CAS/Authentication 403 (Forbidden)"
"Failed to load https://example.com/CAS/Authentication: Response for preflight has invalid HTTP status code 403"
我认为它来自使用 Ajax 刷新局部视图,它 returns 我登录页面,它不在同一个域中。我该如何解决这个问题?
在我的视图中,我使用 Ajax.BeginForm()
将数据发送到控制器,而我的控制器 returns 是部分视图,因此我不需要完全刷新页面。
为了克服跨源请求错误,我需要处理 Ajax 响应。我没有让登录页面在局部视图中返回,而是在 OnComplete 事件上调用了一个 Javascript 函数,检查响应的状态代码。
我的部分观点:
AjaxOptions ajaxOptions = new AjaxOptions
{
HttpMethod = "POST",
OnComplete = "redirectToLoginPage"
};
using (Ajax.BeginForm("ActionName", "ControllerName", null, ajaxOptions))
{
<button type="submit">Submit</button>
}
点击提交后,它将执行来自控制器 "ControllerName" 的操作 "ActionName"。然后,它将触发 Javascript 函数 "redirectToLoginPage",即:
function redirectToLoginPage(xhr) {
if (xhr.status == 200) {
//Whatever
}
else
{
window.location.replace("https://login.example/");
}
}
这样就可以了。
我正在开发一个用 ASP.NET MVC5 编写的应用程序,它要求用户登录。身份验证与中央身份验证服务 (CAS) 一起工作。在主页上,我有几个局部视图:
Home page with partial views
当我想更新用户数据时调用控制器的动作。
它运行良好,直到 CAS 会话过期。如果我尝试刷新局部视图,则会出现错误:
"OPTIONS https://example.com/CAS/Authentication 403 (Forbidden)"
"Failed to load https://example.com/CAS/Authentication: Response for preflight has invalid HTTP status code 403"
我认为它来自使用 Ajax 刷新局部视图,它 returns 我登录页面,它不在同一个域中。我该如何解决这个问题?
在我的视图中,我使用 Ajax.BeginForm()
将数据发送到控制器,而我的控制器 returns 是部分视图,因此我不需要完全刷新页面。
为了克服跨源请求错误,我需要处理 Ajax 响应。我没有让登录页面在局部视图中返回,而是在 OnComplete 事件上调用了一个 Javascript 函数,检查响应的状态代码。
我的部分观点:
AjaxOptions ajaxOptions = new AjaxOptions
{
HttpMethod = "POST",
OnComplete = "redirectToLoginPage"
};
using (Ajax.BeginForm("ActionName", "ControllerName", null, ajaxOptions))
{
<button type="submit">Submit</button>
}
点击提交后,它将执行来自控制器 "ControllerName" 的操作 "ActionName"。然后,它将触发 Javascript 函数 "redirectToLoginPage",即:
function redirectToLoginPage(xhr) {
if (xhr.status == 200) {
//Whatever
}
else
{
window.location.replace("https://login.example/");
}
}
这样就可以了。