TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
/** - ]2 w8 k( J' R6 v$ L4 C! j: a
*
& j7 |% f0 X) E& v1 ?, k% s9 z* 5 I" l" N0 t1 c- d1 B* g
*
1 |7 c- e& J1 b$ e* 拦截器的作用:
$ i- W3 n5 d0 ?7 m2 G0 F9 U$ N' d* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。
6 N! x" l: M, C% P4 R* 1.全局日志(谁提交了请求,要做什么事)
, O5 c" i. C) @! v* 2.权限管理(每个请求都能判断权限)
" M/ i" K6 T: [1 W; J; ]' s8 Z* 代码:
5 {! C$ @! d3 N6 m* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口 j- E" ^: F+ r* d! o
* preHandle请求前拦截(尚未执行Controller) - {9 {9 s' d0 K% W3 i. y; @
* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息) + O' }1 k' E. Q8 N5 B9 T9 r. o* Q
* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭 " z1 i$ w1 w& D
*
! J# @8 I/ Q& _4 Z: ^/ O' C( ]* 这三个方法根据业务选,不实不编写代码就可以了。
2 L. f. p/ {' P' b5 \+ N*
# e$ p! R5 S% a+ o: X*
; M% a! Y/ _0 B9 _# {" i9 [ @" @* 设置拦截器链
' `( U8 c" o8 n% J0 Z* <mvc:interceptors>
& U+ P4 @3 |4 c. @% @* <mvc:interceptor>
- M) F- w2 q# G" G* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。
$ t. V. k1 Y: g9 e1 f' V9 \) j* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求
5 E& V. j* T& r, C" l* <bean class="com.my.common.MyInterceptor"></bean>
; \1 H* s3 O7 B; f% i# h* </mvc:interceptor> ( m. m! r6 O% z
* / u. G! v3 _! p. f' r
* <mvc:interceptor> 拦截器链中的第二个
' e1 X% q7 O/ T3 K* </mvc:interceptor>
8 [9 V) Z/ s9 d, ` m. {" R8 `* ; ]$ c& H( _) x
* </mvc:interceptors> + [& @2 p4 |# K1 ^
*
5 \" W: C* d8 D$ r: l" g% P
1 |2 I7 A6 X3 S处理流程
+ D8 R2 c+ d* E( K/ G8 t7 G- x, c* v
1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器6 q6 M# m' w) Q/ I$ V5 c
2 F. v, C2 K( K2 S( E7 k0 H) K2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 e' X" I( V4 C1 X
*
5 }5 i0 Y1 i( x* O1 q*/: R7 m6 u# ?0 o6 T' I( P
1 f- c" |( Q7 `! w& f$ Y& }/ z |
|