springMVC 攔截器簡單配置

在spring 3.0甚礎上,起來越多的用到了註解,從前的攔截器在配置文件中需要這樣配置

<beans...> 



    ... 

    <bean id="measurementInterceptor"  

        class="com.apress.springrecipes.court.web.MeasurementInterceptor"/> 

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"

        <property name="interceptors"

            <list> 

                <ref bean="measurementInterceptor"/> 

            </list> 

        </property> 

        ... 

    </bean> 

    <bean class="org.springframework.web.servlet.mvc.support 

       .ControllerClassNameHandlerMapping"

        <property name="interceptors"

            <list> 

                <ref bean="measurementInterceptor"/> 

            </list> 

        </property> 

    </bean> 

    .... 

</beans> 

·        現在用註解只需要這樣:

<mvc:interceptors> 

        <mvc:interceptor> 

            <mvc:mapping path="/*/*.shtml"/>//映射路徑後綴名 

            <bean class="x.x.x.filter.SessionFilter"/>//自定義攔截器 

        </mvc:interceptor> 

    </mvc:interceptors>

SessionFilter.java代碼:

publicclass SessionFilter implements HandlerInterceptor{ 

 

    @Override 

    publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response, Object o) throws Exception{ 

      //  後臺session控制 

        Objectuser=request.getSession().getAttribute("username"); 

        String returnUrl = request.getRequestURI(); 

        if(null==user){ 

            if(returnUrl.equals("/public/getImg.shtml")||returnUrl.equals("/public/checkLogin.shtml")||returnUrl.equals("/public/login.shtml")||returnUrl.equals("/public/logOut.shtml")){ 

                returntrue

           }else

                response.setContentType("text/html"); 

                response.setCharacterEncoding("utf-8"); 

                PrintWriter out =response.getWriter();   

                StringBuilder builder = new StringBuilder();    

                builder.append("<script type=\"text/javascript\"charset=\"UTF-8\">");   

                builder.append("alert(\"請重新登陸!\");");   

                builder.append("window.location.href=\"/public/login.shtml\";");   

                builder.append("</script>");   

               out.print(builder.toString());   

                out.close();   

                returnfalse

            } 

        } 

        returntrue

    } 

 

    @Override 

    publicvoidpostHandle(HttpServletRequest httpServletRequest, HttpServletResponse response,Object o, ModelAndView modelAndView) throws Exception { 

 

    } 

 

    @Override 

    publicvoidafterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse response, Object o, Exception e) throws Exception{ 

 

    } 

 

 

    /** 

     * @paramrequest 

     * @returnCreate Date:2016-07-31 

     * Description:獲取IP 

     */ 

    private String getIpAddr(HttpServletRequestrequest) { 

        String ip = request.getHeader("x-forwarded-for"); 

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

            ip = request.getHeader("Proxy-Client-IP"); 

        } 

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

            ip = request.getHeader("WL-Proxy-Client-IP"); 

        } 

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 

            ip = request.getRemoteAddr(); 

        } 

        return ip; 

    } 

}

這個攔截器的目的就是:用戶所屬的session不存在後進行對控制器請求的攔截,使跳轉到首頁。對於HandlerInterceptor這個類這裏不多說,網上有的可能說的更好,這裏只簡單說下它的三個方法,preHandle、postHandle和afterCompletion。

(1)preHandle(WebRequest request) 方法。該方法將在請求處理之前進行調用,也就是說會在Controller 方法調用之前被調用。這個方法跟HandlerInterceptor中的preHandle 是不同的,主要區別在於該方法的返回值是void,也就是沒有返回值,所以我們一般主要用它來進行資源的準備工作,比如我們在使用hibernate 的時候可以在這個方法中準備一個Hibernate 的Session 對象,然後利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的屬性中。這裏可以說說這個setAttribute 方法的第三個參數scope ,該參數是一個Integer類型的。在WebRequest 的父層接口RequestAttributes 中對它定義了三個常量:

SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以訪問。

SCOPE_SESSION :它的值是1 ,如果環境允許的話它代表的是一個局部的隔離的session,否則就代表普通的session,並且在該session範圍內可以訪問。

SCOPE_GLOBAL_SESSION :它的值是2 ,如果環境允許的話,它代表的是一個全局共享的session,否則就代表普通的session,並且在該session 範圍內可以訪問。

(2)postHandle(WebRequest request, ModelMap model) 方法。該方法將在請求處理之後,也就是在Controller 方法調用之後被調用,但是會在視圖返回被渲染之前被調用,所以可以在這個方法裏面通過改變數據模型ModelMap 來改變數據的展示。該方法有兩個參數,WebRequest 對象是用於傳遞整個請求數據的,比如在preHandle 中準備的數據都可以通過WebRequest 來傳遞和訪問;ModelMap 就是Controller 處理之後返回的Model 對象,我們可以通過改變它的屬性來改變返回的Model 模型。

(3)afterCompletion(WebRequest request, Exception ex) 方法。該方法會在整個請求處理完成,也就是在視圖返回並被渲染之後執行。所以在該方法中可以進行資源的釋放操作。而WebRequest 參數就可以把我們在preHandle 中準備的資源傳遞到這裏進行釋放。Exception 參數表示的是當前請求的異常對象,如果在Controller中拋出的異常已經被spring 的異常處理器給處理了的話,那麼這個異常對象就是是null 。

參考:http://haohaoxuexi.iteye.com/blog/1750680


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章