SpringCloud zuul接口网关拦截五

1、A、B两个服务,怎么保证B服务只允许A服务访问?

使用nginx或者zuul搭建接口网关系统进行判断请求来源

在接口网关中需要判断服务名称

在网关中获取具体调用哪个服务(获取service-id,取得服务名称)

2、接口网关拦截实例

接口网关实例的基础上添加一个过滤器进行拦截:

SpringCloud zuul接口网关拦截五

过滤器:

package com.serverzuul.demo;


import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
//使用zuul网关接口拦截参数
@Component
public class MyFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    public boolean shouldFilter() {
        return true;
    }

    public Object run() {
        //拦截所有请求
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        //获取请求token参数
        Object accessToken = request.getParameter("token");
        //请求来源
        String refer=request.getHeader("refer");
        //token不等于null的时候返回null,表示直接放行,否则就拦截
        if (accessToken != null) {
            return null;
        }
        log.warn("token is empty");
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(401);
        try {
            ctx.getResponse().getWriter().write("token is empty");
        } catch (Exception e) {
        }
        return null;
    }
}

访问结果

SpringCloud zuul接口网关拦截五

SpringCloud zuul接口网关拦截五