在表单登录 Glassfish 上禁用重定向到上次访问的资源

Posted

技术标签:

【中文标题】在表单登录 Glassfish 上禁用重定向到上次访问的资源【英文标题】:Disable redirect to last accessed resource on form login Glassfish 【发布时间】:2013-04-03 13:55:11 【问题描述】:

我要重写我之前的问题。

表单登录后Glassfish重定向到最后访问的资源,我该如何关闭它?

我们的问题是我们在 FF 和 IE 中得到 415,因为如果我有 JSESSION cookie,Glassfish 将重定向到我尝试访问的最后一个资源,但不会从 (x-form-urlencoded) 切换内容类型。

伪示例(请求是浏览器的 XMLHttpRequest):

GET /secure/resouce1 (json) -> Response "you're not logged in."
GET /login.xhtml
POST /j_secure (x-form-urlencoded) -> New location /secure/resource1 (x-form-urlencoded)
GET /secure/resource1 (x-form-urlencoded) <- HTTP ERROR 415 content type not JSON.

【问题讨论】:

如果不重定向,你希望它做什么?如何进行?提到的资源是 RESTful 资源吗? 是的,所有资源都是 RESTful 的(登录除外)。我希望它要么转到预定义的 URL,即。欢迎文件或让它设置另一种响应类型。由于重定向和响应类型组合,AJAX 调用失败。即使认证成功。 【参考方案1】:

您可能需要写一个Filter 来检查和捕捉这种情况。我喜欢this tutorial(希望英文翻译可以理解)。

【讨论】:

这就是我实际上正在做的以规避它,但到目前为止它还没有工作。 Glassfish 在任何请求到达容器之前进行重定向。届时响应类型已设置为application/x-form-urlencoded 我做对了吗:问题是您的应用程序没有返回 JSON,因为浏览器提交了不需要的响应类型?这应该是在调用chain.doFilter(request, response);之前修改请求还是我还没收到? 修改请求有点棘手,解决方法是here【参考方案2】:

在我看来,对于 RESTful 服务,最好使用基于 SSL 的 Basic 或 Digest 身份验证。其他选项包括将凭据作为有效负载的一部分,或者创建一个专用的登录服务,该服务接受凭据并返回一个令牌。有多种reasons 为什么基于表单的身份验证不太适合 RESTful 服务:它需要一个会话,它不使用现有的 HTTP 授权等等。 如果您需要使用 AJAX 调用 RESTful 服务,那么使用 cookie 进行身份验证可能是一个有效的解决方案。它们应该只影响用户是否可以拨打电话,而不影响服务器如何响应。

如果您想继续为您的应用程序使用基于表单的身份验证,我建议添加一个额外的 JAAS 身份验证提供程序来处理 RESTful 服务身份验证。你可以阅读更多关于它的信息here。

另一个应该比 JAAS 更容易的选项是使用 Spring Security 或 Apache Shiro 而不是基于容器的身份验证。 Here 是使用 Spring Security 配置基于表单的身份验证的示例。这篇文章展示了如何使用 Spring Security secure RESTful services 的示例。

【讨论】:

我同意该表单登录存在问题,但我被锁定到 Glassfish。至于基本身份验证,我认为这是有问题的,因为它会在每个请求中重新发送身份验证,并且我放弃了任何简单的实际注销方式。我同意基于 Cookie 的身份验证,您对 Glassfish(即插件等)的使用有什么建议吗? 我会尝试创建一个自定义 JAAS 登录模块 - docs.oracle.com/cd/E19587-01/821-0027/gepfq/index.html 另一种选择是使用 Spring Security 或 Apache Shiro 代替标准 JEE 安全【参考方案3】:

在您的登录页面中

重置 JSESSIONID cookie 以防止重定向最后一页

// login_form.jsp

Cookie jsess = new Cookie("JSESSIONID", null);

jsess.setMaxAge(0);

jsess.setPath(pageContext.getServletContext().getContextPath());

response.addCookie(jsess);

【讨论】:

以上是关于在表单登录 Glassfish 上禁用重定向到上次访问的资源的主要内容,如果未能解决你的问题,请参考以下文章

在 Glassfish 上进行领域身份验证后重定向

如何在 Symfony 2 中 login_check 后禁用重定向

会话超时后,Spring 安全性不会重定向到上次请求的页面登录

开始页面上的 Django 注册表单,没有重定向到登录页面

在 SSL 卸载程序和 Apache 之后的 Glassfish HTTPS 重定向

Spring security *always* 重定向到登录表单