Spring MVC攔截器示例

我以為是時候看看Spring的MVC攔截器機制了,這種機制已經存在了很多年,并且是一個非常有用的工具。

Spring Interceptor會按照提示進行操作:在傳入的HTTP請求到達您的Spring MVC控制器類之前對其進行攔截,或者相反,在其離開您的控制器之后但在將其反饋給瀏覽器之前,對其進行攔截。

您可能會問這對您有什么用? 答案是,它允許您執行每個請求或一組請求共有的任務,而無需將“ n”粘貼樣板代碼切成每個控制器類。 例如,您可以在請求到達控制器之前執行用戶身份驗證,如果成功,則從數據庫中檢索一些其他用戶詳細信息,然后在調用控制器之前將其添加到HttpServletRequest對象。 然后,您的控制器可以簡單地檢索和使用這些值,或將其留給JSP顯示。 另一方面,如果身份驗證失敗,則可以將用戶重定向到其他頁面。

演示代碼向您展示如何在傳入的HttpServletRequest對象到達控制器之前對其進行修改。 這無非是向請求中添加一個簡單的字符串,但是,正如我上面所說,您始終可以進行數據庫調用來獲取每個請求所需的一些數據……您甚至可以添加某種優化并進行一些處理此時進行緩存。

public class RequestInitializeInterceptor extends HandlerInterceptorAdapter {// Obtain a suitable logger.private static Log logger = LogFactory.getLog(RequestInitializeInterceptor.class);/*** In this case intercept the request BEFORE it reaches the controller*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {try {logger.info("Intercepting: " + request.getRequestURI());// Do some changes to the incoming request objectupdateRequest(request);return true;} catch (SystemException e) {logger.info("request update failed");return false;}}/*** The data added to the request would most likely come from a database*/private void updateRequest(HttpServletRequest request) {logger.info("Updating request object");request.setAttribute("commonData","This string is required in every request");}/** This could be any exception */private class SystemException extends RuntimeException {private static final long serialVersionUID = 1L;// Blank}
}

在上面的代碼中,我通過擴展HandlerInterceptorAdaptor類(覆蓋preHandle(..)方法)選擇了最簡單的實現方法。 我的preHandle(...)方法進行錯誤處理,確定發生錯誤時的處理方法,如果發生錯誤則返回false。 返回false時,攔截器鏈會斷開,并且不會調用您的控制器類。 與請求對象混淆的實際事務被委托給updateRequest(request)。

HandlerInterceptorAdaptor類具有三個方法,每個方法都被存根,如果需要,可以忽略。 這些方法是:prehandle(…),postHandle(…)和afterCompletion(…),有關這些的更多信息可以在Spring API文檔中找到 。 請注意,這可能會造成一些混亂,因為Handler Interceptor類文檔仍通過它們的Spring 2處理程序名稱來引用MVC控制器類。 如果您查看prehandle(…)的Object類型的第三個參數(稱為處理程序),則很容易證明這一點。 如果在調試器中進行檢查,您將看到它是控制器類的實例。 如果您不熟悉這項技術,請記住該控制器==處理程序。

與往常一樣,實現攔截器的下一步是向Spring XML配置文件中添加一些內容:

<!-- Configures Handler Interceptors --> 
<mvc:interceptors>  <!-- This bit of XML will intercept all URLs - which is what you want in a web app --><bean class="marin.interceptor.RequestInitializeInterceptor" /><!-- This bit of XML will apply certain URLs to certain interceptors --><!-- <mvc:interceptor><mvc:mapping path="/gb/shop/**"/><bean class="marin.interceptor.RequestInitializeInterceptor" /></mvc:interceptor>-->
</mvc:interceptors>

上面的XML演示了向所有請求URL添加攔截器的一種或一種選擇,或者如果您查看注釋掉的部分,則向特定的請求URL添加攔截器,從而允許您選擇將哪些URL連接到您的攔截器類。

鷹眼的讀者可能已經注意到,攔截器類使用繼承和XML配置作為其實現方法。 在配置方面的常規情況下,這種模式看起來有些疲憊,并且可能需要進行大修。 一種建議是使用已添加到控制器機制中的相同技術來增強整體以使用注釋。 這將增加額外的靈活性,而不會導致使用所有接口和抽象基類的復雜性。 作為建議,將來的攔截器類實現可能如下所示:

