介绍
拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。
具体操作步骤
拦截器功能,就是一个拦截请求(controller)前中后的操作,登录的时候,把用户信息储存在Session中,没有拦截器的话,你不登录,也可以直接访问你的主页面,添加登录拦截的话,在每个链接前先判断当前用户是否登录存入了一个Session,没有的话,就跳转到登录页面,实现了安全,这里我也是简单的判断了一下,用户是否登录了
一、实现拦截功能(Springboot通过实现HandlerInterceptor接口实现拦截器功能)
preHandle: 预先处理,在目标的controller方法执行之前,进行处理
postHandle: 在目标的controller方法执行之后,到达指定页面之前进行处理
afterCompletion: 在页面渲染之后进行处理
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行前
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//查看了链接中是否存入了名为"teacherInfo"的Session,如果存在就说明已经登录了,执行放行处理
Object loginUser = request.getSession().getAttribute("teacherInfo");
if (loginUser == null) {
//未登录,返回登陆页
request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
request.getRequestDispatcher("/").forward(request, response);
return false;
} else {
//放行
return true;
}
}
/**
* 目标方法执行后
* 该方法在控制器处理请求方法调用之后、解析视图之前执行
* 可以通过此方法对请求域中的模型和视图做进一步修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}", modelAndView);
}
/**
* 页面渲染后
* 该方法在视图渲染结束后执行
* 可以通过此方法实现资源清理、记录日志信息等工作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}", ex);
}
}
二、注册到容器中(通过WebMvcConfigurer实现一个配置类,再通过@Configuration 注解注入到容器)
我这里使用@Autowired
注解把LoginInterceptor
获取到,放入了拦截器配置类中,并在/index/**
(这里的**
是指/index/
后面的所有链接)链接中进行拦截,查看是否有Session
(这里是放在LoginInterceptor
中进行了判断),不拦截/
、/static/**
和/index
的请求
注意:如果拦截的是 /**
会拦截一切资源,包括静态资源,需要将静态资源放行 /static/**
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Autowired
LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自己的拦截器,并设置拦截的请求路径
//addPathPatterns为拦截此请求路径的请求
//excludePathPatterns为不拦截此路径的请求
registry.addInterceptor(loginInterceptor).addPathPatterns("/index/**").excludePathPatterns("/","/static/**","/index");
}
}
借鉴了:https://blog.csdn.net/weixin_52875557/article/details/123793361
https://blog.csdn.net/weixin_52120555/article/details/123327175