责任链模式的简单使用

文章介绍了如何在IT系统中使用责任链模式结合过滤器,通过AuthticationFilter检查HTTP请求中的token以验证用户身份,并由FilterChainManagerImpl按顺序执行过滤逻辑。doFilter方法展示了如何将这些组件整合在Servlet框架中处理请求。
摘要由CSDN通过智能技术生成

定义需要过滤的接口以及实现类

public interface FilterChain {
/**
* 过滤请求数据
* /
    boolean intercept(HttpServletRequest request) throws SQLException;
}

实现过滤请求数据中是否含有token(唯一身份标识),还可以实现其他的过滤,如:关键词、黑名单等等

public class AuthticationFilter implements FilterChain{
    private Logger logger = LoggerFactory.getLogger(AuthticationFilter.class);
    private IUserService iUserService = (IUserService) ObjectUtils.getObject("userService");
    //需要放行的静态资源
    private String[] noStaticIntercept={
            ".lpg",".png","html",".css",".js"
    };
    //不能拦截的请求 登录请求、通过手机获取密码
    private String[] noActionIntercept={
            "/mobile/users/getPassword.action",
            "/mobile/users/login.action"
    };
    @Override
    public boolean intercept(HttpServletRequest request) throws SQLException {
        String requestURI = request.getRequestURI();
        //判断是否是静态资源
        for (String str :noStaticIntercept){
            if (requestURI.endsWith(str)){
                logger.info("请求的是静态资源");
                return true;
            }
        }
        //判断是否是特殊方法
        for (String str :
                noActionIntercept) {
            if(requestURI.endsWith(str)){
                logger.info("特殊的请求地址");
                return true;
            }
        }
        //身份验证
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)){
            //token 有误
            throw new BusinessException(ResponseCode.TOKEN_NAME_ERROR.getCode(), ResponseCode.TOKEN_NAME_ERROR.getMessage());
        }
        //使用token查找用户
            User user = iUserService.getByToken(token);
            if (null==user){
                logger.info("token信息有误");
                throw new BusinessException(ResponseCode.TOKEN_USER_ERROR.getCode(),ResponseCode.TOKEN_USER_ERROR.getMessage());
            }
        logger.info("认证执行了。。。。。。。。");
        return false;
    }
}

过滤资源管理器

public class FilterChainManagerImpl{
    private static Map<String,FilterChain> filterChainMap = new HashMap<>();
    static {
        filterChainMap.put("authticationFilter",new AuthticationFilter());
        filterChainMap.put("limitFilter",new LimitFilter());

    }
    public boolean intercept(HttpServletRequest request) throws SQLException {
        List<String> filterOrder = getFilterOrder();
        //按照顺序执行
        for (String orderName :
                filterOrder) {
                //根据名字获取map中的过滤对象,起到了按顺序
            FilterChain filterChain = filterChainMap.get(orderName);
            if (null==filterChain){
                //名字有误
                throw new BusinessException(ResponseCode.FILTER_NAME_ERROR.getCode(), ResponseCode.FILTER_NAME_ERROR.getMessage());
            }
            //对request进行过滤
            boolean intercept  = filterChain.intercept(request);
        }
        return false;
    }

    /**
     * 获取配置文件中过滤器链的执行顺序
     * @return
     */
    private List<String> getFilterOrder(){
        List<String> lists = new ArrayList<>();
        InputStream in = FilterChainManagerImpl.class.getClassLoader().getResourceAsStream("filter-order.properties");
        Properties properties = new Properties();
        try {
            properties.load(in);
            String val = properties.getProperty("filterOrder");
            if (StringUtils.isEmpty(val)){
                //未设置执行顺序
                throw new BusinessException(ResponseCode.FILTER_ORDR_ERROR.getCode(), ResponseCode.FILTER_ORDR_ERROR.getMessage());
            }
            //按照顺序执行 说明只有一个
            if(!val.contains(",")){
                lists.add(val);
                return lists;
            }
            //按照,进行分割并添加到数组
            String[] split = val.split(",");
            lists = Arrays.asList(split);
            return lists;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

使用过滤器执行过滤管理器

这里贴出doFilter方法

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        //责任链执行
        try {
            //执行各种认证信息 如果认证不成功,就会抛出异常
            boolean intercept = filterChainManager.intercept(req);
            //没有抛出异常说明验证通过
            filterChain.doFilter(servletRequest,servletResponse);

        }catch (Exception e){
            DataResult dataResult = new DataResult();
            if (e instanceof BusinessException){
                BusinessException businessException = (BusinessException) e;
                dataResult.setCode(businessException.getCode());
                dataResult.setMessage(businessException.getErrMessage());
            }else {
                dataResult.setCode(ResponseCode.SYSTEM_ERROR.getCode());
                dataResult.setMessage(ResponseCode.SYSTEM_ERROR.getMessage());
            }
            //输出返回值 验证不通过输出错误信息
            sendToResponse(JSON.toJSONString(dataResult),req, (HttpServletResponse) servletResponse);
            return;
        }

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值