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