装饰者模式之servlet过滤器(Filter)网页压缩

JavaWeb三大组件   Servlet,Filter,Listener JavaWeb三大组件: Servlet,Filter,Listener 1 Servlet 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器,他连接了客户端和服务器端的信息交互和处理。简单来说,客户端发送请求,传递到servlet容器,而servlet将数据转换成服务器端可以处理的数据再发送给服务器端,再数据处理之后,再传递到servlet容器,servlet再转译到客户端,完成了一次客户端和服务器端的信息交互。   Servlet是通过Java编写的,因为他也具备 阅读详情
1.装饰者模式定义
动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰模式相比生成子类更为灵活。
                                                                    ------《设计模式之禅》
2.通用类图:

这里写图片描述

类图说明:

● Component抽象构件
Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

注意: 在装饰模式中, 必然有一个最基本、 最核心、 最原始的接口或抽象类充当Component抽象构件。 

● ConcreteComponent 具体构件
ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。  

● Decorator装饰角色
一般是一个抽象类, 做什么用呢? 实现接口或者抽象方法, 它里面可不一定有抽象的方法呀, 
在它的属性里必然有一个private变量指向Component抽象构件。 

● 具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,
 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西。

                                                                    ------《设计模式之禅》  

3.类图代码:
public abstract class Component {
//抽象的方法
    public abstract void operate();
}

public class ConcreteComponent extends Component {
//具体实现
@Override
    public void operate() {
        System.out.println("do Something");
    }
}

public abstract class Decorator extends Component {
    private Component component = null;
    //通过构造函数传递被修饰者
        public Decorator(Component _component){
        this.component = _component;
    }
    //委托给被修饰者执行
    @Override
    public void operate() {
        this.component.operate();
    }
}

public class ConcreteDecorator1 extends Decorator {
//定义被修饰者
    public ConcreteDecorator1(Component _component){
        super(_component);
}
    //定义自己的修饰方法
    private void method1(){
        System.out.println("method1 修饰");
    }
    //重写父类的Operation方法
    public void operate(){
        this.method1();
        super.operate();
    }
}

servlet过滤器之网页压缩
应用: 如今租赁的服务器有的是按照流量来节省流量,所以网页压缩技术有助于节省流量,
     并且可以提高用户的网的响应速度,大大提高了用户体验。
  • 所用技术:

    • java 的GZIPOutputStream类进行gzip压缩。
    • 通过javaweb的过滤器,对服务端发响应的数据进行压缩。
    • 装饰者模式,对已经存在的方法进行重写。
  • 分析:

    • 运用过滤器,对服务器每一次的响应的数据进行gzip压缩。
    • 在servlet中的response.getwriter().writer()向客户端发送数据,可是中间的数据无法再过滤器中截取。
    • 以上,所以需要重写response中的PrintWriter方法,将响应数据在发送到客户端之前先保存到ServletResponse的成员缓冲区中。
    • 随后在过滤器中将响应内容进行压缩,再发送给客户端。

过滤器代码
public class GIZPFilter implements Filter {

    public GIZPFilter() {

    }
    public void destroy() {

    }
    public void init(FilterConfig fConfig) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
     throws IOException, ServletException {
        //对响应中的数据先进行编码
        req.setCharacterEncoding("utf-8");
        //对response进行装饰
        HttpServletResponse response = (HttpServletResponse) res;
        //进行包装
        MyHttpResponse myResponse = new MyHttpResponse(response);
        //放行,在servlet向缓冲区中写数据
        chain.doFilter(req, myResponse);
        //获取缓冲区中的内容
        char[] content = myResponse.getBuf().toCharArray();
        //创建缓冲区
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //进行压缩
        GZIPOutputStream gzip = new GZIPOutputStream(bos);
        //向bos2缓冲区中写入数据
        gzip.write(new String(content).getBytes());
        //刷新缓冲区
        gzip.finish();
        System.out.println("压缩后的数据大小:" + new String(bos.toByteArray()).length());
        System.out.println(new String(content));
        //设置响应体中的字体
        myResponse.setContentType("text/html;charset=utf-8");
        //设置浏览器解析格式
        myResponse.setHeader("content-encoding", "gzip");
        //向浏览器写数据
        myResponse.getOutputStream().write(bos.toByteArray());
    }
}

