Pet*_*der 7 java jquery servlets http http-status-code-301
我有一个要求,即不应将值缓存在服务器中,也不应将浏览器缓存为域和会话上的cookie.
所以我选择永久重定向到价值
Servlet的:
@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.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
脚本:
<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>
Run Code Online (Sandbox Code Playgroud)
控制台输出:
Send use from cache.
--- i enter username and press the button ---
Write
Read and cache!
--- now i make a reload ---
Send use from cache.
Run Code Online (Sandbox Code Playgroud)
来自browsercache的reaload后没有返回我插入的用户名.
为什么浏览器不缓存?

您的请求是一个 ajax 调用,它是async request对您的 servlet 的调用,在这种情况下,您在服务器端的重定向不会影响客户端。此请求的工作方式类似于浏览器中的单独线程。
因此,您应该指定响应数据(在本例中为 url,带有查询字符串)。在 ajax 成功回调中 servlet 响应之后,您应该指定重定向事件的位置。
对于 ajax success 后的重定向window.location.href = reponseUrl;,您可以设置输入的值,而不是重定向。
否则只需提交表单并通过您的 servlet 进行重定向。