package com.nuiiqk.util;import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang3.StringUtils;/**** @version 0.0.1* @date 2018年8月15日* @author NuiiQK* @Description 访问终端工具*/
public class TerminalUtils {// \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),// 字符串在编译时会被转码一次,所以是 "\\b"// \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i" + "|windows (phone|ce)|blackberry"+ "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" + "|laystation portable)|nokia|fennec|htc[-_]"+ "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser" + "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";// 移动设备正则匹配:手机端、平板static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);/*** 检测是否是移动设备访问** @Title: check* @param userAgent*            浏览器标识* @return true:移动设备接入,false:pc端接入*/public static boolean check(String userAgent) {if (null == userAgent) {userAgent = "";}// 匹配Matcher matcherPhone = phonePat.matcher(userAgent);Matcher matcherTable = tablePat.matcher(userAgent);if (matcherPhone.find() || matcherTable.find()) {return true;} else {return false;}}private static final String USER_AGENT = "USER-AGENT";/*** 检查访问方式是否为移动端** @Title: check* @param request* @throws IOException*/public static boolean check(HttpServletRequest request) throws IOException {boolean isFromMobile = false;// 检查是否已经记录访问方式(移动端或pc端)try {// 获取ua,用来判断是否为移动端访问String userAgent = request.getHeader(USER_AGENT).toLowerCase();if (null == userAgent) {userAgent = "";}isFromMobile = TerminalUtils.check(userAgent);// 判断是否为移动端访问if (isFromMobile) {System.out.println("移动端访问");return isFromMobile;} else {System.out.println("pc端访问");return isFromMobile;}} catch (Exception e) {LogUtil.error("TerminalUtils异常", e);}return isFromMobile;}/** 电脑上的IE或Firefox浏览器等的User-Agent关键词 */private static String[] pcHeaders =new String[] {"Windows 98", "Windows ME", "Windows 2000", "Windows XP", "Windows NT", "Ubuntu"};/** Wap网关Via头信息中特有的描述信息 */private static String mobileGateWayHeaders[] = new String[] {"ZXWAP", // 中兴提供的wap网关的via信息,例如:Via=ZXWAP GateWayZTE// Technologies,"chinamobile.com", // 中国移动的诺基亚wap网关,例如:Via=WTP/1.1 GDSZ-PB-GW003-WAP07.gd.chinamobile.com (Nokia// WAP Gateway 4.1 CD1/ECD13_D/4.1.04)"monternet.com", // 移动梦网的网关,例如:Via=WTP/1.1 BJBJ-PS-WAP1-GW08.bj1.monternet.com. (Nokia WAP// Gateway 4.1 CD1/ECD13_E/4.1.05)"infoX", // 华为提供的wap网关,例如:Via=HTTP/1.1 GDGZ-PS-GW011-WAP2 (infoX-WISG Huawei// Technologies),或Via=infoX WAP Gateway V300R001 Huawei Technologies"XMS 724Solutions HTG", // 国外电信运营商的wap网关,不知道是哪一家"wap.lizongbo.com", // 自己测试时模拟的头信息"Bytemobile",// 貌似是一个给移动互联网提供解决方案提高网络运行效率的,例如:Via=1.1 Bytemobile OSN WebProxy/5.1};/** 手机浏览器的User-Agent里的关键词 */private static String[] mobileUserAgents = new String[] {"Nokia", // 诺基亚,有山寨机也写这个的,总还算是手机,Mozilla/5.0 (Nokia5800// XpressMusic)UC AppleWebkit(like Gecko)// Safari/530"SAMSUNG", // 三星手机// SAMSUNG-GT-B7722/1.0+SHP/VPP/R5+Dolfin/1.5+Nextreaming+SMM-MMS/1.2.0+profile/MIDP-2.1+configuration/CLDC-1.1"MIDP-2", // j2me2.0,Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1 /110.48.125// Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML like Gecko)// Safari/413"CLDC1.1", // M600/MIDP2.0/CLDC1.1/Screen-240X320"SymbianOS", // 塞班系统的,"MAUI", // MTK山寨机默认ua"UNTRUSTED/1.0", // 疑似山寨机的ua,基本可以确定还是手机"Windows CE", // Windows CE,Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)"iPhone", // iPhone是否也转wap?不管它,先区分出来再说。Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac// OS X; zh-cn) AppleWebKit/532.9 (KHTML like Gecko) Mobile/8B117"iPad", // iPad的ua,Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; zh-cn)// AppleWebKit/531.21.10 (KHTML like Gecko) Version/4.0.4 Mobile/7B367// Safari/531.21.10"Android", // Android是否也转wap?Mozilla/5.0 (Linux; U; Android 2.1-update1; zh-cn; XT800// Build/TITA_M2_16.22.7) AppleWebKit/530.17 (KHTML like Gecko) Version/4.0// Mobile Safari/530.17"BlackBerry", // BlackBerry8310/2.7.0.106-4.5.0.182"UCWEB", // ucweb是否只给wap页面? Nokia5800 XpressMusic/UCWEB7.5.0.66/50/999"ucweb", // 小写的ucweb貌似是uc的代理服务器Mozilla/6.0 (compatible; MSIE 6.0;) Opera ucweb-squid"BREW", // 很奇怪的ua,例如:REW-Applet/0x20068888 (BREW/3.1.5.20; DeviceId: 40105; Lang: zhcn)// ucweb-squid"J2ME", // 很奇怪的ua,只有J2ME四个字母"YULONG", // 宇龙手机,YULONG-CoolpadN68/10.14 IPANEL/2.0 CTC/1.0"YuLong", // 还是宇龙"COOLPAD", // 宇龙酷派YL-COOLPADS100/08.10.S100 POLARIS/2.9 CTC/1.0"TIANYU", // 天语手机TIANYU-KTOUCH/V209/MIDP2.0/CLDC1.1/Screen-240X320"TY-", // 天语,TY-F6229/701116_6215_V0230 JUPITOR/2.2 CTC/1.0"K-Touch", // 还是天语K-Touch_N2200_CMCC/TBG110022_1223_V0801 MTK/6223 Release/30.07.2008// Browser/WAP2.0"Haier", // 海尔手机,Haier-HG-M217_CMCC/3.0 Release/12.1.2007 Browser/WAP2.0"DOPOD", // 多普达手机"Lenovo", // 联想手机,Lenovo-P650WG/S100 LMP/LML Release/2010.02.22 Profile/MIDP2.0// Configuration/CLDC1.1"LENOVO", // 联想手机,比如:LENOVO-P780/176A"HUAQIN", // 华勤手机"AIGO-", // 爱国者居然也出过手机,AIGO-800C/2.04 TMSS-BROWSER/1.0.0 CTC/1.0"CTC/1.0", // 含义不明"CTC/2.0", // 含义不明"CMCC", // 移动定制手机,K-Touch_N2200_CMCC/TBG110022_1223_V0801 MTK/6223 Release/30.07.2008// Browser/WAP2.0"DAXIAN", // 大显手机DAXIAN X180 UP.Browser/6.2.3.2(GUI) MMP/2.0"MOT-", // 摩托罗拉,MOT-MOTOROKRE6/1.0 LinuxOS/2.4.20 Release/8.4.2006 Browser/Opera8.00// Profile/MIDP2.0 Configuration/CLDC1.1 Software/R533_G_11.10.54R"SonyEricsson", // 索爱手机,SonyEricssonP990i/R100 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS;// 405) Opera 8.65 [zh-CN]"GIONEE", // 金立手机"HTC", // HTC手机"ZTE", // 中兴手机,ZTE-A211/P109A2V1.0.0/WAP2.0 Profile"HUAWEI", // 华为手机,"webOS", // palm手机,Mozilla/5.0 (webOS/1.4.5; U; zh-CN) AppleWebKit/532.2 (KHTML like// Gecko) Version/1.0 Safari/532.2 Pre/1.0"GoBrowser", // 3g GoBrowser.User-Agent=Nokia5230/GoBrowser/2.0.290 Safari"IEMobile", // Windows CE手机自带浏览器,"WAP2.0"// 支持wap 2.0的};public static String checks(HttpServletRequest request) {boolean mobileFlag = false;String via = request.getHeader("Via");String userAgent = request.getHeader(USER_AGENT);for (int i = 0; via != null && !via.trim().equals("") && i < mobileGateWayHeaders.length; i++) {if (via.contains(mobileGateWayHeaders[i])) {mobileFlag = true;// 移动端return "mobile";}}for (int i = 0; !mobileFlag && userAgent != null && !userAgent.trim().equals("") && i < mobileUserAgents.length;i++) {if (userAgent.contains(mobileUserAgents[i])) {mobileFlag = true;// 移动端return "mobile";}}for (int i = 0; userAgent != null && !userAgent.trim().equals("") && i < pcHeaders.length; i++) {if (userAgent.contains(pcHeaders[i])) {// pc端return "pc";}}// 其他return "other";}/**** @author NuiiQK* @Description 获取系统* @param request* @return String*/public static String visitSystem(HttpServletRequest request) {String userAgent = request.getHeader(USER_AGENT);if (StringUtils.isEmpty(userAgent)) {return "other";} else if (userAgent.contains("iPhone") || userAgent.contains("iPod") || userAgent.contains("iPad")) {return "ios";} else if (userAgent.contains("Android")) {return "android";} else if (userAgent.contains("Linux")) {return "linux";} else if (userAgent.contains("Windows")) {return "windows";} else if (userAgent.contains("BB10")) {return "qnx";} else if (userAgent.contains("PlayBook")) {return "PlayBook";}return "other";}}

访问终端工具类TerminalUtils相关推荐

