官方说法:
如果你想要保持Spring Boot 的一些默认MVC特征,同时又想自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),你应该让一个类实现WebMvcConfigurer
,并且添加@Configuration
注解,但是千万不要加@EnableWebMvc
注解。如果你想要自定义HandlerMapping
、HandlerAdapter
、ExceptionResolver
等组件,你可以创建一个WebMvcRegistrationsAdapter
实例 来提供以上组件。如果你想要完全自定义SpringMVC,不保留SpringBoot提供的一切特征,你可以自己定义类并且添加@Configuration
注解和@EnableWebMvc
注解。
总结:所以之后我们需要在config包下新建一个WebMvcConfig类,这个类继承于WebMvcConfigurer类,实现它的addInterceptors方法来添加拦截器。注意要将拦截器类使用@Autowired注入进去
1、controller
@RequestMapping("/user/login")
public String login(
@RequestParam("username") String username,
@RequestParam("password") String password,
Model model, HttpSession session){
//具体的业务:
if (!StringUtils.isEmpty(username) && "123456".equals(password)){
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else {
//告诉用户.你登录失败了!
model.addAttribute("msg","用户名或者密码错误");
return "index";
}
}
2、定义一个拦截器
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor {
// ture 放行
//false 不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录成功之后,应该有用户的session
//通过loginUser获取到用户名
Object loginUser = request.getSession().getAttribute("loginUser");
//判断用户名是否为空
if (loginUser == null){
request.setAttribute("msg","没有权限,请先登录");
//返回页面
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else {
return true;
}
}
}
3、定义配置类,注册拦截器
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns("/**")拦截所有请求
//excludePathPatterns()过滤请求,就是不拦截哪些请求
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login","/asserts/**");
}
}
详细参考: https://blog.youkuaiyun.com/qq_45632660/article/details/113095482