User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。UA也成为了,我们服务器判断请求是PC浏览器,还是移动端浏览器的主要依据了。虽然我是一个JavaEE工程师,但在实际中经常要开发一些微信商城或APP应用,所以判断请求来自哪里,就显得尤为重要了。

  1. import javax.servlet.http.HttpServletRequest;
  2.  
  3. import eu.bitwalker.useragentutils.Browser;
  4. import eu.bitwalker.useragentutils.DeviceType;
  5. import eu.bitwalker.useragentutils.UserAgent;
  6.  
  7. /**
  8. * 用户代理字符串识别工具
  9. */
  10. public class UserAgentUtils {
  11.  
  12. /**
  13. * 获取用户代理对象
  14. * @param request
  15. * @return
  16. */
  17. public static UserAgent getUserAgent(HttpServletRequest request){
  18. return UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
  19. }
  20.  
  21. /**
  22. * 获取设备类型
  23. * @param request
  24. * @return
  25. */
  26. public static DeviceType getDeviceType(HttpServletRequest request){
  27. return getUserAgent(request).getOperatingSystem().getDeviceType();
  28. }
  29.  
  30. /**
  31. * 是否是PC
  32. * @param request
  33. * @return
  34. */
  35. public static boolean isComputer(HttpServletRequest request){
  36. return DeviceType.COMPUTER.equals(getDeviceType(request));
  37. }
  38.  
  39. /**
  40. * 是否是手机
  41. * @param request
  42. * @return
  43. */
  44. public static boolean isMobile(HttpServletRequest request){
  45. return DeviceType.MOBILE.equals(getDeviceType(request));
  46. }
  47.  
  48. /**
  49. * 是否是平板
  50. * @param request
  51. * @return
  52. */
  53. public static boolean isTablet(HttpServletRequest request){
  54. return DeviceType.TABLET.equals(getDeviceType(request));
  55. }
  56.  
  57. /**
  58. * 是否是手机和平板
  59. * @param request
  60. * @return
  61. */
  62. public static boolean isMobileOrTablet(HttpServletRequest request){
  63. DeviceType deviceType = getDeviceType(request);
  64. return DeviceType.MOBILE.equals(deviceType) || DeviceType.TABLET.equals(deviceType);
  65. }
  66.  
  67. /**
  68. * 获取浏览类型
  69. * @param request
  70. * @return
  71. */
  72. public static Browser getBrowser(HttpServletRequest request){
  73. return getUserAgent(request).getBrowser();
  74. }
  75.  
  76. /**
  77. * 是否IE版本是否小于等于IE8
  78. * @param request
  79. * @return
  80. */
  81. public static boolean isLteIE8(HttpServletRequest request){
  82. Browser browser = getBrowser(request);
  83. return Browser.IE5.equals(browser) || Browser.IE6.equals(browser)
  84. || Browser.IE7.equals(browser) || Browser.IE8.equals(browser);
  85. }
  86.  
  87. }
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4.  
  5. /**
  6. * MAC地址工具
  7. */
  8. public class MacUtils {
  9.  
  10. /**
  11. * 获取当前操作系统名称. return 操作系统名称 例如:windows,Linux,Unix等.
  12. */
  13. public static String getOSName() {
  14. return System.getProperty("os.name").toLowerCase();
  15. }
  16.  
  17. /**
  18. * 获取Unix网卡的mac地址.
  19. *
  20. * @return mac地址
  21. */
  22. public static String getUnixMACAddress() {
  23. String mac = null;
  24. BufferedReader bufferedReader = null;
  25. Process process = null;
  26. try {
  27. /**
  28. * Unix下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
  29. */
  30. process = Runtime.getRuntime().exec("ifconfig eth0");
  31. bufferedReader = new BufferedReader(new InputStreamReader(
  32. process.getInputStream()));
  33. String line = null;
  34. int index = -1;
  35. while ((line = bufferedReader.readLine()) != null) {
  36. /**
  37. * 寻找标示字符串[hwaddr]
  38. */
  39. index = line.toLowerCase().indexOf("hwaddr");
  40. /**
  41. * 找到了
  42. */
  43. if (index != -1) {
  44. /**
  45. * 取出mac地址并去除2边空格
  46. */
  47. mac = line.substring(index + "hwaddr".length() + 1).trim();
  48. break;
  49. }
  50. }
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. } finally {
  54. try {
  55. if (bufferedReader != null) {
  56. bufferedReader.close();
  57. }
  58. } catch (IOException e1) {
  59. e1.printStackTrace();
  60. }
  61. bufferedReader = null;
  62. process = null;
  63. }
  64.  
  65. return mac;
  66. }
  67.  
  68. /**
  69. * 获取Linux网卡的mac地址.
  70. *
  71. * @return mac地址
  72. */
  73. public static String getLinuxMACAddress() {
  74. String mac = null;
  75. BufferedReader bufferedReader = null;
  76. Process process = null;
  77. try {
  78. /**
  79. * linux下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
  80. */
  81. process = Runtime.getRuntime().exec("ifconfig eth0");
  82. bufferedReader = new BufferedReader(new InputStreamReader(
  83. process.getInputStream()));
  84. String line = null;
  85. int index = -1;
  86. while ((line = bufferedReader.readLine()) != null) {
  87. index = line.toLowerCase().indexOf("硬件地址");
  88. /**
  89. * 找到了
  90. */
  91. if (index != -1) {
  92. /**
  93. * 取出mac地址并去除2边空格
  94. */
  95. mac = line.substring(index + 4).trim();
  96. break;
  97. }
  98. }
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. } finally {
  102. try {
  103. if (bufferedReader != null) {
  104. bufferedReader.close();
  105. }
  106. } catch (IOException e1) {
  107. e1.printStackTrace();
  108. }
  109. bufferedReader = null;
  110. process = null;
  111. }
  112.  
  113. // 取不到,试下Unix取发
  114. if (mac == null){
  115. return getUnixMACAddress();
  116. }
  117.  
  118. return mac;
  119. }
  120.  
  121. /**
  122. * 获取widnows网卡的mac地址.
  123. *
  124. * @return mac地址
  125. */
  126. public static String getWindowsMACAddress() {
  127. String mac = null;
  128. BufferedReader bufferedReader = null;
  129. Process process = null;
  130. try {
  131. /**
  132. * windows下的命令,显示信息中包含有mac地址信息
  133. */
  134. process = Runtime.getRuntime().exec("ipconfig /all");
  135. bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
  136. String line = null;
  137. int index = -1;
  138. while ((line = bufferedReader.readLine()) != null) {
  139. /**
  140. * 寻找标示字符串[physical address]
  141. */
  142. // index = line.toLowerCase().indexOf("physical address");
  143. // if (index != -1) {
  144. if (line.split("-").length == 6){
  145. index = line.indexOf(":");
  146. if (index != -1) {
  147. /**
  148. * 取出mac地址并去除2边空格
  149. */
  150. mac = line.substring(index + 1).trim();
  151. }
  152. break;
  153. }
  154. index = line.toLowerCase().indexOf("物理地址");
  155. if (index != -1) {
  156. index = line.indexOf(":");
  157. if (index != -1) {
  158. /**
  159. * 取出mac地址并去除2边空格
  160. */
  161. mac = line.substring(index + 1).trim();
  162. }
  163. break;
  164. }
  165. }
  166. } catch (IOException e) {
  167. e.printStackTrace();
  168. } finally {
  169. try {
  170. if (bufferedReader != null) {
  171. bufferedReader.close();
  172. }
  173. } catch (IOException e1) {
  174. e1.printStackTrace();
  175. }
  176. bufferedReader = null;
  177. process = null;
  178. }
  179.  
  180. return mac;
  181. }
  182.  
  183. public static String getMac(){
  184. String os = getOSName();
  185. String mac;
  186. if (os.startsWith("windows")) {
  187. mac = getWindowsMACAddress();
  188. } else if (os.startsWith("linux")) {
  189. mac = getLinuxMACAddress();
  190. } else {
  191. mac = getUnixMACAddress();
  192. }
  193. return mac == null ? "" : mac;
  194. }
  195.  
  196. /**
  197. * 测试用的main方法.
  198. *
  199. * @param argc 运行参数.
  200. */
  201. public static void main(String[] argc) {
  202. String os = getOSName();
  203. System.out.println("os: " + os);
  204. if (os.startsWith("windows")) {
  205. String mac = getWindowsMACAddress();
  206. System.out.println("mac: " + mac);
  207. } else if (os.startsWith("linux")) {
  208. String mac = getLinuxMACAddress();
  209. System.out.println("mac: " + mac);
  210. } else {
  211. String mac = getUnixMACAddress();
  212. System.out.println("mac: " + mac);
  213. }
  214. }
  215.  
  216. }
  1. /**
  2. * 我们需要判断Http请求是来自手机端还是电脑端,关键是取得User-Agent的信息,进行筛选判断即可
  3. * @param requestHeader
  4. * @return
  5. */
  6. public static boolean isMobileDevice(String requestHeader){
  7. /**
  8. * android : 所有android设备
  9. * mac os : iphone ipad
  10. * windows phone:Nokia等windows系统的手机
  11. */
  12. String[] deviceArray = new String[]{"Android","android","mac os","windows phone"};
  13. if(requestHeader == null)
  14. return false;
  15. requestHeader = requestHeader.toLowerCase();
  16. for(int i=0;i<deviceArray.length;i++){
  17. if(requestHeader.indexOf(deviceArray[i])>0){
  18. return true;
  19. }
  20. }
  21. return false;
  22. }
  1. //导入slf4j的包
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4.  
  5. //使用
  6. private static Logger logger = LoggerFactory.getLogger(***.class);
  1. //自动注入
  2. @Autowired
  3. protected HttpServletRequest request;
  4.  
  5. //在方法中调用isMobileDevice(String requestHeader)判断
  6. if(isMobileDevice(requestHeader)){
  7. logger.debug("使用手机浏览器");
  8. return "/***/***";
  9. 11 }else{
  10. logger.debug("使用web浏览器");
  11. return "/***/***";
  12. }

