gpt4 book ai didi

javascript - 如何在 JSF2 中禁用 .css 和 .js 等静态 Assets 的缓存?

转载 作者:技术小花猫 更新时间:2023-10-29 11:52:45 25 4
gpt4 key购买 nike

我正在尝试设置一个不缓存静态 Assets .css 和 .js 的元素。对于某些人来说,我们似乎遇到了一些内部缓存问题,我希望这能解决问题。

我有一个相位监听器,基本上是这个 http://turbomanage.wordpress.com/2006/08/08/disable-browser-caching-in-jsf/ 的一个稍微修改的版本

我的类(class):

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>

我的 .xhtml 页面过去有过期 header :

Expires Thu, 01 Jan 1970 00:00:00 GMT

所以这似乎有点工作......我假设这个日期来自 Expires -1(将其设置为 unix 纪元)。

如您所见,我已尝试为某些 javascript 和 css 设置适当的内容类型 header ,但这些 Assets 的到期日期是 future 一周。

有人有什么想法吗?另外,我是前端开发人员,而不是后端 Java 人员。我可以随意使用 Java,但我绝对不是 Java 开发人员。这也是我使用 JSF 的第一份工作,所以尽可能多地简化它会很好 :)

最佳答案

随着 setHeader()您正在覆盖任何先前设置的 header 。而是使用 addHeader()相反,或者只是将所有值以逗号分隔作为 header 值。这是完整的集合:

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 页面请求上调用,而不是在由 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)
}

如果您以 Servlet 3.0 容器(Tomcat 7、Glassfish 3 等)为目标,则 web.xml (或 faces-config.xml )无需注册。 @WebFilter("/*")将自动注册它并将其映射到 /* 的 URL 模式上因此涵盖了所有请求。

另见:


与具体问题无关,完全禁用静态 Assets 缓存并不是最好的主意。它不必要地消耗网络带宽。而是寻找不同的解决方案,例如在查询字符串中包含服务器启动时间戳。

例如

<script src="foo.js?#{startup.time}"></script>

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>

此示例将强制浏览器在服务器重新启动时重新加载 Assets 。

关于javascript - 如何在 JSF2 中禁用 .css 和 .js 等静态 Assets 的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10854522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com