springcloud脚手架搭建(四)---zuul网关搭建
1.引入pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gameley</groupId>
<artifactId>gateway-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>gateway-service</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gameley</groupId>
<artifactId>adplatform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-starter-stream-rabbit</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gameley</groupId>
<artifactId>gameley-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework.cloud</groupId>-->
<!--<artifactId>spring-cloud-starter-zipkin</artifactId>-->
<!--<version>RELEASE</version>-->
<!--</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.配置zuul:
zuul:
routes:
api-a:
path: /user-api/**
serviceId: user-service
api-b:
path: /gameley-auth/**
serviceId: gameley-auth
prefix: /api #为zuul设置一个公共的前缀
3.创建springboot启动类
package com.gameley;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableFeignClients
public class GatewayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayServiceApplication.class, args);
}
/** * 解决跨域问题 * @return */
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允许cookies跨域
config.addAllowedOrigin("*");// #允许向该服务器提交请求的URI,*表示全部允许
config.addAllowedHeader("*");// #允许访问的头信息,*表示全部
config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");// 允许Get的请求方法
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
4.配置登录拦截器
package com.gameley.filter;
import com.alibaba.fastjson.JSON;
import com.gameley.bean.Audience;
import com.gameley.bean.JwtInfo;
import com.gameley.common.constant.RestCodeConstants;
import com.gameley.common.msg.auth.TokenErrorResponse;
import com.gameley.feign.ElementService;
import com.gameley.utils.JwtHelper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@EnableConfigurationProperties(Audience.class)
@Slf4j
@Component
public class loginfiler extends ZuulFilter {
@Autowired
ElementService iUserService;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Value("${zuul.prefix}")
private String zuulPrefix;
@Value("${gate.ignore.startWith}")
private String startWith;
@Autowired
private Audience audience;
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
final String requesturi=request.getRequestURI().substring(zuulPrefix.length());
String token=request.getHeader("token");
String client=request.getHeader("client");
//不进行拦截的地址
if(isStartWith(requesturi)){
return null;
}
/** * 未登录,踢出 */
if(token==null||client==null){
ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由
ctx.setResponseStatusCode(RestCodeConstants.TOKEN_ERROR_CODE);// 返回错误码
ctx.setResponseBody("fail token");// 返回错误内容
ctx.set("isSuccess", false);
return null;
}
try {
JwtInfo jwtInfo=new JwtInfo();
jwtInfo.setToken(token);
jwtInfo.setClientId(audience.getClientId());
jwtInfo.setExpiresSecond(audience.getExpiresSecond());
jwtInfo.setName(audience.getName());
JwtHelper jwtHelper=new JwtHelper();
jwtHelper.setJwtInfo(jwtInfo);
Claims claims = jwtHelper.parseJWT(token, audience.getBase64Secret());
Claims clientClaims = jwtHelper.parseJWT(client, audience.getClient64Secret());
if(claims==null||clientClaims==null){
/** * 暂不使用后台自动刷新,改为前端页面定时自动拉取刷新 */
setFailedRequest("token过期", RestCodeConstants.TOKEN_ERROR_CODE);
return null;
// String refreshToken=jwtInfo.getToken();
// ctx.addZuulRequestHeader("token",refreshToken);
// ctx.addZuulResponseHeader("token",refreshToken);
}else {
ctx.addZuulRequestHeader("token",token);
}
} catch (Exception e) {
setFailedRequest(JSON.toJSONString(new TokenErrorResponse(e.getMessage())), RestCodeConstants.TOKEN_ERROR_CODE);
return null;
}
return null;
}
/** * URI是否以什么打头 * * @param requestUri * @return */
private boolean isStartWith(String requestUri) {
boolean flag = false;
for (String s : startWith.split(",")) {
if (requestUri.startsWith(s)) {
return true;
}
}
return flag;
}
/** * 网关抛异常 * * @param body * @param code */
private void setFailedRequest(String body, int code) {
log.debug("Reporting error ({}): {}", code, body);
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setResponseStatusCode(code);
if (ctx.getResponseBody() == null) {
ctx.setResponseBody(body);
ctx.setSendZuulResponse(false);
}
}
}
5.备注:这里登录使用的为jwt-token(https://www.jianshu.com/p/576dbf44b2ae)
还没有评论,来说两句吧...