最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1.DispatcherServlet

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

DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請(qǐng)求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來的請(qǐng)求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller來處理。  所以我們現(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)資源的訪問是沒有問題的,但是如果配置攔截了所有的請(qǐng)求(如我們上面配置的“/”),就會(huì)造成js文件、css文件、圖片文件等靜態(tài)資源無法訪問。

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

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

<!-- 該servlet為tomcat,jetty等容器提供,將靜態(tài)資源映射從/改為/static/目錄,如原來訪問 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",則需要通過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> 

我的攔截邏輯是“在未登錄前,任何訪問url都跳轉(zhuǎn)到login頁面;登錄成功后跳轉(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è)攔截器往回執(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頁面!"); 
      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ì)象,保存和加密頁面,取出等功能。

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

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

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

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

相關(guān)文章

  • 詳解Maven私服Nexus的安裝與使用

    詳解Maven私服Nexus的安裝與使用

    這篇文章主要介紹了詳解Maven私服Nexus的安裝與使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java如何輸出windows中的全部漢字

    Java如何輸出windows中的全部漢字

    這篇文章主要介紹了Java如何輸出windows中的全部漢字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java自動(dòng)拆裝箱簡(jiǎn)單介紹

    Java自動(dòng)拆裝箱簡(jiǎn)單介紹

    這篇文章主要為大家詳細(xì)介紹了Java自動(dòng)拆裝箱的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • springboot?yml配置文件值注入方式

    springboot?yml配置文件值注入方式

    這篇文章主要介紹了springboot?yml配置文件值注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 解決微服務(wù)下Mybatis?xml無效綁定問題及分析Invalid?bound?statement

    解決微服務(wù)下Mybatis?xml無效綁定問題及分析Invalid?bound?statement

    這篇文章主要介紹了解決微服務(wù)下Mybatis?xml無效綁定問題及分析Invalid?bound?statement,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java redis 實(shí)現(xiàn)簡(jiǎn)單的用戶簽到功能

    java redis 實(shí)現(xiàn)簡(jiǎn)單的用戶簽到功能

    這篇文章主要介紹了java redis 實(shí)現(xiàn)簡(jiǎn)單的用戶簽到功能,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 使用idea的database模塊繪制數(shù)據(jù)庫er圖的方法

    使用idea的database模塊繪制數(shù)據(jù)庫er圖的方法

    這篇文章主要介紹了使用idea的database模塊繪制數(shù)據(jù)庫er圖,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 圖文詳解Java中class的初始化順序

    圖文詳解Java中class的初始化順序

    網(wǎng)上有很多關(guān)于Java中class的初始化順序文章,但是本文通過圖文更加詳細(xì)的介紹了Java中class的初始化順序,并對(duì)class的裝載順序進(jìn)行了講解,下面一起來看看。
    2016-08-08
  • java TreeUtil菜單遞歸工具類

    java TreeUtil菜單遞歸工具類

    這篇文章主要為大家詳細(xì)介紹了java TreeUtil菜單遞歸工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • java實(shí)現(xiàn)支付寶退款功能

    java實(shí)現(xiàn)支付寶退款功能

    這篇文章主要為大家詳細(xì) 介紹了java實(shí)現(xiàn)支付寶退款功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評(píng)論

美姑县| 东兰县| 乐平市| 合江县| 榆社县| 马公市| 闵行区| 磴口县| 镇坪县| 宜君县| 忻州市| 礼泉县| 东台市| 巴林左旗| 珲春市| 滨州市| 十堰市| 连山| 锦屏县| 镇平县| 夏河县| 遵义市| 沭阳县| 安仁县| 刚察县| 望都县| 汉源县| 明溪县| 安国市| 治县。| 璧山县| 靖边县| 抚州市| 建瓯市| 婺源县| 凌云县| 广汉市| 呈贡县| 香格里拉县| 昌江| 固原市|