1. 程式人生 > >spring boot學習筆記(六)

spring boot學習筆記(六)

今日內容:

  1. 複習攔截器,過濾器
  2. 寫一個實現攔截器的登入功能
  3. 區分攔截器,過濾器

一,複習攔截器,過濾器

1.攔截器

1.攔截器概念
是指通過統一攔截從瀏覽器發出的請求來完成功能的增強,可以是請求前增強,也可以請求後增強。說白了就是在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情,在實現上基於Java的反射機制,屬於面向切面程式設計(AOP)的一種運用。同時一個攔截器例項在一個controller生命週期之內可以多次呼叫。但是缺點是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理

2.使用場景:

1、日誌記錄:記錄請求資訊的日誌,以便進行資訊監控、資訊統計、計算PV(Page View)等。

2、許可權檢查:如登入檢測,進入處理器檢測檢測是否登入,如果沒有直接返回到登入頁面;(待會實現這樣的一個小功能)

3、效能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

4、通用行為:讀取cookie得到使用者資訊並將使用者物件放入請求,從而方便後續流程使 用,還有如提取Locale、Theme資訊等,只要是多個處理器都需要的即可使用攔截器實現。

5、OpenSessionInView:如hibernate,在進入處理器開啟Session,在完成後關閉Session

2.過濾器

1.過濾器概念
依賴於servlet容器。在實現上基於函式回撥,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器例項只能在容器初始化時呼叫一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在過濾器中修改字元編碼;在過濾器中修改HttpServletRequest的一些引數,包括:過濾低俗文字、危險字元等。

2.使用場景
1.統一專案字元編碼
2.過濾非法url請求
3.在過濾器中修改HttpServletRequest的一些引數,包括:過濾低俗文字、危險字元等

二,攔截器實現登入許可權管理

1.先寫一個登入攔截器

@Configuration
public class LoginInterceptor2 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        Logger logger = LoggerFactory.getLogger(getClass());
        HttpSession session = request.getSession();
        logger.info("進入登入攔截器");

        if(session.getAttribute("username")==null){
            logger.info("還沒有登入,返回登入介面");
            response.sendRedirect(request.getContextPath()+"/index.jsp");
            return false;
        }
        logger.info("已經登入");
        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 {

    }
}

2.寫一個攔截器配置類,註冊攔截器

//WebMvcConfigurerAdapter 在spring boot 2.0過期,解決方法:實現WebMvcConfigurer介面
//攔截器配置類,讓spring boot可以掃描到
@Configuration
public class ConfigInterceptor implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor2 loginInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //需要攔截的路徑
        String[] addpathpatterns ={
                "/boot/*"
        };

        //不需要攔截的路徑
        String[] excludepathpatterns = {
                  "/boot/dologin",

        };

        //註冊攔截器
        InterceptorRegistration interceptorRegistry = registry.addInterceptor( loginInterceptor2).
                addPathPatterns(addpathpatterns).excludePathPatterns(excludepathpatterns);
    }
}

3.編寫controller層程式碼

@Controller
public class JspController {


    @RequestMapping("/boot/dologin")
    public String dologin(HttpServletRequest request,Model model, @RequestParam("userName") int userName, @RequestParam("pwd") int pwd){

        Logger logger = LoggerFactory.getLogger(getClass());
        logger.info("dologin");
        HttpSession session = request.getSession();

        if(userName==123 && pwd==123){
            logger.info("if");
            session.setAttribute("username",userName);
            logger.info("msg");
            model.addAttribute("msg","登入成功");
            return "redirect:/boot/hello";
        }
        else{
            logger.info("else");
            return "redirect:/boot/configInfo";
        }
    }

}

第二個

@Controller
public class hellocontroller {

    @RequestMapping("/boot/hello")
    public @ResponseBody String hello(){
        return "hello spring boot";
    }

    @Value("${boot.name}")
    private String name;

    @Value("${boot.location}")
    private String location;

    @Autowired
    private Config config;

    @ResponseBody
    @RequestMapping("/boot/configInfo")
    public String configInfo(){
        String info1=name+"  "+location;
        String info2=config.getName()+"    "+config.getLocation();
        return info2;
    }
}

4.測試一下
先成功登入一下

在這裡插入圖片描述
登入成功,跳轉頁面
在這裡插入圖片描述
登入成功的基礎上,訪問其他頁面,同樣可以跳轉
在這裡插入圖片描述
控制檯日誌輸出:

在這裡插入圖片描述

我們重新開啟瀏覽器,重新登入,但是在登入之前,我們試著去請求另一個頁面
在這裡插入圖片描述
但是結果是失敗的,自動跳轉到登入介面來,必須登入才有操作許可權
在這裡插入圖片描述

控制檯輸出:
在這裡插入圖片描述

三,區分攔截器和過濾器

1.執行流程
在這裡插入圖片描述

多個的時候
在這裡插入圖片描述

2,區別
在這裡插入圖片描述