javascript
Spring MVC拦截器示例
Spring Interceptor會(huì)按照提示進(jìn)行操作:在傳入的HTTP請(qǐng)求到達(dá)您的Spring MVC控制器類之前對(duì)其進(jìn)行攔截,或者相反,在其離開您的控制器之后但在將其反饋給瀏覽器之前,對(duì)其進(jìn)行攔截。
您可能會(huì)問這對(duì)您有什么用? 答案是,它允許您執(zhí)行每個(gè)請(qǐng)求或一組請(qǐng)求共有的任務(wù),而無需將“ n”粘貼樣板代碼切成每個(gè)控制器類。 例如,您可以在請(qǐng)求到達(dá)控制器之前執(zhí)行用戶身份驗(yàn)證,如果成功,則從數(shù)據(jù)庫中檢索一些其他用戶詳細(xì)信息,然后在調(diào)用控制器之前將其添加到HttpServletRequest對(duì)象。 然后,您的控制器可以簡(jiǎn)單地檢索和使用這些值,或?qū)⑵淞艚oJSP顯示。 另一方面,如果身份驗(yàn)證失敗,則可以將用戶重定向到其他頁面。
演示代碼向您展示如何在傳入的HttpServletRequest對(duì)象到達(dá)控制器之前對(duì)其進(jìn)行修改。 這無非是向請(qǐng)求中添加一個(gè)簡(jiǎn)單的字符串,但是,正如我上面所說,您始終可以進(jìn)行數(shù)據(jù)庫調(diào)用來獲取每個(gè)請(qǐng)求所需的一些數(shù)據(jù)……您甚至可以添加某種優(yōu)化并進(jìn)行一些處理此時(shí)進(jìn)行緩存。
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} }在上面的代碼中,我通過擴(kuò)展HandlerInterceptorAdaptor類(覆蓋preHandle(..)方法)選擇了最簡(jiǎn)單的實(shí)現(xiàn)方法。 我的preHandle(...)方法進(jìn)行錯(cuò)誤處理,確定發(fā)生錯(cuò)誤時(shí)的處理方法,如果發(fā)生錯(cuò)誤則返回false。 返回false時(shí),攔截器鏈會(huì)斷開,并且不會(huì)調(diào)用您的控制器類。 與請(qǐng)求對(duì)象混淆的實(shí)際事務(wù)被委托給updateRequest(request)。
HandlerInterceptorAdaptor類具有三個(gè)方法,每個(gè)方法都被存根,如果需要,可以忽略。 這些方法是:prehandle(…),postHandle(…)和afterCompletion(…),有關(guān)這些的更多信息可以在Spring API文檔中找到 。 請(qǐng)注意,這可能會(huì)造成一些混亂,因?yàn)镠andler Interceptor類文檔仍通過它們的Spring 2處理程序名稱來引用MVC控制器類。 如果您查看prehandle(…)的Object類型的第三個(gè)參數(shù)(稱為處理程序),則很容易證明這一點(diǎn)。 如果在調(diào)試器中進(jìn)行檢查,您將看到它是控制器類的實(shí)例。 如果您不熟悉這項(xiàng)技術(shù),請(qǐng)記住該控制器==處理程序。
與往常一樣,實(shí)現(xiàn)攔截器的下一步是向Spring XML配置文件中添加一些內(nèi)容:
<!-- 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演示了向所有請(qǐng)求URL添加攔截器的一種或一種選擇,或者如果您查看注釋掉的部分,則向特定的請(qǐng)求URL添加攔截器,從而允許您選擇將哪些URL連接到您的攔截器類。
鷹眼的讀者可能已經(jīng)注意到,攔截器類使用繼承和XML配置作為其實(shí)現(xiàn)方法。 在配置方面的常規(guī)情況下,這種模式看起來有些疲憊,并且可能需要進(jìn)行大修。 一種建議是使用已添加到控制器機(jī)制中的相同技術(shù)來增強(qiáng)整體以使用注釋。 這將增加額外的靈活性,而不會(huì)導(dǎo)致使用所有接口和抽象基類的復(fù)雜性。 作為建議,將來的攔截器類實(shí)現(xiàn)可能如下所示:
@Intercept(value = "/gb/en/*", method = RequestMethod.POST)public boolean myAuthenticationHandler(HttpServletRequest request,Model model) {// Put some code here}這樣就結(jié)束了對(duì)Spring攔截器的了解,應(yīng)該記住,我只是展示了最基本的實(shí)現(xiàn)。
參考:來自Captain Debug博客的 JCG合作伙伴 Roger Hughes在MVC Webapp中使用Spring Interceptor 。
相關(guān)文章 :- jqGrid,REST,AJAX和Spring MVC集成
- SpringMVC 3 Tiles 2.2.2集成教程
- Spring MVC3 Hibernate CRUD示例應(yīng)用程序
- Spring MVC開發(fā)–快速教程
- Spring,Quartz和JavaMail集成教程
- Spring Insight – Web應(yīng)用程序分析
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html
總結(jié)
以上是生活随笔為你收集整理的Spring MVC拦截器示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何升级安卓13(如何升级安卓)
- 下一篇: 做短,但做对!