转载请注明出处!

http://www.cnblogs.com/libingbin/

感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

用户代理字符串识别工具源码与slf4j日志使用的更多相关文章

  1. WAFW00F waf识别工具 源码学习

    我实习工作的第一个任务根据已有的java waf识别工具 实现了一个python的waf识别工具 代码结构非常乱 仅仅达到了能用的水平. 顶头svp推荐这个项目当时我已经写好了开始用了自己的 稍微看了 ...

  2. 从微信小程序开发者工具源码看实现原理(四)- - 自适应布局

    从前面从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计可以知道,小程序大部分是通过web技术进行渲染的,也就是最终通过浏览器的dom tree + cssom来生成渲染树:既然最终是通 ...

  3. Ethtool工具源码剖析

    Ethtool工具源码剖析 ethool是一个实用的工具,用来给系统管理员以大量的控制网络接口的操作.可以用来控制接口参数,速度,介质类型,双工模式,DMA环设置,硬件校验和,LAN唤醒操作等.本人经 ...

  4. AForge.NET 工具源码下载

    AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器 ...

  5. NhibernateProfiler-写个自动破解工具(源码)

    04 2013 档案   [屌丝的逆袭系列]是个人都能破解之终结NhibernateProfiler-写个自动破解工具(源码) 摘要: 破解思路分析及手动破解 增加“附加到进程”功能--功能介绍增加“ ...

  6. 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计

    使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...

  7. CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)

    前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上 ...

  8. 实例源码--Android小工具源码

      下载源码   技术要点: 1. Android控件布局的使用 2. Http通信 3. XML数据解析 4. 网络状态的监听 5. 源码带有非常详细的中文注释 ...... 详细介绍: 1. An ...

  9. 【绝对给力】Android开发免豆资料(教程+工具+源码)地址汇总

    教程下载: [免费]android界面效果全汇总.pdf http://down.51cto.com/data/209179 Android终极开发教程[pdf高清版] http://down.51c ...

