Filter——response增强案例—压缩响应=学习笔记

本文介绍了一种使用自定义HttpServletResponseWrapper实现HTTP响应内容压缩的方法。通过重写getOutputStream和getWriter方法,将输出内容先缓存再进行GZIP压缩,最终发送给客户端,有效减少传输数据量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:
通过filter向目标页面传递一个自定义的response对象。
在自定义的response对象中,重写getOutputStream方法和getWriter方法,使目标资源调用此方法输出页面内容时,获得的是我们自定义的ServletOutputStream对象。
在我们自定义的ServletOuputStream对象中,重写write方法,使写出的数据写出到一个buffer中。
当页面完成输出后,在filter中就可得到页面写出的数据,从而我们可以调用GzipOuputStream对数据进行压缩后再写出给浏览器,以此完成响应正文件压缩功能

ShowServlet

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

        ServletOutputStream sout = response.getOutputStream();
        sout.write(data.getBytes("UTF-8"));
        MyServletOutputStream mySout = myResponse.getOutputStream();
        sout.write("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes());
        //mySout.write("AAAAAA".getBytes[]);
    }
}

GzipFilter


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.web.decorator.MyResponse;

public class GzipFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        MyResponse myResponse = new MyResponse(response);

        chain.doFilter(request,myResponse);

        //取得缓存中的内容
        byte[] data = myResponse.getBuffer();
        System.out.println("压缩前:" + data.length);

        //进行压缩
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        GZIPOutputStream gout = new GZIPOutputStream(bout);
        gout.write(data);
        gout.flush();
        gout.close();
        data = bout.toByteArray();
        System.out.println("压缩后:" + data.length);

        //通知浏览器接收是的一个压缩型数据库和长度
        response.setHeader("content-encoding","gzip");
        response.setHeader("content-length",data.length+"");

        //以字节方式真正输出到浏览器
        response.getOutputStream().write(data);

        //无限压缩,无出口,类似环无限循环
        //myResponse.getOutputStream().write(data);
    }
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

MyResponse


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

//对response对象的装饰/包装
public class MyResponse extends HttpServletResponseWrapper{
    private HttpServletResponse response;
    //缓存
    private ByteArrayOutputStream bout = new ByteArrayOutputStream();
    private PrintWriter pw;
    public MyResponse(HttpServletResponse response) {
        super(response);
        this.response = response;
    }
    //重写父类方法,目的是将字节输出到缓存中去[字节]
    public ServletOutputStream getOutputStream() throws IOException {
        return new MyServletOutputStream(bout);
    }
    //重写父类方法,目的是将字符输出到缓存中去[字符]
    public PrintWriter getWriter() throws IOException {
        pw = new PrintWriter(new OutputStreamWriter(bout,"UTF-8"));
        return pw;
    }
    //取得缓存中的数据
    public byte[] getBuffer(){
        if(pw!=null){
            pw.flush();
        }
        return bout.toByteArray();
    }
}
//带有缓存功能ServletOutputStream
class MyServletOutputStream extends ServletOutputStream{
    private ByteArrayOutputStream bout;
    public MyServletOutputStream(ByteArrayOutputStream bout) {
        this.bout = bout;
    }
    public void write(int b) throws IOException {
    }
    public void write(byte[] bytes) throws IOException {
        //将字节数组的内容写入缓存
        bout.write(bytes);
        //确保所有字节数组内容进入缓存
        bout.flush();
    }
}

转载于:https://blog.51cto.com/357712148/2105519

