小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
第一步:springboot启动类添加注解@ServletComponentScan
第二步:在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;
}
}
经过以上步骤拦截器的初步使用已经完成了。
阿里嘎多,斯密马赛。