新增IP地址黑白名单过滤器及参数配置
This commit is contained in:
@@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||||
|
* No deletion without permission, or be held responsible to law.
|
||||||
|
*/
|
||||||
|
package com.jeesite.modules.config.web;
|
||||||
|
|
||||||
|
import com.jeesite.common.config.Global;
|
||||||
|
import com.jeesite.common.lang.StringUtils;
|
||||||
|
import com.jeesite.common.web.http.ServletUtils;
|
||||||
|
import jakarta.servlet.Filter;
|
||||||
|
import jakarta.servlet.ServletRequest;
|
||||||
|
import jakarta.servlet.ServletResponse;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IP地址黑白名单过滤器配置
|
||||||
|
*/
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
public class IpAddrFilterConfig {
|
||||||
|
|
||||||
|
private static long clearCacheTime;
|
||||||
|
private static String[] allowPrefixes;
|
||||||
|
private static String[] denyPrefixes;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean<Filter> ipAddrFilter() {
|
||||||
|
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
|
||||||
|
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
|
||||||
|
bean.setFilter((setvletRequest, setvletResponse, chain) -> {
|
||||||
|
if (isAccessAllowed(setvletRequest, setvletResponse)) {
|
||||||
|
chain.doFilter(setvletRequest, setvletResponse);
|
||||||
|
} else {
|
||||||
|
HttpServletResponse response = (HttpServletResponse) setvletResponse;
|
||||||
|
response.setStatus(403);
|
||||||
|
ServletUtils.renderString(response, Global.getText("访问拒绝"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
bean.addUrlPatterns("/*");
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAccessAllowed(ServletRequest request, ServletResponse response) {
|
||||||
|
if (clearCacheTime == 0 || clearCacheTime != Global.getClearCacheTime()) {
|
||||||
|
allowPrefixes = Global.getConfigToArray("sys.filter.allowIpAddrs", StringUtils.EMPTY);
|
||||||
|
denyPrefixes = Global.getConfigToArray("sys.filter.denyIpAddrs", StringUtils.EMPTY);
|
||||||
|
clearCacheTime = Global.getClearCacheTime();
|
||||||
|
}
|
||||||
|
// 如果未初始化,直接拒绝
|
||||||
|
if (allowPrefixes == null || denyPrefixes == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 如果未设置黑白名单,直接通过
|
||||||
|
if (allowPrefixes.length == 0 && denyPrefixes.length == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// 如果未设置白名单,则直接通过白名单,再从黑名单中检查
|
||||||
|
boolean result = allowPrefixes.length == 0;
|
||||||
|
String ip = request.getRemoteAddr() + "]";
|
||||||
|
for (String prefix : allowPrefixes) {
|
||||||
|
if (StringUtils.startsWithIgnoreCase(ip, StringUtils.trim(prefix))){
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String prefix : denyPrefixes) {
|
||||||
|
if (StringUtils.startsWithIgnoreCase(ip, StringUtils.trim(prefix))){
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Reference in New Issue
Block a user