登录拦截功能实现 -瑞吉外卖笔记
1 配置webfilter注解,设置要拦截处理的路径,先设置全部路径,后面分析放行就行
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
2 编写filter,拦截器类,编写拦截的的逻辑代码
package com.itheima.reggie_take_out.filter;import com.alibaba.fastjson.JSON;
import com.itheima.reggie_take_out.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.LogRecord;@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {//路径匹配器public static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {HttpServletRequest request=(HttpServletRequest) servletRequest;HttpServletResponse response=(HttpServletResponse) servletResponse;String requestURI=request.getRequestURI();String[] urls=new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};//不需要拦截的boolean check = check(urls, requestURI);if(check){filterChain.doFilter(request,response);log.info("请求不需要处理;{}",request.getRequestURI());return;}if(request.getSession().getAttribute("employee")!=null){filterChain.doFilter(request,response);log.info("已登录,用户ID;{}",request.getSession().getAttribute("employee"));return;}response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));log.info("拦截请求;{}",request.getRequestURI());return;}//路径匹配public boolean check(String[] urls,String requestURI){for(String url:urls){boolean match= PATH_MATCHER.match(url,requestURI);if(match){return true;}}return false;}}
3 在启动类上组件扫描
@SpringBootApplication
@ServletComponentScan
public class ReggieTakeOutApplication {public static void main(String[] args) {SpringApplication.run(ReggieTakeOutApplication.class, args);log.info("项目启动");}}