Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

网友投稿 356 2023-05-01


Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

前言

在编写过滤器、监听器、拦截器之前我们需要在spring-boot启动的类上加上注解@ServletComponentScan:

@SpringBootApplication

@ServletComponentScan

public class MySpringbootApplication {

public static void main(String[] args) {

SpringApplication.run(MySpringbootApplication.class, args);

}

}

Servlet

spring-boot编写过滤器和spring中差不多,直接看代码:

@WebServlet(urlPatterns = "/serv")

public class MyServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

System.out.println("------------doget-------------");

doPost(request, response);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) {

System.out.println("------------dopost-------------");

}

}

其实也就是注解的不同而已:

@WebServlet(urlPatterns = "/serv")

过滤器(Filter)

在spring-boot里编写过滤器我们只需要实现javax.servlet.Filter

@WebFilter(filterName = "myFilter", urlPatterns = "/*")

public class MyFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("初始化过滤器");

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

System.out.println("执行过滤器");

filterChain.doFilter(servletRequest, servletResponse);

}

@Override

public void destroy() {

System.out.println("销毁过滤器!");

}

}

然后添加一个注解:

@WebFilter(filterName = "myFilter", urlPatterns = "/*")

监听器 (Listener)

在上面,看了下过滤器的使用。其实监听器和拦截器就差不多了,直接上代码:

@WebListener

public class MyHttpSessionListener implements HttpSessionListener {

@Override

public void sessionCreated(HttpSessionEvent httpSessionEvent) {

niyifl System.out.println("session 被创建");

}

@Override

public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

System.out.println("session 被摧毁");

}

}

我们发现只是注解发生了变化:

@WebListener

拦截器(Interceptor)

拦截器大致和上面差不多,不过有一点点不同。我们知道在web开发中,可以使用过滤器和拦截器来过滤外部的web请求。但是拦截器提供了更加细致的控制功能。主要有:请求之前、请求之后渲染之前、渲染之后、请求全部结束之后这四个步骤的拦截。

这里面使用拦截器主要有三个步骤

自定义拦截器,实现org.springframework.web.servlet.HandlerInterceptor

自定义WebAppConfigurer,继承WebMvcConfigurerAdapter

在自定义的WebAppConfigurer覆盖父类方法addInterceptors(InterceptorRegistry registry),并在方法中添加自己定义的拦截器

public class MyInterceptor implements HandlerInterceptor{

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

System.out.println(MyInterceptor.class.getName()+" : 在请求之前调用");

return true;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

System.out.println(MyInterceptor.class.getName()+" :请求处理之后视图渲染之前使用");

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

System.out.println(MyInterceptor.class.getName()+" :请视图渲染之后使用");

}

}

@Configuration

public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

@Override

public void addInterceptors(InterceptorRegistry registry) {

// 多个拦截器组成一个拦截器链

// addPathPatterns 用于添加拦截规则

// excludePathPatterns 用户排除拦截

registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");

registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");

super.addInterceptors(registry);

}

}

以上就是关于在spring-boot中如何定义过滤器、监听器和拦截器。关于他们的原理以及一些细节问题(如拦截器的拦截顺序),就不详述。有兴趣的可以去网上搜索。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化测试工具mock(自动化测试工具是什么)
下一篇:解决webpack打包速度慢的解决办法汇总
相关文章

 发表评论

暂时没有评论,来抢沙发吧~