拦截器拦截的是 Controller层 写好的请求
如果自定义@WebServlet(urlPatterns = “/xxx”)是不会被拦截的,因为不是走的DispatcherServlet
package com.atguigu.admin.controller;
import com.atguigu.admin.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@Controller
public class IndexController {
//登陆页面
@GetMapping(value = {"/","/login"})
public String indexController(){
return "login";
}
//首页
@PostMapping("/login")
public String mainTest(User user, HttpSession session, Model model){
//return "main"; 通过/login转发到main页面,
// 刷新当前页面/login,因为是post请求会出现重复提交主页的问题,
// 避免重复提交这种情况使用重定向,这样每次就好刷新main页面,不会产生post提交
if (StringUtils.hasLength(user.getUserName()) && "123456".equals(user.getPassword())){
session.setAttribute("loginUser",user);
return "redirect:/main.html";
}else {
model.addAttribute("msg","登陆失败");
return "/login";
}
}
@GetMapping("/main.html")
public String mainHtml(HttpSession session,Model model){
//设置拦截器
// if (session.getAttribute("loginUser") != null){
// return "main";
// }else {
// model.addAttribute("msg","请登陆账户");
// return "login";
// }
return "main.html";
}
}
- 编写一个拦截器实现HandlerInterceptor接口
- 拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
- 指定拦截规则【如果是拦截所有,静态资源也会被拦截】
package com.atguigu.admin.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 1、编写一个拦截器实现HandlerInterceptor接口
* 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
* 3、指定拦截规则【如果是拦截所有,静态资源也会被拦截】
*/
@Slf4j
public class AdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//打印拦截的所有url
String requestURI = request.getRequestURI();
log.info("拦截的请求是" + requestURI);
HttpSession httpSession = request.getSession();
if (httpSession.getAttribute("loginUser") != null){
return true;
}
/*
httpSession.setAttribute("msg","请登陆");
response.sendRedirect("/login");
问题:无法获取域对象数据,页面没有渲染
解决办法:改用转发的方式跳转到登陆页面
原因:
(转发)RequestDispatcher.forward 方法的调用者与被调用者之间 共享相同的 request 对象和 response 对象 ,
它们属于同一个访问请求和响应过程;
而 (重定向)HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的 request 对象和 response
对象,它们属于两个独立的访问请求和响应过程。
*/
//转到登陆页面
request.setAttribute("msg","请登陆");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
package com.atguigu.admin.config;
import com.atguigu.admin.interceptor.AdminInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AdminConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//将自定义的拦截器添加到容器中
InterceptorRegistration interceptorRegistration = registry.addInterceptor(new AdminInterceptor());
//拦截所有路径,会拦截所有路径 包括静态资源
interceptorRegistration.addPathPatterns("/**");
//放行路径
interceptorRegistration.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");
// WebMvcConfigurer.super.addInterceptors(registry);
}
}