springboot項目中,攔截器可以用作以下用途:
- 用於登錄驗證;
- 性能檢查;
- 日誌記錄;
以登錄驗證爲例:
需要重寫一個攔截器、寫一個配置類
重寫攔截器代碼如下(攔截器在controller之前執行)
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (user == null){
request.setAttribute("msg","當前沒有權限,請先登錄");
request.getRequestDispatcher("/login").forward(request,response);
return false;//流程中斷
}else {
return true;//流程繼續
}
}
}
配置類代碼:addPathPatterns//這個是添加攔截路徑,excludePathPatterns這個是排除攔截的路徑多個路徑中間用逗號隔開
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加自定義攔截器,添加攔截路徑和排除攔截路徑
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/","/index.html","/login","/userLogin","/static/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}
}
controller
@Controller
public class LoginController {
@PostMapping("/userLogin")
public String userLogin(String username, String password, Model model,HttpSession session){
if (!StringUtils.isEmpty(username) && "123456".equals(password)){
//記錄登錄狀態
session.setAttribute("user",username);
//跳轉到主頁
return "redirect:main.html";
}else {
model.addAttribute("msg","用戶名或密碼錯誤");
return "login";
}
}
}