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