java 版

// \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),
// 字符串在编译时会被转码一次,所以是 "\\b"
// \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)
private static final String PHONE_REG = "\\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";// 手记的正则表达式
private static final String TABLE_REG = "\\b(ipad|tablet|(Nexus 7)|up.browser"
+ "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";// 拼版的正则表达式

// 移动设备正则匹配:手机端、平板
private static final Pattern PHONE_PAT = Pattern.compile(PHONE_REG, Pattern.CASE_INSENSITIVE);
private static final Pattern TABLE_PAT = Pattern.compile(TABLE_REG, Pattern.CASE_INSENSITIVE);

/**
* 登陆设备认证。判断前台请求的设备是pc,pad还是phone
*
* @param userAgent 用户代理信息
* @return
*/
public static String checkLoginDeviceType(String userAgent) {
if (null == userAgent) {
userAgent = "";
}
// 匹配
Matcher matcherPhone = PHONE_PAT.matcher(userAgent);
Matcher matcherTable = TABLE_PAT.matcher(userAgent);
if (matcherPhone.find()) {
return PHONE_TYPE;
} else if (matcherTable.find()) {
return PAD_TYPE;
} else {
return PC_TYPE;
}
}

js 版

没经过项目测试,只是记录别人写的代码,而且好像只能区分移动端和桌面,不能区分移动端是 pad 还是 phone

//智能检测登陆设备类型
var browser = {
versions: (function () {
var u = navigator.userAgent,
app = navigator.appVersion
return {
//移动终端浏览器版本信息
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/) || u.indexOf('iPad') > -1, //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部
}
})(),
language: (navigator.browserLanguage || navigator.language).toLowerCase()
}

if (browser.versions.mobile) {
//移动端
} else {
//pc端
}