spring boot學習筆記(六)
今日內容:
- 複習攔截器,過濾器
- 寫一個實現攔截器的登入功能
- 區分攔截器,過濾器
一,複習攔截器,過濾器
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,區別