激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot攔截器實現對404和500等錯誤的攔截

SpringBoot攔截器實現對404和500等錯誤的攔截

2020-09-07 09:30漫步于成神之路男人 Java教程

本篇文章主要介紹了SpringBoot攔截器實現對404和500等錯誤的攔截,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

今天給大家介紹一下SpringBoot攔截器的用法,相比Struts2中的攔截器,SpringBoot的攔截器就顯得更加方便簡單了。

只需要寫幾個實現類就可以輕輕松松實現攔截器的功能了,而且不需要配置任何多余的信息,對程序員來說簡直是一種福利啊。

廢話不多說,下面開始介紹攔截器的實現過程:

第一步:創建我們自己的攔截器類并實現 HandlerInterceptor 接口。

?
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
package example.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * 自定義攔截器1
 *
 * @author  林志強(208017534)
 * @create  2016年9月20日
 */
@Controller
public class ErrorInterceptor implements HandlerInterceptor {
 
  /**
   * preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行調用,SpringMVC中的Interceptor攔截器是鏈式的,可以同時存在
   * 多個Interceptor,然后SpringMVC會根據聲明的前后順序一個接一個的執行,而且所有的Interceptor中的preHandle方法都會在
   * Controller方法調用之前調用。SpringMVC的這種Interceptor鏈式結構也是可以進行中斷的,這種中斷方式是令preHandle的返
   * 回值為false,當preHandle的返回值為false的時候整個請求就結束了。
   */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    System.out.println(">>>MyInterceptor1>>>>>>>在請求處理之前進行調用(Controller方法調用之前)");
    return true;// 只有返回true才會繼續向下執行,返回false取消當前請求
  }
 
  /**
   * 這個方法只會在當前這個Interceptor的preHandle方法返回值為true的時候才會執行。postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之
   * 后,也就是在Controller的方法調用之后執行,但是它會在DispatcherServlet進行視圖的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操
   * 作。這個方法的鏈式結構跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會后調用,這跟Struts2里面的攔截器的執行過程有點像,
   * 只是Struts2里面的intercept方法中要手動的調用ActionInvocation的invoke方法,Struts2中調用ActionInvocation的invoke方法就是調用下一個Interceptor
   * 或者是調用action,然后要在Interceptor之前調用的內容都寫在調用invoke之前,要在Interceptor之后調用的內容都寫在調用invoke方法之后。
   */
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
              ModelAndView modelAndView) throws Exception {
    System.out.println(">>>MyInterceptor1>>>>>>>請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)");
    if(response.getStatus()==500){
      modelAndView.setViewName("/errorpage/500");
    }else if(response.getStatus()==404){
      modelAndView.setViewName("/errorpage/404");
    }
  }
 
  /**
   * 該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行。該方法將在整個請求完成之后,也就是DispatcherServlet渲染了視圖執行,
   * 這個方法的主要作用是用于清理資源的,當然這個方法也只能在當前這個Interceptor的preHandle方法的返回值為true時才會執行。
   */
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
      throws Exception {
    System.out.println(">>>MyInterceptor1>>>>>>>在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作)");
  }
}

攔截器實現類中幾個函數的作用,以及調用的先后順序都很明確,我這里就不多介紹了。

第二部:創建一個Java類繼承WebMvcConfigurerAdapter,并重寫 addInterceptors 方法。實例化我們自定義的攔截器,然后將對像手動添加到攔截器鏈中(在addInterceptors方法中添加)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package example.configuration;
import example.Interceptor.ErrorInterceptor;
import example.Interceptor.MyInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多個攔截器組成一個攔截器鏈
    // addPathPatterns 用于添加攔截規則
    // excludePathPatterns 用戶排除攔截
    registry.addInterceptor(new ErrorInterceptor()).addPathPatterns("/**");
    super.addInterceptors(registry);
  }
 
}

到這里攔截器就基本實現了,我上面給出的例子中是可以實現對404或者500的攔截。

不過需要注意的是,這種攔截有時候也會出現特別大問題。例如一個網頁中如果需要加載很多的圖片或者js文件資源,可是正好沒有這個資源,也就是找不到這么多個資源報一堆的404錯誤。這個時候如果還是單純的使用這種攔截就會出現null指針異常的情況。

針對這種情況,我研究了一種方法可以解決這樣類似的問題。

解決方案就是:創建一個類并實現ErrorController接口,這樣就可以利用這個類來處理上面發生的問題了。

下面給出代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package example.controller;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainsiteErrorController implements ErrorController {
  private static final String ERROR_PATH = "/error";
  @RequestMapping(value=ERROR_PATH)
  public String handleError(){
    return "errorpage/error";
  }
  @Override
  public String getErrorPath() {
    return ERROR_PATH;
  }
}

這樣就可以實現對404,500等錯誤信息的攔截了,而且也不會發生那種空指針異常的情況了,是不是特別方便啊!

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

原文鏈接:http://blog.csdn.net/linzhiqiang0316/article/details/52600839

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 欧美亚洲国产成人综合在线 | 免费一及片 | 亚洲骚妻 | 久久男人天堂 | www.99热视频 | 一级在线视频 | 午夜视频中文字幕 | 欧美一区二区精品夜夜嗨 | 亚洲免费看片网站 | 久久蜜桃精品一区二区三区综合网 | av免播放| 中文字幕精品一二三四五六七八 | 国产小视频一区 | 有一婷婷色 | 欧美成人se01短视频在线看 | 久久99久久99免费视频 | 国产精品字幕 | 一区二区三区黄色 | 久久免费视频1 | 91一区二区三区久久久久国产乱 | 天堂成人一区二区三区 | 中文字幕电影免费播放 | 久久久久久久久久性 | 成人国产综合 | 色99久久 | 狠狠干夜夜操 | 成人免费看视频 | 午夜视频在线免费 | 欧美一级高清片_欧美高清aa | 91午夜视频| 精品麻豆cm视频在线看 | 在线成人av观看 | 九九热免费精品 | 九九热精品在线 | 欧美成人一区二区三区电影 | 91久久国产露脸精品免费 | 亚洲欧洲日产v特级毛片 | 精品成人免费一区二区在线播放 | 欧美成人鲁丝片在线观看 | 亚欧美一区二区 | 性生活视频软件 |