先编写拦截器类
拦截器类有两种实现方式(参考自https://blog.csdn.net/u013905744/article/details/78335001):
1.一种是实现HandlerInterceptor 接口
public class MyInterceptor1 implements HandlerInterceptor {
//该方法在action执行前执行,可以实现对数据的预处理,
// 比如:编码、安全控制等。如果方法返回true,则继续执行action。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {
System.out.println("MyInterceptor1 action之前执行!!!");
return true; //继续执行action
}
////该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
modelAndView) throws Exception {
System.out.println("MyInterceptor1 action执行之后,生成视图之前执行!!");
}
//最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。
//因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1 最后执行!!!一般用于释放资源!!");
}
}
2.另一种是继承HandlerInterceptorAdapter:
public class MyInterceptor2 extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {
System.out.println("MyInterceptor2.preHandle()");
return true; //继续执行action
}
}
举一个我自己写的登录拦截器:
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
// 请求之前的处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
// 没登陆则转到/admin,即会访问登录页面
request.setAttribute("message", "您还没有登录,请先登录!");
request.getRequestDispatcher("/admin").forward(request, response);
return false;
}
return true;
}
}
个人感觉区别在于继承拦截器的适配器可以使重写的方法少一些,对于只需要preHandle方法的功能如登录拦截,使用继承适配器可能使代码更简洁。
接下来在配置类中配置拦截的路径
我这里因为做的博客项目,只需要拦截后台管理界面(/admin),前台展示界面是不需要拦截的,可根据实际需要设置。
@Configuration
public class LoginInterceptorConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/admin/**") // 这个是拦截的路径
.excludePathPatterns("/admin") // 下面两个是不拦截的路径
.excludePathPatterns("/admin/login");
}
}
另外,在SSM项目中可能需要配置xml文件去配置拦截路径。这里就不展示了,都比较类似。