基于上一篇Web應(yīng)用實(shí)現(xiàn)登陸攔截功能烤礁,未登陸用戶訪問(wèn)主頁(yè)面自動(dòng)跳轉(zhuǎn)至登陸頁(yè)。實(shí)現(xiàn)過(guò)程如下:
HandlerInterceptor是SpringWebMVC的攔截器继榆,類似于Servlet開(kāi)發(fā)中的過(guò)濾器Filter亮元,用于對(duì)請(qǐng)求進(jìn)行攔截和處理⊙罚可以應(yīng)用如下場(chǎng)景:
1绵估、權(quán)限檢查:如檢測(cè)請(qǐng)求是否具有登錄權(quán)限,如果沒(méi)有直接返回到登陸頁(yè)面卡骂。
2国裳、性能監(jiān)控:用請(qǐng)求處理前和請(qǐng)求處理后的時(shí)間差計(jì)算整個(gè)請(qǐng)求響應(yīng)完成所消耗的時(shí)間。
3全跨、日志記錄:可以記錄請(qǐng)求信息的日志缝左,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)等浓若。
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的用戶登陸攔截新建類LoginInterceptor實(shí)現(xiàn)HandlerInterceptor接口渺杉,實(shí)現(xiàn)內(nèi)容代碼:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (user == null || user.equals("")) {
response.sendRedirect("/index.html");
return false;
}
return true;
}
}
preHandle:在請(qǐng)求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前)
postHandle:請(qǐng)求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)
afterCompletion:在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用挪钓,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作)
在Spring Boot 1.5版本都是靠重寫(xiě)WebMvcConfigurerAdapter的方法來(lái)添加自定義攔截器是越,消息轉(zhuǎn)換器等。SpringBoot 2.0 后诵原,該類被標(biāo)記為@Deprecated英妓。因此我們只能靠實(shí)現(xiàn)WebMvcConfigurer接口來(lái)實(shí)現(xiàn)。
新建類WebMvcConfg實(shí)現(xiàn)WebMvcConfigurer接口绍赛,
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
public final static String SESSION_KEY = "user";
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/emp/**","/main.html").excludePathPatterns("/index.html");
}
}
UserController部分:
@Controller
@RequestMapping("/user/*")
public class UserController {
@Autowired
UserService userService;
@Autowired
HttpServletRequest request;
@Autowired
HttpServletResponse response;
@RequestMapping("/login")
public String login(HttpSession session) throws Exception {
String str = "";
String username= request.getParameter("username");
String password= request.getParameter("password");
Map<String, Object> map = new HashMap<String, Object>();
map.put("username",username);
map.put("password", password);
if(userService.login(map)) {
Cookie c1 = new Cookie("loginName", username);
c1.setPath("/");
response.addCookie(c1);
session.setAttribute("user",WebMvcConfg.SESSION_KEY);
str = "redirect:/main.html";
}else {
str = "redirect:/index.html";
}
return str;
}
@RequestMapping("/logout")
public String logout() {
HttpSession session = request.getSession();
session.removeAttribute("user");
return "redirect:/index.html";
}
}
啟動(dòng)項(xiàng)目蔓纠,訪問(wèn)登陸頁(yè),登陸后正常使用吗蚌。退出登陸腿倚,訪問(wèn)主頁(yè)自動(dòng)跳轉(zhuǎn)至登陸頁(yè)。
總結(jié)一下蚯妇,實(shí)現(xiàn)自定義攔截器簡(jiǎn)單以下幾個(gè)步驟:
1敷燎、創(chuàng)建我們自己的攔截器類并實(shí)現(xiàn) HandlerInterceptor 接口暂筝。
2、創(chuàng)建一個(gè)Java類實(shí)現(xiàn)WebMvcConfigurer接口硬贯,并重寫(xiě) addInterceptors 方法焕襟。
2、實(shí)例化我們自定義的攔截器饭豹,然后將對(duì)象手動(dòng)添加到攔截器鏈中(在addInterceptors方法中添加)鸵赖。