``` {—————————————— 系统参数模块 ——————————————} {——估值体系——} PE := IF(FINANCE(33)>0, FINANCE(30)/FINANCE(4), 1000); {动态市盈率} PB := IF(FINANCE(5)>0, FINANCE(30)/FINANCE(5), 1000); {市净率} {——波动率自适应系统——} VOLATILITY := STD(CLOSE,20)/MA(CLOSE,20); VAR_PERIOD := IF(VOLATILITY<0.08,55,IF(VOLATILITY<0.15,34,21)); MACD_FAST := MAX(5, CEILING(VAR_PERIOD*0.382)); {限制最小周期5} MACD_SLOW := MIN(60, FLOOR(VAR_PERIOD*1.618)); {限制最大周期60} MACD_SGNL := 9; {——多周期参数——} KDJ_N := 9; {KDJ周期} RSI_N := 14; {RSI周期} BOLL_N := 20; {布林线周期} MOM_N := 21; {动量基准周期} {—————————————— 核心指标系统 ——————————————} {——MACD自适应系统——} DIF := EMA(CLOSE,MACD_FAST) - EMA(CLOSE,MACD_SLOW); DEA := EMA(DIF,MACD_SGNL); MACD := 2*(DIF-DEA); {——均线系统——} MA5 := MA(CLOSE,5); MA10 := MA(CLOSE,10); MA20 := EMA(CLOSE,20); MA60 := EMA(CLOSE,60); {——量能系统——} VOL_MA5 := MA(VOL,5); VOL_MA20 := EMA(VOL,20); VOL_RATIO := VOL/REF(VOL,1); {——动量确认系统——} MOMENTUM := EMA(CLOSE,5)/REF(EMA(CLOSE,MOM_N),5)-1; WEEK_CHG := (CLOSE-REF(CLOSE,5))/REF(CLOSE,5)*100; MOM_CONFIRM := EMA(CLOSE,5)>EMA(EMA(CLOSE,5),13) AND CLOSE>HHV(CLOSE*0.7,40); {——KDJ系统——} RSV := (CLOSE-LLV(LOW,KDJ_N))/(HHV(HIGH,KDJ_N)-LLV(LOW,KDJ_N)+0.0001)*100; K := SMA(RSV,3,1); D := SMA(K,3,1); J := 3*K-2*D; {——布林带系统——} MID := MA(CLOSE,BOLL_N); UPPER := MID + 2*STD(CLOSE,BOLL_N); LOWER := MID - 2*STD(CLOSE,BOLL_N); BWIDTH := (UPPER-LOWER)/MID*100; {—————————————— 信号生成系统 ——————————————} {——趋势条件——} TREND_COND := MA5>MA10 AND MA10>MA20 AND CLOSE>MA60; {均线多头排列} {——突破条件——} BREAK_COND := CROSS(DIF,DEA) AND MACD>REF(MACD,1) AND DIF>0; {MACD金叉} {——量价条件——} VOLUME_COND := VOL>VOL_MA20*1.8 AND SUM(IF(CLOSE>REF(CLOSE,1),VOL*C,-VOL*C),5)/CAPITAL*100>3 AND SUM(IF(C>O,VOL*(C-O)/O,0),5)/SUM(VOL,5)*100>0.3; {——估值条件——} VALUE_COND := PE<30 AND PB<4.5; {估值双低} {——波动条件——} VOLAT_COND := BWIDTH>=10 AND BWIDTH<=18; {带宽过滤} {——筹码条件——} CHIP_COND := FINANCE(42)/FINANCE(1)<1.2; {流通盘比例} {——北向资金——} NORTH_COND := FINANCE(56)/FINANCE(55)>1.05 AND FINANCE(56)>50000000; {——风险过滤——} BETA_ADJ := 1 + (SLOPE(CLOSE/INDEXC,60)*STD(CLOSE,60)/STD(INDEXC,60)-1)*0.3; BETA_FILTER := BETA_ADJ < 1.2; {——日线预警条件——} DAILY_ALERT := CROSS(MA(CLOSE,5),MA(CLOSE,10)) AND VOL>REF(VOL,1)*1.5 AND CLOSE>OPEN; {——动量排名系统——} ROC21 := (CLOSE-REF(CLOSE,21))/REF(CLOSE,21)*100; RANK_ROC := (ROC21-LLV(ROC21,120))/(HHV(ROC21,120)-LLV(ROC21,120)+0.0001)*100; {—————————————— 信号合成系统 ——————————————} FINAL_SIGNAL:FILTER( TREND_COND AND BREAK_COND AND VOLUME_COND AND (VALUE_COND + VOLAT_COND + CHIP_COND >=2) AND {至少满足两个条件} MOM_CONFIRM AND RANK_ROC>80 AND DAILY_ALERT AND BETA_FILTER, 3); {—————————————— 风控系统 ——————————————} STOP_LOSS := MAX(MA10*0.93, LLV(LOW,8)*0.95); TAKE_PROFIT := BETA_ADJ*IF(VOLATILITY<0.1, MA20*1.25, MA20*1.35);```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信量化择时周线选股】代码,遇到了 【优化选股逻辑,所有参数计算关系和信号触发条件优化计算,,选到即将大幅上涨的股票,日线盘中预警和盘后选股】,将以上综合因素加入后,请帮我检查并补全正确代码,生成修正后语法规范的通达信完整代码。
最新发布
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值