@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-12 15:15:34 发布
本文介绍了一种基于Java Servlet的微信登录过滤器实现方案。该过滤器能够拦截未登录用户的请求,并通过检查Cookie中的openid来验证用户身份。对于未认证的用户,过滤器将返回提示信息,要求用户从微信菜单进行登录。
4582

被折叠的 条评论
为什么被折叠?



