面試官:你是怎麼用Spring MVC攔截器的

面試官:你是怎麼用Spring MVC攔截器的

介紹

我們要寫自己的攔截器一般有兩種方式。

1.實現HandlerInterceptor接口

2.繼承HandlerInterceptorAdapter抽象類

我就直接繼承了HandlerInterceptorAdapter抽象類,按需重寫部分實現即可。

HandlerInterceptor有如下3個方法

preHandler:在controller執行之前調用

postHandler:controller執行之後,且頁面渲染之前調用

afterCompletion:頁面渲染之後調用,一般用於資源清理操作

先定義一下返回值,因為這是一個微服務項目,最好把項目的返回值都統一成一個對象,這樣序列化和反序列化都比較方便,而且前端解析也很方便。

面試官:你是怎麼用Spring MVC攔截器的

記錄接口響應時間

面試官:你是怎麼用Spring MVC攔截器的

這個攔截器記錄了每個接口的響應時間,還有接口的路徑及參數,有了路徑,參數,響應時間這3個指標,排查問題應該很方便了。

判斷用戶是否登錄

登錄接口為

面試官:你是怎麼用Spring MVC攔截器的

登錄成功會設置session的屬性值。

面試官:你是怎麼用Spring MVC攔截器的

可以看到當從session中取不到相應的用戶信息時,說明用戶沒有登錄,應該提示登錄

。當用戶已經登錄時會調用request.setAttribute方法,設置一下用戶的信息,方便記錄操作人之類的。後面會演示到。

這裡用了一個工具類,來重寫返回的json

面試官:你是怎麼用Spring MVC攔截器的

JsonUtil是我寫的將對象轉為json的工具類

沒有登錄顯示

{
"code": 2,
"desc": "請登錄"
}

登錄成功顯示

{
"code": 0,
"desc": "成功"
}

判斷用戶的權限

這個項目的權限是基於RBAC(Role-Based Access Control,基於角色的訪問控制)來做的,簡答來說需要五張表。

用戶表

用戶角色關聯表

角色表

角色權限關聯表

權限表

基於這種模型,用註解+攔截器來實現權限管理還是很容易的,大概演示一下

權限註解(在需要進行權限校驗的url上加,id屬性一般為權限id)

面試官:你是怎麼用Spring MVC攔截器的

如下面代碼,刪除用戶需要id=0的權限(默認值),並且會打印出操作人是誰,request.getAttribute之所以能取到值,是因為在登錄的時候已經設置了,可以看一下前面,當出現問題的時候就可以迅速排查到哪些用戶做了哪些操作,能迅速找到責任人,當然我這裡打印的信息很少,簡單演示一下就行。

面試官:你是怎麼用Spring MVC攔截器的

攔截器如下

面試官:你是怎麼用Spring MVC攔截器的

這個攔截器是和登錄攔截器一起使用的,不然會讓用戶一直登錄。

接口權限校驗

這個寫起來比較長,單開一篇吧。

配置

配置攔截器的方法如下,注意順序的問題,最起碼本節中LoginInterceptor和AuthorityInterceptor這2個攔截器的順序是不能顛倒的。

面試官:你是怎麼用Spring MVC攔截器的

圖沒截全,放一下代碼

@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

"


分享到:


相關文章: