介紹
我們要寫自己的攔截器一般有兩種方式。
1.實現HandlerInterceptor接口
2.繼承HandlerInterceptorAdapter抽象類
我就直接繼承了HandlerInterceptorAdapter抽象類,按需重寫部分實現即可。
HandlerInterceptor有如下3個方法
preHandler:在controller執行之前調用
postHandler:controller執行之後,且頁面渲染之前調用
afterCompletion:頁面渲染之後調用,一般用於資源清理操作
先定義一下返回值,因為這是一個微服務項目,最好把項目的返回值都統一成一個對象,這樣序列化和反序列化都比較方便,而且前端解析也很方便。
記錄接口響應時間
這個攔截器記錄了每個接口的響應時間,還有接口的路徑及參數,有了路徑,參數,響應時間這3個指標,排查問題應該很方便了。
判斷用戶是否登錄
登錄接口為
登錄成功會設置session的屬性值。
可以看到當從session中取不到相應的用戶信息時,說明用戶沒有登錄,應該提示登錄
。當用戶已經登錄時會調用request.setAttribute方法,設置一下用戶的信息,方便記錄操作人之類的。後面會演示到。
這裡用了一個工具類,來重寫返回的json
JsonUtil是我寫的將對象轉為json的工具類
沒有登錄顯示
{
"code": 2,
"desc": "請登錄"
}
登錄成功顯示
{
"code": 0,
"desc": "成功"
}
判斷用戶的權限
這個項目的權限是基於RBAC(Role-Based Access Control,基於角色的訪問控制)來做的,簡答來說需要五張表。
用戶表
用戶角色關聯表
角色表
角色權限關聯表
權限表
基於這種模型,用註解+攔截器來實現權限管理還是很容易的,大概演示一下
權限註解(在需要進行權限校驗的url上加,id屬性一般為權限id)
如下面代碼,刪除用戶需要id=0的權限(默認值),並且會打印出操作人是誰,request.getAttribute之所以能取到值,是因為在登錄的時候已經設置了,可以看一下前面,當出現問題的時候就可以迅速排查到哪些用戶做了哪些操作,能迅速找到責任人,當然我這裡打印的信息很少,簡單演示一下就行。
攔截器如下
這個攔截器是和登錄攔截器一起使用的,不然會讓用戶一直登錄。
接口權限校驗
這個寫起來比較長,單開一篇吧。
配置
配置攔截器的方法如下,注意順序的問題,最起碼本節中LoginInterceptor和AuthorityInterceptor這2個攔截器的順序是不能顛倒的。
圖沒截全,放一下代碼
@Configuration
public class DemoWebMvcConfigurerAdapter extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SystemInterceptor());
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login");
registry.addInterceptor(new AuthorityInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login");
}
}
說一下攔截器的執行順序,有2個攔截器,則執行順序為
preHandler 1
preHandler 2
postHandler 2
postHandler 1
afterCompletion 2
afterCompletion 1
github地址為:
https://github.com/erlieStar/interceptor-demo
閱讀更多 Java識堂 的文章