content: package com.java2nb.novel.core.filter;
  
  import com.java2nb.novel.core.cache.CacheKey;
  import com.java2nb.novel.core.cache.CacheService;
  import com.java2nb.novel.core.utils.*;
  import io.github.xxyopen.util.UUIDUtil;
  import jakarta.servlet.*;
  import jakarta.servlet.http.HttpServletRequest;
  import jakarta.servlet.http.HttpServletResponse;
  
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  
  /**
   * 项目核心过滤器
   * @author Administrator
   */
  public class NovelFilter implements Filter {
  
      /**
       * 本地图片保存路径
       * */
      private String picSavePath;
  
      @Override
      public void init(FilterConfig filterConfig){
          picSavePath = filterConfig.getInitParameter("picSavePath");
      }
  
  
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          HttpServletRequest req = (HttpServletRequest) servletRequest;
          HttpServletResponse resp = (HttpServletResponse) servletResponse;
          String requestUri = req.getRequestURI();
  
          //本地图片访问处理
          if (requestUri.contains(Constants.LOCAL_PIC_PREFIX)) {
              //缓存10天
              resp.setDateHeader("expires", System.currentTimeMillis()+60*60*24*10*1000);
              OutputStream out = resp.getOutputStream();
              InputStream input = new FileInputStream(picSavePath + requestUri);
              byte[] b = new byte[4096];
              for (int n; (n = input.read(b)) != -1; ) {
                  out.write(b, 0, n);
              }
              input.close();
              out.close();
              return;
  
          }
  
  
          String userMark = CookieUtil.getCookie(req,Constants.USER_CLIENT_MARK_KEY);
          if(userMark == null){
              userMark = UUIDUtil.getUUID32();
              CookieUtil.setCookie(resp,Constants.USER_CLIENT_MARK_KEY,userMark);
          }
          ThreadLocalUtil.setClientId(userMark);
          //根据浏览器类型选择前端模板
          String to = req.getParameter("to");
          CacheService cacheService = SpringUtil.getBean(CacheService.class);
          if("pc".equals(to)){
              //直接进PC站
              cacheService.set(CacheKey.TEMPLATE_DIR_KEY+userMark,"",60*60*24);
          }else if("mobile".equals(to)){
              //直接进手机站
              cacheService.set(CacheKey.TEMPLATE_DIR_KEY+userMark,"mobile/",60*60*24);
          }else{
              //自动识别是PC站还是手机站
              if(BrowserUtil.isMobile(req)){
                  //手机端访问
                  ThreadLocalUtil.setTemplateDir("mobile/");
              }else{
                  //PC端访问
                  ThreadLocalUtil.setTemplateDir("");
              }
          }
  
  
          filterChain.doFilter(servletRequest,servletResponse);
      }
  
      @Override
      public void destroy() {
  
      }
  }
  