欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解SpringMVC攔截器(資源和權(quán)限管理)

 更新時(shí)間:2016年12月09日 10:56:16   作者:tonytfjing  
本篇文章主要介紹了SpringMVC攔截器(資源和權(quán)限管理),具有一定的參考價(jià)值,有興趣的可以了解一下。

本文主要介紹了SpringMVC攔截器,具體如下:

1.DispatcherServlet

SpringMVC具有統(tǒng)一的入口DispatcherServlet,所有的請(qǐng)求都通過(guò)DispatcherServlet。

DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請(qǐng)求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來(lái)的請(qǐng)求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller來(lái)處理。  所以我們現(xiàn)在web.xml中加入以下配置:

<!-- 初始化 DispatcherServlet時(shí),該框架在 web應(yīng)用程序WEB-INF目錄中尋找一個(gè)名為[servlet-名稱]-servlet.xml的文件, 
     并在那里定義相關(guān)的Beans,重寫在全局中定義的任何Beans --> 
  <servlet> 
   <servlet-name>springMybatis</servlet-name> 
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
   <load-on-startup>1</load-on-startup> 
  </servlet> 
  <servlet-mapping> 
   <servlet-name>springMybatis</servlet-name> 
   <!-- 所有的的請(qǐng)求,都會(huì)被DispatcherServlet處理 --> 
   <url-pattern>/</url-pattern> 
  </servlet-mapping> 

 2.靜態(tài)資源不攔截

如果只配置攔截類似于*.do格式的url,則對(duì)靜態(tài)資源的訪問(wèn)是沒有問(wèn)題的,但是如果配置攔截了所有的請(qǐng)求(如我們上面配置的“/”),就會(huì)造成js文件、css文件、圖片文件等靜態(tài)資源無(wú)法訪問(wèn)。

一般實(shí)現(xiàn)攔截器主要是為了權(quán)限管理,主要是攔截一些url請(qǐng)求,所以不對(duì)靜態(tài)資源進(jìn)行攔截。要過(guò)濾掉靜態(tài)資源一般有兩種方式,

第一種是采用<mvc:default-servlet-handler />,(一般Web應(yīng)用服務(wù)器默認(rèn)的Servlet名稱是"default",所以這里我們激活Tomcat的defaultServlet來(lái)處理靜態(tài)文件,在web.xml里配置如下代碼即可:)

<!-- 該servlet為tomcat,jetty等容器提供,將靜態(tài)資源映射從/改為/static/目錄,如原來(lái)訪問(wèn) http://localhost/foo.css ,現(xiàn)在http://localhost/static/foo.css --> 
<!-- 不攔截靜態(tài)文件 --> 
<servlet-mapping> 
  <servlet-name>default</servlet-name> 
  <url-pattern>/js/*</url-pattern> 
  <url-pattern>/css/*</url-pattern> 
  <url-pattern>/images/*</url-pattern> 
  <url-pattern>/fonts/*</url-pattern> 
</servlet-mapping> 

Tomcat, Jetty, JBoss, and GlassFish  默認(rèn) Servlet的名字 -- "default"

Resin 默認(rèn) Servlet的名字 -- "resin-file"

WebLogic 默認(rèn) Servlet的名字  -- "FileServlet"

WebSphere  默認(rèn) Servlet的名字 -- "SimpleFileServlet"

如果你所有的Web應(yīng)用服務(wù)器的默認(rèn)Servlet名稱不是"default",則需要通過(guò)default-servlet-name屬性顯示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服務(wù)器默認(rèn)使用的Servlet名稱" /> 

第二種是采用<mvc:resources />,在springmvc的配置文件中加入以下代碼:

<mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>  
<mvc:resources mapping="/styles/**" location="/static_resources/css/"/>  
<mvc:resources mapping="/images/**" location="/static_resources/images/"/> 

3.自定義攔截器

SpringMVC的攔截器HandlerInterceptorAdapter對(duì)應(yīng)提供了三個(gè)preHandle,postHandle,afterCompletion方法。preHandle在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用,

postHandle在業(yè)務(wù)處理器處理請(qǐng)求執(zhí)行完成后,生成視圖之前執(zhí)行,afterCompletion在DispatcherServlet完全處理完請(qǐng)求后被調(diào)用,可用于清理資源等 。所以要想實(shí)現(xiàn)自己的權(quán)限管理邏輯,需要繼承HandlerInterceptorAdapter并重寫其三個(gè)方法。

首先在springmvc.xml中加入自己定義的攔截器我的實(shí)現(xiàn)邏輯CommonInterceptor,

  <!--配置攔截器, 多個(gè)攔截器,順序執(zhí)行 --> 
<mvc:interceptors>  
  <mvc:interceptor>  
    <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller --> 
    <mvc:mapping path="/" /> 
    <mvc:mapping path="/user/**" /> 
    <mvc:mapping path="/test/**" /> 
    <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>  
  </mvc:interceptor> 
  <!-- 當(dāng)設(shè)置多個(gè)攔截器時(shí),先按順序調(diào)用preHandle方法,然后逆序調(diào)用每個(gè)攔截器的postHandle和afterCompletion方法 --> 
</mvc:interceptors> 

我的攔截邏輯是“在未登錄前,任何訪問(wèn)url都跳轉(zhuǎn)到login頁(yè)面;登錄成功后跳轉(zhuǎn)至先前的url”,具體代碼如下:

  /** 
 * 
 */ 
package com.alibaba.interceptor; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
 
import com.alibaba.util.RequestUtil; 
 
 
/** 
 * @author tfj 
 * 2014-8-1 
 */ 
public class CommonInterceptor extends HandlerInterceptorAdapter{ 
  private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class); 
  public static final String LAST_PAGE = "com.alibaba.lastPage"; 
  /* 
   * 利用正則映射到需要攔截的路徑   
   
  private String mappingURL; 
   
  public void setMappingURL(String mappingURL) {   
        this.mappingURL = mappingURL;   
  }  
 */ 
  /** 
   * 在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用 
   * 如果返回false 
   *   從當(dāng)前的攔截器往回執(zhí)行所有攔截器的afterCompletion(),再退出攔截器鏈 
   * 如果返回true 
   *  執(zhí)行下一個(gè)攔截器,直到所有的攔截器都執(zhí)行完畢 
   *  再執(zhí)行被攔截的Controller 
   *  然后進(jìn)入攔截器鏈, 
   *  從最后一個(gè)攔截器往回執(zhí)行所有的postHandle() 
   *  接著再?gòu)淖詈笠粋€(gè)攔截器往回執(zhí)行所有的afterCompletion() 
   */  
  @Override  
  public boolean preHandle(HttpServletRequest request,  
      HttpServletResponse response, Object handler) throws Exception {  
    if ("GET".equalsIgnoreCase(request.getMethod())) { 
      RequestUtil.saveRequest(); 
    } 
    log.info("==============執(zhí)行順序: 1、preHandle================");  
    String requestUri = request.getRequestURI(); 
    String contextPath = request.getContextPath(); 
    String url = requestUri.substring(contextPath.length()); 
    
    log.info("requestUri:"+requestUri);  
    log.info("contextPath:"+contextPath);  
    log.info("url:"+url);  
     
    String username = (String)request.getSession().getAttribute("user");  
    if(username == null){ 
      log.info("Interceptor:跳轉(zhuǎn)到login頁(yè)面!"); 
      request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); 
      return false; 
    }else 
      return true;   
  }  
  
  /** 
   * 在業(yè)務(wù)處理器處理請(qǐng)求執(zhí)行完成后,生成視圖之前執(zhí)行的動(dòng)作  
   * 可在modelAndView中加入數(shù)據(jù),比如當(dāng)前時(shí)間 
   */ 
  @Override  
  public void postHandle(HttpServletRequest request,  
      HttpServletResponse response, Object handler,  
      ModelAndView modelAndView) throws Exception {   
    log.info("==============執(zhí)行順序: 2、postHandle================");  
    if(modelAndView != null){ //加入當(dāng)前時(shí)間  
      modelAndView.addObject("var", "測(cè)試postHandle");  
    }  
  }  
  
  /** 
   * 在DispatcherServlet完全處理完請(qǐng)求后被調(diào)用,可用于清理資源等  
   *  
   * 當(dāng)有攔截器拋出異常時(shí),會(huì)從當(dāng)前攔截器往回執(zhí)行所有的攔截器的afterCompletion() 
   */  
  @Override  
  public void afterCompletion(HttpServletRequest request,  
      HttpServletResponse response, Object handler, Exception ex)  
      throws Exception {  
    log.info("==============執(zhí)行順序: 3、afterCompletion================");  
  }  
 
}  

