我试图通过Gzipping来自后端的所有响应来减少网络流量,但是我遇到了一个问题,如果登录/注销调用以相同的方式完成,那么浏览器中没有设置cookie我和# 39;我不知道为什么。
这是Java中的后端代码。
Cookie cookie = new Cookie("cookie_name", cookieToken);
cookie.setPath("/");
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
response.setContentType("application/json; charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Content-Encoding", "gzip");
String json=serviceOutput.toString();
byte[] gzip = Utils.gzip(json.getBytes("UTF-8"));
response.setContentLength(gzip.length);
response.getOutputStream().write(gzip);
任何关于为什么这不起作用的指针?我很确定我之前做过同样的事情而没有任何问题。
-
public static byte[] gzip(byte[] content) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream g = new GZIPOutputStream(baos);
if (content != null && content.length > 0) {
g.write(content, 0, content.length);
g.close();
}
return baos.toByteArray();
}
答案 0 :(得分:9)
我已将用于模拟数据的代码修改为
package com.mytests.pack;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HomeServlet extends HttpServlet{
private static final long serialVersionUID = -2638972063792556071L;
private Cookie[] cookies;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
cookies = request.getCookies();
System.out.println("----------------------======================-------------------");
if(null!=cookies){
for(Cookie c : cookies){
System.out.println(c.getValue());
}
}else {
System.out.println("First request");
}
System.out.println("----------------------======================-------------------");
Cookie cookie = new Cookie("cookie_name", "cookiecontentishereofname"+LocalDateTime.now().toString());
cookie.setPath("/");
cookie.setMaxAge(Integer.MAX_VALUE);
response.setContentType("application/json; charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.addCookie(cookie);
response.setHeader("Content-Encoding", "gzip");
String json="{\"keyone\":\"Somestring is here in the point\"}";
ByteArrayOutputStream obj=new ByteArrayOutputStream();
GZIPOutputStream gzipstream = new GZIPOutputStream(obj);
byte[] gzip = json.getBytes("UTF-8");
gzipstream.write(gzip);
gzipstream.close();
response.setContentLength(obj.toByteArray().length);
response.getOutputStream().write(obj.toByteArray());
}
}
以上代码和 jetty-distribution-9.4.0.v20161208
经过测试的浏览器
- Google Chrome - Version 58.0.3029.110 (64-bit)
RESULT :cookie was set
- 歌剧 - 45.0.2552.812 (PGO)
RESULT :cookie was set
- Mozilla Firefox - 53.0.3 (32-bit)
关于FIREFOX的重要事项
当您打开开发人员工具时,不会显示任何Cookie集,但实际上可以正常工作检查屏幕截图
在哪里
Jetty控制台输出显示cookie已成功设置!
配置中的其他更改我想向您展示
将POM dependency snippet
添加为
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
答案 1 :(得分:3)
你的代码看起来很不错。
我建议你在这里使用例如curl -v http://your.host/under/test
terminal命令显示响应纯文本标题。
如果你的cookie出现在那里,那么它就是浏览器的东西