责任链设计模式
责任链的应用场景
- Servlet API 中的
Filter
过滤器- MVC 框架中的拦截器
. . .
简单使用责任链模式拆分 Servlet API 中的过滤器
模拟
Servlet
中的Request
对象
/**
* @desc <b>模拟 Servlet 中的 Request 对象</b>
*
* @author jiang ru yi
*/
public class HttpServletRequest {
private String requestContext;
private Map<String, Object> requestParam = new HashMap<>();
public String getRequestContext() {
return requestContext;
}
public void setRequestContext(String requestContext) {
this.requestContext = requestContext;
}
public void setRequestParam(Map<String, Object> requestParam) {
this.requestParam = requestParam;
}
public Object setAttribute(String key, Object value) {
return requestParam.put(key, value);
}
public Object getAttribute(String key) {
return requestParam.get(key);
}
public Object removeAttribute(String key) {
return requestParam.remove(key);
}
}
模拟
Servlet
中的Response
对象
/**
* @desc <b>模拟 Servlet 中的 Response 对象</b>
*
* @author jiang ru yi
*/
public class HttpServletResponse {
private String responseContext;
public String getResponseContext() {
return responseContext;
}
public void setResponseContext(String responseContext) {
this.responseContext = responseContext;
}
}
过滤器抽象层
/**
* @desc <b>公用的过滤器抽象层</b>
*
* @author jiang ru yi
*/
public abstract class HttpFilter {
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain);
}
过滤器调度
/**
* @desc <b>过滤器的调度器</b>
*
* @author jiang ru yi
*/
public class FilterChain {
private List<HttpFilter> filters = new ArrayList<>();
private int currFilter;
public boolean addFilter(HttpFilter filter) {
return filters.add(filter);
}
public boolean removeFilter(HttpFilter filter) {
return filters.remove(filter);
}
public void doFilter(HttpServletRequest request, HttpServletResponse response) {
if (currFilter++ == filters.size()) return;
filters.get(currFilter - 1).doFilter(request, response, this);
}
}
Junit 测试
public static void main(String[] args) {
HttpServletRequest request = new HttpServletRequest();
request.setRequestContext("<EvE>, Y(OvO)Y");
request.setAttribute("user", "administrator");
HttpServletResponse response = new HttpServletResponse();
FilterChain chain = new FilterChain();
chain.addFilter(new CharacterSetFilter());
chain.addFilter(new PowerFilter());
chain.doFilter(request, response);
System.out.println(request.getRequestContext());
}
抽象层子类 : 字符过滤器
/**
* @desc <b>过滤请求中的危险符号( < > )</b>
*
* @author jiang ru yi
*/
public class CharacterSetFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
String context = request.getRequestContext();
String result = context.replaceAll("<", "≤").replaceAll(">", "<");
request.setRequestContext(result);
chain.doFilter(request, response);
}
}
抽象层子类 : 校验用户是否登录
/**
* @desc <b>过滤用户是否登录</b>
*
* @author jiang ru yi
*/
public class PowerFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {
Object attribute = request.getAttribute("user");
if (null != attribute) {
chain.doFilter(request, response);
} else {
throw new RuntimeException("user not login");
}
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
一篇文章助你理解Python3中字符串编码问题
前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解Python2中字符串编码问题。下面在Python3环境中进行代码演示,分别Windows和Linux操作系统下进行演示,以加深对字符串编码的理解。 在Python2的Python文件的文件头往往会声明字符的编码格式,通过会使用代码“#-*- coding -*-”作为编码声明,如下图所示。 因为考虑到Python文件中可能会穿插中文,不然的话Python通过解释器来读取文件的时候,文件中的中文就有可能识别不了。而在Python3中,我们就不必像Python2的文件那样进行声明编码格式了,因为在Python3中,默认将所有的字符都视为unicode格式了。下面在Python3环境下进行代码演示。 1、首先在Windows操作系统下的Python3环境中进行演示,如下图所示。 可以看到str1就是一个中文的字符串,字符串前面也没有加u以表示其为unicode编码,其实也没有必要加那个字符,因...
-
下一篇
单例设计模式
常见的五种单例模式实现方式– 主要: 饿汉式(线程安全,调用效率高。 但是,不能延时加载。) 懒汉式(线程安全,调用效率不高。 但是,可以延时加载。) 其他: 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用) 静态内部类式(线程安全,调用效率高。 但是,可以延时加载) 枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列化漏洞!) 如何选用? 单例对象 占用 资源 少,不需要 延时加载 枚举式 好于 饿汉式 单例对象 占用 资源 大,需要 延时加载: 静态内部类式 好于 懒 饿汉 public class OneObject { private static final OneObject OBJECT = new OneObject(); private OneObject () {} public static OneObject build () { return OBJECT; } } 懒汉 public class OneObjectLaz { private static OneObjectLaz laz; private OneO...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池