今天依旧学习了黑马的瑞吉外卖,以下是我跟着视频学习写的代码,关于过滤器:
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { //匹配器,当访问路径为/backend/login.html,和backend/**匹配上 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; //1.获取本次请求的URI String requestURI = request.getRequestURI(); log.info("拦截到请求: {}",requestURI); //定义不需要处理的请求路径 String[] urls = new String[]{ "/employee/login", "/employee/logout", //放行页面,但不放行接口,看到页面无法看到数据 "/backend/**", "/front/**", //"/common/**" "/user/sendMsg", //移动端发送短信 "/user/login", //移动端登录 //访问Swagger不需要登录 "/doc.html", "/webjars/**", "/swagger-resources", "/v2/api-docs" }; //2.判断本次请求是否需要处理 boolean check = check(urls, requestURI); //3.如果不需要处理,直接放行 if(check){ log.info("本次请求{}不需要处理",requestURI); filterChain.doFilter(request,response); return; } //4-1.判断登录状态,如果已登录,则直接放行(pc端) if(request.getSession().getAttribute("employee") != null){ log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee")); Long empId = (Long) request.getSession().getAttribute("employee"); BaseContext.setCurrentId(empId); filterChain.doFilter(request,response); return; } //4-2.判断登录状态,如果已登录,则直接放行(移动端) if(request.getSession().getAttribute("user") != null){ log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("user")); Long userId = (Long) request.getSession().getAttribute("user"); BaseContext.setCurrentId(userId); filterChain.doFilter(request,response); return; } log.info("用户未登录"); //5.如果没登陆则返回未登录结果,通过输出流的方式向客户端页面响应数据 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); return; } /** * 路径匹配,检查本次请求是否需要放行 * @param urls * @param requestURI * @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; } }
欢迎大家一起学习,有不足的地方还请指出。