package com.ithema.reggie.filter; import com.alibaba.fastjson.JSON; import com.ithema.reggie.common.BaseContext; import com.ithema.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.springframework.util.AntPathMatcher; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.websocket.Session; import java.io.IOException; /* * 检查用户是否已经完成登录 * */ @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*") @Slf4j public class LoginCheckFilter 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; //1.获取本次请求的URL String requestURI = request.getRequestURI(); log.info("拦截到: {}",requestURI); //定义不需要处理的请求路径 String[]urls =new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**", "/common/**", "/user/sendMsg", "/user/login" }; //2.判断本次请求是否需要处理 boolean check = check(urls, requestURI); //3.如果不需要处理,则直接放行 if (check){ log.info("本次请求{}不需要处理",requestURI); filterChain.doFilter(request,response); return; } //4.判断登录状态,如果已经登录,则直接放行 if (request.getSession().getAttribute("employee")!=null){ log.info("用户已经登录,用户id为: {}",request.getSession().getAttribute("employee")); Long empId = (Long) request.getSession().getAttribute("employee"); BaseContext.setCurrentId(empId); long id = Thread.currentThread().getId(); log.info("线程id:{}",id); filterChain.doFilter(request,response); return; } log.info("用户未登录"); //5. 如果未登录,则返回未登录结果,通过输出流的方式向客户端页面响应数据 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); return; } /* *路径匹配,检查本次请求是否需要放行 * @param urls * @param request * @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; } }
过滤器实现
于 2022-07-02 11:20:34 首次发布