【问题标题】:Redirect from java filter to a different AngularJS page从 java 过滤器重定向到不同的 AngularJS 页面
【发布时间】:2018-08-20 21:29:11
【问题描述】:

当我试图为我目前面临的挑战找到解决方案时,我得到了许多似乎不太适合我的问题的方法。 这就是我所面临的:

我有一个与Spring Security 集成的后端,而前端都是使用AngularJS 构建的。我们有两组用户 - 旧用户和新用户。新功能要求在旧用户登录时,将用户重定向到密码重置页面并让旧用户重置其密码以满足新密码标准。

这是我处理这个问题的方法: 创建一个过滤器来拦截每个用户请求,检查用户是否是旧用户。如果是,则将用户重定向到密码重置页面。

我目前面临的挑战是让 AngularJS 从过滤器中知道它应该将用户重定向到密码重置页面。

当我在HttpServletResponse 上调用 sendRedirect 时,它不会重定向到目标页面。我知道我在这里遗漏了一些东西。有人可以帮我解决这里的方法吗?

谢谢。

【问题讨论】:

  • 您应该在 Angular 应用程序中检查登录请求的响应状态。如果响应状态为 REDIRECT,则在您的 Angular 应用程序中执行重定向。您不能从后端 api 发送重定向并期望 angularjs 应用程序会理解它并自行执行重定向。
  • 我对此进行了思考,但只是想知道在 AngularJS 或后端是否还有其他更好的方法我可能不知道。感谢您的意见。

标签: java angularjs spring-security filter


【解决方案1】:

就像 Dvorog 在他的评论中所说,您必须向您的客户端发送重定向响应,例如 302。您应该在标头中指定重定向位置。

然后,在客户端,您可以在错误回调中管理标头

$http.get('/someUrl').success(function(data, status, headers, config) {
})
.error(function(data, status, headers, config) {
  // check status and get headers informations(ie location) here to make redirection
});

您将在documentation中找到更多详细信息

【讨论】:

  • 感谢您的回复。不是 AngularJS 的专家。但是无论如何实现拦截器对我有帮助吗?
【解决方案2】:

既然您要求更好的解决方案(在 cmets 中),我会这样做:

创建一个守卫,该守卫将分配给需要用户通过身份验证才能访问它们的所有路由。这个守卫应该检查经过身份验证的用户的角色,如果用户是旧用户,则将用户重定向到“更改密码”站点。这样,您就不必在后端实现特殊逻辑并发送重定向请求。

【讨论】:

  • 守卫?我会记住这一点。谢谢。在阅读了更多关于此的内容后,我遇到了 AngularJS 拦截器。我不太擅长 AgularJS。您认为在这种情况下实施拦截器是个好主意吗?
  • 据我所知,拦截器会拦截任何发出或进入您的应用程序的请求。例如,您可能拥有只有其他类型用户才能访问的组件,而无需检查这些用户是否更新了密码。使用警卫,您可以仅将特定警卫分配给您想要验证的组件,而在其他情况下,您无法选择应该检查哪些请求。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2016-09-03
  • 2012-04-30
  • 1970-01-01
  • 2012-05-10
  • 2023-04-05
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多