diff --git a/canal-admin/canal-admin-server/pom.xml b/canal-admin/canal-admin-server/pom.xml
index 165b1cf5..65a2da76 100644
--- a/canal-admin/canal-admin-server/pom.xml
+++ b/canal-admin/canal-admin-server/pom.xml
@@ -14,7 +14,7 @@
org.springframework.boot
- spring-boot-starter-webflux
+ spring-boot-starter-web
org.springframework.boot
@@ -29,6 +29,10 @@
commons-dbutils
commons-dbutils
+
+ com.github.ben-manes.caffeine
+ caffeine
+
diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java
new file mode 100644
index 00000000..80a8df70
--- /dev/null
+++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java
@@ -0,0 +1,116 @@
+package com.alibaba.otter.canal.admin.config;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.otter.canal.admin.controller.UserController;
+import com.alibaba.otter.canal.admin.model.BaseModel;
+import com.alibaba.otter.canal.admin.model.User;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.io.PrintWriter;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new HandlerInterceptor() {
+
+ @Override
+ public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
+ Object o) throws Exception {
+ httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
+ httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");
+ httpServletResponse.setHeader("Access-Control-Allow-Headers",
+ "Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Token");
+ httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
+ httpServletResponse.setHeader("Access-Control-Max-Age", String.valueOf(3600 * 24));
+
+ if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) {
+ httpServletResponse.setStatus(HttpStatus.NO_CONTENT.value());
+ return false;
+ }
+
+ return true;
+ }
+ }).addPathPatterns("/api/**");
+
+ registry.addInterceptor(new HandlerInterceptor() {
+
+ @Override
+ public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
+ Object o) throws Exception {
+ String token = httpServletRequest.getHeader("X-Token");
+ boolean valid = false;
+ if (token != null) {
+ User user = UserController.loginUsers.getIfPresent(token);
+ if (user != null) {
+ valid = true;
+ }
+ }
+ if (!valid) {
+ BaseModel baseModel = BaseModel.getInstance(null);
+ baseModel.setCode(50014);
+ baseModel.setMessage("Expired token");
+ ObjectMapper mapper = new ObjectMapper();
+ String json = mapper.writeValueAsString(baseModel);
+ try {
+ httpServletResponse.setContentType("application/json;charset=UTF-8");
+ PrintWriter out = httpServletResponse.getWriter();
+ out.print(json);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ return true;
+ }
+ }).addPathPatterns("/api/**").excludePathPatterns("/api/**/user/**");
+ }
+
+ /**
+ * 跨域支持
+ *
+ * @param registry
+ */
+ // @Override
+ // public void addCorsMappings(CorsRegistry registry) {
+ // registry.addMapping("/api")
+ // .allowedOrigins("http://127.0.0.1")
+ // .allowCredentials(true)
+ // .allowedMethods("*")
+ // .allowedHeaders("Origin, X-Requested-With, Content-Type, Accept,
+ // Authorization")
+ // .maxAge(3600 * 24);
+ // }
+
+ /**
+ * 添加静态资源--过滤swagger-api (开源的在线API文档)
+ *
+ * @param registry
+ */
+ // @Override
+ // public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ // // 过滤swagger
+ // registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+ //
+ // registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+ //
+ // registry.addResourceHandler("/swagger-resources/**")
+ // .addResourceLocations("classpath:/META-INF/resources/swagger-resources/");
+ //
+ // registry.addResourceHandler("/swagger/**").addResourceLocations("classpath:/META-INF/resources/swagger*");
+ //
+ // registry.addResourceHandler("/v2/api-docs/**")
+ // .addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
+ //
+ // }
+}
diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java
index f56cecad..9342cea3 100644
--- a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java
+++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java
@@ -1,5 +1,6 @@
package com.alibaba.otter.canal.admin.controller;
+import com.alibaba.otter.canal.admin.model.BaseModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -10,14 +11,14 @@ import com.alibaba.otter.canal.admin.model.CanalConfig;
import com.alibaba.otter.canal.admin.service.CanalConfigService;
@RestController
-@RequestMapping("/api/{env}/config")
+@RequestMapping("/api/{env}/canal")
public class CanalConfigController {
@Autowired
CanalConfigService canalConfigService;
- @RequestMapping(value = "/canal", method = RequestMethod.GET)
- public CanalConfig canalConfig(@PathVariable String env) {
- return canalConfigService.getCanalConfig();
+ @RequestMapping(value = "/config", method = RequestMethod.GET)
+ public BaseModel canalConfig(@PathVariable String env) {
+ return BaseModel.getInstance(canalConfigService.getCanalConfig());
}
}
diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java
new file mode 100644
index 00000000..c01161a9
--- /dev/null
+++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java
@@ -0,0 +1,57 @@
+package com.alibaba.otter.canal.admin.controller;
+
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.springframework.web.bind.annotation.*;
+
+import com.alibaba.otter.canal.admin.model.BaseModel;
+import com.alibaba.otter.canal.admin.model.User;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("/api/{env}/user")
+public class UserController {
+
+ public static final LoadingCache loginUsers = Caffeine.newBuilder()
+ .maximumSize(10_000)
+ .expireAfterAccess(10, TimeUnit.MINUTES)
+ .build(key -> null);
+
+ @PostMapping(value = "/login")
+ public BaseModel