@Intercept(value = "/gb/en/*", method = RequestMethod.POST)public boolean myAuthenticationHandler(HttpServletRequest request,Model model) {// Put some code here}

這樣就結束了對Spring攔截器的了解,應該記住,我只是展示了最基本的實現。

參考:來自Captain Debug博客的 JCG合作伙伴 Roger Hughes在MVC Webapp中使用Spring Interceptor 。

相關文章 :
  • jqGrid,REST,AJAX和Spring MVC集成
  • SpringMVC 3 Tiles 2.2.2集成教程
  • Spring MVC3 Hibernate CRUD示例應用程序
  • Spring MVC開發–快速教程
  • Spring,Quartz和JavaMail集成教程
  • Spring Insight – Web應用程序分析
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 調用系統的分享[完美實現同一時候分享圖片和文字]

android 系統的分享功能 private void share(String content, Uri uri){Intent shareIntent new Intent(Intent.ACTION_SEND); if(uri!null){//uri 是圖片的地址shareIntent.putExtra(Intent.EXTRA_STREAM, uri);shareIntent.setType("image/*"); //當用戶選擇短信時…

團隊行為守則—如果你們由我來領導

&#xfeff;&#xfeff;如果你是在我領導的團隊里&#xff0c;有幾個額外的事情我要告訴你。我深信這些行為守則是一個高效團隊的潤滑劑&#xff0c;我并不只是要求別人這樣做&#xff0c;我自己也嚴格恪守。 只有三樣事&#xff1a; 問&#xff1a;如果你對任務不清楚&#…

做短,但做對!

編寫簡潔&#xff0c;優雅&#xff0c;清晰的代碼一直是開發人員的艱巨任務。 您的同事不僅會感謝您&#xff0c;而且您會驚訝地發現&#xff0c;不斷期待著重構解決方案以更少的代碼完成更多&#xff08;或至少相同&#xff09;的工作是多么令人興奮。 曾經有人說好的程序員是…

math

莫比烏斯反演&#xff1a; $F(n) \sum\limits_{d|n} {f(d)} \Leftrightarrow \sum\limits_{d|n} {\mu (d)F(\frac{n}{d})} $ 其中 ${\mu (d)}$為莫比烏斯函數: 若$d$等于0 , 則${\mu (d)}$1 若$d {p_1}{p_2}{p_3}...{p_k}$ , ${p_i}$為互異質數&#xff0c;則${\mu (d)}$${( …

(筆試題)二進制1的個數相同的距離最小數

題目&#xff1a; 輸入&#xff1a;整數A輸出&#xff1a;整數B條件&#xff1a;A和B的二進制1的個數相同&#xff0c;且A和B之間的距離|A-B|最小。思路&#xff1a; 題目沒有說明整數類型&#xff0c;這里認為是帶符號的整數&#xff0c;即區分正負數。 根據題意&#xff0c;A…

Java Swing –日期選擇器對話框

房子里有Swing開發人員嗎&#xff1f; 對于使用Swing的用戶來說&#xff0c;這是一個GUI組件&#xff0c;可能會對您的UI編碼工作有所幫助。 我們的JCG合作伙伴之一提供了日期選擇器小部件。 一探究竟&#xff1a; Java Swing –日期選擇器對話框以選擇日期 翻譯自: https://…

Casperjs中fill提交表單遇到的問題

1.if you access internet with proxy please add --ignore-ssl-errorstrue --ssl-protocolany 2.casper.then* and casper.wait* 都是異步執行的 他們的調用&#xff0c;都是按堆棧中的順序來執行&#xff1b;也就是說&#xff0c;其他同步執行的函數&#xff0c;…

Xuggler視頻處理簡介

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 隨著互聯網上視頻的爆炸式增長&#xff0c;開發人員經常需要在其應用程序中操縱視頻內容。 Xuggler是Java開發人員的免費開放源代碼庫&#xff0c;可用于實時解壓縮&#xff0c;處理和壓縮錄制的視頻或實時視頻…

軟件測試中條件覆蓋,路徑覆蓋,語句覆蓋,分支覆蓋的區別

轉&#xff1a;軟件測試中條件覆蓋&#xff0c;路徑覆蓋&#xff0c;語句覆蓋&#xff0c;分支覆蓋的區別 舉個例子吧 if A and B then Action1 if C or D then Action2 語句覆蓋最弱&#xff0c;只需要讓程序中的語句都執行一遍即可 …

Spring_講解

http://s&#xff0c;i&#xff0c;s&#xff0c;h&#xff0c;u&#xff0c;o&#xff0c;k.com/forum/blogPost/list/6174.html轉載于:https://www.cnblogs.com/gisblogs/p/4579162.html

使用Spring AspectJ和Maven進行面向方面的編程

Spring框架附帶AOP支持。 實際上&#xff0c;如Spring參考文檔中所述 &#xff0c; “ Spring的關鍵組件之一是AOP框架。 盡管Spring IoC容器不依賴于AOP&#xff0c;這意味著您不需要使用AOP&#xff0c;但AOP是對Spring IoC的補充&#xff0c;以提供功能強大的中間件解決方案…

hadoop5--mapreduce設計模式

運行結果附圖 本節課程主要內容為學習MapReduc設計模式&#xff0c;并編寫java程序對日志文件進行處理。 課本上介紹的MapReduce的設計模式主要包含:計數(Counting),分類(Classification),過濾處理(Filtering),排序(Sorting),去重計數(Distinct Counting),相關計數(Cross-Corre…

ES5中新增的Array方法詳細說明

http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/轉載于:https://www.cnblogs.com/lmw425317/p/5339539.html

jqGrid,REST,AJAX和Spring MVC集成

兩年多以前&#xff0c;我寫了一篇關于兩個如何在Struts2中實現優雅的CRUD的文章。 實際上&#xff0c;我必須就該主題寫兩篇文章&#xff0c;因為該主題如此廣泛。 今天&#xff0c;我采用了一套更為流行的&#xff0c;完善的框架和庫&#xff0c;采用了更為輕量級的現代方法。…

Java-馬士兵設計模式學習筆記-代理模式--動態代理 修改成可以代理任意接口

一、概述 1.目標&#xff1a;把Proxy修改成可以代理任意接口及其任意方法 2.思路&#xff1a; (1)代理任意接口&#xff1a;把接口類型作為參數傳給Proxy的newProxyInstance(Class interfze) (2)代理任意方法&#xff1a;用interfze.getMethods()取出所有方法&#xff0c;拼接實…

PTA習題

PTA習題 PTA浙大版《C語言程序設計&#xff08;第3版&#xff09;》 題目集5-6 水仙花數是指一個N位正整數&#xff08;N≥3&#xff09;&#xff0c;它的每個位上的數字的N次冪之和等于它本身。 本題要求編寫兩個函數&#xff0c;一個判斷給定整數是否水仙花數&#xff0c;…

acdream 1409 Musical 狀壓DP

鏈接&#xff1a;http://acdream.info/problem?pid1409 題意&#xff1a;整個國家有n座城市&#xff0c;每座城市有三種粉絲。 第一種一周看一場音樂劇&#xff0c;挑選的音樂劇是已經在周圍城市播放上演過的次數最多的音樂劇中的隨機一個。 另外一種每天看一場音樂劇&#xf…

真正的模塊化Web應用程序:為什么沒有開發標準?

OSGI &#xff0c; SpringSource &#xff0c; Jboss模塊 &#xff0c;J2EE和清單永遠不會結束。所有這些技術都向他們的最終用戶/開發人員保證了相同的東西&#xff0c;或多或少是Java模塊化Web應用程序&#xff08;&#xff1f;&#xff09;。 但是&#xff0c;我們當中有多少…

C語言5-7習題

本題要求實現一個函數&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精確到最后一項的絕對值小于e&#xff1a; #include <stdio.h> #include <math.h>double funcos( double e, double x );int main() { double e, x;scanf("%lf %lf", &…

JDBC批處理executeBatch

JDBC運行SQL聲明&#xff0c;有兩個處理接口&#xff0c;一PreparedStatement,Statement,一般程序JDBC有多少仍然比較PreparedStatement 只要運行批處理&#xff0c;PreparedStatement少一點Statement ps conn.prepareStatement(sql); for(int i 0;i<10;i){ ps.setString(…