//重写的类
class MyHttpResponse extends HttpServletResponseWrapper {
    private HttpServletResponse response = null;
    //定义缓冲区
    private CharArrayWriter buf = new CharArrayWriter();

    public CharArrayWriter getBuf() {
        return buf;
    }

    public MyHttpResponse(HttpServletResponse response) {
        super(response);
        this.response = response;
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        //创建带缓冲区的PrintWriter对象(API中可查)
        return new PrintWriter(buf);
    }
}
服务器代码:
public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws  ServletException, IOException {
        //准备数据
        StringBuffer sb = new StringBuffer();
        for(int i=1;i<=3000;i++){
            sb.append("abcd你好");
        }
        System.out.println("压缩前的数据大小: "+sb.toString().getBytes().length);
        //这里的response已经是过滤器中定义的MyHttpResponse 类
        PrintWriter out = response.getWriter();
        out.write(sb.toString());
        //关闭并刷新缓冲区
        out.close();
    }
Servlet3.0使用注解标注过滤器(Filter) Servlet3.0使用注解标注过滤器 Servlet3.0使用注解标注过滤器 立即下载

相关推荐

【论文阅读】AU检测|《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》

摘要 本文旨在从大量没有人工标注的视频中学习用于面部动作单元检测的区分表示。受面部动作是面部肌肉运动这一事实的启发,论文将这些运动描述为不同帧中两幅面部图像之间的转换,并将其用作学习表示的自我监控信号。但是,在不受控制的情况下,这种转换是由面部动作和头部运动引起的。为了消除头部运动的影响,我们提出了一个双圈自动编码器(TCAE),它可以解开面部动作相关运动和头部运动相关运动。具体而言,TCAE被训练成分别将源面部的面部动作和头部姿态改变为目标面部的面部动作和头部姿态。我们的实验验证了TCAE解耦运动的能力。

Celine的博客 4554

Servlet(二)servlet过滤器filter

.1)什么是过滤器        servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

蜗牛不怕慢的博客 1078

逆向实战:360加固DEX解密全流程解析(附Frida脚本与SoFixer修复技巧)

本文深入解析360加固DEX解密的全流程,涵盖动态Hook技术、Frida脚本应用及SoFixer修复技巧。通过实战案例详细展示如何识别加固特征、定位关键函数、实现ELF文件修复,并解析RC4和zlib解密算法,为逆向工程师提供全面的技术指导。

weixin_29323551的博客 608

Servlet与设计模式

过滤器可以拦截请求及控制响应,而servlet对此毫无感知。过滤器有如下作用: 1)请求过滤器:完成安全检查、重新格式化请求首部或体、建立请求审计日志。 2)响应过滤器:压缩响应流、追加或修改响应流、创建一个完全不同的响应。

KEEP CODING 737

别再手动查日志了!用Dify+Zabbix打造你的专属运维“嘴替”(保姆级配置流程)

本文详细介绍了如何利用Dify平台与Zabbix监控系统集成,构建智能运维对话系统,实现自然语言交互的运维管理。通过保姆级配置流程,帮助运维工程师提升查询效率、降低学习成本,打造企业级智能运维解决方案。

weixin_27298377的博客 456

Spark中Application、Job、Stage和Task区别详解

在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。

优快云 精品推荐 901

Java Servlet 详解:(二十)Filter 与 Listener 设计模式

Filter 与 Listener 设计模式1.Filter 的设计模式1.责任链模式特点2.责任链的优缺点2.Listener 的设计模式1. 观察者模式的特点2.观察者模式的优缺点 1.Filter 的设计模式 在 Servlet 的 Filter 中使用的责任链设计模式 1.责任链模式特点 责任链(Chain of Responsibility):责任链模式也叫职责链模式,是一种对象行为模式。 在责任链模式里,很多对象由每一个对象对其下一个对象的引用而连接起来形成一条链。 请求在这个链上传递,直到链

