• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

springboot中过滤器和拦截器的实现方法介绍(代码)

springboot 搞代码 4年前 (2022-01-09) 35次浏览 已收录 0个评论

本篇文章给大家带来的内容是关于springboot中过滤器和拦截器的实现方法介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查、日志记录等。二者有一定的相似之处,不同的地方在于:

  • Filter是servlet规范,只能用在Web程序中,而拦截器是Spring规范,可以用在Web程序中,也可以用在Application程序中。

  • Filter是servlet中定义的,依赖servlet容器。而拦截器在Spring中定义,依赖Spring容器。

  • 拦截器是一个Spring组件,归Spring管理,配置在Spring的配置文件中,因此它可使用Spring的任何资源。比如Service、数据源等,通过IOC容器注入到拦截器即可,而Filter则不行。

  • Filter只在servlet前后起作用,而拦截器则能深入到方法前后,异常抛出前后。使用深度更大一些。

Spring中实现过滤器Filter

方法1:使用springboot提供的 FilterRegistrationBean注册自定义过滤器

public class MyFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("MyFilter init...");    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        //站点图标/favicon.ico  filter会执行2次        HttpServletRequest request=(HttpServletRequest) servletRequest;        System.out.println(request.getRequestURI());        System.out.println("MyFilter dofilter...");        filterChain.doFilter(servletRequest,servletResponse);    }    @Override    public void destroy() {    }}

在springboot中注册Filter

@Configurationpublic class FilterConfig {    @Bean    public FilterRegistrationBean registrationBean(){        FilterRegistrationBean myfilter=new FilterRegistrationBean(new MyFilter());        myfilter.addUrlPatterns("/*");        return myfilter;    }

到这里运行demo时会发现do filter执行了2次,debug发现这是因为浏览器请求时站点图标管理,通过uri能发现。可以根据自己的需求用正则表达式适当控制。

方法2:servlet注解定义Filter

@Component@WebFilter(filterName = "myFilter2",urlPatterns = "/*")public class MyFilter2 implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("myFilter2 init...");    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        System.out.println("myFilter2 dofilter ...");        filterChain.doFilter(servletRequest,servletResponse);    }    @Override    public void destroy() {    }}

 使用servleta注解声明的filter,执行时只有一次请求。和使用spring配置filter这里不同。

Spring中实现拦截器

拦截器主要使用自定义类集成HandlerInterceptor。preHandle返回true时程序才会继续向下执行,返回false则中断请求。

public class MyInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, Ht<b>本文来源gao@dai!ma.com搞$代^码!网7</b>tpServletResponse response, Object handler) throws Exception {        System.out.println("/preHandler");        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {        System.out.println("postHandler");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {        System.out.println("afterCompletion");    }}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:springboot中过滤器和拦截器的实现方法介绍(代码)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址