spring-boot中攔截器的使用
阿新 • • 發佈:2018-12-30
背景
相信很多同行都有過做後臺許可權管理或者api token登陸態校驗之類的經驗,我最開始工作的時候就是做OA系統的,印象最深刻的就是角色許可權管理,當時經驗少,把許可權和業務功能做的耦合度非常的高,常常會在一個action的業務邏輯裡面加很多的if else來做許可權的判斷,這是一段痛苦的經歷。
最近開發的專案也有許可權後臺,提供出去的api要校驗token判斷登陸態,想起java應該是有攔截器的功能,就學起來用了,非常簡單實用,完全跟業務邏輯分離。
spring中的攔截器
spring中提供了攔截器HandlerInterceptor,HandlerInterceptor的功能是:提供了三個方法來攔截請求的三個階段,preHandle(在請求處理之前)、postHandle(請求處理後檢視渲染前)、afterCompletion(請求完全結束之後)。我們不能通過攔截器修改請求內容,但是可以通過丟擲異常(或者返回false)來暫停請求的執行。
配置攔截器分為三步:
- 建立我們自己的攔截器類並實現 HandlerInterceptor 介面。
- 建立一個Java配置類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。
- 將對像手動新增到攔截器鏈中(在addInterceptors方法中新增)
具體程式碼如下:
- 建立攔截器,並實現業務邏輯
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
}
}
- 註冊攔截器
/**
* 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/**");
}
}