zoukankan      html  css  js  c++  java
  • Spring Boot (20) 拦截器

    动态资源和静态资源

      拦截器可以算是aop的一种实现,专门拦截对动态资源的后台请求,也就是拦截对控制层的请求,主要用于判断用户是否有权限请求后台。拦截器不会拦截静态资源,如spring boot默认静态目录resources/static。请求期目录下的html,js,img都不会被拦截。将一些静态资源分离出来放在静态服务器也可以缓解后台服务器的压力。

    创建拦截器

    package com.david.controller;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
        /**
         * controller执行前调用此方法
         * 返回true表示继续执行,返回false终止执行 这里可以加入登陆校验、权限拦截等
         */
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            return false;
        }
    
        /**
         * controller执行后但未返回视图前调用此方法
         * 这里可在返回用户前对模型数据进行加工处理 比如可以加入共用信息以便页面显示
         */
        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
        }
    
        /**
         * controller执行后且试图返回后调用此方法
         * 这里可得到执行controller时的异常信息 也可以记录日志
         */
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
        }
    }

    只需要实现HandlerInterceptor接口即可,通常在preHandle中判断是否有权限 返回false终止请求(一般重定向到登陆页) 返回true放行

    配置拦截器

    //回顾下mvc中如何配置
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/product/*"/>
                <bean class="com.david.utils.myInterceptor"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

    在spring boot中只需要继承WebMvcConfigurerAdapter说明这是一个spring mvc配置类,重写addInterceptors方法就可以实现拦截的配置。

    @SpringBootConfiguration
    public class mvc extends WebMvcConfigurerAdapter {
        public void addInterceptors(InterceptorRegistry registry) {
            // addPathPatterns:添加拦截规则    excludePathPatterns: 排除拦截规则
            registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/error");
        }
    }

    /**表示所有的请求url,包括子路径,/error是spring boot中默认处理异常的url,将其排除掉,不拦截它

    使用拦截器还是过滤器

      先有的servlet,然后才是spring mvc。同理,首先会执行过滤器,然后才是拦截器。过滤器属于servlet技术,所以可以过滤servlet和spring mvc请求。而拦截器属于spring,所以只能拦截spring mvc,无法拦截servlet,如果项目用的十spring,拦截器可以和spring更好的融合,可以自动识别spring boot静态资源。如果项目没有用spring而是servlet,那肯定只能用过滤器了。

  • 相关阅读:
    csharp: Cyotek.GhostScript.PdfConversion pdf convert image
    csharp: using Acrobat.dll pdf convert images in winform
    机器学习实战---K均值聚类算法
    机器学习实战---决策树CART回归树实现
    机器学习实战---决策树CART简介及分类树实现
    机器学习实战---线性回归(更好的使用正规方程求解)
    机器学习实战---逻辑回归梯度上升(更好的理解sigmoid函数的含义并改进)
    机器学习实战---朴素贝叶斯算法使用K折交叉验证
    机器学习实战---朴素贝叶斯算法
    机器学习实战---决策树ID3算法
  • 原文地址:https://www.cnblogs.com/baidawei/p/9115556.html
Copyright © 2011-2022 走看看