<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot 中對攔截器的簡單使用

          共 4387字,需瀏覽 9分鐘

           ·

          2020-09-10 02:05

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

          66套java從入門到精通實戰(zhàn)課程分享?

          明確需求

          我們的部分接口需要訪問者具有相應(yīng)的權(quán)限才能進行相應(yīng)的訪問,即需要有正確的通行密碼才能放行??吹竭@個需求,相應(yīng)大家腦海中瞬間浮現(xiàn)出一個詞 – 攔截器,確實,我們可以使用攔截器來實現(xiàn)這個需求,下面就讓我來帶領(lǐng)大家一起完成這個任務(wù)吧!

          第一步:實現(xiàn)一個注解

          首先,我們先實現(xiàn)一個注解,這個注解可以被加在方法上面,其主要功能如下:對于加上了這個注解的接口,會對其進行權(quán)限校驗,通過才能執(zhí)行下面的邏輯,否則會直接拋出異常。

          package edu.szu.demo.annotation;
          import java.lang.annotation.*;
          @Target(ElementType.METHOD) // 作用于方法上@Retention(RetentionPolicy.RUNTIME) // 運行期保留@Inherited@Documentedpublic @interface Judge { public boolean need() default true;}

          實現(xiàn)接口

          我們的接口邏輯很簡單,對于傳入的字符串參數(shù),稍作修改便直接返回。而我們的接口使用了之前定義的 @Judge 注解,意味著該接口需要進行校驗。

          package edu.szu.demo.controller;
          import edu.szu.demo.annotation.Judge;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
          @RestControllerpublic class TestController {
          /** * 該方法對傳入數(shù)據(jù)做一定的修改,然后將其返回 * @param judgePassword 通行密碼,通過校驗才放行 * @param name 傳入的數(shù)據(jù) * @return */ @Judge @RequestMapping("/test") public String test(String judgePassword, String name) { return name + " 已被修改"; }}

          實現(xiàn)一個攔截器

          實現(xiàn)攔截器比較簡單,既可以實現(xiàn)接口 HandlerInterceptor ,也可以繼承抽象類 HandlerInterceptorAdapter,在這一步博主選擇了實現(xiàn)接口。

          我們先來看看這個 HandlerInterceptor 接口是何方神圣。

          public interface HandlerInterceptor {    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        return true;    }
          default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { }
          default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { }}
          1. preHandle:在業(yè)務(wù)處理器處理請求之前被調(diào)用,可用于編碼、安全控制、權(quán)限校驗

          2. postHandle:在業(yè)務(wù)處理器處理請求執(zhí)行完成后,生成視圖之前執(zhí)行

          3. afterCompletion:在 DispatcherServlet 完全處理完請求后被調(diào)用,可用于清理資源

          明白了 HandlerInterceptor 的構(gòu)造,我們便可以使用這個接口了。我們定義一個攔截器,該攔截器對于帶有 Judge 注解的請求,會進行判斷,若密碼不為 happy,會直接拋出異常,其余情況均會放行。

          package edu.szu.demo.interceptor;
          import edu.szu.demo.annotation.Judge;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;
          import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
          public class TestInterceptor implements HandlerInterceptor {
          @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; //獲取注解 Judge judge = handlerMethod.getMethod().getAnnotation(Judge.class); if(judge != null && judge.need()) { String getJudgePassword = request.getParameter("judgePassword"); //這里直接寫死,密碼必須設(shè)置為 happy if(!getJudgePassword.equals("happy")) { throw new Exception(); } } return true; }
          @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
          }
          @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
          }}

          注冊攔截器

          然后把我們前面寫好的攔截器注冊一下

          package edu.szu.demo.config;
          import edu.szu.demo.interceptor.TestInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
          @Configurationpublic class WebAppConfigurer implements WebMvcConfigurer {
          @Override public void addInterceptors(InterceptorRegistry registry) { // 攔截所有請求地址 registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**"); }}

          這樣子,我們的需求就已經(jīng)實現(xiàn)了,接下來我們測試一下。

          測試

          在瀏覽器中我們輸入以下 URL:

          localhost:8080/test?judgePassword=happy&name=fdg

          返回結(jié)果如下,可見對于添加了 @Judge 注解的接口,若 judgePassword 設(shè)置為 happy,攔截器會放行。


          然后我們在瀏覽器輸入以下 URL:

          http://localhost:8080/test?judgePassword=not&name=fdg

          返回結(jié)果如下,可見對于添加了 @Judge 注解的接口,若 judgePassword 設(shè)置不為 happy,攔截器會拋出異常。



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/Geffin/article/details/108405165





          ??? ?



          感謝點贊支持下哈?

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩在线视频免费看 | 狠狠躁日日躁夜夜躁 | 免费操B 狠干视频 | 久草免费网站 | 亚洲娇小wite黑人粗大 |