JSF 默认页面(已解决:小心浏览器的 301 缓存)
JSF Default Page (Resolved: Beware of 301-Caches of Browsers)
我们有一个 JSF 应用程序 运行。自从默认登陆页面定义为 /pages/dashboard.xhtml
.
Shiro 正在捕获请求,显示登录页面,在成功验证后,我们的 servlet 从 shiro 检索存储的请求并将用户转发到该页面。
所以,所有其他类型的深度link 都是可能的。
现在,我们希望允许用户定义他的默认登录页面。系统已设置,如果 shiro 未提供存储的请求,我们的应用程序会将用户转发到他定义的登录页面。
(其他 deeplinks 仍在工作。)
如果用户现在直接调用 https://example.com/app/login.xhtml
,他将被转到他的自定义登陆页面。 (登录后)
唯一奇怪的是 - 现在让我发疯:如果用户只请求 https://example.com/app
- 第一个请求 shiro 是 link 再次到旧仪表板: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>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
,然后导致 "stored request"。
(我们不喜欢,因为 szenario 应该使用用户的默认登录页面)
这是 wildfly 8.1,我完全不知道这个 "request" 是在哪里触发的。 (显然它不是默认页面) - 但它是第一个请求到达我们的 url-rewrite 过滤器,所以它必须在调用应用程序之前发生...
但是在哪里呢?
尴尬...
<meta http-equiv="Refresh" content="0; URL=login.xhtml">
被认为是 301(永久移动)并且 chrome 是 缓存 此重定向,即使开发工具(禁用缓存)已打开。只有手动清除缓存才能解决这个问题。
因此,chrome 从未调用(新)index.xhtml
,因为在更改之前它是 <meta http-equiv="Refresh" content="0; URL=/pages/dashboard.xhtml">
因此,在缓存可能在任何客户端上存在时,唯一的选择似乎是:将 存储的请求 考虑到旧仪表板 否存储请求...
更新:浏览器似乎可以无限期地缓存 301:
意思是:现在我需要忽略这个存储的请求。如果用户将其设置为自定义登录页面,这将在稍后处理。
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;
我们有一个 JSF 应用程序 运行。自从默认登陆页面定义为 /pages/dashboard.xhtml
.
Shiro 正在捕获请求,显示登录页面,在成功验证后,我们的 servlet 从 shiro 检索存储的请求并将用户转发到该页面。
所以,所有其他类型的深度link 都是可能的。
现在,我们希望允许用户定义他的默认登录页面。系统已设置,如果 shiro 未提供存储的请求,我们的应用程序会将用户转发到他定义的登录页面。
(其他 deeplinks 仍在工作。)
如果用户现在直接调用 https://example.com/app/login.xhtml
,他将被转到他的自定义登陆页面。 (登录后)
唯一奇怪的是 - 现在让我发疯:如果用户只请求 https://example.com/app
- 第一个请求 shiro 是 link 再次到旧仪表板: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>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
,然后导致 "stored request"。
(我们不喜欢,因为 szenario 应该使用用户的默认登录页面)
这是 wildfly 8.1,我完全不知道这个 "request" 是在哪里触发的。 (显然它不是默认页面) - 但它是第一个请求到达我们的 url-rewrite 过滤器,所以它必须在调用应用程序之前发生...
但是在哪里呢?
尴尬...
<meta http-equiv="Refresh" content="0; URL=login.xhtml">
被认为是 301(永久移动)并且 chrome 是 缓存 此重定向,即使开发工具(禁用缓存)已打开。只有手动清除缓存才能解决这个问题。
因此,chrome 从未调用(新)index.xhtml
,因为在更改之前它是 <meta http-equiv="Refresh" content="0; URL=/pages/dashboard.xhtml">
因此,在缓存可能在任何客户端上存在时,唯一的选择似乎是:将 存储的请求 考虑到旧仪表板 否存储请求...
更新:浏览器似乎可以无限期地缓存 301:
意思是:现在我需要忽略这个存储的请求。如果用户将其设置为自定义登录页面,这将在稍后处理。
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;