1. 程式人生 > >springboot攔截器註解方式

springboot攔截器註解方式

WebMvcConfigurerAdapter配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置檔案形式進行鍼對框架個性化定製,下面我們來看一下該類內的常用方法。

本章目標

繼承WebMvcConfigurerAdapter採用JavaBean形式實現個性化配置定製。

SpringBoot 企業級核心技術學習專題


專題 專題名稱 專題描述
001 Spring Boot 核心技術 講解SpringBoot一些企業級層面的核心元件
002 Spring Boot 核心技術章節原始碼 Spring Boot 核心技術簡書每一篇文章碼雲對應原始碼
003 Spring Cloud 核心技術 對Spring Cloud核心技術全面講解
004 Spring Cloud 核心技術章節原始碼 Spring Cloud 核心技術簡書每一篇文章對應原始碼
005 QueryDSL 核心技術 全面講解QueryDSL核心技術以及基於SpringBoot整合SpringDataJPA
006 SpringDataJPA 核心技術 全面講解SpringDataJPA核心技術
007 SpringBoot核心技術學習目錄 SpringBoot系統的學習目錄,敬請關注點贊!!!

構建專案

本章內容同樣不涉及到業務邏輯,我們建立一個web專案即可,pom.xml配置檔案如下所示:

...//省略
<dependencies>
        <dependency>
            <groupId
>
org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--<scope>provided</scope>--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> ...//省略

WebMvcConfigurerAdapter實現類

我們建立一個配置實體型別,並繼承WebMvcConfigurerAdapter,程式碼如下所示:

package com.yuqiyu.chapter34;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

import java.util.List;

/**
 * 自定義配置類實現JavaBean註解形式配置
 * ========================
 * Created with IntelliJ IDEA.
 * User:恆宇少年
 * Date:2017/9/3
 * Time:21:48
 * 碼雲:http://git.oschina.net/jnyqy
 * ========================
 */
@Configuration
public class WebConfiguration
    extends WebMvcConfigurerAdapter
{
}

我們在配置類上添加了註解@Configuration,標明瞭該類是一個配置類並且會將該類作為一個SpringBean新增到IOC容器內,我們開啟該註解的原始碼檢視如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}

可以看到在@Configuration上宣告式添加了Spring注入註解@Component,也就是解釋了為什麼我們配置了@Configuration會被自動新增到IOC容器內。

WebMvcConfigurerAdapter該抽象類其實裡面沒有任何的方法實現,只是空實現了介面WebMvcConfigurer內的全部方法,並沒有給出任何的業務邏輯處理,這一點設計恰到好處的讓我們不必去實現那些我們不用的方法,都交由WebMvcConfigurerAdapter抽象類空實現,如果我們需要針對具體的某一個方法做出邏輯處理,僅僅需要在WebMvcConfigurerAdapter子類中@Override對應方法就可以了。

配置攔截器

在之前Xml配置形式天下的時候,我們都是在spring-mvc.xml配置檔案內新增<mvc:interceptor>標籤配置攔截器。攔截器的相關建立請訪問第六章:如何在SpringBoot專案中使用攔截器,攔截器配置如下所示:

    /**
     * 攔截器配置
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        super.addInterceptors(registry);
        registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
    }

InterceptorRegistry內的addInterceptor需要一個實現HandlerInterceptor介面的攔截器例項,addPathPatterns方法用於設定攔截器的過濾路徑規則。

配置CORS

跨域我們之前章節也有講到,請訪問第二十五章:SpringBoot新增支援CORS跨域訪問Spring既然為了集成了CROS,那就證明了一點,以後前後端分離是一個開發趨勢,配置程式碼如下所示:

    /**
     * 跨域CORS配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
        registry.addMapping("/cors/**")
                .allowedHeaders("*")
                .allowedMethods("POST","GET")
                .allowedOrigins("*");
    }

配置ViewController

這一個配置在之前是經常被使用到的,最經常用到的就是"/"、"/index"路徑請求時不通過@RequestMapping配置,而是直接通過配置檔案對映指定請求路徑到指定View頁面,當然也是在請求目標頁面時不需要做什麼資料處理才可以這樣使用,配置內容如下所示:

    /**
     * 檢視控制器配置
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/").setViewName("/index");
    }

配置ViewResolver

這個對我們來說很熟悉,只要我們配置html、Jsp頁面檢視時就會用到InternalResourceViewResolver配置類,然後設定preffixsuffix引數進行配置檢視檔案路徑字首與字尾。配置程式碼如下所示:

    /**
     * 配置請求檢視對映
     * @return
     */
    @Bean
    public InternalResourceViewResolver resourceViewResolver()
    {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        //請求檢視檔案的字首地址
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
        //請求檢視檔案的字尾
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }

    /**
     * 檢視配置
     * @param registry
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        super.configureViewResolvers(registry);
        registry.viewResolver(resourceViewResolver());
        /*registry.jsp("/WEB-INF/jsp/",".jsp");*/
    }

上述程式碼中方法resourceViewResolver上配置了@Bean註解,該註解會將方法返回值加入到SpringIoc容器內。
而在configureViewResolvers方法內配置檢視對映為resourceViewResolver方法返回的InternalResourceViewResolver例項,這樣完成了檢視的配置。在下面還有註釋掉的一部分程式碼,這塊程式碼很神奇,我們先來看看org.springframework.web.servlet.config.annotation.ViewResolverRegistry原始碼:

package org.springframework.web.servlet.config.annotation;

public class ViewResolverRegistry {
    ...//省略程式碼
    public UrlBasedViewResolverRegistration jsp() {
        return this.jsp("/WEB-INF/", ".jsp");
    }

    public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(prefix);
        resolver.setSuffix(suffix);
        this.viewResolvers.add(resolver);
        return new UrlBasedViewResolverRegistration(resolver);
    }
}
...//省略程式碼

可以看到上述原始碼中有兩個jsp方法,而沒有引數的方法恰恰跟我們配置的內容一樣,這一點看來是Spring早就根據使用者使用習慣新增的預設配置,同樣也提供了自定義配置Jsp相關的字首、字尾內容的方法,
方法內部同樣是例項化了一個InternalResourceViewResolver檢視對映類,並將例項新增到了viewResolvers集合內。

配置MessageConverter

這個配置一般針對於Api介面服務程式,配置在請求返回時內容採用什麼轉換器進行轉換,我們最常用到的就是fastJson的轉換,配置如下所示:

/**
     * 訊息內容轉換配置
     * 配置fastJson返回json轉換
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //呼叫父類的配置
        super.configureMessageConverters(converters);
        //建立fastJson訊息轉換器
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //建立配置類
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //修改配置返回內容的過濾
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);
        //將fastjson新增到檢視訊息轉換器列表內
        converters.add(fastConverter);
    }

內容轉換都是針對面向介面進行編寫的實現類,都必須implements HttpMessageConverter介面完成方法的實現。

總結

以上內容就是本章的全部講解內容,本章主要講解了採用JavaBean配置的形式代替傳統的Xml配置檔案的形式進行多種配置宣告,根據原始碼我們可見到Spring在多年被使用的過程中不斷的提供一些預設配置,從而達到用於預計的效果並提高了開發效率。

本章程式碼已經上傳到碼雲:
SpringBoot配套原始碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套原始碼地址:https://gitee.com/hengboy/spring-cloud-chapter
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
感謝閱讀!



作者:恆宇少年
連結:https://www.jianshu.com/p/2c2cdb80fe47
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。