Commit 767a02be authored by 向怀芳's avatar 向怀芳 🎱

1. 代理IP处理02

parent 356ff45a
...@@ -80,10 +80,7 @@ public class SictTokenEndpoint { ...@@ -80,10 +80,7 @@ public class SictTokenEndpoint {
String tokenValue = authHeader.replaceAll("(?i)Bearer", "").trim(); String tokenValue = authHeader.replaceAll("(?i)Bearer", "").trim();
OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue); OAuth2AccessToken accessToken = tokenStore.readAccessToken(tokenValue);
if (accessToken == null || StrUtil.isBlank(accessToken.getValue())) { if (accessToken == null || StrUtil.isBlank(accessToken.getValue())) {
return R.builder() return new R();
.code(Constant.BYTE_NO)
.data(Boolean.FALSE)
.msg("退出失败,token 无效").build();
} }
OAuth2Authentication auth2Authentication = tokenStore.readAuthentication(accessToken); OAuth2Authentication auth2Authentication = tokenStore.readAuthentication(accessToken);
......
...@@ -39,279 +39,283 @@ import java.util.*; ...@@ -39,279 +39,283 @@ import java.util.*;
@Slf4j @Slf4j
@UtilityClass @UtilityClass
public class WebUtils extends org.springframework.web.util.WebUtils { public class WebUtils extends org.springframework.web.util.WebUtils {
private final String BASIC_ = "Basic "; private final String BASIC_ = "Basic ";
private final String UNKNOWN = "unknown"; private final String UNKNOWN = "unknown";
/** /**
* 判断是否ajax请求 * 判断是否ajax请求
* spring ajax 返回含有 ResponseBody 或者 RestController注解 * spring ajax 返回含有 ResponseBody 或者 RestController注解
* *
* @param handlerMethod HandlerMethod * @param handlerMethod HandlerMethod
* @return 是否ajax请求 * @return 是否ajax请求
*/ */
public boolean isBody(HandlerMethod handlerMethod) { public boolean isBody(HandlerMethod handlerMethod) {
ResponseBody responseBody = ClassUtils.getAnnotation(handlerMethod, ResponseBody.class); ResponseBody responseBody = ClassUtils.getAnnotation(handlerMethod, ResponseBody.class);
return responseBody != null; return responseBody != null;
} }
/** /**
* 读取cookie * 读取cookie
* *
* @param name cookie name * @param name cookie name
* @return cookie value * @return cookie value
*/ */
public String getCookieVal(String name) { public String getCookieVal(String name) {
HttpServletRequest request = WebUtils.getRequest(); HttpServletRequest request = WebUtils.getRequest();
Assert.notNull(request, "request from RequestContextHolder is null"); Assert.notNull(request, "request from RequestContextHolder is null");
return getCookieVal(request, name); return getCookieVal(request, name);
} }
/** /**
* 读取cookie * 读取cookie
* *
* @param request HttpServletRequest * @param request HttpServletRequest
* @param name cookie name * @param name cookie name
* @return cookie value * @return cookie value
*/ */
public String getCookieVal(HttpServletRequest request, String name) { public String getCookieVal(HttpServletRequest request, String name) {
Cookie cookie = getCookie(request, name); Cookie cookie = getCookie(request, name);
return cookie != null ? cookie.getValue() : null; return cookie != null ? cookie.getValue() : null;
} }
/** /**
* 清除 某个指定的cookie * 清除 某个指定的cookie
* *
* @param response HttpServletResponse * @param response HttpServletResponse
* @param key cookie key * @param key cookie key
*/ */
public void removeCookie(HttpServletResponse response, String key) { public void removeCookie(HttpServletResponse response, String key) {
setCookie(response, key, null, 0); setCookie(response, key, null, 0);
} }
/** /**
* 设置cookie * 设置cookie
* *
* @param response HttpServletResponse * @param response HttpServletResponse
* @param name cookie name * @param name cookie name
* @param value cookie value * @param value cookie value
* @param maxAgeInSeconds maxage * @param maxAgeInSeconds maxage
*/ */
public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) { public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) {
Cookie cookie = new Cookie(name, value); Cookie cookie = new Cookie(name, value);
cookie.setPath("/"); cookie.setPath("/");
cookie.setMaxAge(maxAgeInSeconds); cookie.setMaxAge(maxAgeInSeconds);
cookie.setHttpOnly(true); cookie.setHttpOnly(true);
response.addCookie(cookie); response.addCookie(cookie);
} }
/** /**
* 获取 HttpServletRequest * 获取 HttpServletRequest
* *
* @return {HttpServletRequest} * @return {HttpServletRequest}
*/ */
public HttpServletRequest getRequest() { public HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} }
/** /**
* 获取 HttpServletResponse * 获取 HttpServletResponse
* *
* @return {HttpServletResponse} * @return {HttpServletResponse}
*/ */
public HttpServletResponse getResponse() { public HttpServletResponse getResponse() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
} }
/** /**
* 返回json * 返回json
* *
* @param response HttpServletResponse * @param response HttpServletResponse
* @param result 结果对象 * @param result 结果对象
*/ */
public void renderJson(HttpServletResponse response, Object result) { public void renderJson(HttpServletResponse response, Object result) {
renderJson(response, result, MediaType.APPLICATION_JSON_UTF8_VALUE); renderJson(response, result, MediaType.APPLICATION_JSON_UTF8_VALUE);
} }
/** /**
* 返回json * 返回json
* *
* @param response HttpServletResponse * @param response HttpServletResponse
* @param result 结果对象 * @param result 结果对象
* @param contentType contentType * @param contentType contentType
*/ */
public void renderJson(HttpServletResponse response, Object result, String contentType) { public void renderJson(HttpServletResponse response, Object result, String contentType) {
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
response.setContentType(contentType); response.setContentType(contentType);
try (PrintWriter out = response.getWriter()) { try (PrintWriter out = response.getWriter()) {
out.append(JSONUtil.toJsonStr(result)); out.append(JSONUtil.toJsonStr(result));
} catch (IOException e) { } catch (IOException e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
/** /**
* 获取ip * 获取ip
* *
* @return {String} * @return {String}
*/ */
public String getIP() { public String getIP() {
return getIP(WebUtils.getRequest()); return getIP(WebUtils.getRequest());
} }
public String getSession(){ public String getSession() {
return WebUtils.getSessionId(WebUtils.getRequest()); return WebUtils.getSessionId(WebUtils.getRequest());
} }
/** /**
* 获取ip * 获取ip
* *
* @param request HttpServletRequest * @param request HttpServletRequest
* @return {String} * @return {String}
*/ */
public String getIP(HttpServletRequest request) { public String getIP(HttpServletRequest request) {
Assert.notNull(request, "HttpServletRequest is null"); Assert.notNull(request, "HttpServletRequest is null");
String ip = request.getHeader("X-Requested-For"); String ip = request.getHeader("X-Requested-For");
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For"); ip = request.getHeader("X-Forwarded-For");
} }
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP"); ip = request.getHeader("Proxy-Client-IP");
} }
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP"); ip = request.getHeader("WL-Proxy-Client-IP");
} }
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP"); ip = request.getHeader("HTTP_CLIENT_IP");
} }
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR"); ip = request.getHeader("HTTP_X_FORWARDED_FOR");
} }
if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) { if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr(); ip = request.getRemoteAddr();
} }
return StringUtils.isBlank(ip) ? null : ip.split(",")[0]; return StringUtils.isBlank(ip) ? null : ip.split(",")[0];
} }
public String getIP(ServerHttpRequest request) { public String getIP(ServerHttpRequest request) {
HttpHeaders headers = request.getHeaders(); HttpHeaders headers = request.getHeaders();
String ip = headers.getFirst("x-forwarded-for"); String ip = headers.getFirst("x-forwarded-for");
log.error("getIp.ip = {}", ip); log.error("headers = {}", JSONUtil.toJsonStr(headers));
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个ip才是真实ip // 多次反向代理后会有多个ip值,第一个ip才是真实ip
if (ip.indexOf(",") != -1) { if (ip.indexOf(",") != -1) {
ip = ip.split(",")[0]; if ("127.0.0.1".equals(ip.split(",")[0])) {
} ip = ip.split(",")[1];
} } else {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = ip.split(",")[0];
ip = headers.getFirst("Proxy-Client-IP"); }
} }
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { }
ip = headers.getFirst("WL-Proxy-Client-IP"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
} ip = headers.getFirst("Proxy-Client-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { }
ip = headers.getFirst("HTTP_CLIENT_IP"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
} ip = headers.getFirst("WL-Proxy-Client-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { }
ip = headers.getFirst("HTTP_X_FORWARDED_FOR"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
} ip = headers.getFirst("HTTP_CLIENT_IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { }
ip = headers.getFirst("X-Real-IP"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
} ip = headers.getFirst("HTTP_X_FORWARDED_FOR");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { }
ip = request.getRemoteAddress().getAddress().getHostAddress(); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
} ip = headers.getFirst("X-Real-IP");
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; }
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddress().getAddress().getHostAddress();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
/** /**
* 从request 获取CLIENT_ID * 从request 获取CLIENT_ID
* *
* @return * @return
*/ */
@SneakyThrows @SneakyThrows
public String[] getClientId(ServerHttpRequest request) { public String[] getClientId(ServerHttpRequest request) {
String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
if (header == null || !header.startsWith(BASIC_)) { if (header == null || !header.startsWith(BASIC_)) {
throw new CheckedException("请求头中client信息为空"); throw new CheckedException("请求头中client信息为空");
} }
byte[] base64Token = header.substring(6).getBytes("UTF-8"); byte[] base64Token = header.substring(6).getBytes("UTF-8");
byte[] decoded; byte[] decoded;
try { try {
decoded = Base64.decode(base64Token); decoded = Base64.decode(base64Token);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new CheckedException( throw new CheckedException(
"Failed to decode basic authentication token"); "Failed to decode basic authentication token");
} }
String token = new String(decoded, StandardCharsets.UTF_8); String token = new String(decoded, StandardCharsets.UTF_8);
int delim = token.indexOf(":"); int delim = token.indexOf(":");
if (delim == -1) { if (delim == -1) {
throw new CheckedException("Invalid basic authentication token"); throw new CheckedException("Invalid basic authentication token");
} }
return new String[]{token.substring(0, delim), token.substring(delim + 1)}; return new String[]{token.substring(0, delim), token.substring(delim + 1)};
} }
/** /**
* * @param request HttpServletRequest
* @param request HttpServletRequest * tip: 不可使用WebUtils.getRequest()获取
* tip: 不可使用WebUtils.getRequest()获取 * @param allowSuffix 文件后缀名 多个以","逗号分隔
* @param allowSuffix 文件后缀名 多个以","逗号分隔 * @return
* @return */
*/ public MultipartFile getRequestFile(@NonNull HttpServletRequest request, @NonNull String allowSuffix) {
public MultipartFile getRequestFile(@NonNull HttpServletRequest request, @NonNull String allowSuffix){ String errorMsg = StrUtil.EMPTY;
String errorMsg = StrUtil.EMPTY;
String[] suffixs = allowSuffix.split(","); String[] suffixs = allowSuffix.split(",");
Set<String> suffixSet = new HashSet<String>(Arrays.asList(suffixs)); Set<String> suffixSet = new HashSet<String>(Arrays.asList(suffixs));
Map<String, MultipartFile> fileMap = ((MultipartHttpServletRequest) request).getFileMap(); Map<String, MultipartFile> fileMap = ((MultipartHttpServletRequest) request).getFileMap();
MultipartFile file = null; MultipartFile file = null;
for (Map.Entry<String, MultipartFile> fileEntity : fileMap.entrySet()) { for (Map.Entry<String, MultipartFile> fileEntity : fileMap.entrySet()) {
file = fileEntity.getValue(); file = fileEntity.getValue();
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf('.') + 1); String suffix = originalFilename.substring(originalFilename.lastIndexOf('.') + 1);
if(suffixSet.contains(suffix)){ if (suffixSet.contains(suffix)) {
break; break;
} }
errorMsg = "文件类型不支持"; errorMsg = "文件类型不支持";
} }
Assert.isTrue(StrUtil.isBlank(errorMsg), errorMsg); Assert.isTrue(StrUtil.isBlank(errorMsg), errorMsg);
Objects.requireNonNull(file,"excel导入 ---------->>>>>>> 未检测到上传文件"); Objects.requireNonNull(file, "excel导入 ---------->>>>>>> 未检测到上传文件");
return file; return file;
} }
/** /**
* 导出excel * 导出excel
* @param list 数据 *
* @param writer * @param list 数据
* @param name 文件名 * @param writer
*/ * @param name 文件名
@SneakyThrows */
public void exportExcel(@NonNull List list,@NonNull ExcelWriter writer, String name) { @SneakyThrows
writer.setOnlyAlias(true); public void exportExcel(@NonNull List list, @NonNull ExcelWriter writer, String name) {
HttpServletResponse response = WebUtils.getResponse(); writer.setOnlyAlias(true);
//response为HttpServletResponse对象 HttpServletResponse response = WebUtils.getResponse();
response.setContentType("application/vnd.ms-excel;charset=utf-8"); //response为HttpServletResponse对象
//codes.xls是弹出下载对话框的文件名,不能为中文,中文需自行编码 response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=data.xlsx"); //codes.xls是弹出下载对话框的文件名,不能为中文,中文需自行编码
ServletOutputStream out = response.getOutputStream(); response.setHeader("Content-Disposition", "attachment;filename=data.xlsx");
try { ServletOutputStream out = response.getOutputStream();
writer.write(list); try {
writer.flush(out); writer.write(list);
} catch (Exception e) { writer.flush(out);
log.error("下载[{}]excel异常 =====>>>>> {}", name, e.getMessage()); } catch (Exception e) {
} finally { log.error("下载[{}]excel异常 =====>>>>> {}", name, e.getMessage());
// 关闭writer,释放内存 } finally {
writer.close(); // 关闭writer,释放内存
//关闭输出Servlet流 writer.close();
IoUtil.close(out); //关闭输出Servlet流
} IoUtil.close(out);
} }
}
} }
...@@ -65,7 +65,7 @@ public class RequestGlobalFilter implements GlobalFilter, Ordered { ...@@ -65,7 +65,7 @@ public class RequestGlobalFilter implements GlobalFilter, Ordered {
// IP白名单 // IP白名单
String ip = WebUtils.getIP(request); String ip = WebUtils.getIP(request);
// log.error("RemoteAddress = {}, ip = {}", request.getRemoteAddress(), ip); log.error("RemoteAddress = {}, ip = {}", request.getRemoteAddress(), ip);
try { try {
if (whitIPConfig.getLimitFlag() && !IPStrUtil.matches(ip, whitIPConfig.getWhites())) { if (whitIPConfig.getLimitFlag() && !IPStrUtil.matches(ip, whitIPConfig.getWhites())) {
ServerHttpResponse response = exchange.getResponse(); ServerHttpResponse response = exchange.getResponse();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment