首页 文章 精选 留言 我的

精选列表

搜索[接口设计],共10000篇文章
优秀的个人博客,低调大师

责任链设计模式

责任链的应用场景 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("<", "&le;").replaceAll(">", "&lt;"); 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"); } } }

优秀的个人博客,低调大师

单例设计模式

常见的五种单例模式实现方式– 主要: 饿汉式(线程安全,调用效率高。 但是,不能延时加载。) 懒汉式(线程安全,调用效率不高。 但是,可以延时加载。) 其他: 双重检测锁式(由于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 OneObjectLaz () {} public static OneObjectLaz build () { synchronized (OneObjectLaz.class) { if (null == laz) laz = new OneObjectLaz(); } return laz; } } 多线程测试 for (int i = 0; i < 10; i++) { new Thread(() -> { OneObjectLaz build = OneObjectLaz.build(); System.out.println(build.hashCode()); }).start(); } 通过反射机制暴力范围 private 构造器, 从而达到多实例 Constructor<OneObject> constructor = OneObject.class.getDeclaredConstructor(); constructor.setAccessible(true); OneObject newInstance = constructor.newInstance(); System.out.println(newInstance); 解决方案 public class OneObjectLaz { private static OneObjectLaz laz; private OneObjectLaz () { if (laz != null) throw new RuntimeException("对象必须保证单例!"); } public static OneObjectLaz build () { synchronized (OneObjectLaz.class) { if (null == laz) laz = new OneObjectLaz(); } return laz; } } 防止序列化破解单例 public class OneObjectLaz { private static OneObjectLaz laz; private OneObjectLaz () { if (laz != null) throw new RuntimeException("对象必须保证单例!"); } public static OneObjectLaz build () { synchronized (OneObjectLaz.class) { if (null == laz) laz = new OneObjectLaz(); } return laz; } /** * 防止单例, 反序列化破解 * 如果定义了: readResolve 方法在反序列时直接返回方法指定的对象, 不需要new了 */ private Object readResolve() throws ObjectStreamException { return laz; } } 要想真正的实现单利漏洞还是很多的所以jdk提供了新特性: enum public enum One { ONE, TWO, THREE; }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册