  1. [工具类] 系列二 Lettuce 访问Redis 工具类 RedisUtil

    最近公司Redis集群启用了ssl和密码校验,使用Jedis访问Redis Cluster的时候,支持不太好.看到spring-data-redis 2.x开始使用Lettuce访问Redis,于是开 ...

  2. php访问mysql工具类

    本文转载自:http://www.cnblogs.com/lida/archive/2011/02/18/1958211.html <?php class mysql {private $db_ ...

  3. java.util —— 工具类

    工具类的存在,是为了平衡,Java 彻底的面向对象(everything is object. 的极端:),也即并非所有的东西都可抽象为类的,但又要有类的形式,工具类便由此诞生. 工具类不做实例化,工 ...

  4. java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解

    java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...

  5. 前端请求接口post_程序员:HttpClient进行post请求的工具类,访问第三方接口HTTPS...

    HTTPS (英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure) 是一 ...

  6. 一个简单易用的Http访问工具类for Android

    前言 去年(2017)参加服务外包省赛的时候,负责App开发的我遇到了一个小难题--Http请求.虽说已经有成熟的HttpUrlConnection库供使用,但依然感到有些不方便:进行一次简单的请求并 ...

  7. Android开发之访问WebService的工具类

    Android中使用WebService通讯,下面对访问WebService的工具类进行记录 package com.wjy.project.railway.tools;import android. ...

