TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
/**
% j0 N r( P% o7 W9 ?*
9 U1 m- M# g& S' _8 @* : P. H5 k; a: O# a
* & v9 b: n7 q; f; L6 d/ f( P
* 拦截器的作用: * A- @# P$ U9 D* _8 t+ A! y& M) o
* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。 " @; k1 v6 C& B; ? ^ J
* 1.全局日志(谁提交了请求,要做什么事) 1 f+ Z$ M! R& W# O- H' f
* 2.权限管理(每个请求都能判断权限)
1 c$ l: @8 e" w- p* 代码: ! v, U! @+ i1 R9 a' j
* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口
0 _9 I9 P# e7 ]8 i7 d) K* preHandle请求前拦截(尚未执行Controller) ( ~) e+ s h+ [+ p
* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息)
( h/ a+ N3 C2 p* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭 $ P3 Y* P' }/ K, h0 [
* , U% |' v2 y# o$ I% i8 x( T
* 这三个方法根据业务选,不实不编写代码就可以了。
% y% a8 U ^8 R2 }: m# B8 L; s* 2 A0 g, Q# Y, L" h
* . o; y8 j1 _# I3 x- |
* 设置拦截器链 " L& {$ p- K5 e7 d. u! q2 @2 p- G
* <mvc:interceptors>
7 B0 C% O; e8 X* <mvc:interceptor>
/ l) T" s' A3 p" O2 N* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。
" D' R' B% K! v `! z* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求 + r" ~: ^; |0 A) U6 [/ R
* <bean class="com.my.common.MyInterceptor"></bean>
! s% N$ w% h: O; a5 [ P7 z, m* </mvc:interceptor>
' B( f# P3 M* G# ~+ i% }* : O3 B8 W% `0 p
* <mvc:interceptor> 拦截器链中的第二个 6 T4 S: T0 S- d! W1 t/ C0 H# V; B
* </mvc:interceptor> : p: C3 B2 M5 N8 q9 c
*
8 ?0 |$ |: r5 ]" k' V6 m* </mvc:interceptors> , ]& r; b5 ?2 |" [: c6 T
*
3 ~" x2 ?2 o$ `
; V. m6 f% k& k% p; U处理流程. [: v# c% p3 }# i
" q; n3 I7 I8 w1 _0 L1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器
' x% z5 o0 S) [" M; S$ I
& C4 Z$ e/ ]) x2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 & c! L% x5 j# x& i9 F$ ?; N
* 4 o* |0 c) i) ]2 J% x' @
*/
+ l' Y' I* b; a) ~, e& N0 G2 l- {& W% D/ D* \. y
|
|