JSF默认页面(已解决:小心浏览器的301缓存)

时间:2017-10-14 22:23:30

标签: jsf-2

我们正在运行JSF-Application。自从默认目标网页定义为/pages/dashboard.xhtml

Shiro正在捕获请求,显示登录页面,成功验证后,我们的servlet从shiro检索存储的请求,并将用户转发到该页面。

所以,其他所有类型的深层链接都是可能的。

现在,我们希望允许用户定义其默认目标网页。系统已设置,如果shiro未提供存储的请求,我们的应用程序会将用户转发到其定义的登录页面。

(其他深层链接仍在使用。)

如果用户现在直接呼叫https://example.com/app/login.xhtml,则会将其转发到其自定义目标网页。 (登录后)

唯一奇怪的是 - 现在让我发疯:如果用户只请求https://example.com/app - 第一个请求shiro的请求是指向旧信息中心的链接:https://example.com/app/pages/dashboard.xhtml

在web.xml中,我们将servlet映射到*.xhtml

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>

并将welcome-file-list定义为

  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>

文件存在且仅包含

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Refresh" content="0; URL=login.xhtml">
</head>
</html>

似乎永远不会调用该文件。删除重定向后,调用https://example.com/app会立即转到https://example.com/app/login.xhtml - 但是shiro会将访问请求记录到https://example.com/app/pages/dashboard.xhtml,从而导致存储请求&#34;然后

(我们不喜欢,因为szenario应该使用用户默认目标网页)

它的野生动物8.1,我完全没有想到这个&#34;请求&#34;被触发了。 (显然它不是默认页面) - 但它是第一个请求我们的url-rewrite过滤器的请求,所以它在调用应用程序之前就已经发生......

但是在哪里?

1 个答案:

答案 0 :(得分:1)

...尴尬

<meta http-equiv="Refresh" content="0; URL=login.xhtml">
即使dev-tools(禁用缓存)打开,

也被视为301(永久移动),chrome是缓存此重定向。只有手动清除缓存才能解决此问题。

因此,chrome从未调用(新)index.xhtml,因为在更改之前它是<meta http-equiv="Refresh" content="0; URL=/pages/dashboard.xhtml">

因此,对于任何客户端上缓存可能存在的时间,唯一的选择似乎是:将存储的请求作为 no stored request 考虑到旧仪表板。 ..

更新:似乎浏览器可能会无限期地缓存301: How long do browsers cache HTTP 301s?

意思是:现在我需要忽略这个存储的请求。如果用户将其设置为自定义着陆页,则稍后将对此进行处理。

        FacesContext context = FacesContext.getCurrentInstance();
        ServletRequest request = (ServletRequest) context.getExternalContext().getRequest();
        SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request);

        if ((savedRequest != null) && (savedRequest.getRequestUrl() != null)) {
            /**
             * Browser might cache the 301 redirect from index.xhtml
             * for an infinite amount of time. So, as of now, we can only consider
             * the old "dashboard" to be an "unstored request".
             *
             */
            if (!savedRequest.getRequestUrl().contains("/pages/dashboard.xhtml")) {
                return savedRequest.getRequestUrl();
            }
        }

        // No stored request. Get Custom Landingpage.
        String defaultLandingPage = this.userValueService.getValue(UserValueKey.defaultLandingPage);
        return ProjectStageConfiguration.getInstance().getWebContextPath() + defaultLandingPage;