基于建造者模式重构代码

  1. 在做微服务项目中,网关服务的逻辑需要做'黑名单'、'验签'的限制,run()原本的代码是这样的。 
    	@Override
    	public Object run() throws ZuulException {
    		// 1、获取请求对象
    		RequestContext ctx = RequestContext.getCurrentContext();
    		HttpServletRequest request = ctx.getRequest();
    		HttpServletResponse response = ctx.getResponse();
    		response.setContentType("UTF-8");
    		String ipAddres = getIpAddr(request);
    		// 2、黑名单限制  从数据库获取黑名单IP
    		MeiteBlacklist blacklist = blacklistMapper.findBlacklist(ipAddres);
    		if (blacklist != null) {
    			resultError(ctx, "ip: "+ipAddres+", 没有权限!");
    		}
    		// 3、验证签名 客户端请求是参数依然是明文,防止数据篡改。 但是url加个sign=密码。密码:客户端请求是所有参数md5加密。用参数sign加个参数MD5加密,服务端再验证下
    		Map<String, String> stringStringMap = SignUtil.toVerifyMap(request.getParameterMap(), false);
    		if(!SignUtil.verify(stringStringMap)){
    			resultError(ctx, "参数被修改,验签失败!");
    		}
    		// 4、xss、sql注入
    		return null;
    	}

     // 这个方法里有很多行为:黑名单限制、验签、xss、sql注入....等行为。如果接着一行一行写,维护性不是很强。
      这里使用建造者模式进行重构。
     

  • 建造者模式
     
  1. 定义一个创建接口
    public interface GatewayBuild {
    
    	/**
    	 * 黑名单拦截
    	 */
    	Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response);
    
    	/**
    	 * 参数验证
    	 */
    	Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request);
    	
    	// xss
    	//sql注入.....
    
    }

     

  2. 参数创建者
    @Slf4j
    @Component
    public class VerificationBuild implements GatewayBuild {
    
    	@Override
    	public Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response) {
    		log.info("黑名单逻辑...........................");
    		return true;
    	}
    
    	@Override
    	public Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request) {
    		log.info("验签逻辑...........................");
    		return false;
    	}
    	
    }

     

  3. 定义建造者组装类
    @Component
    public class GatewayDirector {
    	@Resource(name = "verificationBuild")
    	private GatewayBuild gatewayBuild;
    
    	public void direcot(RequestContext ctx, String ipAddres, HttpServletResponse response, HttpServletRequest request) {
    		// 调用黑名单拦截方法
    		Boolean blackBlock = gatewayBuild.blackBlock(ctx, ipAddres, response);
    		if (!blackBlock) {
    			return;
    		}
    		// 调用参数验证方法
    		Boolean verifyMap = gatewayBuild.toVerifyMap(ctx, ipAddres, request);
    		if (!verifyMap) {
    			return;
    		}
    		// css、sql注入
    	}
    }

     

  4. 最终实现
     run()最终实现代码
    	@Override
    	public Object run() throws ZuulException {
    		// 1、获取请求对象
    		RequestContext ctx = RequestContext.getCurrentContext();
    		HttpServletRequest request = ctx.getRequest();
    		HttpServletResponse response = ctx.getResponse();
    		response.setContentType("UTF-8");
    		String ipAddres = getIpAddr(request);
    		gatewayDirector.direcot(ctx, ipAddres, response, request);
    		return null;
    	}

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值