javascript
spring mvc拦截器_Spring MVC拦截器示例
spring mvc攔截器
我認(rèn)為現(xiàn)在是時候看看Spring的MVC攔截器機制了,這種機制已經(jīng)存在了很多年,并且是一個非常有用的工具。Spring Interceptor會按照提示說:在傳入的HTTP請求到達(dá)您的Spring MVC控制器類之前對其進(jìn)行攔截,或者相反,在它離開控制器之后但在將其反饋給瀏覽器之前,截取該發(fā)出的HTTP響應(yīng)。
您可能會問這對您有什么用? 答案是,它允許您執(zhí)行每個請求或一組請求通用的任務(wù),而無需將“ n”粘貼樣板代碼切成每個控制器類。 例如,您可以在請求到達(dá)控制器之前執(zhí)行用戶身份驗證,如果成功,則從數(shù)據(jù)庫中檢索一些其他用戶詳細(xì)信息,然后在調(diào)用控制器之前將其添加到HttpServletRequest對象。 然后,您的控制器可以簡單地檢索和使用這些值,或者將其留給JSP顯示。 另一方面,如果身份驗證失敗,則可以將用戶重定向到其他頁面。
演示代碼向您展示如何在傳入的HttpServletRequest對象到達(dá)您的控制器之前對其進(jìn)行修改。 這無非是向請求中添加一個簡單的字符串,但是,正如我上面所說,您始終可以進(jìn)行數(shù)據(jù)庫調(diào)用以獲取每個請求所需的一些數(shù)據(jù)……您甚至可以添加某種優(yōu)化并做一些此時進(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} }在上面的代碼中,我通過擴展HandlerInterceptorAdaptor類(覆蓋preHandle(..)方法)選擇了最簡單的實現(xiàn)方法。 我的preHandle(...)方法執(zhí)行錯誤處理,確定發(fā)生錯誤時的處理方式,如果發(fā)生錯誤則返回false。 返回false時,攔截器鏈會斷開,并且不會調(diào)用您的控制器類。 處理請求對象的實際工作被委托給updateRequest(request)。
HandlerInterceptorAdaptor類具有三個方法,每個方法都被存根,如果需要,可以忽略。 這些方法是:prehandle(...),postHandle(...)和afterCompletion(...),有關(guān)這些的更多信息可以在Spring API文檔中找到 。 請注意,這可能有些令人困惑,因為Handler Interceptor類文檔仍通過其Spring 2處理程序名稱引用MVC控制器類。 如果您查看prehandle(…)的Object類型的第三個參數(shù)(稱為處理程序),就很容易說明這一點。 如果在調(diào)試器中進(jìn)行檢查,您將看到它是控制器類的實例。 如果您不熟悉這項技術(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演示了向所有請求URL添加攔截器的一種或一種選擇,或者,如果您查看注釋掉的部分,則向特定的請求URL添加攔截器,從而允許您選擇將哪些URL連接到您的攔截器類。
鷹眼的讀者可能已經(jīng)注意到,攔截器類使用繼承和XML配置作為其實現(xiàn)方法。 在配置方面的常規(guī)情況下,這種模式看起來有些疲憊,并且可能需要進(jìn)行大修。 一種建議是使用已添加到控制器機制中的相同技術(shù)來增強整體以使用注釋。 這將增加額外的靈活性,而不會導(dǎo)致使用所有接口和抽象基類復(fù)雜化。 作為建議,將來的攔截器類實現(xiàn)可能如下所示:
@Intercept(value = "/gb/en/*", method = RequestMethod.POST)public boolean myAuthenticationHandler(HttpServletRequest request,Model model) {// Put some code here}這樣就結(jié)束了對Spring攔截器的研究,應(yīng)該記住,我只是展示了最基本的實現(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
spring mvc攔截器
總結(jié)
以上是生活随笔為你收集整理的spring mvc拦截器_Spring MVC拦截器示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一家人分两次上坟对谁不好(上坟一家人可不
- 下一篇: Spring 3使用JUnit 4进行测