一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - 詳解SpringMVC攔截器(資源和權限管理)

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

2020-07-11 14:06tonytfjing JAVA教程

本篇文章主要介紹了SpringMVC攔截器(資源和權限管理),具有一定的參考價值,有興趣的可以了解一下。

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

1.DispatcherServlet

SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet。

DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller來處理。  所以我們現在web.xml中加入以下配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 初始化 DispatcherServlet時,該框架在 web應用程序WEB-INF目錄中尋找一個名為[servlet-名稱]-servlet.xml的文件,
     并在那里定義相關的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>
   <!-- 所有的的請求,都會被DispatcherServlet處理 -->
   <url-pattern>/</url-pattern>
  </servlet-mapping>

 2.靜態資源不攔截

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

一般實現攔截器主要是為了權限管理,主要是攔截一些url請求,所以不對靜態資源進行攔截。要過濾掉靜態資源一般有兩種方式,

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

?
1
2
3
4
5
6
7
8
9
<!-- 該servlet為tomcat,jetty等容器提供,將靜態資源映射從/改為/static/目錄,如原來訪問 http://localhost/foo.css ,現在http://localhost/static/foo.css -->
<!-- 不攔截靜態文件 -->
<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  默認 Servlet的名字 -- "default"

Resin 默認 Servlet的名字 -- "resin-file"

WebLogic 默認 Servlet的名字  -- "FileServlet"

WebSphere  默認 Servlet的名字 -- "SimpleFileServlet"

如果你所有的Web應用服務器的默認Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:

?
1
<mvc:default-servlet-handler default-servlet-name="所使用的Web服務器默認使用的Servlet名稱" />

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

?
1
2
3
<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對應提供了三個preHandle,postHandle,afterCompletion方法。preHandle在業務處理器處理請求之前被調用,

postHandle在業務處理器處理請求執行完成后,生成視圖之前執行,afterCompletion在DispatcherServlet完全處理完請求后被調用,可用于清理資源等 。所以要想實現自己的權限管理邏輯,需要繼承HandlerInterceptorAdapter并重寫其三個方法。

首先在springmvc.xml中加入自己定義的攔截器我的實現邏輯CommonInterceptor,

?
1
2
3
4
5
6
7
8
9
10
11
  <!--配置攔截器, 多個攔截器,順序執行 -->
<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>
  <!-- 當設置多個攔截器時,先按順序調用preHandle方法,然后逆序調用每個攔截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  /**
 *
 */
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;  
  
 */
  /**
   * 在業務處理器處理請求之前被調用
   * 如果返回false
   *   從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈
   * 如果返回true
   *  執行下一個攔截器,直到所有的攔截器都執行完畢
   *  再執行被攔截的Controller
   *  然后進入攔截器鏈,
   *  從最后一個攔截器往回執行所有的postHandle()
   *  接著再從最后一個攔截器往回執行所有的afterCompletion()
   */ 
  @Override 
  public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 
    if ("GET".equalsIgnoreCase(request.getMethod())) {
      RequestUtil.saveRequest();
    }
    log.info("==============執行順序: 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:跳轉到login頁面!");
      request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
      return false;
    }else
      return true;  
  
  
  /**
   * 在業務處理器處理請求執行完成后,生成視圖之前執行的動作 
   * 可在modelAndView中加入數據,比如當前時間
   */
  @Override 
  public void postHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception {  
    log.info("==============執行順序: 2、postHandle================"); 
    if(modelAndView != null){ //加入當前時間 
      modelAndView.addObject("var", "測試postHandle"); 
    
  
  
  /**
   * 在DispatcherServlet完全處理完請求后被調用,可用于清理資源等 
   
   * 當有攔截器拋出異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion()
   */
  @Override
  public void afterCompletion(HttpServletRequest request, 
      HttpServletResponse response, Object handler, Exception ex) 
      throws Exception { 
    log.info("==============執行順序: 3、afterCompletion================"); 
  
 

注:上述代碼里我寫了一個RequestUtil,主要實現獲取當前Request、Session對象,保存和加密頁面,取出等功能。

至此,攔截器已經實現了,效果如圖:

我直接訪問/test/hello,會被攔截

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

登錄成功后會跳轉至/test/hello對應的頁面

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/tonytfjing/article/details/39207551

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 婷射吧 | 青青草原国产 | 欧美xxoo黑人又粗暴 | 91热国内精品永久免费观看 | 白丝h视频 | 亚洲欧美日韩国产一区二区精品 | 深夜免费在线视频 | 午夜影院在线免费观看 | 久久视频这有精品63在线国产 | 亚洲六月丁香婷婷综合 | 4hu影院在线观看 | 午夜在线a亚洲v天堂网2019 | 日本伊人色综合网 | 久久久无码精品无码国产人妻丝瓜 | 大ji吧快给我别停受不了视频 | 亚洲精品永久免费 | 日本xxoo动图网站欧美 | 九九热免费在线观看 | 丝袜白浆 | 全彩成人18h漫画 | 欧美亚洲国产另类 | 全彩成人18h漫画 | 撕开老师的丝袜白丝扒开粉嫩的小 | 日韩欧一级毛片在线播无遮挡 | 人人擦| 亚洲精品卡一卡2卡3卡4卡 | 91精品国产综合久久 | 日本一区二区三区在线 观看网站 | 女人狂吮男人命根gif视频 | 午色影院 | 色欲麻将 | 亚洲国产成人久久综合区 | 乌克兰13一14娇小 | 北岛玲亚洲一区在线观看 | 我的好妈妈7中字在线观看韩国 | 大胸纲手被羞羞漫画网站 | 精品久久香蕉国产线看观看麻豆 | 四虎精品视频在线永久免费观看 | 69日本xxxx| 女人张开腿让男人桶爽 | 91在线老王精品免费播放 |