main
黄海 11 months ago
parent bc03bef29f
commit 3050633bb0

@ -1,40 +1,34 @@
package com.dsideal.gw.Controller; package com.dsideal.gw.Controller;
import com.dsideal.gw.Start;
import com.jfinal.core.Controller; import com.jfinal.core.Controller;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import org.yaml.snakeyaml.Yaml;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class ApiController extends Controller { public class ApiController extends Controller {
private final OkHttpClient client = new OkHttpClient(); private final OkHttpClient client = new OkHttpClient();
private List<Map<String, String>> routes; private final List<Map<String, String>> routes;
public ApiController() { public ApiController() {
Yaml yaml = new Yaml(); Map<String, Object> jfinalConfig = (Map<String, Object>) Start.yamlConfig.get("jfinal");
try (InputStream input = getClass().getClassLoader().getResourceAsStream("application_dev.yaml")) { routes = (List<Map<String, String>>) jfinalConfig.get("routes");
if (input == null) {
System.out.println("Sorry, unable to find routes.yaml");
return;
}
Map<String, List<Map<String, String>>> yamlData = yaml.load(input);
routes = yamlData.get("routes");
} catch (IOException ex) {
ex.printStackTrace();
}
} }
public void index() { public void index() {
String path = getPara(); // 获取请求路径 String path = getRequest().getRequestURI(); // 获取请求路径
System.out.println(path); if (path.equals("/")) {
renderText("Welcome to JFinal Gateway.");
return;
}
String serviceUrl = route(path); // 根据路径决定转发到哪个微服务 String serviceUrl = route(path); // 根据路径决定转发到哪个微服务
if (serviceUrl == null) { if (serviceUrl == null) {
@ -43,7 +37,9 @@ public class ApiController extends Controller {
} }
try { try {
//方法类型
String method = getRequest().getMethod(); String method = getRequest().getMethod();
//传递jwt token
Request.Builder requestBuilder = new Request.Builder() Request.Builder requestBuilder = new Request.Builder()
.url(serviceUrl) .url(serviceUrl)
.header("Authorization", getHeader("Authorization")); .header("Authorization", getHeader("Authorization"));
@ -59,7 +55,9 @@ public class ApiController extends Controller {
Response response = client.newCall(request).execute(); Response response = client.newCall(request).execute();
if (response.isSuccessful()) { if (response.isSuccessful()) {
renderJson(response.body().string()); if (response.body() != null) {
renderJson(response.body().string());
}
} else { } else {
renderJson("error", "服务请求失败"); renderJson("error", "服务请求失败");
} }
@ -68,6 +66,13 @@ public class ApiController extends Controller {
} }
} }
/**
*
*
* @param path
* @return
*/
private String route(String path) { private String route(String path) {
if (routes != null) { if (routes != null) {
for (Map<String, String> route : routes) { for (Map<String, String> route : routes) {

@ -1,18 +1,47 @@
package com.dsideal.gw.Interceptor; package com.dsideal.gw.Interceptor;
import com.dsideal.gw.Start;
import com.jfinal.aop.Interceptor; import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation; import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller; import com.jfinal.core.Controller;
import java.util.List;
import java.util.Map;
public class AuthInterceptor implements Interceptor { public class AuthInterceptor implements Interceptor {
//白名单
private final List<String> whitelist;
public AuthInterceptor() {
Map<String, Object> jfinalConfig = (Map<String, Object>) Start.yamlConfig.get("jfinal");
whitelist = (List<String>) jfinalConfig.get("whitelist");
}
/**
*
*
* @param path
* @return
*/
private boolean isWhitelisted(String path) {
if (whitelist != null) {
for (String allowedPath : whitelist) {
if (path.startsWith(allowedPath)) {
return true;
}
}
}
return false;
}
@Override @Override
public void intercept(Invocation inv) { public void intercept(Invocation inv) {
Controller controller = inv.getController(); Controller controller = inv.getController();
String token = controller.getHeader("Authorization"); String token = controller.getHeader("Authorization");
// 这里添加你的鉴权逻辑,例如检查 token 是否有效 // 这里添加你的鉴权逻辑,例如检查 token 是否有效
if (!isValidToken(token)) { if (!isWhitelisted(controller.getRequest().getRequestURI()) && !isValidToken(token)) {
controller.renderJson("error", "Unauthorized"); controller.renderJson("error", "请登录后访问此接口");
} else { } else {
inv.invoke(); inv.invoke();
} }

@ -9,8 +9,24 @@ import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine; import com.jfinal.template.Engine;
import java.io.File; import java.io.File;
import java.io.InputStream;
import java.util.Map;
import org.yaml.snakeyaml.Yaml;
public class Start extends JFinalConfig { public class Start extends JFinalConfig {
public static Map<String, Object> yamlConfig;
//通过构造函数读取配置文件
public Start() {
Yaml yaml = new Yaml();
InputStream input = getClass().getClassLoader().getResourceAsStream("application_dev.yaml");
if (input == null) {
System.out.println("Sorry, unable to find application.yaml");
return;
}
yamlConfig = yaml.load(input);
}
//配置文件 //配置文件
public static void main(String[] args) { public static void main(String[] args) {
@ -24,6 +40,11 @@ public class Start extends JFinalConfig {
public void configConstant(Constants me) { public void configConstant(Constants me) {
//使用LogBack //使用LogBack
me.setLogFactory(new LogBackLogFactory()); me.setLogFactory(new LogBackLogFactory());
//开发模式配置,有其它数据库配置时,参考这里的用法
if (yamlConfig != null) {
Map<String, Object> jfinalConfig = (Map<String, Object>) yamlConfig.get("jfinal");
me.setDevMode((boolean) jfinalConfig.get("devMode"));
}
} }
/** /**

@ -1,8 +1,14 @@
# 路由配置 jfinal:
routes: # 开发模式
- prefix: /base devMode: true
url: http://localhost:9002 # 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
# 根
- /
# 登录接口
- /base/doLogin
# 白名单
whitelist:
- /base/doLogin

@ -1,8 +1,14 @@
# 路由配置 jfinal:
routes: # 开发模式
- prefix: /base devMode: true
url: http://localhost:9002 # 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
# 根
- /
# 登录接口
- /base/doLogin
# 白名单
whitelist:
- /base/doLogin

Loading…
Cancel
Save