基于上一篇Web应用实现登陆拦截功能,未登陆用户访问主页面自动跳转至登陆页。实现过程如下:
HandlerInterceptor是SpringWebMVC的拦截器,类似于Servlet开发中的过滤器Filter,用于对请求进行拦截和处理。可以应用如下场景:
1、权限检查:如检测请求是否具有登录权限,如果没有直接返回到登陆页面。
2、性能监控:用请求处理前和请求处理后的时间差计算整个请求响应完成所消耗的时间。
3、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。
实现一个简单的用户登陆拦截新建类LoginInterceptor实现HandlerInterceptor接口,实现内容代码:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (user == null || user.equals("")) {
response.sendRedirect("/index.html");
return false;
}
return true;
}
}
preHandle:在请求处理之前进行调用(Controller方法调用之前)
postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
afterCompletion:在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated。因此我们只能靠实现WebMvcConfigurer接口来实现。
新建类WebMvcConfg实现WebMvcConfigurer接口,
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
public final static String SESSION_KEY = "user";
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/emp/**","/main.html").excludePathPatterns("/index.html");
}
}
UserController部分:
@Controller
@RequestMapping("/user/*")
public class UserController {
@Autowired
UserService userService;
@Autowired
HttpServletRequest request;
@Autowired
HttpServletResponse response;
@RequestMapping("/login")
public String login(HttpSession session) throws Exception {
String str = "";
String username= request.getParameter("username");
String password= request.getParameter("password");
Map<String, Object> map = new HashMap<String, Object>();
map.put("username",username);
map.put("password", password);
if(userService.login(map)) {
Cookie c1 = new Cookie("loginName", username);
c1.setPath("/");
response.addCookie(c1);
session.setAttribute("user",WebMvcConfg.SESSION_KEY);
str = "redirect:/main.html";
}else {
str = "redirect:/index.html";
}
return str;
}
@RequestMapping("/logout")
public String logout() {
HttpSession session = request.getSession();
session.removeAttribute("user");
return "redirect:/index.html";
}
}
启动项目,访问登陆页,登陆后正常使用。退出登陆,访问主页自动跳转至登陆页。
总结一下,实现自定义拦截器简单以下几个步骤:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类实现WebMvcConfigurer接口,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对象手动添加到拦截器链中(在addInterceptors方法中添加)。