zoukankan      html  css  js  c++  java
  • spring boot 添加拦截器

    构建一个spring boot项目。

    添加拦截器需要添加一个configuration

    @Configuration
    @ComponentScan(basePackageClasses = Application.class, useDefaultFilters = true)
    public class ServletContextConfig extends WebMvcConfigurationSupport {

    为了方便扫描位置,我们可以写一个接口或者入口类Application放置于最外一层的包内,这样就会扫描该类以及子包的类。

    1 resources配置

    在没有配置这个类的时候,我们可以在application.ym中修改静态文件位置和匹配方式:

    #指定环境配置文件
    spring:
      profiles:
        active: dev
      # 修改默认静态路径,默认为/**,当配置hello.config.ServletContextConfig后此处配置失效
      mvc:
        static-path-pattern: /static/**

    但当我们继承了WebMvcConfigurationSupport 并配置扫描后,上述resources的配置失效,还原默认配置。那么我们需要在这个类中再次指定静态资源位置:

    @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/").addResourceLocations("/**");
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        }

    这样访问classpath下的static包下的静态资源的url匹配为/static/xxx.js。默认匹配static下的静态文件url为/xxx.js,虽然清洁,但我感觉idea不会识别这种路径,还是改成完整的路径比较好。

    2.Interceptor配置

    配置登录拦截或者别的。需要创建一个拦截器类来继承HandlerInterceptorAdapter,然后只需要覆盖你想要拦截的位置就可以了。比如,我只是拦截访问方法之前:

    package hello.interceptor;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Created by miaorf on 2016/8/3.
     */
    public class LoginInterceptor extends HandlerInterceptorAdapter {
        private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String authorization = request.getHeader("Authorization");
            logger.info("The authorization is: {}",authorization);
            return super.preHandle(request, response, handler);
        }
    }

    写好interceptor之后需要在开始创建的ServletContextConfig中添加这个拦截器:

    @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns(FAVICON_URL)
            ;
        }

    完整的ServletContextConfig为:

    /*
     * The MIT License (MIT)
     *
     * Copyright (c) 2014-2016 abel533@gmail.com
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     */
    
    package hello.config;
    
    import hello.Application;
    import hello.interceptor.LoginInterceptor;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    
    /**
     *
     */
    @Configuration
    @ComponentScan(basePackageClasses = Application.class, useDefaultFilters = true)
    public class ServletContextConfig extends WebMvcConfigurationSupport {
    
        static final private String FAVICON_URL = "/favicon.ico";
        static final private String PROPERTY_APP_ENV = "application.environment";
        static final private String PROPERTY_DEFAULT_ENV = "dev";
    
    
    
        /**
         * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/").addResourceLocations("/**");
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        }
    
    
        /**
         * 配置servlet处理
         */
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor())
                    .addPathPatterns("/**")
                    .excludePathPatterns(FAVICON_URL)
            ;
        }
    
    }
    View Code

    3.AOP拦截方法

    相关测试代码http://www.cnblogs.com/woshimrf/p/5677337.html

    本demo源码:

    https://github.com/Ryan-Miao/spring-boot-demo

  • 相关阅读:
    算法(第4版)-1.1.2 原始数据类型与表达式
    java值传递与引用传递实例
    (转载)理解Java中的引用传递和值传递
    (转载)深入Java关键字this的用法的总结
    如何判断数据库中是否存在某个表
    iforums之UEditor上传图片提示【未知错误】
    空指针和野指针
    self关键字
    自定义构造方法和description方法
    点语法
  • 原文地址:https://www.cnblogs.com/woshimrf/p/5734956.html
Copyright © 2011-2022 走看看