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