springMVC 攔截器簡單配置

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

<beans...>  html



    ... java

    <bean id="measurementInterceptor"   web

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

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

        <property name="interceptors"mvc

            <list>  app

                <ref bean="measurementInterceptor"/>  ide

            </list>  post

        </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

相關文章
相關標籤/搜索