Javascript 如何在JSF2中禁用.css和.js等静态资产的缓存?
我正在尝试设置一个不缓存静态资产.css和.js的项目。对于一些人来说,我们似乎有一些内部缓存问题,我希望这能解决这个问题 我有一个阶段监听器,基本上是一个稍微修改的版本 我的班级:Javascript 如何在JSF2中禁用.css和.js等静态资产的缓存?,javascript,css,jsf,websphere,browser-cache,Javascript,Css,Jsf,Websphere,Browser Cache,我正在尝试设置一个不缓存静态资产.css和.js的项目。对于一些人来说,我们似乎有一些内部缓存问题,我希望这能解决这个问题 我有一个阶段监听器,基本上是一个稍微修改的版本 我的班级: package com.ods.common.jsf.phaselistener; import javax.faces.context.FacesContext; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; imp
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");
}
}
添加到faces-config.xml的内容:
<lifecycle>
<phase-listener id="nocache">com.ods.common.jsf.phaselistener.CacheControlPhaseListener</phase-listener>
</lifecycle>
因此,这似乎在某种程度上起作用了……我假设这个日期是从Expires-1开始的(将其设置为unix纪元)
正如您所看到的,我已经尝试为一些javascript和css设置适当的内容类型头,但是这些资产的过期日期是一周以后
有人有什么想法吗?另外,我是一名前端开发人员,而不是后端java人员。我可以随意使用Java,但我绝对不是Java开发人员。这是我在JSF上的第一份工作,所以尽可能地沉默会很好:)使用setHeader()
您正在覆盖任何以前设置的头。而是使用addHeader()
,或者将所有逗号分隔的值作为标题值。这是完整的一套:
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.
您的另一个错误是PhaseListener
不是进行此操作的最佳位置。它只在JSF页面请求上调用,而不是在webbrowser独立调用的静态资源请求上调用。换句话说,只有JSF页面本身禁用了缓存,但是所有的
,
,
在faces config.xml中使用
启动
日期类型
应用
此示例将强制浏览器在服务器重新启动时重新加载资产。如果我只需要.css和.js文件,是否需要两个单独的过滤器@WebFilter(“/path/to/css”)和@WebFilter(/path/to/javascript”)使用@WebFilter(urlPatterns={“*.js”,“*.css”})
。注意:对于Servlet2.5,您当然需要老式的web.xml
注册。另请参见一个具体示例。在资源上设置标题并自定义其处理,实际上是javax.faces.application.Resource
的工作。我建议注册一个覆盖自定义Resource
处理的ResourceHandler
。另请参见和@YoYo:并非所有静态资源都通过FacesServlet
。
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.
@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)
}