ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java之拦截器(Filter)与过滤器(Interceptor)

2022-05-07 15:33:23  阅读:189  来源: 互联网

标签:拦截器 void request Filter 使用 过滤器 Interceptor public


拦截器与过滤器的区别

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用。而过滤器只需依赖servlet api,不需要依赖spring。

何时使用拦截器?何时使用过滤器?

  • 如果是非spring项目,那么拦截器则不可使用,只能使用过滤器
  • 如果是处理controller前后,则既可以使用拦截器也可以使用过滤器
  • 如果是处理dipaterServlet前后,则只可以使用过滤器,像中文乱码问题通常都是使用过滤器实现的

拦截器与过滤器的一个关系图

整个执行流程如下所示:

过滤器的使用

过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前

//过滤器处理乱码
@Component
public class CharacterEncodingFilter implements Filter {
    //web服务器启动,就会初始化,因为它要随时等待监听
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }
    //当访问网页时,就会进行过滤,每访问一次,就会过滤一次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        System.out.println("解码前");
        filterChain.doFilter(servletRequest,servletResponse);  
        System.out.println("解码后");
    }
    //只有当web服务器关闭时,才会销毁
    @Override
    public void destroy() {
        System.out.println("销毁");
    }
}

拦截器的使用

在springboot项目中拦截器的定义和使用。springboot是依靠springMVC来完成的。springMVC提供了一个HandlerInterceptor接口,用于表示定义一个拦截器。受限制自定义个类,在这个类实现这个接口。

public class MyIntercepetor implements HandlerInterceptor {
  /**
   * return ture;  执行下一个拦截器,放行
   * return false; 不执行下一个拦截器,不放行
   * 通常也只使用第一行拦截就可以了
   */
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("--------处理前-----------");
    return true;
  }
  //后面两行不使用可以删除掉
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

  }

  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

  }
}

具体使用:拦截请求

//定义一个拦截器,检测session对象中是否有指定内容
public class LoginHandlerInterceptor implements HandlerInterceptor
{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断是否已登录
        Object user = request.getSession().getAttribute("LoginUser");

        //若无登录,跳转至登录页面
        if (user == null) {
            request.setAttribute("key", "您没有权限,请先登录");
            request.getRequestDispatcher("/login").forward(request, response);
            return false;
        } else {
            return true;
        }
    }
}

借助WebMvcConfigure接口,可以将用户定义的拦截器进行注册,才可以保证拦截器能够生效和使用。定义一个类,然后让这个类实现WebMvcConfigure接口。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor())
                .addPathPatterns("/**") //拦截所有请求
                //排除拦截的内容,登录页面和注册页面的相关请求都排除掉
                .excludePathPatterns("/", "/login", "/register", "/regist", "/loginIn", "/css/**", "/js/**", "/img/**");
    }
}

 

标签:拦截器,void,request,Filter,使用,过滤器,Interceptor,public
来源: https://www.cnblogs.com/cjzzz/p/16242718.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有