【问题标题】:BHSM-Servlet does not let browser cache usernameBHSM-Servlet 不允许浏览器缓存用户名
【发布时间】:2015-06-25 06:21:19
【问题描述】:

我有一个要求,即不应将值作为域和会话上的 cookie 缓存在服务器或浏览器中。

所以我选择永久重定向到该值

小服务程序:

@Override
protected void service(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String key = request.getParameter("key");
    String val = request.getContentType();
    if (val != null && val.length() == 0) {
        val = null;
    }
    String repeatText = request.getParameter("repeatText");
    if (val != null && repeatText == null) {
        response.setStatus(301); // moved permanent
        response.addHeader("Location", "?repeatText=" + val);
        System.out.println("Write");
    } else {
        if (repeatText != null) {
            response.setContentLength(repeatText.length());
            response.addHeader("pragma", "no-cache");
            response.addIntHeader("expires", BROWSER_CACHE_DAYS);
            response.getWriter().write(repeatText);
            System.out.println("Read and cache!");
        } else {
            response.sendError(304); // use from cache!
            System.out.println("Send use from cache.");
        }
    }
}

脚本:

<input class="username" />
<button>Login</button>

<script>
jQuery.ajax('theservlet?key=username').done(function(v){jQuery('.username').val(v);});
jQuery('button').click(function(){
  jQuery.ajax('theservlet?key=username',{contentType:jQuery('.username').val()})
});
</script>

控制台输出:

Send use from cache.
--- i enter username and press the button ---
Write
Read and cache!
--- now i make a reload ---
Send use from cache.

从浏览器缓存重新加载后不返回我插入的用户名。

为什么浏览器不缓存?

【问题讨论】:

  • 重载前后地址栏显示什么?
  • http://localhost:8080/
  • BHSM 是 BrowserHistoryStorageMechanism。
  • 对了,如果你想让浏览器缓存结果,为什么要调用response.addHeader("pragma", "no-cache");
  • @CupawnTae 我喜欢阻止任何代理缓存。不是浏览器。编译指示是否也阻止浏览器缓存?

标签: java jquery http servlets http-status-code-301


【解决方案1】:

重定向 ajax 请求不会将浏览器重定向到新位置,如果这样做了,您将不再拥有您的页面,您只会得到来自 servlet 的响应。

因此,当您刷新页面时,您将再次从头开始请求原始 URL,并且用户名丢失了。

您可以直接在 javascript 中将用户名添加到 URL:

jQuery('button').click(function(){
  var username=jQuery('.username').val();
  jQuery.ajax('theservlet?key=username',{contentType:username});
  window.location.hash=username;
});

这会将“#用户名”附加到地址栏中的 URL。然后在页面加载时,您可以从请求参数中填充输入(如果存在):

jQuery('.username').val( window.location.hash );

【讨论】:

  • 我不喜欢浏览器更改位置。
【解决方案2】:

即使您确实使 301 机制正常工作,您也无法保证浏览器将缓存重定向多长时间。我没有立即回答为什么没有为您缓存 301,但是如果您对存储用户名 somewhere 的浏览器感到满意(毕竟,这就是您想要的使用 301s),只是您特别不希望将其存储在 cookie 中,那么 sessionStoragelocalStorage 将是正确的选择:

sessionStorage.setItem("username", username);

var username = sessionStorage.getItem("username");

或使用localStorage 跨会话持久存储它。

Docs here

【讨论】:

  • 这些存储仅限于一个域或会话。这与 BHSM 机制不同。我喜欢让每个人在不同的页面域、扩展和插件之间共享这些信息。
  • 好的。可能值得将该要求添加到问题中。
【解决方案3】:

您的请求是一个 ajax 调用,它是对您的 servlet 的 async request,在这种情况下,您在服务器端的重定向不会影响到客户端。这个请求就像浏览器中的单独线程一样工作。

所以你应该指定响应数据(在这种情况下是带有查询字符串的 url)。在您的 ajax 成功回调中的 servlet 响应之后,您应该指定重定向事件的位置。

对于 ajax 成功 window.location.href = reponseUrl; 后的重定向,您可以设置输入的值,而不是重定向。

否则只需提交表单并通过您的 servlet 重定向。

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2011-03-23
    • 2013-11-24
    • 2014-11-29
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多