设计模式 之 装饰者模式_strong request-程序员宅基地

技术标签: java  servlet  装饰者模式  interceptor  设计模式  

背景: 临近放假,手上的活没那么多了, 积累了一些设计模式经验  分享给大家

 

 

今天说的 是 装饰者模式

装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

直接干货 示例demo如下:

package com.yzgu.up.disignpattern.decorator;


import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 *  request 增强类,项目中可以用来校验和设置token
 *
 *     具体使用可以基于过滤器拦截,配置 在mvc配置中就行
 * @author yzgu
 */
public class StrongRequestDemo extends HttpServletRequestWrapper {

    private final Map<String, String> customHeaders;

    private HttpServletRequest req;

    public StrongRequestDemo(HttpServletRequest request) {
        super(request);
        this.req = request;
        this.customHeaders = new HashMap<String, String>();
    }

    public void putHeader(String name, String value) {
        this.customHeaders.put(name, value);
    }

    @Override
    public String getHeader(String name) {
        if (name == "SID") {
            if (StringUtils.isBlank(req.getHeader(name))) {
//                return "QWRER";
                throw new RuntimeException("未携带SID信息");
            }
        }
        return req.getHeader(name);
    }

    public Map<String, String> getCustomHeaders() {
        return customHeaders;
    }

    @Override
    public Enumeration<String> getHeaders(String name) {
        if (null != name && name.equals("SID")) {
            return new Enumeration<String>() {
                private boolean hasGetted = false;

                @Override
                public boolean hasMoreElements() {
                    return !hasGetted;
                }

                @Override
                public String nextElement() {
                    if (hasGetted) {
                        throw new NoSuchElementException();
                    } else {
                        hasGetted = true;
                        return name;
                    }
                }
            };
        }
        return super.getHeaders(name);

    }
}

上面 例子 是基于 request的装饰类做了一定的拓展增强,具体功能的话,可以实现 对token 鉴权,也可以作为中转服务设置request 头 header信息(这个本来是客户调用端做的事),当然这些动作你也可以基于拦截器 实现此功能。

  

示例demo2:

package com.yzgu.up.disignpattern.decorator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;

/**
 *  装饰者模式对HttpServletRequest进行增强。
 *  两种方法:
 *      1: implements HttpServletRequest(所有的方法都要自己来重写,所以,建议使用第二种方法,也就是通过继承HttpServletRequestWrapper,再对自己的需要进行重写相应的方法)
 *      2: extends HttpServletRequestWrapper(已经用装饰者模式帮我们重写所有的方法,我们只需要重写自己需要重写的方法就可以了,而免去了对其它方法的进行重写的麻烦)
 * @author yzgu
 */
public class EncodingRequest extends HttpServletRequestWrapper {

    private HttpServletRequest req;

    public EncodingRequest(HttpServletRequest request) {
        super(request);
        this.req = request;
    }

