前提
在springboot启动类上加上@ServletComponentScan注解
@SpringBootApplication
@ServletComponentScan
public class SpbthymeleafApplication {
public static void main(String[] args) {
SpringApplication.run(SpbthymeleafApplication.class, args);
}
}
1.Filter
@WebFilter(filterName = "MyFilter",urlPatterns = {"/test/*"})
public class MyFilter implements Filter {
private static Logger logger= LoggerFactory.getLogger(MyFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("start");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
String url=request.getRequestURI();
logger.info(url);
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
logger.info("end");
}
}
2.Listener
监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。
监听器总共分为6类:
按监听的对象划分,可以分为
- ServletContext对象监听器(ServletContextListener )
- HttpSession对象监听器(HttpSessionListener )
- ServletRequest对象监听器(ServletRequestListener )
按监听的事件划分
- 对象自身的创建和销毁的监听器
- 对象中属性的创建和消除的监听器
- session中的某个对象的状态变化的监听器
此处以HttpSessionListener和ServletContextListener为例
2.1 HttpSessionListener
@WebListener("myHttpSessionListener")
public class MyHttpSessionListener implements HttpSessionListener {
private static Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);
@Override
public void sessionCreated(HttpSessionEvent se) {
logger.info("session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
logger.info("session销毁");
}
}
2.2 ServletContextListener
@WebListener(value = "myListener")
public class MyContextListener implements ServletContextListener {
private static Logger logger= LoggerFactory.getLogger(MyContextListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("容器启动");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("容器结束");
}
}
3.Servlet
@WebServlet(name = "user", urlPatterns = "/user")
public class MyServlet extends HttpServlet {
private static Logger logger = LoggerFactory.getLogger(MyServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("servlet请求的URL",req.getRequestURI());
PrintWriter writer = resp.getWriter();
writer.write("请求成功");
writer.flush();
}
}
4.Interceptor
4.1 先新建一个类继承HandlerInterceptorAdapter,重写preHandle方法
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
private static Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("拦截处理");
return super.preHandle(request, response, handler);
}
}
4.2 注册拦截器
@Configuration
public class registryInterceptor extends WebMvcConfigurationSupport {
private static final String[] excludePathPatterns = {"/images/*","/js/*"};
@Autowired
private MyInterceptor myInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(myInterceptor).addPathPatterns("/**")
.excludePathPatterns(excludePathPatterns);
}
}