常用的监听接口
- 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个星