zuul网关使用过滤器

zuul网关使用过滤器 要解决 的问题 :

1,如何鉴权,即判断是否登录;

编写过滤器,继承

com.netflix.zuul.ZuulFilter

重写run() ,在run()中进行鉴权判断,

比如参数值

accessToken

为"whuang",才能访问

@Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse response=ctx.getResponse();

        log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());

        Object accessToken = request.getParameter("accessToken");
        System.out.println("accessToken :" + accessToken);
        if (ValueWidget.isNullOrEmpty(accessToken)
                || (!"whuang".equals(accessToken))) {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);
            try {
                WebServletUtil.writeResponse(response,"登录失败");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ctx.setResponseStatusCode(401);
            return null;
        }
        return null;
    }

2,过滤器中如何重定向或修改应答题response

在过滤器中可以重写response,但是前提是要设置

ctx.setSendZuulResponse(false);

否则报错:

Caused by: java.lang.IllegalStateException: getWriter() has already been called for this response
    at org.apache.catalina.connector.Response.getOutputStream(Response.java:592) ~[tomcat-embed-core-8.5.15.jar:8.5.15]

重定向:

 if (ValueWidget.isNullOrEmpty(accessToken)
                || (!"whuang".equals(accessToken))) {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);
           
            try {
                response.sendRedirect("error.jsp");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

3,过滤器中能修改参数吗?

ctx.setRequestQueryParams();

4.如何解决 跨域问题 

待续

代码:https://github.com/liuyu520/SpringCloud-Learning-Dalston-/tree/master/api-gateway-with-eureka

猜你喜欢

转载自my.oschina.net/huangweiindex/blog/1825934