@WebFilter(filterName = "loginFilter", urlPatterns = "/*") public class LoginFilter implements Filter { private Logger logger = LoggerFactory.getLogger(getClass()); private static final String OPENID_COOKIE_NAME = "openId"; /* 这里设置不被拦截的请求路径 */ private static final List<String> unFilterUrlList = Arrays.asList("/WeChatWeb/auth","/WeChatWeb/html"); /* 判断请求路径是否为不拦截的请求路径 */ private boolean isFilter(String url){ for(String s: unFilterUrlList) { if(url.indexOf(s) > -1) { return false; } } return true; } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { ThreadLocalCache.start(); try { HttpServletRequest request = (HttpServletRequest) servletRequest; logger.debug("requestURL======================================" + request.getRequestURL().toString()); if(isFilter(request.getRequestURL().toString())) { String openId = getUserIdFromCookie(request.getCookies()); logger.debug("url:" + request.getRequestURL().toString()); logger.debug("拦截到的cookies======================================" + openId); if (openId == null || "".equals(openId)) { JSONObject result = new JSONObject(); result.put("success", false); result.put("message", "Please log in from the WeChat menu"); servletResponse.getWriter().write(result.toJSONString()); logger.info("没有获取到openId", ((HttpServletRequest) servletRequest).getRequestURI()); return; } } filterChain.doFilter(servletRequest, servletResponse); } finally { ThreadLocalCache.clean(); } } @Override public void destroy() { } private String getUserIdFromCookie(Cookie[] cookies){ if(cookies == null){ return null; } for(Cookie cookie:cookies){ if(StringUtils.equalsIgnoreCase(cookie.getName(), OPENID_COOKIE_NAME)){ try { return cookie.getValue(); } catch (NumberFormatException e) { return null; } } } return null; } class ThreadLocalCache { private static final String USER_KEY = "login.openId.key"; private static final ThreadLocal<HashMap<String, Object>> local = new ThreadLocal<>(); public static void clean() { MDC.clear(); localMap().clear(); } public static void start() { MDC.put("traceId", UUID.randomUUID().toString()); } public static void addOpenId(String openId) { if (openId != null) { MDC.put("openId", openId); } localMap().put(USER_KEY, openId); } private static Object get(String key) { return localMap().get(key); } private static HashMap<String, Object> localMap() { HashMap<String, Object> map = local.get(); if (map == null) { map = new HashMap<String, Object>(); local.set(map); } return map; } } }
配置某些请求不被过滤器拦截
最新推荐文章于 2024-07-14 18:12:37 发布