TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
/**
! {* x- z+ V5 y2 X i" F& `*
( l$ n& I- ?8 S: I& H4 {: I*
% C* w# M( L) Y; _& @* 6 t/ T* |* b g% [: w; h3 x
* 拦截器的作用: 7 n1 }! U) V9 p4 [* R, i5 h* f5 D* f0 I
* 每个请求到达Controller之前,或者每个响应到达view之前,都可以进行拦截。 9 u1 D; A& V8 b t* r# R ]0 R
* 1.全局日志(谁提交了请求,要做什么事)
3 P& r: r. M& A: \, i* 2.权限管理(每个请求都能判断权限)
: }! Z5 l( K' Z% ~" E/ F* 代码:
N+ ]. ?1 s% W8 i# V9 d8 `% x* 写一个类,实现springframework.web.servlet.HandlerInterceptor接口
2 O2 K% g) |3 v0 q6 t) M, u2 ?* preHandle请求前拦截(尚未执行Controller) , J& p4 |1 E; T" p# \: _
* postHandle控制器执行完,生成视图之前可以加入的动作(加入模型中的公共部分,如版权信息)
9 Q# m# ~0 L! [+ h5 J* afterCompletion 释放资源,比如在pre中打开了数据库链接,在这里可以进行关闭
6 ~) l% Z1 K! Q" g ?% z* q% }; o*
" Q. K' o6 G4 G) u6 ^* 这三个方法根据业务选,不实不编写代码就可以了。
' @2 \% P$ j/ _' E+ w+ [' v*
0 D \9 d2 S" ?7 l8 `2 w) E* # W, j: [3 x& I$ _' @+ I
* 设置拦截器链
- n$ w# d* c" z* ~3 o: G# C* <mvc:interceptors>
1 f g1 \8 T1 |' _5 i6 n% w* <mvc:interceptor> a& j) d- ]( c) P" A% _& d3 k) [
* <mvc:mapping path=""/> 可选项。若不指定,则默认拦截所有请求; 若指定了,则只拦截符合一定模式的请求。
% y% l9 T! \1 W/ |+ ?7 Q" O* 例子:<mvc:mapping path="/user/*"/> eg:拦截user/下的所有请求
/ F2 ]+ r6 n7 A0 \ Z$ o! R* <bean class="com.my.common.MyInterceptor"></bean>
# q. ~( _; U _" v) U( O8 a5 x* </mvc:interceptor> }9 @2 X/ B d; ~5 |" }8 e' {
*
w" [3 V% O" b5 |% O* <mvc:interceptor> 拦截器链中的第二个 2 D \! N4 Y# b O$ d' m* W
* </mvc:interceptor> 6 u \8 U2 V. Q7 |' t
* 0 `1 v8 r8 |3 D# b7 `
* </mvc:interceptors> 9 Q8 k' i5 Z' n# b
*+ W$ o* R, v+ A& o- l7 `
* g+ ?/ b$ S9 ]0 p' v处理流程
/ l" d% U. F& J
0 A3 i; k( ? Q' G0 A1请求沿着拦截器①--拦截器②…拦截器N的preHandle方法执行,最终到达控制器
2 m7 Q) \+ {; n7 o; ]! M
- ]) ?5 I: X! `( J2在控制器执行完毕,将要生成视图之前依次执行拦截器N--拦截器N-1….拦截器②---拦截器①中的postHandle方法。 6 {# `% f a5 K) q
* - v# E9 w) d8 r& a O( _" z
*/
/ {8 n! {( D/ M% x$ x5 t7 l" y* y" y7 O3 B/ j3 K4 D$ R; @
|
|