Springboot 自定义Listener、自定义拦截器 (五)

本文介绍如何使用Servlet监听器和Spring Boot拦截器来监控和限制HTTP请求次数。通过具体代码示例,展示了如何实现请求计数和超过指定次数后的自动拦截。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的监听接口

  • HttpSessionListener:监听HttpSession的操作,监听session的创建和销毁
  • ServletRequestListener:监听request的创建和销毁
  • ServletContextListener:监听context的创建和销毁

实现一个监听请求次数的例子

package com.xcc.springbootstuday.listener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

/**
 * 监听请求次数
 */
@WebListener
public class TestListener implements ServletRequestListener {
    private int count = 0;
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("---------请求销毁--------");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletRequest servletRequest = sre.getServletRequest();
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        if(request.getRequestURL().indexOf("listener") != -1){
            count++;
            System.out.println("listener 请求已经被访问了"+count+"次");
        }
    }
}

访问请求,会记录listener请求的次数

 此种办法只能记录、当达到请求次数时,没法拦截住。

我们可以通过拦截器实现

首先写好一个count的拦截器

package com.xcc.springbootstuday.intecpter;

import com.google.gson.Gson;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

public class CountHandler implements HandlerInterceptor {

    private Gson gson = new Gson();

    private int count=0;
    /**
     * 进入controller之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求开始");
        if(request.getRequestURL().indexOf("listener") != -1){
            count++;
        }
        if(count > 4){
            writer(response,500,"请求超过限制");
            return false;
        }else{
            System.out.println("已经访问"+count+"次");
            return true;
        }
    }

    /**
     * 调用完controller之后、渲染之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 进入controller之后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("请求结束");
    }

    /**
     * 响应信息
     * @param rep
     * @param statusCode
     * @param msg
     */
    private void writer(HttpServletResponse rep, int statusCode,String msg) {
        rep.setCharacterEncoding("UTF-8");
        rep.setContentType("application/json");
        rep.setDateHeader("Expires", 0);
        PrintWriter out = null;
        try {
            Map<String,Object> map = new HashMap<>();
            map.put("status",statusCode);
            map.put("msg",msg);
            String json =gson.toJson(map);
            out = rep.getWriter();
            out.println(json);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注册拦截器

package com.xcc.springbootstuday.intecpter;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class RegisterIntecpter implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CountHandler()).addPathPatterns("/api/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

http://127.0.0.1:8080/api/listener 

超过限制,自动拦截。

需要注意的是/api/**,后面必须是2个星

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值