1. 程式人生 > >spring-boot中攔截器的使用

spring-boot中攔截器的使用

背景

相信很多同行都有過做後臺許可權管理或者api token登陸態校驗之類的經驗,我最開始工作的時候就是做OA系統的,印象最深刻的就是角色許可權管理,當時經驗少,把許可權和業務功能做的耦合度非常的高,常常會在一個action的業務邏輯裡面加很多的if else來做許可權的判斷,這是一段痛苦的經歷。
最近開發的專案也有許可權後臺,提供出去的api要校驗token判斷登陸態,想起java應該是有攔截器的功能,就學起來用了,非常簡單實用,完全跟業務邏輯分離。

spring中的攔截器

spring中提供了攔截器HandlerInterceptor,HandlerInterceptor的功能是:提供了三個方法來攔截請求的三個階段,preHandle(在請求處理之前)、postHandle(請求處理後檢視渲染前)、afterCompletion(請求完全結束之後)。我們不能通過攔截器修改請求內容,但是可以通過丟擲異常(或者返回false)來暫停請求的執行。

配置攔截器分為三步:

  1. 建立我們自己的攔截器類並實現 HandlerInterceptor 介面。
  2. 建立一個Java配置類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。
  3. 將對像手動新增到攔截器鏈中(在addInterceptors方法中新增)

具體程式碼如下:

  1. 建立攔截器,並實現業務邏輯
package com.ewt360.netschool.service.common;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import
javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; /** * @author Rael.liu * @since $Revision:1.0.0, $Date: 2018年05月17日 下午5:47 $ */ public class AdminUserInterceptor implements HandlerInterceptor { //使用者服務
@Autowired UserService userService; //在執行Controller方法之前來執行的 @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //校驗使用者,校驗失敗則中斷請求 boolean result = userService.check(httpServletRequest); return result; } //在執行Controller方法之後返回modelAndView之前來執行,比如可以向檢視中新增一些公共資料 @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } //完成對頁面的渲染之後執行此方法,比如記錄請求日誌,效能監控 @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { // TODO Auto-generated method stub } }
  1. 註冊攔截器
/**
 * kaike.la Inc.
 * Copyright (c) 2014-2016 All Rights Reserved.
 */
package com.ewt360.netschool.service;

import com.ewt360.netschool.service.common.AdminUserInterceptor;
import com.ewt360.netschool.service.common.BackStageUserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * @author [email protected]
 * @since $Revision:1.0.0, $Date: 2018年05月10日 下午7:12 $
 */
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private AdminUserInterceptor adminUserInterceptor;
    @Autowired
    private BackStageUserInterceptor backStageUserInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多個攔截器組成一個攔截器鏈
        // addPathPatterns 用於新增攔截規則
        // excludePathPatterns 使用者排除攔截
        registry.addInterceptor(adminUserInterceptor).addPathPatterns("/admin/**");
        registry.addInterceptor(backStageUserInterceptor).addPathPatterns("/backstage/**");
    }
}