diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java index 94f705bc2c6358ff6c2f1c679d70381af6be1e6d..3875bb078326a2e976f03d4c763780f26341f9d4 100644 --- a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java @@ -1,6 +1,7 @@ package com.gitee.freakchicken.dbapi.apiserver; import com.gitee.freakchicken.dbapi.basic.filter.ApiAuthFilter; +import com.gitee.freakchicken.dbapi.basic.filter.ApiHeaderFilter; import com.gitee.freakchicken.dbapi.basic.servlet.APIServlet; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; @@ -33,30 +34,4 @@ public class DBApiApiServer { System.setProperty("spring.profiles.active", "apiServer"); SpringApplication.run(DBApiApiServer.class, args); } - - @Autowired - APIServlet APIServlet; - @Autowired - ApiAuthFilter apiAuthFilter; - - @Value("${dbapi.api.context}") - String apiContext; - - @Bean - public ServletRegistrationBean clusterApiServlet() { - ServletRegistrationBean bean = new ServletRegistrationBean(APIServlet); - bean.addUrlMappings(String.format("/%s/*", apiContext)); - return bean; - } - - @Bean - public FilterRegistrationBean authFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(apiAuthFilter); - registrationBean.addUrlPatterns(String.format("/%s/*", apiContext)); - registrationBean.setOrder(2); - registrationBean.setEnabled(true); - return registrationBean; - } - } diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..dfa697973cf095243ba77c6d5df2d8fb994de9e7 --- /dev/null +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java @@ -0,0 +1,54 @@ +package com.gitee.freakchicken.dbapi.apiserver.conf; + +import com.gitee.freakchicken.dbapi.basic.filter.ApiAuthFilter; +import com.gitee.freakchicken.dbapi.basic.filter.ApiHeaderFilter; +import com.gitee.freakchicken.dbapi.basic.filter.ApiIPFilter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description: 用于注册Filter + * @program: dbApi + * @author: kensan + * @create: 2022-04-16 12:43 + */ +@Slf4j +@Configuration +public class FilterConfig { + @Value("${dbapi.api.context}") + String apiContext; + + @Autowired + private ApiAuthFilter apiAuthFilter; + + @Bean + public FilterRegistrationBean apiHeaderFilter() { + // issues/I51LOI + int apiHeaderFilterOrder = 1; + String format = String.format("/%s/*", apiContext); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new ApiHeaderFilter()); + registrationBean.addUrlPatterns(format); + registrationBean.setOrder(apiHeaderFilterOrder); + registrationBean.setEnabled(true); + log.info("regist apiHeaderFilter for {} UrlPatterns, and order is {}",format,apiHeaderFilterOrder); + return registrationBean; + } + + @Bean + public FilterRegistrationBean authFilter() { + int authFilterOrder = 2; + String format = String.format("/%s/*", apiContext); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(apiAuthFilter); + registrationBean.addUrlPatterns(format); + registrationBean.setOrder(authFilterOrder); + registrationBean.setEnabled(true); + log.info("regist authFilter for {} UrlPatterns, and order is {}",format,authFilterOrder); + return registrationBean; + } +} diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..feec8ec0713ac1156e5323ce87c84e5f7330f7dd --- /dev/null +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java @@ -0,0 +1,35 @@ +package com.gitee.freakchicken.dbapi.apiserver.conf; + +import com.gitee.freakchicken.dbapi.basic.servlet.APIServlet; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description: + * @program: dbApi + * @author: kensan + * @create: 2022-04-16 12:45 + */ +@Slf4j +@Configuration +public class ServletConfig { + @Value("${dbapi.api.context}") + String apiContext; + + @Autowired + private APIServlet apiServlet; + + @Bean + public ServletRegistrationBean getServletRegistrationBean() { + String format = String.format("/%s/*", apiContext); + ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet); + bean.addUrlMappings(format); + log.info("regist APIServlet servelet for {} urlMappings",format); + return bean; + } +} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java index 39ff26564b5c3a1d75b2d0488ddb9863cfa75e1c..fa5df6a81c5e5e00836645fa1e60dfbdb90ea5a8 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java @@ -24,14 +24,13 @@ import java.util.List; public class ApiAuthFilter implements Filter { @Autowired - ApiConfigService apiConfigService; + private ApiConfigService apiConfigService; @Autowired - TokenService tokenService; - + private TokenService tokenService; @Value("${dbapi.api.context}") - String apiContext; + private String apiContext; @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -47,14 +46,13 @@ public class ApiAuthFilter implements Filter { String servletPath = request.getRequestURI(); servletPath = servletPath.substring(apiContext.length() + 2); - PrintWriter out = null; + // 不使用writer的时候不要提前获取response的writer,否则无法在后续filter中设置编码 try { - out = response.getWriter(); // 校验接口是否存在 ApiConfig config = apiConfigService.getConfig(servletPath); if (config == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); - out.append(JSON.toJSONString(ResponseDto.fail("Api not exists"))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail("Api not exists"))); return; } // 如果是私有接口,校验权限 @@ -63,18 +61,18 @@ public class ApiAuthFilter implements Filter { // log.debug(tokenStr); if (StringUtils.isBlank(tokenStr)) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - out.append(JSON.toJSONString(ResponseDto.fail("No Token!"))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail("No Token!"))); return; } else { Token token = tokenService.getToken(tokenStr); if (token == null) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - out.append(JSON.toJSONString(ResponseDto.fail("Invalid Token!"))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail("Invalid Token!"))); return; } else { if (token.getExpire() != null && token.getExpire() < System.currentTimeMillis()) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - out.append(JSON.toJSONString(ResponseDto.fail("Token Expired!"))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail("Token Expired!"))); return; } else { // log.info("token存在且有效"); @@ -83,7 +81,7 @@ public class ApiAuthFilter implements Filter { } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - out.append(JSON.toJSONString(ResponseDto.fail("Invalid Token!"))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail("Invalid Token!"))); return; } } @@ -96,12 +94,13 @@ public class ApiAuthFilter implements Filter { } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - out.append(JSON.toJSONString(ResponseDto.fail(e.toString()))); + response.getWriter().append(JSON.toJSONString(ResponseDto.fail(e.toString()))); log.error(e.toString()); } finally { - if (out != null) - out.close(); + if (response.getWriter() != null) { + response.getWriter().close(); + } } } diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..8409222c15b5391ed8edd848779c21c14202d56b --- /dev/null +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java @@ -0,0 +1,50 @@ +package com.gitee.freakchicken.dbapi.basic.filter; + +import com.alibaba.fastjson.JSON; +import com.gitee.freakchicken.dbapi.basic.domain.Token; +import com.gitee.freakchicken.dbapi.basic.service.ApiConfigService; +import com.gitee.freakchicken.dbapi.basic.service.TokenService; +import com.gitee.freakchicken.dbapi.common.ApiConfig; +import com.gitee.freakchicken.dbapi.common.ResponseDto; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; + +@Slf4j +public class ApiHeaderFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + log.debug("ApiHeaderFilter filter execute"); + HttpServletResponse response = (HttpServletResponse) servletResponse; + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + // 跨域设置 + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Headers", "*");//这里很重要,要不然js header不能跨域携带 Authorization属性 + response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); + + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } +} \ No newline at end of file diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java index 067a8006dacc3e04a519c654c32a5f63aaf4512d..0d8bc59c8a9fd9ae6c949c48bff00c793b031d68 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSON; import com.gitee.freakchicken.dbapi.basic.service.IPService; import com.gitee.freakchicken.dbapi.basic.util.IPUtil; import com.gitee.freakchicken.dbapi.common.ResponseDto; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,7 +21,7 @@ import java.io.PrintWriter; public class ApiIPFilter implements Filter { @Autowired - IPService ipService; + private IPService ipService; @Override public void init(FilterConfig filterConfig) throws ServletException { @@ -35,15 +37,6 @@ public class ApiIPFilter implements Filter { String originIp = IPUtil.getOriginIp(request); String method = request.getMethod(); - - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/json; charset=utf-8"); - // 跨域设置 - response.setHeader("Access-Control-Allow-Origin", "*"); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Headers", "*");//这里很重要,要不然js header不能跨域携带 Authorization属性 - response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); - PrintWriter out = null; try { @@ -68,8 +61,9 @@ public class ApiIPFilter implements Filter { log.error(e.toString()); } finally { - if (out != null) + if (out != null) { out.close(); + } } } diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java index bf05e4b9b34dfeee8cfb385617c4daaa9b15e248..4bcd3236c5889304a0cc4d38197606c864b5fb94 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java @@ -56,7 +56,6 @@ public class APIServlet extends HttpServlet { @Autowired MailService mailService; - @Value("${dbapi.api.context}") String apiContext; diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java index 323d384298a9d894829115f6d02fb4a11c09ff5d..3530bd985c8fe029d1a49e18d1e07433e5b11142 100644 --- a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java @@ -19,7 +19,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @MapperScan("com.gitee.freakchicken.dbapi.basic.dao") @EnableCaching -@ComponentScan(value = "com.gitee.freakchicken.dbapi.basic") +@ComponentScan(value = {"com.gitee.freakchicken.dbapi.basic","com.gitee.freakchicken.dbapi.conf"}) @EnableAsync //@PropertySource("application-standalone.properties") public class DBApiStandalone { @@ -27,44 +27,4 @@ public class DBApiStandalone { System.setProperty("spring.profiles.active","standalone"); SpringApplication.run(DBApiStandalone.class, args); } - - @Value("${dbapi.api.context}") - String apiContext; - - @Autowired - APIServlet APIServlet; - - //filter 会自动全局注册 - @Autowired - ApiIPFilter apiIPFilter; - - @Autowired - ApiAuthFilter apiAuthFilter; - - @Bean - public ServletRegistrationBean getServletRegistrationBean() { - ServletRegistrationBean bean = new ServletRegistrationBean(APIServlet); - bean.addUrlMappings(String.format("/%s/*", apiContext)); - return bean; - } - - @Bean - public FilterRegistrationBean IPFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(apiIPFilter); - registrationBean.addUrlPatterns(String.format("/%s/*", apiContext)); - registrationBean.setOrder(1); - registrationBean.setEnabled(true); - return registrationBean; - } - - @Bean - public FilterRegistrationBean authFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(apiAuthFilter); - registrationBean.addUrlPatterns(String.format("/%s/*", apiContext)); - registrationBean.setOrder(2); - registrationBean.setEnabled(true); - return registrationBean; - } } diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..93b23fababe6645bae8ce6893eb741b971840f37 --- /dev/null +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java @@ -0,0 +1,70 @@ +package com.gitee.freakchicken.dbapi.conf; + +import com.gitee.freakchicken.dbapi.basic.filter.ApiAuthFilter; +import com.gitee.freakchicken.dbapi.basic.filter.ApiHeaderFilter; +import com.gitee.freakchicken.dbapi.basic.filter.ApiIPFilter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description: 用于注册Filter + * @program: dbApi + * @author: kensan + * @create: 2022-04-16 12:43 + */ +@Slf4j +@Configuration +public class FilterConfig { + @Value("${dbapi.api.context}") + private String apiContext; + + @Autowired + private ApiIPFilter apiIPFilter; + + @Autowired + private ApiAuthFilter apiAuthFilter; + + @Bean + public FilterRegistrationBean apiHeaderFilter() { + // issues/I51LOI + int apiHeaderFilterOrder = 1; + String format = String.format("/%s/*", apiContext); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(new ApiHeaderFilter()); + registrationBean.addUrlPatterns(format); + registrationBean.setOrder(apiHeaderFilterOrder); + registrationBean.setEnabled(true); + log.info("regist apiHeaderFilter for {} UrlPatterns, and order is {}",format,apiHeaderFilterOrder); + return registrationBean; + } + + @Bean + public FilterRegistrationBean ipFilter() { + int ipfilterOrder = 2; + String format = String.format("/%s/*", apiContext); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(apiIPFilter); + registrationBean.addUrlPatterns(format); + registrationBean.setOrder(ipfilterOrder); + registrationBean.setEnabled(true); + log.info("regist ipFilter for {} UrlPatterns, and order is {}",format,ipfilterOrder); + return registrationBean; + } + + @Bean + public FilterRegistrationBean authFilter() { + int authFilterOrder = 3; + String format = String.format("/%s/*", apiContext); + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(apiAuthFilter); + registrationBean.addUrlPatterns(format); + registrationBean.setOrder(authFilterOrder); + registrationBean.setEnabled(true); + log.info("regist authFilter for {} UrlPatterns, and order is {}",format,authFilterOrder); + return registrationBean; + } +} diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..208074f81fc0cd9877f0417f5aaac5eccac2753e --- /dev/null +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java @@ -0,0 +1,34 @@ +package com.gitee.freakchicken.dbapi.conf; + +import com.gitee.freakchicken.dbapi.basic.servlet.APIServlet; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description: + * @program: dbApi + * @author: kensan + * @create: 2022-04-16 12:45 + */ +@Slf4j +@Configuration +public class ServletConfig { + @Value("${dbapi.api.context}") + private String apiContext; + + @Autowired + private APIServlet apiServlet; + + @Bean + public ServletRegistrationBean getServletRegistrationBean() { + String format = String.format("/%s/*", apiContext); + ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet); + bean.addUrlMappings(format); + log.info("regist APIServlet servelet for {} urlMappings",format); + return bean; + } +}