简介: HandlerInterceptor是SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。通过实现该接口自定义拦截器,进行登录拦截。
引用: https://blog.csdn.net/echo0127/article/details/109160784
自定义拦截器:UserLoginInterceptor
public class UserLoginInterceptor implements HandlerInterceptor {
/***
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器的preHandle方法");
//如果返回值为false时,被请求时,拦截器执行到此处将不会继续操作
//如果返回值为true时,请求将会继续执行后面的操作(继续执行后续的controller)
return false;
}
/***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行了拦截器的postHandle方法");
}
/***
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行
* (主要用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行了拦截器的afterCompletion方法");
}
}
由于登录拦截是请求前进行操作的,这里主要还是通过覆写preHandle方法
我这里使用session保存了user的信息,通过判断user是否为空来判断是否登录
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器的preHandle方法");
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
User user = (User) session.getAttribute("user");
if (user != null) {
return true;
}
response.sendRedirect(request.getContextPath() + "login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
后端登录处理器,我这里使用了mybatis进行数据库查询用户的用户名和密码是否输入正确
主要还是通过request.getSession().setAttribute()来保存user
@RequestMapping("/doLogin")
@ResponseBody
public String doLogin(User user, Model model, HttpServletRequest request) {
List<User> u = mapper.findByUP(user.getUsername(), user.getPassword());
if (!u.isEmpty()) {
model.addAttribute("user", user);
request.getSession().setAttribute("user", user);
return "success";
}
return "failed";
}
前面说过,HandlerInterceptor是SpringWebMVC的处理器拦截器。
我们自定义了拦截器,需要在WebMvcConfigurer进行添加。
接下来,展示下WebMvcConfigurer接口的常用方法
/* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
*静态资源处理
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/**
*这里配置视图解析器
**/
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
这里只为了添加拦截器,只需要覆写addInterceptors方法即可
首先,添加一个配置类,实现WebMvcConfigurer接口
然后,添加拦截器,配置拦截规则。
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册UserLoginInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(
new UserLoginInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/login", //登录路径
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css" //css静态资源
);
}
}
至此,本次的小功能就到此结束了。