mag*_*nta 4 javascript css websphere jsf browser-cache
我正在尝试设置一个不缓存静态资产.css和.js的项目.我们似乎对某些人有一些内部缓存问题,我希望这可以解决它.
我有一个阶段监听器,基本上是这个http://turbomanage.wordpress.com/2006/08/08/disable-browser-caching-in-jsf/的略微修改版本
我的课:
package com.ods.common.jsf.phaselistener;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletResponse;
public class CacheControlPhaseListener implements PhaseListener
{
public PhaseId getPhaseId()
{
return PhaseId.RENDER_RESPONSE;
}
public void afterPhase(PhaseEvent event)
{
}
public void beforePhase(PhaseEvent event)
{
FacesContext facesContext = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
response.setHeader("Cache-control", "no-cache"); // HTTP 1.1
response.setHeader("Cache-control", "no-store"); // HTTP 1.1
response.setHeader("Cache-control", "must-revalidate"); // HTTP 1.1
// response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setHeader("Allow", "GET"); // Allowing GET Method only
response.setHeader("Allow", "POST");// Allowing POST Method only
response.setDateHeader("Expires", -1); // prevent caching at the proxy server
/*what I've added*/
response.setHeader("Pragma", "no-cache");
response.setHeader("Content-type", "x-javascript");
//below are the content types I'm seeing for the css/js assets via Firebug
response.setHeader("Content-type", "application/x-javascript");
response.setHeader("Content-type", "text/css");
}
}
Run Code Online (Sandbox Code Playgroud)
我对faces-config.xml的补充:
<lifecycle>
<phase-listener id="nocache">com.ods.common.jsf.phaselistener.CacheControlPhaseListener</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)
我的.xhtml页面在过去获得了一个过期标题:
Expires Thu, 01 Jan 1970 00:00:00 GMT
Run Code Online (Sandbox Code Playgroud)
所以这似乎有点工作......我假设这个日期来自Expires -1(将其设置为unix epoch).
正如您所看到的,我已尝试为某些javascript和css设置适当的内容类型标头,但这些资产的过期日期是未来一周.
有人有主意吗?另外,我是一个前端开发人员,而不是一个后端java人.我可以搞乱Java,但我绝对不是Java开发人员.这是我在JSF的第一份工作,所以尽管你可以愚蠢下来会很好:)
Bal*_*usC 12
随着setHeader()你覆盖任何以前设置的标题.而是使用addHeader(),或者只是将所有值commaseparated作为标头值.这是完整的集合:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
Run Code Online (Sandbox Code Playgroud)
你的另一个错误是a PhaseListener不是最好的地方.它仅在JSF页面请求上调用,而不是在由Web浏览器独立调用的静态资源请求上调用.换句话说,只有在JSF页面本身已禁用高速缓存,但所有<script>,<link>,<img>,等会产生不调用新的请求PhaseListener,因为这些都不是JSF页面.
而是使用Filter.
@WebFilter("/*")
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);
}
// ... (just keep init() and destroy() NO-OP)
}
Run Code Online (Sandbox Code Playgroud)
如果您定位Servlet 3.0容器(Tomcat 7,Glassfish 3等),则无需注册web.xml(或faces-config.xml).该@WebFilter("/*")会autoRegister的,并映射它的URL模式/*,其因此涵盖了所有请求.
与具体问题无关,完全禁用静态资产缓存并不是最好的主意.它不必要地花费网络带宽.而是寻找不同的解决方案,例如包括查询字符串中的服务器启动时间戳.
例如
<script src="foo.js?#{startup.time}"></script>
Run Code Online (Sandbox Code Playgroud)
内 faces-config.xml
<managed-bean>
<managed-bean-name>startup</managed-bean-name>
<managed-bean-class>java.util.Date</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)
此示例将强制浏览器在服务器重新启动时重新加载资产.
| 归档时间: |
|
| 查看次数: |
8366 次 |
| 最近记录: |