Spring 使用ZuulProxy重定向呼叫
我想做什么: 我希望有一个服务器,可以通过这种方式重定向某些类型的调用:Spring 使用ZuulProxy重定向呼叫,spring,redirect,spring-cloud,netflix-zuul,spring-cloud-netflix,Spring,Redirect,Spring Cloud,Netflix Zuul,Spring Cloud Netflix,我想做什么: 我希望有一个服务器,可以通过这种方式重定向某些类型的调用: @Slf4j public class SimpleRouteFilter extends ZuulFilter { @Value("${unauthorized.url.redirect:http://localhost:8090/testcategory/api/available}") private String urlRedirect; @Override public Str
@Slf4j
public class SimpleRouteFilter extends ZuulFilter {
@Value("${unauthorized.url.redirect:http://localhost:8090/testcategory/api/available}")
private String urlRedirect;
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
private boolean isAuthorizedRequest(HttpServletRequest request) {
return false;
}
private void setRouteHost(RequestContext ctx) throws MalformedURLException {
String urlS = ctx.getRequest().getRequestURL().toString();
URL url = new URL(urlS);
String protocol = url.getProtocol();
String rootHost = url.getHost();
int port = url.getPort();
String portS = (port > 0 ? ":" + port : "");
ctx.setRouteHost(new URL(protocol + "://" + rootHost + portS));
}
@Override
public Object run() {
log.debug("query interception");
RequestContext ctx = RequestContext.getCurrentContext();
try {
if (isAuthorizedRequest(ctx.getRequest())) {
log.debug("NOT redirecting...");
setRouteHost(ctx);
} else {
log.debug("redirecting to " + urlRedirect + " ...");
ctx.setRouteHost(new URL(urlRedirect));
}
} catch (MalformedURLException e) {
log.error("", e);
}
return null;
}
}
http://localhost:8080/myapp/api/rest/category/method
在
http://localhost:8090/category/api/method
我所做的:
我已将我的Zuul代理配置为:
info:
component: Simple Zuul Proxy Server
cloud:
conablefig:
failFast: true
discovery:
end: true
zuul:
routes:
api: /myapp/api/rest/**
server:
port: 8080
logging:
level:
ROOT: INFO
org.springframework.web: INFO
info.tcb: DEBUG
我正在以这种方式使用路由筛选器:
@Slf4j
public class SimpleRouteFilter extends ZuulFilter {
@Value("${unauthorized.url.redirect:http://localhost:8090/testcategory/api/available}")
private String urlRedirect;
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
private boolean isAuthorizedRequest(HttpServletRequest request) {
return false;
}
private void setRouteHost(RequestContext ctx) throws MalformedURLException {
String urlS = ctx.getRequest().getRequestURL().toString();
URL url = new URL(urlS);
String protocol = url.getProtocol();
String rootHost = url.getHost();
int port = url.getPort();
String portS = (port > 0 ? ":" + port : "");
ctx.setRouteHost(new URL(protocol + "://" + rootHost + portS));
}
@Override
public Object run() {
log.debug("query interception");
RequestContext ctx = RequestContext.getCurrentContext();
try {
if (isAuthorizedRequest(ctx.getRequest())) {
log.debug("NOT redirecting...");
setRouteHost(ctx);
} else {
log.debug("redirecting to " + urlRedirect + " ...");
ctx.setRouteHost(new URL(urlRedirect));
}
} catch (MalformedURLException e) {
log.error("", e);
}
return null;
}
}
我在这个类中使用默认url只是为了测试重定向
我的问题是,当我调用例如http://localhost:8080/myapp/api/rest/testcategory/available
它以404结尾,但我的过滤器记录它执行重定向
只有当我调用http://localhost:8080/myapp/api/rest/
我做错了什么?
为什么double**不适用于所有其他通话 你能解决这个问题吗?现在正在处理这个问题。。。