注:上述代碼里我寫了一個(gè)RequestUtil,主要實(shí)現(xiàn)獲取當(dāng)前Request、Session對(duì)象,保存和加密頁(yè)面,取出等功能。

至此,攔截器已經(jīng)實(shí)現(xiàn)了,效果如圖:

我直接訪問(wèn)/test/hello,會(huì)被攔截

登錄成功后會(huì)跳轉(zhuǎn)至/test/hello對(duì)應(yīng)的頁(yè)面

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC文件上傳中要解決的問(wèn)題大匯總

    SpringMVC文件上傳中要解決的問(wèn)題大匯總

    這篇文章主要介紹了SpringMVC文件上傳中要解決的問(wèn)題,主要有中文文件名編碼問(wèn)題,文件位置存儲(chǔ)問(wèn)題以及文件名沖突問(wèn)題等等,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Spring Boot 入門之消息中間件的使用

    Spring Boot 入門之消息中間件的使用

    本篇文章主要介紹了Spring Boot 入門之消息中間件的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • SpringData JPA基本/高級(jí)/多數(shù)據(jù)源的使用詳解

    SpringData JPA基本/高級(jí)/多數(shù)據(jù)源的使用詳解

    這篇文章主要介紹了SpringData JPA基本/高級(jí)/多數(shù)據(jù)源的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實(shí)現(xiàn)貪吃蛇游戲的示例代碼

    Java實(shí)現(xiàn)貪吃蛇游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Eclipse下Javassist正確使用方法代碼解析

    Eclipse下Javassist正確使用方法代碼解析

    這篇文章主要介紹了Eclipse下Javassist正確使用方法代碼解析,javassist-3.15.0-ga.jar包是一款在java開發(fā)中十分重要的jar文件包,需要的朋友可以參考下,文中附下載鏈接。
    2017-12-12
  • Springboot中@Value的使用詳解

    Springboot中@Value的使用詳解

    這篇文章主要介紹了Springboot中@Value的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • spark中使用groupByKey進(jìn)行分組排序的示例代碼

    spark中使用groupByKey進(jìn)行分組排序的示例代碼

    這篇文章主要介紹了spark中使用groupByKey進(jìn)行分組排序的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Java讀寫txt文件代碼實(shí)例

    Java讀寫txt文件代碼實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java讀寫txt文件的相關(guān)資料,近期處理的數(shù)據(jù)規(guī)模比較大,正好又是統(tǒng)計(jì)合并的事情,想著借助excel就可以完成了,然后就了解了下java讀取excel的事情,需要的朋友可以參考下
    2023-09-09
  • spring+netty服務(wù)器搭建的方法

    spring+netty服務(wù)器搭建的方法

    本篇文章主要介紹了spring+netty服務(wù)器搭建的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • springboot自定義stater啟動(dòng)流程

    springboot自定義stater啟動(dòng)流程

    這篇文章主要介紹了springboot自定義stater啟動(dòng)流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論