|  | @ -0,0 +1,114 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.gateway.filter;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import org.slf4j.Logger;
 | 
	
		
			
				|  |  | import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | 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.net.MalformedURLException;
 | 
	
		
			
				|  |  | import java.util.ArrayList;
 | 
	
		
			
				|  |  | import java.util.List;
 | 
	
		
			
				|  |  | import java.util.regex.Matcher;
 | 
	
		
			
				|  |  | import java.util.regex.Pattern;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * Created by yeshijie on 2022/3/15.
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Component
 | 
	
		
			
				|  |  | public class CsrfFilter implements Filter {
 | 
	
		
			
				|  |  |     private Logger log = LoggerFactory.getLogger(CsrfFilter.class);
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 过滤器配置对象
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     FilterConfig filterConfig = null;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 是否启用
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @Value("${security.csrf.enable}")
 | 
	
		
			
				|  |  |     private boolean enable;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 忽略的URL
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private List<String> excludes = new ArrayList<>();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     public void setExcludes(List<String> excludes) {
 | 
	
		
			
				|  |  |         this.excludes = excludes;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 初始化
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @Override
 | 
	
		
			
				|  |  |     public void init(FilterConfig filterConfig) throws ServletException {
 | 
	
		
			
				|  |  |         this.filterConfig = filterConfig;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 拦截
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @Override
 | 
	
		
			
				|  |  |     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
 | 
	
		
			
				|  |  |             throws IOException, ServletException {
 | 
	
		
			
				|  |  |         HttpServletRequest request = (HttpServletRequest) servletRequest;
 | 
	
		
			
				|  |  |         HttpServletResponse response = (HttpServletResponse) servletResponse;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         String referer = request.getHeader("Referer");
 | 
	
		
			
				|  |  |         String host = request.getServerName();
 | 
	
		
			
				|  |  |         // 不启用或者已忽略的URL不拦截
 | 
	
		
			
				|  |  |         if(!enable ||referer == null||referer.indexOf("http://ehr.yihu.com")==0
 | 
	
		
			
				|  |  |                 ||referer.indexOf("https://zhyzh.gongshu.gov.cn")==0
 | 
	
		
			
				|  |  |                 ||referer.indexOf("27.154.233.186")>0
 | 
	
		
			
				|  |  |                 ||referer.indexOf(host)>0){
 | 
	
		
			
				|  |  |             filterChain.doFilter(servletRequest, servletResponse);
 | 
	
		
			
				|  |  |             return;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         java.net.URL url = null;
 | 
	
		
			
				|  |  |         try {
 | 
	
		
			
				|  |  |             url = new java.net.URL(referer);
 | 
	
		
			
				|  |  |         } catch (MalformedURLException e) {
 | 
	
		
			
				|  |  |             // URL解析异常,也置为404
 | 
	
		
			
				|  |  |             response.setStatus(HttpServletResponse.SC_NOT_FOUND);
 | 
	
		
			
				|  |  |             return;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         // 判断是否存在外链请求本站
 | 
	
		
			
				|  |  |         if (!host.equals(url.getHost())) {
 | 
	
		
			
				|  |  |             log.error("CSRF过滤器 => 服务器:{} => 当前域名:{}", host, referer);
 | 
	
		
			
				|  |  |             servletResponse.setContentType("text/html; charset=utf-8");
 | 
	
		
			
				|  |  |             servletResponse.getWriter().write("系统不支持当前域名的访问!");
 | 
	
		
			
				|  |  |         } else {
 | 
	
		
			
				|  |  |             filterChain.doFilter(servletRequest, servletResponse);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 销毁
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     @Override
 | 
	
		
			
				|  |  |     public void destroy() {
 | 
	
		
			
				|  |  |         this.filterConfig = null;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 判断是否为忽略的URL
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param url URL路径
 | 
	
		
			
				|  |  |      * @return true-忽略,false-过滤
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private boolean isExcludeUrl(String url) {
 | 
	
		
			
				|  |  |         if (excludes == null || excludes.isEmpty()) {
 | 
	
		
			
				|  |  |             return false;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         return excludes.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url))
 | 
	
		
			
				|  |  |                 .anyMatch(Matcher::find);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | }
 |