- 创建filter包,定义一个fliter类
- 在filter类中添加以下注解
@ComponentScan //让包能被扫描到
@WebFilter(filterName = "loginCChecFilter",urlPatterns = "/*")
- 在启动类上添加注解(一定要添加)
@ServletComponentScan
随后开始写正式的代码
@ComponentScan
@WebFilter(filterName = "loginCChecFilter",urlPatterns = "/*")
@Slf4j
public class LoginCChecFilter implements Filter {
//路径匹配器 , 支持通配符
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取本次请求的uri
String requestURI = request.getRequestURI();
log.info(requestURI);
//定义不需要处理的请求路径
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",//在瑞吉外卖项目中已经将主页添加到这里,但进入主页中的会立即请求/employee/page/.... 路径, 但因为没有登录该请求会被拦截跳转到登录界面。
"/front/**",
"/user/login",
"/user/logout"
};
//判断本次请求是否需要处理
boolean check = check(urls,requestURI);
//不需要处理直接放行
if(check){
filterChain.doFilter(request,response);
return;
}
//判断登录状态
if(request.getSession().getAttribute("employee")!=null){
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
filterChain.doFilter(request,response);
return;
}
//5、如果为登录返回未登录结果,通过输出流方式向客户端相应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
log.info("拦截请求:{}",request.getRequestURI());
}
public boolean check(String[] urls,String requestURI){
for(String url:urls){
boolean match = PATH_MATCHER.match(url,requestURI);
if(match){
return true;
}
}
return false;
}
}