地球村 619

Matlab安装硬件支持包、simulink离线安装硬件支持包安装,离线安装ESP32、stm32等安装包,Are you up-to-date on SoftWare Maintenance?

注意:如果提示出现“没有可从此位置安装的兼容支持包后,这个问题,请查看步骤5,是不是没有按照步骤5进行操作.一般情况下出现“没有可从此位置安装的兼容支持包”后,重新安装选择了默认路径就可以成功。如果不是很清楚,直接安装在默认的文件夹下面,即使这个文件夹下没有matlab相关的文件夹,也要这么下载,没有为什么,切记尽量按默认路径安装,更改下载的路径不成功,别怪我没提醒。:下载到哪里非常重要,如果下载的不是默认的路径下,就需要将其中这个的是这个archives文件夹,连同其他文件一并要复制出来,拷贝到。

pvmsmfchcs的博客 1746

JavaWeb核心编程

本阶段Java视频教程涵盖JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、JavaBean、国际化、Cookie和HttpSession、JavaMail等核心技术。并通过书城案例,巩固知识,提供开发能力

SAP PS 收入确认方法配置清单(成本推导收入 / 项目进度推导收入)

摘要:本文详细介绍了SAPPS模块中两种收入确认方法的配置流程:成本推导收入(成本比例法)和项目进度推导收入(里程碑法)。通过事务码OKG1-OKG5等关键配置步骤,分别实现基于累计成本比例和里程碑完成权重的收入确认逻辑。文章对比了两种方法的适用场景和管控要点:成本法适用于成本与进度强相关的项目,需严控预计总成本;进度法则依赖明确的里程碑验收。同时提供了落地建议,包括项目类型绑定、数据校验和变更管控等最佳实践,为SAPPS系统收入确认功能实施提供完整指导。

金牌架构师 952

微博scheme

微博scheme

qq_42278595的博客 318

透过源码学习设计模式1—Servlet Filter和责任链模式

Servlet filter 一瞥相信大家都熟悉Servlet中Filter过滤器,我们可以在servlet和servlet容器之间插入Filter过滤器来包装、预处理请求,或者包装、处...

XMEHB的博客 532

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1630

过滤器Filter总结笔记

过滤器简介 1)过滤器其实就是一个接口,Filter, javax.servet.Filter 2)过滤器就是一个对象,可以在请求一个资源(静态或动态资源),或响应一个资源,或请求和响应一个资源的时候,执行过滤任务!!!! 3)过滤器如何被执行? 过滤器也需要交给tomcat服务器运行!!!! 补充:Servlet的三大组件:(1)都需要交给web服务器运行 2)在we...

qq_44470251的博客 375

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

管道-过滤器模式

今天我要介绍的是软件体系结构模式中的管道-过滤器模式。 1.定义: 在管道和过滤器软件体系结构中,每个模块都有一组输入和一组输出。每个模块从它的输入端接收输入数据流,在其内部经过处理后,按照标准的顺序,将结果数据流送到输出端,以达到传递一组完整的计算结果实例的目的。通常情况下,可以通过对输入数据流进行局部变换,并采用渐增式计算方法,在未处理完所有输入数据以前,就可以产生部...

weixin_30295091的博客 1399

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jsp/servlet过滤器--Filter

Filter可以担任浏览器与JSP/Servlet之间的一个中介处理者,一些request的前置处理动作及一些response的后置处理,都可以交由这个中介处理者来完成,当然Filter可以达到的功能,您也可以直接撰写在JSP/Servlet中,但如果有很多JSP/Servlet都需要相同的处理,例如某些网页都需要统一的身份验证方式时,与其在每一个网页中都撰写验证的程序码,不如直接撰写Filter...

weixin_44121239的博客 252

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JavaWeb-过滤器Filter学习(五)全站压缩

