1、完成拦截器需要实现HandlerInterceptor接口,实现其中的三个方法
package com.example.reggie.util;
import com.alibaba.fastjson.JSON;
import com.example.reggie.vo.DataView;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class ReggieInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("请求路径为{}",request.getRequestURL());
Object employee = request.getSession().getAttribute("employee"); //获得session对象中的保存的属性
if(employee!=null) //不为空则说明已经登录过了,且还没有过期,直接允许访问
{
return true;
}
response.getWriter().write(JSON.toJSONString(DataView.fail(0,"NOTLOGIN",null))); //前端js拦截处理,页面跳转
return false; //过期不允许访问
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
2、方法的作用:
preHandle:在请求到达处理器之前执行,可以用于权限验证、数据校验等操作。如果返回true,则继续执行后续操作;如果返回false,则中断请求处理。
postHandle:在处理器处理请求之后执行,可以用于日志记录、缓存处理等操作。
afterCompletion:在视图渲染之后执行,可以用于资源清理等操作
将拦截器加入到这个配置里面,加入到之后才能实现拦截器的作用。
package com.example.reggie.config;
import com.example.reggie.util.ReggieInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@Slf4j
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
log.info("进入请稍后。。。。。。");
registry.addInterceptor(new ReggieInterceptor()) //自定义拦截器
.addPathPatterns("/**") //要拦截的路径
.excludePathPatterns("/login","/logout","/backend/**","/front/**"); //放行路径,登录,登出,静态资源都放行
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//backend和front是resources目录下的两个静态资源包,将这两个静态资源包放行,如果不声明则找不到,直接404
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/"); //放行静态资源
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
(仅供本人参考,初学者)