|
@ -1,122 +1,122 @@
|
|
|
package com.yihu.jw.gateway.filter;
|
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
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 {
|
|
|
|
|
|
@Autowired
|
|
|
private StringRedisTemplate redisTemplate;
|
|
|
|
|
|
private Logger log = LoggerFactory.getLogger(CsrfFilter.class);
|
|
|
/**
|
|
|
* 过滤器配置对象
|
|
|
*/
|
|
|
FilterConfig filterConfig = null;
|
|
|
|
|
|
private boolean getEnable(){
|
|
|
String strEnable = redisTemplate.opsForValue().get("security:csrf:enable");
|
|
|
if(StringUtils.isNotBlank(strEnable)){
|
|
|
return "1".equals(strEnable);
|
|
|
}
|
|
|
redisTemplate.opsForValue().set("security:csrf:enable","0");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 忽略的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(!getEnable() ||referer == null||referer.indexOf("http://ehr.yihu.com")==0
|
|
|
||referer.indexOf("https://zhyzh.gongshu.gov.cn")==0
|
|
|
||referer.indexOf("https://yyfbxt.szhz.hangzhou.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);
|
|
|
}
|
|
|
}
|
|
|
//package com.yihu.jw.gateway.filter;
|
|
|
//
|
|
|
//import org.apache.commons.lang3.StringUtils;
|
|
|
//import org.slf4j.Logger;
|
|
|
//import org.slf4j.LoggerFactory;
|
|
|
//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
//import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
//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 {
|
|
|
//
|
|
|
// @Autowired
|
|
|
// private StringRedisTemplate redisTemplate;
|
|
|
//
|
|
|
// private Logger log = LoggerFactory.getLogger(CsrfFilter.class);
|
|
|
// /**
|
|
|
// * 过滤器配置对象
|
|
|
// */
|
|
|
// FilterConfig filterConfig = null;
|
|
|
//
|
|
|
// private boolean getEnable(){
|
|
|
// String strEnable = redisTemplate.opsForValue().get("security:csrf:enable");
|
|
|
// if(StringUtils.isNotBlank(strEnable)){
|
|
|
// return "1".equals(strEnable);
|
|
|
// }
|
|
|
// redisTemplate.opsForValue().set("security:csrf:enable","0");
|
|
|
// return false;
|
|
|
// }
|
|
|
//
|
|
|
// /**
|
|
|
// * 忽略的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(!getEnable() ||referer == null||referer.indexOf("http://ehr.yihu.com")==0
|
|
|
// ||referer.indexOf("https://zhyzh.gongshu.gov.cn")==0
|
|
|
// ||referer.indexOf("https://yyfbxt.szhz.hangzhou.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);
|
|
|
// }
|
|
|
//}
|