  8. 大数据_Hbase-API访问_Java操作Hbase_封装操作数据的工具类---Hbase工作笔记0015

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 之前我们对hbase的操作,都是用hbase的api实现的,但是有些麻烦对吧,我们可以自己做个工具 ...

  9. java post访问工具类(使用post方式请求http接口)

    1.需要引入的jar包. 使用idea导入com.budjb:http-requests-httpcomponents-client:2.0.2,如下图: 2.工具类HttpUtil.java,代码如 ...

最新文章

  1. 好消息!算法工程师提高待遇的好机会,终于来了!!
  2. 数据结构实验之数组二:稀疏矩阵
  3. Codeforces 1284E New Year and Castle Building (计算几何)
  4. flock - 必应词典
  5. nts包如何下周 php_windows下PHP7安装方法(ts版和nts版)
  6. Hashtable Dictionary的使用
  7. ( linker command failed with exit code 1) 错误解决方案 项目使用的是pod
  8. Eclipse开启全字母代码提示
  9. AS3学习笔记(一)基础知识
  10. 适用于stuido one的虚拟贝斯手插件:UJAM Virtual Bassist ROYAL for Mac
  11. asp.net 操作Excel大全
  12. linux网络分析之回环网卡
  13. oracle数据库sqlloader,初见Oracle SqlLoader工具
  14. 巴伦变压器电路图_一文看懂巴伦(功能原理、性能参数、基本类型)
  15. 遗传算法在组卷中的应用
  16. 网页聊天室开发思路独家分享
  17. vob格式的视频怎么无损转换成mp4格式
  18. mysql从库binlog_转 mysql 主从复制以及binlog 测试 (5.7)
  19. openstack 创建虚拟机后,虚拟机启动hang在cpu 检测
  20. 网络号和主机号的计算

热门文章

  1. [RK3288][Android6.0] PWM backlight 驱动流程小结
  2. Windows运行.sh文件方法
  3. 前端程序猿常用网站总结
  4. 五一培训 清北学堂 DAY2
  5. unity List记录
  6. 3D 渲染软件市场增长迅速的原因
  7. Python金融数据分析之路(一)
  8. 关于差旅费的账务处理
  9. 2020年蓝桥杯模拟赛解题报告(Python真香)
  10. 可视化案例(五)Kepler.gl绘制动态酷炫热力图