TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
/**
5 g; F8 O' A5 i* H) k7 e4 q*
4 ^' z# D) R( M2 X! Z& }* . P# s6 \7 o' L6 l* x
* 9 ~. I* {9 @" C" a; U
* 拦截器的作用:
' [3 H7 O& `5 Q! o7 Z& x* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。
* Z/ R# E# a( o* P; R* 1.全局日志(谁提交了请求,要做什么事) # `7 Y5 M! q& H
* 2.权限管理(每个请求都能判断权限)
) Q5 m$ y# |0 I; h* A- X* 代码: & r; n$ B& c' O9 ~$ S# b
* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口 9 Y% N5 J @% n
* preHandle请求前拦截(尚未执行Controller)
0 P# j+ @! g& @3 H$ }, v* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息)
' I$ x+ A A3 p9 {& j' V* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭
. T# q/ x4 A; b: o* - d2 t% `6 W$ E# R7 `0 y
* 这三个方法根据业务选,不实不编写代码就可以了。
$ U2 b5 Z8 c3 V$ q4 M*
, {& v6 Z3 t9 V*
0 d) c& `( J3 i4 l/ O9 F: b) m* 设置拦截器链
7 V' P7 t/ F& ] h/ H9 ]9 M; }" A4 i6 Z* <mvc:interceptors> * v9 B) ~5 ?& o$ V& G W( z
* <mvc:interceptor> / l2 ~+ V5 s; r+ P6 N$ x. L
* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。 5 g; d0 @& `1 S3 G# ~5 @6 c
* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求
3 S" @0 j* I& z7 X' c# C* <bean class="com.my.common.MyInterceptor"></bean>
" g1 {) t; n- ^& W# t' {9 F: e/ s* </mvc:interceptor>
0 Z6 G) l7 e& {% P& O! m- _*
5 \3 c% T/ V) N \" w; N$ T* <mvc:interceptor> 拦截器链中的第二个
8 U6 J2 \) A% e0 V3 ^* </mvc:interceptor> ; y' t6 }/ m; `7 N" d% a8 ?# u
*
4 l1 c% `5 u" `+ s0 A* </mvc:interceptors> * [2 a) e3 `8 U+ g" B
*. k% }. ^* O: E& p& J
( Q; g+ P! L0 {. |/ m
处理流程' W2 P1 G# G3 w, ~3 |- b1 V
: C8 t4 }0 \# S. t) X1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器/ r" h) C) Q- @& }0 P7 f {
- z* ~1 e% t# i v% B: H q2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 ! i) g6 s$ X% R! p
*
+ q" ~0 u+ c2 q' R3 X% s$ v" O*/6 j3 [5 ?) ]5 O |& y9 p$ b |
1 f& q. ?. C( v0 n& L |
|