読者です 読者をやめる 読者になる 読者になる

GWT RPC のレスポンスがブラウザにキャッシュされている?

Slim3 + GWT でアプリを開発してるんですが、ちょっと問題にぶち当たっています。GWT RPC でデータの更新をした後、サーバーから再取得すると、なぜか更新前のデータが返ってきてしまう…。でも、F5 を押して画面を更新したら更新後のデータ取得できるようになるし、Datastore にもちゃんと更新は反映されていました。ブラウザが GWT RPC のレスポンスをキャッシュしてる?


試しに、GWT RPC のレスポンスをキャッシュしないように、レスポンスヘッダをいじるフィルタを作ってみました。

package sample.server.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        final HttpServletRequest httpRequest = (HttpServletRequest) request;
        final HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        if (httpRequest.getRequestURI().contains("s3gwt")) {
            httpResponse.setHeader("Pragma", "no-cache");
            httpResponse.setHeader("Cache-Control", "no-cache");
        }
        chain.doFilter(request, response);
    }

    public void init(FilterConfig config) throws ServletException {
    }
}

URL に s3gwt を含むリクエストに対して、レスポンスヘッダに Pragma や Cache-Control を追加しています。


このフィルタをアプリに組み込むために web.xml を修正。

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
...
	<filter>
		<filter-name>ResponseFilter</filter-name>
		<filter-class>sample.server.util.ResponseFilter</filter-class>
	</filter>
...
	<filter-mapping>
		<filter-name>ResponseFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
...
</web-app>

これで Google Chrome ではキャッシュされなくなったっぽいんですけど…要経過観察です。そもそも、ブラウザがキャッシュしてるかどうかも確定じゃないですし。同じ現象に遭遇した人いないですかね?