日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

基于注解风格的Spring-MVC的拦截器

發布時間:2023/12/10 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于注解风格的Spring-MVC的拦截器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring-MVC如何使用攔截器,官方文檔只給出了非注解風格的例子。那么基于注解風格如何使用攔截器呢?


基于注解基本上有2個可使用的定義類,分別是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter:

< bean? class ="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
< bean? class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />


1、DefaultAnnotationHandlerMapping
?????? DefaultAnnotationHandlerMapping本身支持自定義攔截器,只需按如下進行配置:

1 ?< bean? class ="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" >
2 ????? < property? name ="interceptors" >
3 ????????? < list >
4 ???????????????? < bean? class ="packageName.XXXInterceptor" ? />
5 ????????? </ list >
6 ????? </ property >
7 ?</ bean >


Interceptor的定義為:

?1 ?public ? class ?XXXInterceptor? extends ?HandlerInterceptorAdapter?{
?2 ?????@Override
?3 ????? public ? boolean ?preHandle(HttpServletRequest?req,?HttpServletResponse?resp,?Object?handler)?{
?4 ??
?5 ?????????String?className? = ?handler.getClass().getName(); // package Name .ClassName
?6 ????????? if ?(Error)?{
?7 ????????????? return false ;
?8 ?????????}
?9 ????????? return true ;
10 ?????}
11 ?}


2、AnnotationMethodHandlerAdapter
?????? 目前,筆者沒找到如何給AnnotationMethodHandlerAdapter配置自定義Interceptor的方法,但是有個customArgumentResolver可以利用一下,來充當Interceptor。

1 ?< bean? class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
2 ????? < property? name ="customArgumentResolver" >
3 ????????? < bean? class ="packageName.XXXResolver" />
4 ????? </ property >
5 ?</ bean >


Resolver的定義為:

?1 ?public ? class ?XXXResolver? implements ?WebArgumentResolver?{
?2 ??
?3 ?????@Override
?4 ????? public ?Object?resolveArgument(MethodParameter?methodParameter,?NativeWebRequest?webRequest)? throws ?Exception?{
?5 ??
?6 ?????????String?className? = ?methodParameter.getMethod().getDeclaringClass().getName(); // ?packageName.ClassName
?7 ?
?8 ????????? // ?如何取得Response和Request
?9 ?????????HttpServletResponse?resp? = ?(HttpServletResponse)?webRequest.getNativeResponse();
10 ??????? HttpServletRequest?req? = ?(HttpServletRequest)?webRequest.getNativeRequest();
11 ??
12 ??????? if ?(Error)?{
13 ??????????? if (!resp.isCommitted()) resp.sendError(ERROR_STATUS);
14 ??????? }
15 ??????? return ?UNRESOLVED;????
16 ?????}
17 ?}
18 ?


????? 仔細的人會看出,第二種方法其實根本不是攔截。其實第二種只是在映射Controller,調用方法的時候,給每一個方法的參數增加了一個切點。
上例在出錯的時候往HttpServletResponse 寫錯誤狀態,來通知web容器進行錯誤重定向,達到了攔截器的作用。
這么做有一個缺點,就是每個參數都有自己的切點,比如方法有3個參數就會調3次resolveArgument。為了避免出錯,需要判斷一下 resp.isCommitted

????? customArgumentResolver的初衷不是用來做Interceptor的,但有些環境卻不得不使用它,比如部署在GAE上。
GAE 是不支持DefaultAnnotationHandlerMapping的,因為此類用到了 org.springframework.beans.BeanUtils.findEditorByConvention,這個方法會調用 java.lang.ClassLoader.getSystemClassLoader,而這正是GAE所不允許的。

PS:
文中提到軟件的版本:
spring - 2.5.X

轉載于:https://www.cnblogs.com/siukun/archive/2011/12/06/2277647.html

總結

以上是生活随笔為你收集整理的基于注解风格的Spring-MVC的拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。