TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
/**
/ F9 j# Q/ c B- p4 p5 |6 ^2 \2 e* " h8 m% u. o* L) l# `8 P) ^5 x
*
+ i! T$ M1 _, v1 ~* : x: k! d/ s. m+ L3 a
* 拦截器的作用:
; B4 e8 ]2 [0 `0 t* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。
) p1 e; K- V" s" R* 1.全局日志(谁提交了请求,要做什么事)
& n r4 ^! K% c5 M/ ~8 f/ e0 H3 U* 2.权限管理(每个请求都能判断权限) 3 `3 ^& w c3 \0 |% Z$ b
* 代码: 5 v, A4 n l/ I/ ]# i# N
* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口 ' ?& z. Q# m& c1 D# y: X
* preHandle请求前拦截(尚未执行Controller) & ?0 }) h1 e$ C4 L1 b
* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息) 4 }$ Q( x& I0 E% k f8 K
* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭
( B( Z' @& e6 u* J! o: K*
0 m3 L H3 O: q! A. ~% s4 \7 d* 这三个方法根据业务选,不实不编写代码就可以了。 $ F5 o3 R% C' U) y
*
1 N* |: b5 V7 c J7 ~" ~, @* % @4 Y! p6 R* |7 V
* 设置拦截器链
% O1 w# j. \) l" O2 o; H: b& w0 a* <mvc:interceptors> ( c) j) {( i9 E9 a) `
* <mvc:interceptor>
, W- P) P- r ^) e7 q& l2 j3 U* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。 9 x2 q2 j- N- x& n* Y
* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求 0 v5 j% y H/ ~% O# }
* <bean class="com.my.common.MyInterceptor"></bean>
5 N$ R' q5 n4 E$ x4 K' q* </mvc:interceptor>
% F. V# X' b& ~2 G5 k' ?# ^5 g/ f9 Q*
* [4 b, O4 f; g2 m8 D( }2 r* <mvc:interceptor> 拦截器链中的第二个 8 `5 i4 a) l( r6 E1 C
* </mvc:interceptor>
, U/ ]' |, }- P( I! M*
$ N+ D# Q+ h4 f* </mvc:interceptors> ; p; F$ k3 F, _; ?6 Z
*
& g g9 h7 S Y! c! D+ U
6 l& k# x2 I; ?5 P' `处理流程
+ ]6 D/ i+ |6 Y/ B( [; r
+ s- K! ]1 D: v! {5 z1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器% R8 C, C2 Y4 m% m: H" `2 Z% k
% d' {5 G% z( b% q. s, e* P0 h
2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 ^/ r+ r* K5 ~' [: f
*
! P& K/ r( Z% Y, n. W- ~& A1 n*/
; Z. M. {% n* h8 U) _6 f. G
5 i4 U& j5 U7 _- ]3 o: N6 k0 c |
|