`

通过Filter和HttpServletResponseWrapper,实现Gzip压缩

    博客分类:
  • JEE
 
阅读更多
实现定制输出的关键是对HttpServletResponse进行包装,截获所有输出,等过滤器链处理完后,
Filter.doFilter,在截获输出进行处理,在写入到真正的HttpServletResponse中。J2EE中已有
HttpServletResponseWrapper,使得包装HttpServletResponse更加容易
public class GZipFilter implements Filter {
  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
      ServletException {
    HttpServletResponse resp = (HttpServletResponse) response;
    Wrapper wrapper = new Wrapper(resp);
    chain.doFilter(request, wrapper);
    byte[] gzipData = gzip(wrapper.getResponseData());
    resp.addHeader("Content-Encoding", "gzip");
    resp.setContentLength(gzipData.length);
    ServletOutputStream output = response.getOutputStream();
    output.write(gzipData);
    output.flush();
  }

  private byte[] gzip(byte[] data) {
    ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240);
    GZIPOutputStream output = null;
    try {
      output = new GZIPOutputStream(byteOutput);
      output.write(data);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (output != null) {
        try {
          output.close();
        } catch (IOException e) {
        }
      }
    }
    return byteOutput.toByteArray();
  }

  public void init(FilterConfig fConfig) throws ServletException {
  }
}

public class Wrapper extends HttpServletResponseWrapper {
  public static final int OT_NONE = 0, OT_WRITER = 1, OT_STREAM = 2;
  private int outputType = OT_NONE;
  private ServletOutputStream output = null;
  private PrintWriter writer = null;
  private ByteArrayOutputStream buffer = null;

  public Wrapper(HttpServletResponse resp) throws IOException {
    super(resp);
    buffer = new ByteArrayOutputStream();
  }

  public PrintWriter getWriter() throws IOException {
    if (outputType == OT_STREAM)
      throw new IllegalStateException();
    else if (outputType == OT_WRITER)
      return writer;
    else {
      outputType = OT_WRITER;
      writer = new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding()));
      return writer;
    }
  }

  public ServletOutputStream getOutputStream() throws IOException {
    if (outputType == OT_WRITER)
      throw new IllegalStateException();
    else if (outputType == OT_STREAM)
      return output;
    else {
      outputType = OT_STREAM;
      output = new WrappedOutputStream(buffer);
      return output;
    }
  }

  public void flushBuffer() throws IOException {
    if (outputType == OT_WRITER)
      writer.flush();
    if (outputType == OT_STREAM)
      output.flush();
  }

  public void reset() {
    outputType = OT_NONE;
    buffer.reset();
  }

  public byte[] getResponseData() throws IOException {
    flushBuffer();
    return buffer.toByteArray();
  }
  class WrappedOutputStream extends ServletOutputStream {
    private ByteArrayOutputStream buffer;

    public WrappedOutputStream(ByteArrayOutputStream buffer) {
      this.buffer = buffer;
    }

    public void write(int b) throws IOException {
      buffer.write(b);
    }

    public byte[] toByteArray() {
      return buffer.toByteArray();
    }
  }
}
分享到:
评论

相关推荐

    Gzip工具打包JS、CSS文件,后台解压缩

    本文将详细介绍如何使用Gzip来打包JS和CSS文件,并在Java后台通过Filter实现解压缩。 首先,我们需要了解Gzip的工作原理。Gzip基于DEFLATE算法,该算法结合了LZ77(一种无损数据压缩算法)和霍夫曼编码。它通过查找...

    Kotlin-记事本项目代码(android+kotlin)

    Kotlin-记事本项目代码(android+kotlin)

    识别车牌的一个小demo.zip

    车牌识别

    园区(特色小镇)智慧化解决方案PPT(53页).pptx

    在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。

    Redmine Tags plugin (Light version) 可自定义issue标签插件 可设置ISSUE标签 并设置根据标签查询 1.验证通过版本redmine5.0.4 2.解压tar

    Redmine Tags plugin (Light version) 可自定义issue标签插件 可设置ISSUE标签 并设置根据标签查询 1.验证通过版本redmine5.0.4 2.解压tar包至redmine/plugins目录重启redmine即可

    车牌识别_神经网络_模板匹配_训练识别程序_1741774578.zip

    车牌识别项目

    powerDesigner报告模板

    powerDesigner报告模板

    yolov5 csl_labelOriented Object detection旋转检测.zip

    python、yolo、pytorch

    车牌识别_深度学习_YOLOV7_LPRnet_技术实现与实_1741774682.zip

    车牌识别项目

    a8cce16fd8df855fa808c72133df2b4a_1741769036387_1

    a8cce16fd8df855fa808c72133df2b4a_1741769036387_1

    33559399361500导师评价.zip

    33559399361500导师评价.zip

    jaxlib-0.4.18-cp311-cp311-macosx_10_14_x86_64.whl

    该资源为jaxlib-0.4.18-cp311-cp311-macosx_10_14_x86_64.whl,欢迎下载使用哦!

    学号+姓名+实验二.ipynb

    学号+姓名+实验二.ipynb

    机器人项目-基于STM的智能引导车code(用户引导残障人士)

    机器人项目-基于STM的智能引导车code(用户引导残障人士)

    亲测柚子社区团购源码V1.6.2 小程序开源版+前端.zip

    亲测柚子社区团购源码V1.6.2 小程序开源版+前端(已亲测可安装使用) 是以微信为载体整合多个社区社群资源,形成由商家集中化管理运营的预售 团购的社区商业模式。 主要销售场景是由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群,每个群都相当于一个社区店。

    基于caffe的Yolov3v4实时目标检测框架.zip

    python、yolo、pytorch

    java-springboot+vue编程训练系统设计与实现源码(项目源码-说明文档).zip

    系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    图像识别_Cifar10_多种网络_分类研究_1741783912.zip

    图像处理项目实战

    blob-from-images opencv dnn

    blob_from_images opencv dnn

    糖尿病视网膜病变检测_pytorch_图像分类_医疗辅助_1741784391.zip

    图像处理项目实战

Global site tag (gtag.js) - Google Analytics