91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在SpringBoot2中整合攔截器

發布時間:2021-06-08 17:39:05 來源:億速云 閱讀:232 作者:Leah 欄目:編程語言

如何在SpringBoot2中整合攔截器?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

首先聲明一下,這里所說的攔截器是 SpringMVC 的攔截器(HandlerInterceptor)。使用SpringMVC 攔截器需要做如下操作:

創建攔截器類需要實現 HandlerInterceptor

在 xml 配置文件中配置該攔截器,具體配置代碼如下:

<mvc:interceptors>
 <mvc:interceptor>
 <!-- /test/** 這個是攔截路徑以/test開頭的所有的URL-->
 <mvc:mapping path="/**"/><!—這個是攔截所有的路徑-->
 <!-- 配置攔截器類路徑-->
 <bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean>
 <!-- 配置不攔截器URL路徑-->
 <mvc:exclude-mapping path="/fore/**"/>
 </mvc:interceptor>
</mvc:interceptors>

因為在SpringBoot 中沒有 xml 文件,所以SpringBoot 為我們提供 Java Config 的方式來配置攔截器。配置方式有2種:

  1. 繼承 WebMvcConfigurerAdapter (官方已經不建議使用)

  2. 實現 WebMvcConfigurer

接下來開始 SpringBoot 整合攔截器操作詳細介紹!

整合攔截器實戰操作

第一步:聲明攔截器類

通過實現 HandlerInterceptor 來完成。具體代碼如下:

public class LoginInterceptor implements HandlerInterceptor{}

第二步:實現 HandlerInterceptor 3 個攔截方法

  • preHandle:Controller邏輯執行之前進行攔截

  • postHandle:Controller邏輯執行完畢但是視圖解析器還未進行解析之前進行攔截

  • afterCompletion:Controller邏輯和視圖解析器執行完畢進行攔截

實際開發中 preHandle 使用頻率比較高,postHandle 和 afterCompletion操作相對比較少。在下面的代碼中 preHandle 方法中定義攔截所有訪問項目 url 并進行日志信息記錄。

postHandle 中在視圖解析前進行攔截,通過 Model 再次添加數據到 Request域中。

afterCompletion 暫時沒有想到使用場景,如果有使用過的場景可以在下面評論區中進行評論。

攔截器詳細代碼如下:

public class LoginInterceptor implements HandlerInterceptor{
 
 private Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
 
 //ControllerController邏輯執行之前
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 log.info("preHandle....");
 String uri = request.getRequestURI();
 log.info("uri:"+ uri);
 if (handler instanceof HandlerMethod) {
  HandlerMethod handlerMethod = (HandlerMethod) handler;
  log.info("攔截 Controller:"+ handlerMethod.getBean().getClass().getName());
  log.info("攔截方法:"+handlerMethod.getMethod().getName());
 }
 
 return true;
 }
 
 //Controller邏輯執行完畢但是視圖解析器還未進行解析之前
  @Override
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
   log.info("postHandle....");
   Map<String,Object>map=modelAndView.getModel();
 map.put("msg","postHandle add msg");
  }
  
  //Controller邏輯和視圖解析器執行完畢
  @Override
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
   log.info("afterCompletion....");
  }
}

第三步:Java Config 的方式來配置攔截器

繼承 WebMvcConfigurerAdapter 方式

通過繼承 WebMvcConfigurerAdapter 并重寫 addInterceptors方法,通過其參數 InterceptorRegistry 將攔截器注入到 Spring的上下文中。

另外攔截路徑和不攔截的路徑通過InterceptorRegistry 的 addPathPatterns 和 excludePathPatterns 方法進行設置。

繼承 WebMvcConfigurerAdapter 方式官方已經不建議使用,因為官方已將 WebMvcConfigurerAdapter 標記為@Deprecated 了。

@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

繼承 WebMvcConfigurerAdapter 方式具體代碼如下:

@Configuration
 public class InterceptorConfigByExtendsWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{
 
 @Bean
  public LoginInterceptor loginInterceptor(){
    return new LoginInterceptor();
  }
 
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
  }
}

實現 WebMvcConfigurer 方式

通過實現 WebMvcConfigurer 接口 并實現 addInterceptors方法,其他操作和繼承 WebMvcConfigurerAdapter 方式一樣。具體代碼如下:

@Configuration
public class InterceptorConfigByImplWebMvcConfigurer implements WebMvcConfigurer{
 
 @Bean
  public LoginInterceptor loginInterceptor(){
    return new LoginInterceptor();
  }
 @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
  }
}

測試

編寫普通Controller,具體代碼如下:

@Controller
public class IndexController {
 
 @GetMapping("/index")
 public String index(ModelAndView modelAndView){
 
 return "index";
 }
}

在 src/main/resource 下的 templates 目錄下創建 IndexController 訪問頁面 index.ftl, 代碼如下:

<h2>${msg}</h2>

由于我這里使用的是 Freemarker 當頁面使用,所以需要引入 freemarker starter依賴,具體點如下:

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-freemarker</artifactId>
 </dependency>

通過游覽器訪問 localhost:8080/sbe/index,具體訪問效果如下:

如何在SpringBoot2中整合攔截器

如上圖所示在視圖解析前通過 Model 再次添加數據到 Request域中的msg 成功顯示出來了!

日志輸出信息如下:(攔截地址和攔截Controller 和具體方法進行日志輸出)

2019-09-24 15:53:04.144  INFO 7732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/sbe]    : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-24 15:53:04.145  INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-09-24 15:53:04.153  INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : preHandle....
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : uri:/sbe/index
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : 攔截 Controller:cn.lijunkui.controller.IndexController
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : 攔截方法:index
2019-09-24 15:53:04.156  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : postHandle....
2019-09-24 15:53:04.161  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : afterCompletion....

關于如何在SpringBoot2中整合攔截器問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禹州市| 江华| 丰都县| 大宁县| 周宁县| 含山县| 苍山县| 长宁县| 名山县| 广河县| 贵定县| 鹤峰县| 锦州市| 麻阳| 象州县| 辉南县| 左贡县| 桓仁| 临西县| 华安县| 济南市| 通城县| 龙里县| 南和县| 灵丘县| 洪泽县| 项城市| 天柱县| 五莲县| 夏津县| 泉州市| 洮南市| 沅陵县| 广州市| 巴彦淖尔市| 河南省| 调兵山市| 隆德县| 呈贡县| 朝阳县| 山丹县|