应用场景举例
对于一些网页上,在未登录的情况下,不允许方面里面的内容,必须先登录。但是,一个一个访问请求配置太过于麻烦,所以配置拦截器,也相当于JavaWeb的过滤器,就可以更加便捷。
环境配置
环境时SpringBoot环境,可以直接将之前SpringBoot文章的pom拿过来使用。
基础环境配置
基础环境是两个简单的网页,还有一个js(该js用于测试静态资源是否被拦截器所拦截)
登录页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<form method="post" action="main.html" th:action="@{/index}">
<input type="text" name="username" class="form-control" placeholder="用户名">
<input type="password" name="password" class="form-control" placeholder="密码">
<input type="submit">
</form>
</body>
</html>
登陆后页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<script src="js/main.js"></script>
</body>
</html>
处理登录请求:
@Controller
public class IndexController {
@GetMapping(value = {"/","/login"})
public String loginPage(){
return "login";
}
@PostMapping("/index")
public String indexPage(User user, HttpSession session, Model model){
if("123456".equals(user.getUsername())&& "123456".equals(user.password)){
session.setAttribute("loginUser",user);
return "redirect:main";
}else {
model.addAttribute("msg","账号密码错误");
return "login";
}
}
@GetMapping("/main")
public String mainPage(HttpSession session,Model model){
return "main";
}
}
拦截环境的搭建
首先要创建一个拦截器类实现HandlerInterceptor接口。
拦截器类主要要实现以下三个方法:
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
//目标方法执行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("拦截的请求路径{}",requestURI);
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser!=null){
//放行
return true;
}
request.setAttribute("msg","请登录");
request.getRequestDispatcher("/").forward(request,response);
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 {
}
}
因为拦截器是一个Web功能,对于所有定制Web功能的都 实现 WebMvcConfigurer这个接口。
所以我们需要创建一个配置类,里面写拦截的规则:
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")//默认拦截所有的请求,包括静态资源。
.excludePathPatterns("/","/login","/index");//这些请求不拦截
}
}
对于登录页面,我们不拦截。