• Spring boot拦截器的实现


    Spring boot拦截器的实现

    Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力。

    1.注册拦截器

     1 @Configuration
     2 public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
     3     @Bean   //把我们的拦截器注入为bean
     4     public HandlerInterceptor getMyInterceptor(){
     5         return new Interceptor();
     6     }
     7 
     8     @Override
     9     public void addInterceptors(InterceptorRegistry registry) {
    10         // addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接
    11         // excludePathPatterns 用户排除拦截
    12         registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
    13         super.addInterceptors(registry);
    14     }
    15 }

    2.创建拦截器,写要过滤的请求等

     1 public class Interceptor implements HandlerInterceptor {
     2 
     3     private Logger logger = LoggerFactory.getLogger(URLInterceptor.class);
     4 
     5     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
     6             throws Exception {
     7         // TODO Auto-generated method stub
     8 
     9     }
    10 
    11     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
    12             throws Exception {
    13         // TODO Auto-generated method stub
    14 
    15     }
    16 
    17     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    18         String flag = null;
    19         flag = request.getParameter("auth");
    20         if(StringUtils.isEmpty(flag) || !flag.equals("php")){
    21             logger.error("error-auth:{}", flag);
    22             return false;
    23         } else {
    24             logger.info("通过校验!");
    25             return true;
    26         }
    27     }
    28 }

     3.取消拦截

    上面是拦截所有接口,如果想某个接口取消拦截,怎么办?

    新建一个类

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface UnAuthority {
    
    }

    4.在不需要拦截的方法上面添加新增的注解,如下

    @UnAuthority
    @RequestMapping("/hello")
        public String hello(){
            return "Hello World";
        }

    5.修改拦截器的preHandle方法,如下

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    
            // 检测请求的方法是否有UnAuthority注解,有注解不拦截,直接放行,返回true。
            HandlerMethod handlerMethod = (HandlerMethod)arg2;
            Method method = handlerMethod.getMethod();
            UnAuthority unAuthority = method.getAnnotation(UnAuthority.class);
            if(unAuthority != null ){
                return true;
            }
        
             String flag = null;
             flag = request.getParameter("auth");
             if(StringUtils.isEmpty(flag) || !flag.equals("php")){
                 logger.error("error-auth:{}", flag);
                 return false;
             } else {
                 logger.info("通过校验!");
                 return true;
             }
         }

    6.不需要auth参数访问/hello接口,成功。

    新增了无需拦截的注解后,就可以根据业务需求哪些是需要拦截,哪些是不需要拦截

    参考:https://blog.csdn.net/wsbgmofo/article/details/79151947

  • 相关阅读:
    一个不确定内容的数组,统计每个元素出现的次数的方法
    WebStorm配置TSLint
    angualr 项目环境搭建
    angular6 导出json数据到excal表
    angular6 引用echart第一次数据不显示解决
    angular6 开发实践基础知识汇总
    angular6实现对象转换数组对象
    angular 实现左侧和顶部固定定位布局
    ASP.NET MVC 全局异常
    IOC容器之Autofac
  • 原文地址:https://www.cnblogs.com/heqiyoujing/p/9436762.html
Copyright © 2020-2023  润新知