springBoot之filter应用

[toc]

三大组件

servlet , filter,listener

使用注解

@WebServlet
@WebListener
@WebFIlter
三个注解是servlet3.0提出的完全可以替代这个web.xml

servlet

servlet 一般和jsp使用,

@WebServlet(name = "ServletTest1",urlPatterns = "/say")
public class ServletTest1 extends HttpServlet {
     @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        // 和普通的servlet相同的使用
    }

}

或者使用配置@Configration

  @Bean
  public ServletRegistrationBean servletRegistrationBean1() {
            return new ServletRegistrationBean(new MyServlet(), "/servlet/myServlet");// ServletName默认值为首字母小写,即myServlet
        }

filter

@WebFilter(urlPatterns = "/*",filterName = "filterTest")
public class FilterTest implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;


        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

interceptor

  • 创建过程:
    1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
    2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
    3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。
public class InterceptorTest implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    // 写入处理程序  true 代表可以通过, false代表无法通过
        return true;
    }

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

    }

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

    }
}

// 添加
@Configuration
public class webMveConf extends WebMvcConfigurerAdapter{
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptorTest()).addPathPatterns("/jia");

        super.addInterceptors(registry);

    }
}


方法介绍:
– preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
– postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。
– afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。

注意

对于上面的servlet类的调用来说,
我使用时 filter 可以定向到servlet类并调用成功, 但是interceptor只能调用到@Controller的声明的@RequestMapping 里面
然后使用@@RequestMapping测试优先级是filter先调用 然后才是interceptor

区别

从以上分析可以看到过滤器和拦截器实现的方式的不同. Filter是利用了方法的调用(入栈出栈)完成整个流程, 而Interceptor是利用了for循环完成了整个流程.
Filter的实现比较占用栈空间, 在Filter多的情况下可能会有栈溢出的风险存在.
Interceptor的实现逻辑更加的清晰简单
Filter组件更加的通用, 只要支持java servlet的容器都可以使用, 而Interceptor必须依赖于Spring
Filter的优先级是高于Interceptor, 即请求是先到Filter再到Interceptor的, 因为Interceptor的实现主体还是一个servlet

链接


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注