|
@@ -1,6 +1,7 @@
|
|
|
package com.td.boss.filter;
|
|
package com.td.boss.filter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import com.td.boss.common.pojo.IpVo;
|
|
import com.td.boss.common.pojo.IpVo;
|
|
|
import com.td.boss.common.pojo.Result;
|
|
import com.td.boss.common.pojo.Result;
|
|
|
import com.td.boss.config.enums.ResultEnum;
|
|
import com.td.boss.config.enums.ResultEnum;
|
|
@@ -10,6 +11,7 @@ import io.jsonwebtoken.SignatureException;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
|
+import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.util.StringUtils;
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
import javax.servlet.*;
|
|
import javax.servlet.*;
|
|
@@ -17,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
import java.util.Arrays;
|
|
import java.util.Arrays;
|
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @author:slambb
|
|
* @author:slambb
|
|
@@ -30,6 +33,10 @@ public class gameFilter implements Filter {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private JwtTokenUtil jwtTokenUtil;
|
|
private JwtTokenUtil jwtTokenUtil;
|
|
|
|
|
|
|
|
|
|
+ //添加redis 防止恶意请求
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private StringRedisTemplate redisTemplate;
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public void init(FilterConfig filterConfig) throws ServletException {
|
|
public void init(FilterConfig filterConfig) throws ServletException {
|
|
|
}
|
|
}
|
|
@@ -48,7 +55,7 @@ public class gameFilter implements Filter {
|
|
|
response.setHeader("Access-Control-Max-Age", "3600");
|
|
response.setHeader("Access-Control-Max-Age", "3600");
|
|
|
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept , Authorization");
|
|
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept , Authorization");
|
|
|
|
|
|
|
|
- log.info("********进入GameFilter过滤器********");
|
|
|
|
|
|
|
+ //log.info("********进入GameFilter过滤器********");
|
|
|
HttpServletRequest req = (HttpServletRequest) servletRequest;
|
|
HttpServletRequest req = (HttpServletRequest) servletRequest;
|
|
|
//String method = req.getMethod();
|
|
//String method = req.getMethod();
|
|
|
//if (method.equals("OPTIONS")) {
|
|
//if (method.equals("OPTIONS")) {
|
|
@@ -56,31 +63,16 @@ public class gameFilter implements Filter {
|
|
|
// response.flushBuffer();
|
|
// response.flushBuffer();
|
|
|
// return;
|
|
// return;
|
|
|
//}
|
|
//}
|
|
|
|
|
+ //登陆IP不在白名单
|
|
|
|
|
+ String ipAddr = IpUtil.getIpAddr(req);
|
|
|
|
|
+
|
|
|
String token = req.getHeader(tokenHeader);
|
|
String token = req.getHeader(tokenHeader);
|
|
|
String path = req.getServletPath();
|
|
String path = req.getServletPath();
|
|
|
- //登录,获取验证码,不用登录的接口
|
|
|
|
|
- if (!(path.indexOf("game") > -1) // 存在game字段,需要检验token
|
|
|
|
|
- || path.indexOf("loginToken") > -1
|
|
|
|
|
- // || path.indexOf("publicKeyAndSys") > -1
|
|
|
|
|
- // || path.indexOf("playback")>-1
|
|
|
|
|
- // || path.indexOf("game_websocket") > -1 // todo 暂时放行
|
|
|
|
|
- //这里三个接口给DApp后台调用
|
|
|
|
|
- //|| path.indexOf("getSNBAndFreeze") >-1
|
|
|
|
|
- //|| path.indexOf("setSNBAndUnfreeze") >-1
|
|
|
|
|
- //|| path.indexOf("cntPlayback") >-1
|
|
|
|
|
- ) {
|
|
|
|
|
- //登录情况直接放行
|
|
|
|
|
- filterChain.doFilter(servletRequest, response);
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
//这里三个接口给DApp后台调用,需要指定ip访问
|
|
//这里三个接口给DApp后台调用,需要指定ip访问
|
|
|
- if (
|
|
|
|
|
- path.indexOf("getSNBAndFreeze") > -1
|
|
|
|
|
|
|
+ if (path.indexOf("getSNBAndFreeze") > -1
|
|
|
|| path.indexOf("setSNBAndUnfreeze") > -1
|
|
|| path.indexOf("setSNBAndUnfreeze") > -1
|
|
|
|| path.indexOf("cntPlayback") > -1) {
|
|
|| path.indexOf("cntPlayback") > -1) {
|
|
|
- //登陆IP不在白名单
|
|
|
|
|
- String ipAddr = IpUtil.getIpAddr(req);
|
|
|
|
|
log.info("ipAddr:"+ipAddr);
|
|
log.info("ipAddr:"+ipAddr);
|
|
|
//IpVo ipVo = IpUtil.getIpVoByRequest(req);
|
|
//IpVo ipVo = IpUtil.getIpVoByRequest(req);
|
|
|
//log.info("ip2Addr:"+ ipVo.toString());
|
|
//log.info("ip2Addr:"+ ipVo.toString());
|
|
@@ -90,7 +82,31 @@ public class gameFilter implements Filter {
|
|
|
response.getWriter().print(JsonUtils.toJson(Result.of(null, false, ResultEnum.LOGIN_IP_IS_ERROR.getMessage(), ResultEnum.LOGIN_IP_IS_ERROR.getCode())));
|
|
response.getWriter().print(JsonUtils.toJson(Result.of(null, false, ResultEnum.LOGIN_IP_IS_ERROR.getMessage(), ResultEnum.LOGIN_IP_IS_ERROR.getCode())));
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ filterChain.doFilter(servletRequest, response);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 除了上面三个提供给DApp的接口,剩下的game接口都需要限制访问
|
|
|
|
|
+ */
|
|
|
|
|
+ //设置20秒内可以访问10次,同一个接口
|
|
|
|
|
+ String redisKey = "limit-req:".concat(req.getRequestURL().toString()).concat(":").concat(ipAddr);
|
|
|
|
|
+ if(! redisTemplate.hasKey(redisKey)){
|
|
|
|
|
+ redisTemplate.opsForValue().set(redisKey, String.valueOf(1),20, TimeUnit.SECONDS);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ int increment = Convert.toInt(redisTemplate.opsForValue().get(redisKey));
|
|
|
|
|
+ if(increment > 10){
|
|
|
|
|
+ response.setCharacterEncoding("utf-8");
|
|
|
|
|
+ response.getWriter().print(JsonUtils.toJson(Result.of(null, false, ResultEnum.REDIS_IS_LOCK.getMessage(), ResultEnum.REDIS_IS_LOCK.getCode())));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ redisTemplate.opsForValue().set(redisKey, String.valueOf(++increment),20,TimeUnit.SECONDS);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ //登录,获取验证码,不用登录的接口
|
|
|
|
|
+ // 存在game字段,需要检验token
|
|
|
|
|
+ if (!(path.indexOf("game") > -1) || path.indexOf("loginToken") > -1) {
|
|
|
|
|
+ //登录情况直接放行
|
|
|
filterChain.doFilter(servletRequest, response);
|
|
filterChain.doFilter(servletRequest, response);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -105,14 +121,14 @@ public class gameFilter implements Filter {
|
|
|
String authToken = token.substring(7);
|
|
String authToken = token.substring(7);
|
|
|
try {
|
|
try {
|
|
|
String userId = jwtTokenUtil.getUserIdFromToken(authToken);
|
|
String userId = jwtTokenUtil.getUserIdFromToken(authToken);
|
|
|
- log.info("userId:{}", userId);
|
|
|
|
|
|
|
+ //log.info("userId:{}", userId);
|
|
|
//todo 后面需要校验时间,加入可切换 secret 校验
|
|
//todo 后面需要校验时间,加入可切换 secret 校验
|
|
|
- log.info("validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
|
|
|
|
|
|
|
+ //log.info("validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
|
|
|
// 加入secret校验
|
|
// 加入secret校验
|
|
|
if (!jwtTokenUtil.validateToken(authToken, userId)) {
|
|
if (!jwtTokenUtil.validateToken(authToken, userId)) {
|
|
|
log.info("secret 不可靠,validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
|
|
log.info("secret 不可靠,validateToken:{}", jwtTokenUtil.validateToken(authToken, userId));
|
|
|
}
|
|
}
|
|
|
- if (!StringUtils.isEmpty(userId)) {
|
|
|
|
|
|
|
+ if (StringUtils.hasText(userId)) {
|
|
|
filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId), response);
|
|
filterChain.doFilter(new TokenRequestWrapper((HttpServletRequest) servletRequest, userId), response);
|
|
|
} else {
|
|
} else {
|
|
|
//不存在用户信息
|
|
//不存在用户信息
|