TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
/**
0 M; @) T4 k& i" U*
! W: y7 M/ `$ g* ' R8 _' L- P5 y
* 0 m! o# K. j& J2 p q2 x
* 拦截器的作用: " R( E# l0 F# K* e) }) f
* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。 4 ~& @9 d: d& N
* 1.全局日志(谁提交了请求,要做什么事)
+ T0 `7 C# r0 J, N* 2.权限管理(每个请求都能判断权限) # ^ s6 u4 a d Y6 V
* 代码:
# q4 ?0 f/ \4 `" Y3 @* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口
( B0 h3 D/ W: b* preHandle请求前拦截(尚未执行Controller) ( P! b2 U2 w4 R' l
* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息) * y: B, q8 J" W" e Q$ p6 `
* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭
- h; c( N" `9 K6 F& }% y*
9 W b2 j, e& F1 H) n. b* 这三个方法根据业务选,不实不编写代码就可以了。
! \2 { t# Q1 b* 1 G) _9 e% |, p
* % _ |9 `( ^/ I9 f( X
* 设置拦截器链
- U( `( c) n# ~1 C# J& ~1 T* <mvc:interceptors> ! c- \' t3 S: ]/ e3 O; V+ L
* <mvc:interceptor> ' A( I: m8 G! Y3 \
* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。 ! s. ]; H4 [( d- q( E- Z
* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求
! r8 N% I. r/ v9 B/ w$ ]* <bean class="com.my.common.MyInterceptor"></bean>
3 ?7 Y* Z) b# T; x s9 y* </mvc:interceptor> 3 w5 a7 T9 O+ A8 V9 C
* 7 ~4 ?. T+ x9 R1 Q# ~/ R* D4 z
* <mvc:interceptor> 拦截器链中的第二个
. d9 k: ]% b5 z. E* </mvc:interceptor> 6 s4 [5 R* y3 S- M
*
! s# J V5 b8 k4 V8 `- z( W- B1 l& X* </mvc:interceptors>
: i2 x6 q& a6 z7 V1 t- a*4 g9 y/ Q: r& F& x( t: Y- H4 T4 d
$ N+ ?) I' c- s" Q$ T7 ]! U处理流程
1 ?5 \1 @, g/ a' o
6 _* j1 R% s$ ?! N1 W. d& A1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器! w' g3 i: P$ Q: j
& D2 L2 C- N* B5 | m) ~; h8 }% T
2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 : k& q' ^6 b3 Y- K' o0 L' {$ l
*
& i" S( o' C. R. {0 U: L9 ?5 n*/
8 d% M! \( A; I! t; ]; A
% M+ c) U* z* {4 @3 ]! g3 }- _5 A |
|