过滤器
@ServletCompinentScan表示这个类支持servlet
@Slf4j
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
@Override//初始化方法 只调用一次
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override//拦截到请求之后调用
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) servletRequest;
HttpServletResponse resp= (HttpServletResponse) servletResponse;
//获取请求url
String url =req.getRequestURI().toString();
//uri是否包含login
if(url.contains("login")){
log.info("登录操作");
filterChain.doFilter(req,resp);
return;
}
//获得令牌
String jwt=req.getHeader("token");
//判断令牌是否存在
if(!StringUtils.hasLength(jwt)){
log.info("请求头为空,返回未登录");
Result error=Result.error("NOT_LOGIN");
String notLogin= JSON.toJSONString(error);//转换成JSON格式
resp.getWriter().write(notLogin);
return;
}
//解析jwt
try{
JwtUtils.parseJWT(jwt);
}catch(Exception e){
e.printStackTrace();
log.info("解析失败");
}
//放行
log.info("令牌合法,方行");
filterChain.doFilter(req,resp);
}
@Override//销毁方法,只调用一次
public void destroy() {
Filter.super.destroy();
}
}
过滤器链
拦截器
概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。
作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
//目标资源方法执行前执行,放回true:放行,返回false:不放行
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
//获取请求url
String url =req.getRequestURI().toString();
//uri是否包含login
if(url.contains("login")){
log.info("登录操作");
return true;
}
//获得令牌
String jwt=req.getHeader("token");
//判断令牌是否存在
if(!StringUtils.hasLength(jwt)){
log.info("请求头为空,返回未登录");
Result error=Result.error("NOT_LOGIN");
String notLogin= JSON.toJSONString(error);//转换成JSON格式
resp.getWriter().write(notLogin);
return false;
}
//解析jwt
try{
JwtUtils.parseJWT(jwt);
}catch(Exception e){
e.printStackTrace();
log.info("解析失败");
return false;
}
//放行
log.info("令牌合法,方行");
return true;
}
//目标资源方法执行后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//视图渲染完毕后执行,最后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
配置拦截 器
@Configuration//配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
拦截路径
执行流程