spring boot 添加攔截器的簡單實例(springBoot 2.x版本,添加攔截器,靜態資源不可訪問解決方法)

spring中攔截器主要分兩種,一個是HandlerInterceptor,一個是MethodInterceptorjava

1、HandlerInterceptorweb

HandlerInterceptor是springMVC項目中的攔截器,它攔截的目標是請求的地址,比MethodInterceptor先執行。spring

 

一、建立咱們本身的攔截器類並實現 HandlerInterceptor 接口或繼承HandlerInterceptorAdapter。
二、建立一個Java類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。
三、實例化咱們自定義的攔截器,而後將對像手動添加到攔截器鏈中(在addInterceptors方法中添加)。後端

package com.qicheshetuan.backend.web.interceptor;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by 15117 on 2018/4/27.
 */
public class TestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("在控制器執行前調用 ");
        Boolean flag = true;
        if(flag){
            System.out.println(request.getMethod());
            return true;
        }else{
            System.out.println(request.getMethod());
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("在後端控制器執行後調用 ");
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("整個請求執行完成後調用 ");
        super.afterCompletion(request, response, handler, ex);
    }
}
package com.qicheshetuan.backend.web.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by 15117 on 2018/4/27.
 */
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

2、MethodInterceptoride

MethodInterceptor是AOP項目中的攔截器,它攔截的目標是方法,即便不是controller中的方法。實現MethodInterceptor攔截器大體也分爲兩種,一種是實現MethodInterceptor接口,另外一種利用AspectJ的註解或配置。post

基於註解的AspectJ方式spa

package com.qicheshetuan.backend.web.interceptor;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * Created by 15117 on 2018/4/27.
 */
@Component
@Aspect
public class AspectJInterceptor {

    @Around("execution(* com.qicheshetuan.backend.web.controller.AutoCommunityController.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("方法執行前");
        Object proceed = pjp.proceed();
        System.out.println("方法執行後");
        return proceed;
    }
}
package com.qicheshetuan.backend.web.interceptor;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * Created by 15117 on 2018/4/27.
 */
@Component
@Aspect
public class AspectJInterceptor {

    @Pointcut("execution(* com.qicheshetuan.backend.web.controller..*.*(..))")
    public void execMethod(){

    }
    @Before("execMethod()")
    public void beforeMethod(JoinPoint joinPoint){
        System.out.println("方法前執行");
        System.out.println(joinPoint.getSignature().getName());
    }
}

 備註:code

近日,發現Spring 5.0 之後WebMvcConfigurerAdapter會過期,新實現blog

(一)繼承

@Configuration

public class TestConfig implements WebMvcConfigurer {

  . . .

}

(2、推薦)

@Configuration

public class TestConfig extends WebMvcConfigurationSupport {

  . . .

}

 因爲spring boot 2.x依賴的spring 5.x版本,使用spring 5.x時,靜態資源也會執行自定義的攔截器

全部致使靜態資源不可訪問的問題

 

解決方法:

在添加自定義攔截器是,過濾掉靜態資源路徑

相關文章
相關標籤/搜索