随机推荐

  1. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  2. Hadoop单机模式配置

    Required Software 1. 安装Java环境推荐的版本在链接中有介绍HadoopJavaVersions. 2. 安装ssh以使用hadoop脚本管理远程Hadoop daemons. ...

  3. 一文搞懂HMM(隐马尔可夫模型)

    什么是熵(Entropy) 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序,意味着具有确定和有 ...

  4. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  5. (实例篇)PHP实现HTTP断点续传的方法

    PHP实现HTTP断点续传的方法. <?php /** * PHP-HTTP断点续传实现 * @param string $path: 文件所在路径 * @param string $file: ...

  6. 游戏服务器菜鸟之C#初探二游戏服务

    经过短时间的折腾,为了解决上述问题,我对游戏进行一些简单的重构,以便能解决当前的瓶颈 添加了缓存服务器进行处理一些及时数据和配置数据,来缓解数据库的压力和IO的压力: 只能说解决当前的暂时性问题,但是 ...

  7. JavaScript随笔3

    1.获取非行间css if(oDiv.currentStyle){ alert(oDiv.currentStyle.width); }else{ alert(oDiv.getComputedStyle ...

  8. PostCSS深入学习: PostCSS和Sass、Stylus或LESS一起使用

    如果你喜欢使用PostCSS,但又不想抛弃你最喜欢的预处理器.不用担心,你不需要作出二选一的选择,你可以把PostCSS和预处理器(Sass.Stylus或LESS)结合起来使用. 有几个PostCS ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局

    系列目录 前言:这一节比较有趣.基本纯UI,但是不是很复杂 有了实现表单的打印和更加符合流程表单方式,我们必须自定义布局来适合业务场景打印!我们想要什么效果?看下图 (我们没有布局之前的表单和设置布局 ...

  10. Java设计模式之策略模式(Strategy)

    前言: 最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个 ...