Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JSF2中禁用.css和.js等静态资产的缓存?_Javascript_Css_Jsf_Websphere_Browser Cache - Fatal编程技术网

Javascript 如何在JSF2中禁用.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

我正在尝试设置一个不缓存静态资产.css和.js的项目。对于一些人来说,我们似乎有一些内部缓存问题,我希望这能解决这个问题

我有一个阶段监听器,基本上是一个稍微修改的版本

我的班级:

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)
}