    /**
     *  增强getParameter()方法,使其能够自行处理get的编码问题
     */
     @Override
     public String getParameter(String name) {
         String value = req.getParameter(name);
         try {
             //处理get方式
             value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
         return value;
     }
}

 

示例2  主要是针对 request 编码做了装饰, 可以统一处理编码。  你也不要倔,实现统一编码 方式有很多,不会直接私信我。

 

好了 , 简单示例,你学废了的话, 点个赞啥的 支持下楼主。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41165981/article/details/113771654

智能推荐

unp.h网络运行环境搭建_c语言unp.h-程序员宅基地

文章浏览阅读684次。unp.h的安装以及第一个程序的运行源代码下载以及编译点击此处下载源代码解压到本地文件夹,如果访问不了GitHub的话就用我搬到gitee的仓库吧git clone https://gitee.com/Find-ing/unpv13e.git直接这样就不用解压了这里可以看看README按照README上的顺序首先执行./configure然后cd libmakecd ../libfreemakecd ../libroutemake如果出现了错误,就再来一次cd ._c语言unp.h

2018_1_21_Pascal Library_矩阵遍历-程序员宅基地

文章浏览阅读309次。Pascal LibraryTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6384 Accepted: 2957DescriptionPascal University, one of the oldest in the country, needs to _pascal library

Helm v3概念和常用命令详述_helmv2和v3版本对比-程序员宅基地

文章浏览阅读4.8k次,点赞10次,收藏22次。Helm v3概念ChartHelm的应用包,采用tgz格式。类似于Yum的RPM包,其包含了一组定义Kubernetes资源相关的YAML文件。也称为应用Chart。RepoistoryHelm的应用仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart应用包以供用户下载,并且提供了一个该Repository的Chart包的清单文件以供查询。Helm可以同时..._helmv2和v3版本对比

hdu 4300 Clairewd’s message(exkmp)_clairewd鈥檚 message exkmp-程序员宅基地

文章浏览阅读283次。Clairewd’s messageTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7196 Accepted Submission(s): 2663Problem DescriptionClairew_clairewd鈥檚 message exkmp

数据库—完整性_逻辑完整性是数据库完整性规则之一-程序员宅基地

文章浏览阅读1.2k次。数据库—完整性完整性数据库的完整性是指数据库中数据是正确的、一致的和相容的数据的正确性保证数据库的数据是符合语义约束的数据一致性保证数据之间的逻辑关系是正确的,对数据库更新时,数据库从一个一致状态到另一个一致状态相容性则要求同一个事实的两个数据应当是一致的数据库中的数据要成为有意义的信息,必须满足一定的语义约束条件约束的分类①就被约束的数据对象而言,完整性约束又可以分..._逻辑完整性是数据库完整性规则之一

随便推点

ajax 设置Access-Control-Allow-Origin实现跨域访问_asp.net $.ajax 响应设置 access-control-allow-origin-程序员宅基地

文章浏览阅读540次。ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全。即使使用jQuery的jsonp方法,type设为POST,也会自动变为GET。_asp.net $.ajax 响应设置 access-control-allow-origin

emqx服务 + mosquitto客户端(linux yum 安装mosquitto)_emq可以读取mosquitto客户端吗-程序员宅基地

文章浏览阅读1.4k次。第三方企业级开源的MQTT服务结合开源社区MQTT客户端使用_emq可以读取mosquitto客户端吗

hive-set设置总结_hive set-程序员宅基地

文章浏览阅读3.6k次。直接set命令可以看到所有变量值。set单个参数,可以看见这个参数的值。常用hiveconfHive相关的配置属性总结set hive.cli.print.current.db=true;在cli hive提示符后显示当前数据库。set hive.cli.print.header=true;显示表头。select时会显示对应字段。set hive.mapred.mode=strict;防止笛卡儿积的执行;如果对分区表查询,且没有在where中对分区字段进行限制,报错FAILED: Semant..._hive set

Window下编译boost1.68_windows 安装boost 1.68-程序员宅基地

文章浏览阅读743次。下载boost前往boost官网下载boost1.68编译解压释放到D:\boost1.68.0,使用VS工具运行bootstrap.bat,分别运行下面两个命令,其中address-model表示编译的是32位还是64位库,–stagedir=表示输出目录,link表示编译的是静态库还是动态库,runtime-link表示使用的运行时库是静态链接还是动态链接,threading表示使用的运..._windows 安装boost 1.68

c++ 文件/文件夹操作-程序员宅基地

文章浏览阅读1.6k次。filesystem库是一个可移植的文件系统操作库,它在底层做了大量的工作,使用POSIX标准表示文件系统的路径,使C++具有了类似脚本语言的功能,可以跨平台操作目录、文件,写出通用的脚本程序。1.path的构造函数可以接受C字符串和string,也可以是一个指定首末迭代器字符串序列区间。2.filesystem提供了一系列的文件名(或目录)检查函数。3.有丰富的函数用于获取文件名..._fs::is_directory failed.

心情随笔--我与考研战友的故事_於志文弟弟-程序员宅基地

文章浏览阅读8.8k次。 心情随笔声明:若要转载本文,请注明作者名(闫伟)和网站名www.xingfushu.com和http://yanwei77.bokee.com 昨夜突然失眠,不知何故。只得重新打开电视,收听中央9套,本想用英语频道来催眠,无奈此催眠英语仍然无效。只好关了电视,紧闭双眼,蒙着头,开始胡思乱想,想着想着,突然觉得自己应该记录那曾经美好而让人回味的一段日子。而想写出来的原因大致是_於志文弟弟

推荐文章

热门文章

相关标签