• springboot拦截器HandlerInterceptor详解


        Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。

    HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

    实现 UserRoleAuthorizationInterceptor 的拦截器有:

    ConversionServiceExposingInterceptor 
     
    CorsInterceptor 
     
    LocaleChangeInterceptor 
     
    PathExposingHandlerInterceptor
      
    ResourceUrlProviderExposingInterceptor 
     
    ThemeChangeInterceptor 
     
    UriTemplateVariablesHandlerInterceptor 
     
    UserRoleAuthorizationInterceptor

    其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用。

    配置拦截器也很简单,Spring 为什么提供了基础类WebMvcConfigurerAdapter ,我们只需要重写 addInterceptors 方法添加注册拦截器。

    实现自定义拦截器只需要3步: 

    1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。 

    2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。 

    2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。 

    PS:本文重点在如何在Spring-Boot中使用拦截器,关于拦截器的原理请大家查阅资料了解。

    代码示例:

    package com.kfit.interceptor;
      
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
      
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
      
    /**
     * 自定义拦截器1
     *
     * @author   Angel
     */
    publicclass MyInterceptor1 implements HandlerInterceptor {
      
        @Override
        publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
      
            returntrue;// 只有返回true才会继续向下执行,返回false取消当前请求
        }
      
        @Override
        publicvoid postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
        }
      
        @Override
        publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
        }
      
    }

    com.kfit.interceptor.MyInterceptor2.java

    package com.kfit.interceptor;
      
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
      
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
      
    /**
     * 自定义拦截器2
     *
     * 
     */
    public class MyInterceptor2 implements HandlerInterceptor {
      
        @Override
        publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println(">>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
      
            returntrue;// 只有返回true才会继续向下执行,返回false取消当前请求
        }
      
        @Override
        publicvoid postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            System.out.println(">>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
        }
      
        @Override
        publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            System.out.println(">>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
        }
      
    }

    Com.kfit.config.MyWebAppConfigurer.java

    package com.kfit.config;
      
    import com.kfit.interceptor.MyInterceptor1;
    import com.kfit.interceptor.MyInterceptor2;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
      
    @Configuration
    public class MyWebAppConfigurer
            extends WebMvcConfigurerAdapter {
      
        @Override
        publicvoid addInterceptors(InterceptorRegistry registry) {
            // 多个拦截器组成一个拦截器链
            // addPathPatterns 用于添加拦截规则
            // excludePathPatterns 用户排除拦截
            registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
            registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
            super.addInterceptors(registry);
        }
      
    }


    然后在浏览器输入地址: http://localhost:8080/index 后,控制台的输出为:

    >>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)
    >>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)
    >>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    >>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    >>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    >>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    ---------------------

    HandlerInterceptor拦截登陆的实现

    @Component
    public class MyHandlerInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String name= (String) request.getSession().getAttribute("LoginName");
            if (!name.isEmpty()){
                request.getRequestDispatcher("/main.html").forward(request,response);
                return false;
            }else {
                request.getRequestDispatcher("/login.html").forward(request, response);
                return true;
            }
        }
    }

    实现拦截方法从而判断使否含有Session值 该方法在请求之前执行
    @Controller
    public class HelloController {
        @RequestMapping("login")
        public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session){
            if (username.equals("123")&password.equals("123")){
                session.setAttribute("LoginName",username);
                return "redirect:main";
            }else{
                return "login";
            }
        }
    --------------------- 
    作者:小灬罗 
    来源:CSDN 
    原文:https://blog.csdn.net/luojingwei1997/article/details/80554672 
    版权声明:本文为博主原创文章,转载请附上博文链接!
  • 相关阅读:
    I2S波形解析
    F407整点原子I2C波形解码
    WAVE格式文件说明
    ADC结构体初始化成员
    这次,我是真的想吐槽MDK
    I2S源程序(正点原子F407探索者)
    强制类型转换
    嵌套结构体的初始化
    lua 元方法 __index
    lua pairs 与 ipairs
  • 原文地址:https://www.cnblogs.com/pypua/p/10075259.html
Copyright © 2020-2023  润新知