全站压缩,最大的好久就是帮客户端节省流量。 数据压缩,我们需要用到二个Java类,也就是java.util.zip 中的 类 GZIPOutputStream 此类为使用 GZIP 文件格式写入压缩数据实现流过滤器。 java.io 类 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 t

谙忆-陈浩翔 1万+

Servlet——过滤器(Filter)

过滤器 **1.为什么使用它?** 有很多全站性的东西需要处理,例如乱码问题,通过过滤器统一进行过滤更简单 **2.有什么用?** 实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

zuoan666的博客 544

JSP学习笔记(5)——Servlet、监听器、过滤器、MVC模式介绍

MVC模式 在讲解Servlet前,先介绍一下MVC模式。 M:model 模型,相当于数据层,用于存放数据,如一个Java中的一个bean类 V:view 视图,相当于页面层,用于显示数据,如一个网页html,或者是jsp C: controller 控制器,相当于业务层,用于处理数据 我们之前使用的JSP,其中也是可以使用java小脚本来进行数据处理。 但是,我们又想要显示数据,...

weixin_30552811的博客 266

java 过滤.zip_使用filter过滤GZIP压缩(二)

在代码之前,讲一下用filter实现GZIP压缩的原理:因为GZIP压缩之后,是从服务器端传输到浏览器端,从servlet到浏览器(从jsp到浏览器),其实是response带回内容,所以我们要在filter中对从servlet端响应回来的response进行操作,因为写内容是response中的writer或者outputStream来完成的,所以我们首先要把response中的writer或者...

weixin_32924159的博客 277

16filter过滤器

1. Filter过滤器 Filter和Servlet及Listener称之为Servlet三大技术。 Filter是一个过滤器,可以将请求或响应拦截,拦截中的请求或响应,可以对其中的内容进行操作。操作完成后,可以选择放行或不放行当前请求或响应。 主要用于拦截请求进行过滤操作,是实现例如权限控制、全站乱码解决、压缩响应等功能的基础,是web开发中...

weixin_30556959的博客 181

servlet过滤器重点内容

过滤器(Filter接口)                            (1)作用:在请求资源(静态资源或动态资源),或者响应资源,或者请求和响应资源时,执行过滤任务。                            (2)Filter的生命周期:                                      init方法:初始化方法。参数FilterConfig...

abandon_li的博客 404

Filter-全站压缩

通过过滤器拦截指定的请求,将原始的reponse替换为经过装饰后的response装饰类(该类继承一个默认的response装饰类),通过重写这个类的getWriter()和getOutputStream()方法,不让其输出到浏览器,而是 将其写入到内存字节数组中去,当需要输出的时候,也就是过滤器的第二次执行从chain.doFilter(request,response)开始,再次从内存中取出缓冲区中的数据,进行压

msidolphin的博客 619

Filter的作用

filter 作用 过滤器 filter用于拦截用户请求,在服务器作出响应前,可以在拦截后修改request和response,这样实现很多开发者想得到的功能。 filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。 一个过滤器是一个可以传送请求或修改响应的对象。过...

hllyyuan的博客 5421

(十七)Filter

servlet的三大组件: 2.1  (servlet) Servlet接口: javax.servlet.Servlet; 作用:用于开发动态网页 2.2 (过滤器)Filter接口: javax.servlet.Filter;  2.3 (监听器)Listener接口: javax.servlet.*过滤器的生命周期(实现Filter接口) 构造方法:...

Yuan的博客 396

使用Filter实现网站文本数据压缩后再输出

        通常服务端的网页格式数据是通过gzip压缩后再发送给客户端的,gzip压缩算法对文本的压缩率非常高,尤其对html,js,css格式的数据,原因是这些文本中相同的文本块通常非常多,而相同几份文本块数据通过gzip压缩后几乎只有一份文本块数据的大小,所以一般对纯文本内容gzip压缩算法可压缩到原大小的40%。        JavaWeb开发模式所有资源都是通过Servlet发送给客...

hao_vip的博客 364
上一篇: jQuery表单校验之Validate
下一篇: 实时监控文本框中的数据变化(完美解决方案)
Kindle_code
博客等级 码龄12年 21粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值