SpringBoot中使用攔截器
第一步:自定義一個攔截器
第二步:在配置類或者配置xml文件中注冊攔截器和指定攔截哪些路徑
1.新建登錄攔截器
新建一個intercepors包,用來裝攔截器。新建登錄攔截器LoginInterceptor.java,用來攔截驗證登錄(就是說沒有登錄過的用戶必須先登錄才能進入網(wǎng)站的其他頁面)
記得要加@Component注解,因為我們需要在下一步的WebAppConfig.java類中注入這個攔截器類
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("開始攔截");
return false;
}
@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.新建配置類WebAppConfig.java
- 新建config包,用來裝初始化文件,在下面新建WebAppConfig.java
- 首先將LoginInterceptor.java注入到WebAppConfig.java中
- 然后在WebAppConfig中注冊攔截器,使其生效。
addPathPatterns 用來設(shè)置攔截路徑,excludePathPatterns 用來設(shè)置白名單,也就是不需要觸發(fā)這個攔截器的路徑。
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
// 這個方法是用來注冊攔截器,我們自己寫好的攔截器是需要添加注冊才能生效
@Override
public void addInterceptors(InterceptorRegistry registry) {
//.addPathPatterns("/**") 攔截所有請求
registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
.excludePathPatterns("/login");
}
// 這個方法是用來配置靜態(tài)資源,比如html,css,js等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
}
3. 測試類
@RestController
public class LoginController {
@RequestMapping("/login")
public String login(){
return "login success";
}
@RequestMapping("/home")
public String home(){
return "hello home";
}
}
運行結(jié)果,如果輸入http://localhost:8080/home,后臺會輸出“開始攔截”;如果輸入http://localhost:8080/login,不會被攔截,正常輸出"login success"
4.登錄攔截器的使用
最簡單的一個登錄攔截器是通過判斷session中是否有用戶信息,當我們第一次登錄成功后,就將自己的信息以鍵值對的形式記錄到session中,第二次登錄時,判斷session中是否有用戶信息,如果有就是已經(jīng)登錄過了,如果沒有就是未登錄。
@Component
public class LoginInterceptor implements HandlerInterceptor {
//這個方法是在訪問接口之前執(zhí)行的,我們只需要在這里寫驗證登陸狀態(tài)的業(yè)務(wù)邏輯,就可以在用戶調(diào)用指定接口之前驗證登陸狀態(tài)了
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//每一個項目對于登陸的實現(xiàn)邏輯都有所區(qū)別,我這里使用最簡單的Session提取User來驗證登陸。
HttpSession session = request.getSession();
//這里的User是登陸時放入session的
User user = (User) session.getAttribute("user");
//如果session中沒有user,表示沒登陸
if (user == null){
//這個方法返回false表示忽略當前請求,如果一個用戶調(diào)用了需要登陸才能使用的接口,如果他沒有登陸這里會直接忽略掉
//當然你可以利用response給用戶返回一些提示信息,告訴他沒登陸
return false;
}else {
return true; //如果session里有user,表示該用戶已經(jīng)登陸,放行,用戶即可繼續(xù)調(diào)用自己需要的接口
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
SSM中使用攔截器
- 攔截器同上
- 配置文件spring.xml
<!--設(shè)置攔截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--攔截哪些路徑-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<!--注冊攔截器-->
<bean class="com.msj.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>