`
阅读更多

使用Java  servlet如何判断访问介质是否是移动设备呢?

移动设备指手机和pad

/**
	 * 判断手机的操作系统 IOS/android/windows phone/BlackBerry
	 * 
	 * @param UA
	 * @return
	 */
	public static ClientOsInfo getMobilOS(String UA) {
		UA=UA.toUpperCase();
		if (UA == null) {
			return null;
		}
		ClientOsInfo osInfo=new  ClientOsInfo();
		// 存放正则表达式
		String rex = "";
		// IOS 判断字符串
		String iosString = " LIKE MAC OS X";
		if (UA.indexOf(iosString) != -1) {
			if(isMatch(UA, "\\([\\s]*iPhone[\\s]*;", Pattern.CASE_INSENSITIVE)){
				osInfo.setDeviceType(DEVICE_TYPE_PHONE);
			}else if(isMatch(UA, "\\([\\s]*iPad[\\s]*;", Pattern.CASE_INSENSITIVE)){
				osInfo.setDeviceType(DEVICE_TYPE_PAD);
			}
			rex = ".*" + "[\\s]+(\\d[_\\d]*)" + iosString;
			Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(UA);
			boolean rs = m.find();
			if (rs) {
				String osVersion= m.group(1).replace("_", ".");
				osInfo.setVersion(osVersion);
//				System.out.println("Mobil OS is" + " IOS" +osVersion);
				osInfo.setOsTypeVersion(OSTYPE_IOS+"_" + osVersion);
				return osInfo;
			}
			System.out.println("IOS");
			osInfo.setOsTypeVersion(OSTYPE_IOS);
			return osInfo;
		}
		// Android 判断
		String androidString = "ANDROID";
		if (UA.indexOf(androidString) != -1) {
			if(isMatch(UA, "\\bMobi", Pattern.CASE_INSENSITIVE)){
				osInfo.setDeviceType(DEVICE_TYPE_PHONE);
			}else {
				osInfo.setDeviceType(DEVICE_TYPE_PAD);
			}
			rex = ".*" + androidString + "[\\s]*(\\d*[\\._\\d]*)";
			Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(UA);
			boolean rs = m.find();
			if (rs) {
				String version=m.group(1).replace("_", ".");
				osInfo.setVersion(version);
				System.out.println("Mobil OS is " + OSTYPE_ANDROID + version);
				osInfo.setOsTypeVersion(OSTYPE_ANDROID+"_" + version);
				return osInfo;
			}
			System.out.println("Android");
			osInfo.setOsTypeVersion(OSTYPE_ANDROID);
			return osInfo;
		}
		// windows phone 判断
		String wpString = "WINDOWS PHONE";
		if (UA.indexOf(wpString) != -1) {
			rex = ".*" + wpString + "[\\s]*[OS\\s]*([\\d][\\.\\d]*)";
			Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(UA);
			boolean rs = m.find();
			if (rs) {
				System.out.println("Mobil OS is " + OSTYPE_WP + m.group(1));
				String version=m.group(1);
				osInfo.setVersion(version);
				osInfo.setOsTypeVersion(OSTYPE_WP+"_" + version);
				return osInfo;
			}
			System.out.println("WINDOWS PHONE");
			osInfo.setOsTypeVersion(OSTYPE_WP);
			return osInfo;
		}
		// BlackBerry 黑莓系统判断
		String bbString = "BLACKBERRY";
		if (UA.indexOf(bbString) != -1) {
			rex = ".*" + bbString + "[\\s]*([\\d]*)";
			Pattern p = Pattern.compile(rex, Pattern.CASE_INSENSITIVE);
			Matcher m = p.matcher(UA);
			boolean rs = m.find();
			if (rs) {
				System.out.println("Mobil OS is" + " BLACKBERRY " + m.group(1));
				String version=m.group(1);
				osInfo.setVersion(version);
				osInfo.setOsTypeVersion(OSTYPE_BLACKBERRY+"_" + version);
				return osInfo;
			}
			System.out.println("BLACKBERRY");
			osInfo.setOsTypeVersion(OSTYPE_BLACKBERRY);
			return osInfo;
		}
		if(UA.contains("LINUX")){//android
			if(isMatch(UA, "\\bMobi", Pattern.CASE_INSENSITIVE)){
				osInfo.setDeviceType(DEVICE_TYPE_PHONE);
			}else {
				osInfo.setDeviceType(DEVICE_TYPE_PAD);
			}
			
			 Pattern p = Pattern.compile("U;\\s*(Adr[\\s]*)?(\\d[\\.\\d]*\\d)[\\s]*;",Pattern.CASE_INSENSITIVE);
		        Matcher m = p.matcher(UA);
		        boolean result = m.find();
		        String find_result = null;
		        if (result)
		        {
		            find_result = m.group(2);
		        }
		        if(ValueWidget.isNullOrEmpty(find_result)){
		        	osInfo.setOsTypeVersion(OSTYPE_ANDROID);
		        	return osInfo;
		        }else{
		        	osInfo.setVersion(find_result);
		        	osInfo.setOsTypeVersion(OSTYPE_ANDROID+"_"+find_result);
		        	return osInfo;
		        }
		}
		
		//UCWEB/2.0 (iOS; U; iPh OS 4_3_2; zh-CN; iPh4)
		if(UA.matches(".*((IOS)|(iPAD)).*(IPH).*")){
			if(isMatch(UA, "[\\s]*iPh[\\s]*", Pattern.CASE_INSENSITIVE)){
				osInfo.setDeviceType(DEVICE_TYPE_PHONE);
			}else {
				osInfo.setDeviceType(DEVICE_TYPE_PAD);
			}
			 Pattern p = Pattern.compile("U;\\s*(IPH[\\s]*)?(OS[\\s]*)?(\\d[\\._\\d]*\\d)[\\s]*;",Pattern.CASE_INSENSITIVE);
		        Matcher m = p.matcher(UA);
		        boolean result = m.find();
		        String find_result = null;
		        if (result)
		        {
		            find_result = m.group(3);
		        }
		        if(ValueWidget.isNullOrEmpty(find_result)){
		        	osInfo.setOsTypeVersion(OSTYPE_IOS);
		        	return osInfo;
		        }else{
		        	String version=find_result.replace("_", ".");
		        	osInfo.setVersion(version);
		        	osInfo.setOsTypeVersion(OSTYPE_IOS+"_"+version);
		        	return osInfo;
		        }
		}
		return osInfo;
	}

 应用:

String userAgent=request.getHeader("user-agent");
		ClientOsInfo info= HeaderUtil.getMobilOS(userAgent);
		System.out.println("device type:\t"+info.getDeviceType());
		System.out.println("type version:\t"+info.getOsTypeVersion());
		System.out.println("version:\t"+info.getVersion());
		System.out.println("是移动设备吗:"+info.isMobile());

 运行结果:

 

源代码见附件:io0007-find_progess.zip

  • 大小: 11.5 KB
1
0
分享到:
评论

相关推荐

    判断是否是手机

    在IT领域,尤其是在Web开发中,判断用户是通过...在Java Servlet环境中,可以编写代码来解析和判断`User-Agent`,或者利用专门的库来简化这一过程。对于现代Web应用,响应式设计也成为了提供跨设备兼容体验的重要手段。

    java源码包---java 源码 大量 实例

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    java写中国象棋手机网络游戏(J2ME+Servlet)

    【Java编写中国象棋手机网络游戏】是一个基于J2ME(Java Micro Edition)和Servlet技术的项目,主要目标是实现一个可以在移动设备上运行的在线中国象棋游戏平台。以下是这个项目涉及的关键知识点: 1. **J2ME**:...

    java开源包4

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    java源码包3

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    java源码包2

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    俄罗斯方块+jsp+servlet

    在这个项目中,Servlet主要负责接收用户的HTTP请求,处理游戏逻辑,如移动、旋转方块,判断消除行等,并将结果返回给客户端。Servlet通过`doGet`或`doPost`方法处理请求,使用`HttpServletResponse`和`...

    JAVA程序设计说明书

    Java程序设计是一种广泛应用于软件开发领域的技术,其强大的跨平台能力和丰富的类库使得它成为企业级应用、移动应用以及互联网应用的首选编程语言。本说明书将深入探讨Java程序设计的基本概念、语法结构以及实战技巧...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    android -servlet-mysql(json)登陆传值

    总之,Android-Servlet-MySQL(json)登录传值涉及到Android客户端的网络请求、JSON处理、Servlet的请求响应、数据库操作以及安全策略等多个方面,理解并掌握这些知识点对于构建完整的移动应用至关重要。

    AJAX+JSP+Servlet网络版俄罗斯方块

    它接收来自JSP页面的AJAX请求,执行必要的计算(例如,判断新方块的位置是否合法,更新游戏得分等),然后将结果返回给JSP,以便更新游戏状态。 使用Servlet的优点在于,它可以处理多种类型的请求,不仅限于HTTP,...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    基于安徽移动呼叫培训中心的在线考试系统(部分)

    【基于安徽移动呼叫培训中心的在线考试系统(部分)】是一个使用JSP和Servlet技术开发的项目,旨在为安徽移动呼叫中心提供一个部分成型的在线考试平台。该项目包含数据库支持,尽管尚未全部完善,但其核心功能已经...

    四个jar包commons-io+logging+pool+javax-servlet-jsp-jstl

    标题中的"四个jar包commons-io+logging+pool+javax-servlet-jsp-jstl"提到了四个关键的Java库,这些库在开发Java Web应用程序时非常常见。它们分别是Apache Commons IO、Apache Commons Logging、Apache Commons ...

    Java面试题大汇总-基础,编程,改错

    Java面试题涵盖了许多核心概念,包括面向对象的四大特性、数据类型、类与对象的区别、字符串处理、异常处理以及集合框架。以下是对这些知识点的详细解释: 1. 面向对象的特征: - 抽象:抽象是将复杂的现实问题...

    java试题-带答案.pdf

    - **JavaME (Micro Edition)**:移动版,主要用于资源有限的设备,如手机、PDA等。 **1.3 JRE与JDK的区别是什么?** - **JRE (Java Runtime Environment)**:Java运行环境,包含了运行Java程序所需的所有库以及...

    java源码包4

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 ...

    JAVA 语言从入门到精通.rar

    Java ME则适用于嵌入式设备和移动设备。 最后,对于想要精通Java的开发者来说,理解虚拟机(JVM)的工作原理、性能优化、内存管理和垃圾回收机制也非常重要。同时,学习如何使用调试工具(如JDB和VisualVM)进行...

Global site tag (gtag.js) - Google Analytics