配置某些请求不被过滤器拦截

@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;
      }

   }

}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值