Redis 计数器 高并发的应用

文章讲述了如何使用Java编写一个拦截器来限制每个IP地址对特定URL的访问次数,强调了在学习和工作中保持主动性的必要性,提倡为实现大厂梦想而自我努力。
摘要由CSDN通过智能技术生成

}

}

}

}

@Data

public class ResponseMessage implements Serializable {

private static final long serialVersionUID = -2988364810346364595L;

/**

  • 1:成功 -1:失败

*/

private int code;

/**

  • 错误信息

*/

private String errorMsg;

/**

  • 返回数据

*/

private T data;

public ResponseMessage(int code, String errorMsg, T data) {

this.code = code;

this.errorMsg = errorMsg;

this.data = data;

}

public ResponseMessage(int code, String errorMsg) {

this.code = code;

this.errorMsg = errorMsg;

}

public ResponseMessage() {

}

}

拦截器编写

/**

  • IP请求次数限制

  • @author 向振华

  • @date 2018/11/28 10:55

*/

public class CounterInterceptor extends BaseInterceptor {

@Resource

private RedisTemplate redisTemplate;

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

String ip = getRemoteHost(request);

String key = ip + request.getRequestURI() + request.getSession().getId();

Long increment = redisTemplate.opsForValue().increment(key, 1);

if (increment == 1) {

//设置有效期一分钟

redisTemplate.expire(key, 60, TimeUnit.SECONDS);

}

//次数限制为5次

if (increment > 5) {

sendMsg(request, response, -1, “次数限制”, request.getRequestURI());

return false;

}

return true;

}

/**

  • 获取请求IP地址

  • @param request

  • @return

*/

public String getRemoteHost(HttpServletRequest request) {

String ip = request.getHeader(“x-forwarded-for”);

if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

ip = request.getHeader(“Proxy-Client-IP”);

}

if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

ip = request.getHeader(“WL-Proxy-Client-IP”);

}

if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip.equals(“0:0:0:0:0:0:0:1”) ? “127.0.0.1” : ip;

}

}

拦截器配置

/**

  • 拦截器配置

  • @author 向振华

  • @date 2018/11/28 11:30

*/

@Configuration

@EnableTransactionManagement

public class MyWebAppConfig extends WebMvcConfigurerAdapter {

@Bean

CounterInterceptor counterInterceptor() {

return new CounterInterceptor();

}

/**

  • 拦截器配置

  • @param registry

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

//配置IP请求次数限制
registry.addInterceptor(counterInterceptor());
super.addInterceptors(registry);

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

[外链图片转存中…(img-1O5jqgFF-1714439768870)]

[外链图片转存中…(img-BbNnEo2w-1714439768871)]

[外链图片转存中…(img-fRk5vPZn-1714439768871)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值