|
|
@@ -1,87 +0,0 @@
|
|
|
-package com.zd.gateway.filter;
|
|
|
-
|
|
|
-import cn.hutool.core.util.StrUtil;
|
|
|
-import cn.hutool.json.JSONUtil;
|
|
|
-import com.zd.model.domain.ResultData;
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
-import org.springframework.util.AntPathMatcher;
|
|
|
-import org.springframework.util.CollectionUtils;
|
|
|
-import org.springframework.util.PathMatcher;
|
|
|
-
|
|
|
-import javax.annotation.Resource;
|
|
|
-import javax.servlet.*;
|
|
|
-import javax.servlet.annotation.WebFilter;
|
|
|
-import javax.servlet.http.HttpServletRequest;
|
|
|
-import javax.servlet.http.HttpServletResponse;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.PrintWriter;
|
|
|
-import java.nio.charset.StandardCharsets;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-/**
|
|
|
- * @author Hey, rog
|
|
|
- * @version V1.0
|
|
|
- * @since 2023/1/11 15:12
|
|
|
- */
|
|
|
-@Component
|
|
|
-@WebFilter(filterName = "refererFilter", urlPatterns = "/")
|
|
|
-public class RefererFilter implements Filter {
|
|
|
-
|
|
|
- @Resource
|
|
|
- private RefererProperty refererProperty;
|
|
|
-
|
|
|
- private static PathMatcher pathMatcher = new AntPathMatcher();
|
|
|
-
|
|
|
- @Override
|
|
|
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
|
|
|
- throws IOException, ServletException {
|
|
|
- HttpServletRequest request = (HttpServletRequest) servletRequest;
|
|
|
- HttpServletResponse response = (HttpServletResponse) servletResponse;
|
|
|
-
|
|
|
- // 检测地址是否在白名单,若在直接放过
|
|
|
- if (isBlank(request)) {
|
|
|
- filterChain.doFilter(servletRequest, servletResponse);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 启用了Refer检测且不存在配置站点直接拦截
|
|
|
- if (refererProperty.getEnabled() && !existsReferer(request)) {
|
|
|
- response.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
|
|
- response.setContentType("application/json;charset=UTF-8");
|
|
|
- try (PrintWriter writer = response.getWriter()) {
|
|
|
- writer.write(JSONUtil.toJsonStr(ResultData.fail("非法访问")));
|
|
|
- }
|
|
|
- return;
|
|
|
- }
|
|
|
- filterChain.doFilter(request, response);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 是否存在支持跨站点配置地址,存在true、不存在false
|
|
|
- */
|
|
|
- private boolean existsReferer(HttpServletRequest request) {
|
|
|
- String referer = request.getHeader("Referer");
|
|
|
- if (StrUtil.isBlank(referer)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- List<String> allows = this.refererProperty.getExcludes();
|
|
|
- if (!CollectionUtils.isEmpty(allows)) {
|
|
|
- return allows.stream().anyMatch(url -> referer.contains(url));
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 是否存在白名单
|
|
|
- */
|
|
|
- private boolean isBlank(HttpServletRequest request) {
|
|
|
- String path = request.getServletPath();
|
|
|
- List<String> excludes = refererProperty.getIncludes();
|
|
|
- for (String exclude : excludes) {
|
|
|
- if (pathMatcher.match(exclude, path)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
-}
|