将响应编码为Gzip导致Cookie无法在浏览器中设置

时间:2017-05-24 09:16:01

标签: java cookies browser gzip

我试图通过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);

任何关于为什么这不起作用的指针?我很确定我之前做过同样的事情而没有任何问题。

-

添加了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();
}

2 个答案:

答案 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
    screenshot
    - 歌剧 - 45.0.2552.812 (PGO) RESULT :cookie was set
    screenshot

    - Mozilla Firefox - 53.0.3 (32-bit)

关于FIREFOX的重要事项
当您打开开发人员工具时,不会显示任何Cookie集,但实际上可以正常工作检查屏幕截图 firefox cookie view

在哪里

 Jetty console output

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出现在那里,那么它就是浏览器的东西