springboot 配置拦截器,拦截指定方法

596 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

第一步:springboot启动类添加注解@ServletComponentScan

image.png

第二步:在Java类加上@WebFilter注解,且实现Filter接口,urlPatterns表示拦截的controller(此处可指定具体方法)

/**
 * @author tyl
 * @date 2022-09-06
 * 
 */
@WebFilter(filterName = "countFilter",urlPatterns = "/pvuv/*")
@Slf4j
public class countFilter implements Filter {
    private final static String[] agent = {"Android","iPhone","iPod","iPad","Windows Phone","MQQBrowser"};
    @Autowired
    private RedisCache redisCache;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        response.setCharacterEncoding("UTF-8");
        //获取调用者ip
        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
        log.info("调用者IP:{}",ip);
        //获取当前时间
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuuMMdd");
        LocalDate  nowDate = LocalDate.now();
        String format = dateTimeFormatter.format(nowDate);
        Set<String> set = new HashSet<>();
        //判断请求是来自移动端访问还是PC端访问
        if (PvUvCountFilter.checkAgentIsMobile(request)){
            String uvkeyName = "uv:H5:"+format;
            String pvkeyName = "pv:H5:"+format;
            if (null == redisCache.getCacheSet(uvkeyName)){
                redisCache.setCacheSet(uvkeyName,set);
            }else{
                set = redisCache.getCacheSet(uvkeyName);
                set.add(ip);
                redisCache.setCacheSet(uvkeyName,set);
            }
            if (null == redisCache.getCacheObject(pvkeyName)){
                redisCache.setCacheObject(pvkeyName,"1");
            }else {
                Integer num = Integer.parseInt(redisCache.getCacheObject(pvkeyName));
                num +=1;
                redisCache.setCacheObject(pvkeyName,num.toString());
            }
        }else
        {
            String uvkeyName = "uv:PC:"+format;
            String pvkeyName = "pv:PC:"+format;
            if (null == redisCache.getCacheSet(uvkeyName)){
                redisCache.setCacheSet(uvkeyName,set);
            }else{
                set = redisCache.getCacheSet(uvkeyName);
                set.add(ip);
                redisCache.setCacheSet(uvkeyName,set);
            }
            if (null == redisCache.getCacheObject(pvkeyName)){
                redisCache.setCacheObject(pvkeyName,"1");
            }else {
                Integer num = Integer.parseInt(redisCache.getCacheObject(pvkeyName));
                num +=1;
                redisCache.setCacheObject(pvkeyName,num.toString());
            }
        }
        filterChain.doFilter(request,response);
    }
    /**
     * 判断User-Agent是否来自手机
     */
    public static boolean checkAgentIsMobile(HttpServletRequest request){
        String ua = request.getHeader("User-Agent");
        boolean flag = false;
        if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))){
            //排除苹果桌面系统
            if (!ua.contains("Windows NT") && !ua.contains("Macintosh")){
                for (String item:agent){
                    if (ua.contains(item)){
                        flag = true;
                        break;
                    }
                }
            }
        }
        return flag;
    }
}

经过以上步骤拦截器的初步使用已经完成了。

阿里嘎多,斯密马赛。

欢迎评论分享更好的文章~~~~~个人网站:tylxjj.top/