解决会话重放问题

文章介绍了一种针对测试过程中重复请求同一路径导致的数据库压力和会话重放问题的解决方案。通过使用时间戳并在Java中实现一个拦截器,检查请求的时间间隔,如果新请求与旧请求的时间差小于3秒,则抛出异常,否则更新时间戳。这种方法有助于防止脏数据的产生并增强系统安全性。
摘要由CSDN通过智能技术生成

代码在测试中,遇到一个安全问题,测试人员在测试中,会反复请求同一个路径,造成了数据很多脏数据,给数据库造成了压力,导致会话重放,通过时间戳的方式解决问题,话不多说,直接上代码

@Data //实体类
public class SessionReplay {

    private String requestURL;

    private Long newTime;
}

/**
 * @Description 防止会话重放拦截器注入
 **/
@Configuration
public class TimestampConfig implements WebMvcConfigurer
{
    @Autowired
    private UUIDInterceptor uuidInterceptor; // 注入拦截器对象

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(uuidInterceptor); // 注册拦截器
    }
}
@Slf4j
@Component
public class UUIDInterceptor extends HandlerInterceptorAdapter {


    private List<SessionReplay> list = new ArrayList<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String newRequestURL = String.valueOf(request.getRequestURL());
        Long newTime = 0L;
        String time = request.getHeader("Time");
        if (time == null) {
            return true;
        } else {
            newTime = Long.valueOf(request.getHeader("Time"));
        }
        if (list.isEmpty()) {
            SessionReplay sessionReplay = new SessionReplay();
            sessionReplay.setRequestURL(newRequestURL);
            sessionReplay.setNewTime(newTime);
            list.add(sessionReplay);
        } else {
            for (SessionReplay sessionReplay : list) {
                String oldRequestURL = sessionReplay.getRequestURL();
                if (newRequestURL.equals(oldRequestURL)) {
                    Long oldTime = sessionReplay.getNewTime();
                    log.info("旧值:" + oldTime);
                    log.info("新值:" + newTime);
                    if (newTime - oldTime < 3000) {
                        throw new Exception("500");
                    } else {
                        sessionReplay.setNewTime(newTime);
                    }
                }

            }
            SessionReplay sessionReplay1 = new SessionReplay();
            sessionReplay1.setRequestURL(newRequestURL);
            sessionReplay1.setNewTime(newTime);
            list.add(sessionReplay1);
            return true;

        }


        return true; // 继续处理该请求
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值