登录后重定向错误(Java EE w/JSF)

Posted

技术标签:

【中文标题】登录后重定向错误(Java EE w/JSF)【英文标题】:Wrong redirect after logging in (Java EE w/ JSF) 【发布时间】:2012-06-09 19:23:45 【问题描述】:

使用 JSF 在 Java EE 中开发 Web 应用程序。所有页面都通过带有操作'j_security_check'并输入'j_username'和'j_password'的身份验证表单来防止查看。

然而,成功登录后,我被重定向到的不是我想访问的页面,而是这个 URL

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development

所以我正在查看包含所有 JS 代码的脚本文件 jsf.js,而不是我想要查看的页面。如果我访问 Web 根目录或任何其他页面都没有关系,我每次都会被重定向到这个 URL。然后我将 URL 更改为任何页面,它可以正常加载并登录。

我不得不说我已经遇到了这个问题,它神奇地消失了,所以它正确地重定向了我。几周后它又坏了,但我不知道这是我的错,如果是我不知道原因。我根本没有搞乱重定向或导航规则。

值得一提的是,我也在使用 PrettyFaces。

编辑:

<security-constraint>
    <display-name>secured</display-name>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>admin</role-name>
        <role-name>teacher</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>secured for admins</display-name>
    <web-resource-collection>
        <web-resource-name>admin pages</web-resource-name>
        <description/>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>unsecured</display-name>
    <web-resource-collection>
        <web-resource-name>css</web-resource-name>
        <description/>
        <url-pattern>/css/*</url-pattern>
    </web-resource-collection>
    <web-resource-collection>
        <web-resource-name>js</web-resource-name>
        <description/>
        <url-pattern>/js/*</url-pattern>
    </web-resource-collection>
    <web-resource-collection>
        <web-resource-name>img</web-resource-name>
        <description/>
        <url-pattern>/img/*</url-pattern>
    </web-resource-collection>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>wetk-security</realm-name>
    <form-login-config>
        <form-login-page>/faces/login.xhtml</form-login-page>
        <form-error-page>/faces/login.xhtml</form-error-page>
    </form-login-config>
</login-config>

【问题讨论】:

您的web.xml 文件的&lt;security-constraint&gt; 元素中有什么? 【参考方案1】:

容器管理的安全性将重定向到触发身份验证检查的最后一个 HTTP 请求。在您的情况下,它显然是自动包含的 JSF ajax API javascript 文件。如果浏览器从浏览器缓存中完全加载了待认证页面,而浏览器已经从服务器端完全加载了 JS 文件,或者通过条件 GET 请求测试了 JavaScript 文件的缓存有效性,则可能会发生这种情况.

您希望从身份验证检查中排除 JSF 资源(&lt;h:outputScript&gt;&lt;h:outputStylesheet&gt;&lt;h:graphicImage&gt;。您可以通过排除常见的 URL 模式 /javax.faces.resource/* 来做到这一点。您可能只想添加 @ 987654325@ 前缀模式,因为您显然使用它而不是 *.xhtml 后缀模式。

您还需要指示浏览器缓存受限页面,以防止浏览器从缓存中加载它(例如,在注销后按返回按钮)。将以下过滤器映射到与您的 &lt;security-constraint&gt; 相同的 URL 模式。

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint>
public class NoCacheFilter implements Filter 

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
        HttpServletRequest httpReq = (HttpServletRequest) request;
        HttpServletResponse httpRes = (HttpServletResponse) response;

        if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER))  // Skip JSF resources (CSS/JS/Images/etc)
            httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            httpRes.setDateHeader("Expires", 0); // Proxies.
        

        chain.doFilter(request, response);
    

    // ...

【讨论】:

所以我尝试了您的代码,并且在登录过程中(第一个请求和表单提交后)过滤器永远不会收到请求的页面。只有当我再次更改 URL 时它才会收到它。所以,不工作了,我还是看到了 JS 脚本。 终于搞定了。我只需要从安全性中排除/faces/javax.faces.resource/*。不需要过滤器。我应该在深入过滤器之前尝试一下。谢谢! 过滤器是强制性的,否则可能会导致不直观的浏览器行为,例如注销后按返回按钮,否则仍会显示受限页面。

以上是关于登录后重定向错误(Java EE w/JSF)的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 3在错误登录后重定向尝试模式登录

Simplesamlphp IdP 登录后重定向到错误的 url

Laravel - 登录后重定向回登录页面

如何在laravel中登录后重定向特定页面

Instagram API 阻止在成功登录后重定向到 iOS 应用程序并出现 400 错误请求错误

在 Laravel 5 中进行身份验证后重定向