javaweb判断当前请求是否为移动设备访问的方法

 更新时间:2017年05月09日 16:01:34   作者:龙轩  
这篇文章主要为大家详细介绍了javaweb判断当前请求是否为移动设备访问的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这段时间都是在做pc端的业务,结果经理找到我说,可能要做移动端的应用,后台逻辑还是用我写的逻辑,但是需要改动一些,看看怎么处理。

由于移动端和pc端还是稍微有些区别的,我觉得最好是在一个地儿统一判断,而且不要改动原先的代码,这样可以从一定程度上减少bug的数量。我的想法是首先应该判断当前请求是否为移动端,然后设一个标识到session中,然后就可以随便处理了。不管你是单独处理,还是统一处理,直接读取session就可以做相应的判断了。

我封装成了一个类,现在分享给大家:

package com.tgb.util; 
 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
 
/** 
 * 检测是否为移动端设备访问 
 * 
 * @author  : 
 * @group  : 
 * @Version  : 
 * @Date  : 
 */ 
public class CheckMobile { 
  
 // \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 
  * @Date : 
  * @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; 
  } 
 } 
} 

 使用方式:

 /** 
 * 检查访问方式是否为移动端 
 * 
 * @Title: check 
 * @Date : 
 * @param request 
 * @throws IOException 
 */ 
public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException{ 
 boolean isFromMobile=false; 
  
 HttpSession session= request.getSession(); 
 //检查是否已经记录访问方式(移动端或pc端) 
 if(null==session.getAttribute("ua")){ 
  try{ 
   //获取ua,用来判断是否为移动端访问 
   String userAgent = request.getHeader( "USER-AGENT" ).toLowerCase(); 
   if(null == userAgent){ 
    userAgent = ""; 
   } 
   isFromMobile=CheckMobile.check(userAgent); 
   //判断是否为移动端访问 
   if(isFromMobile){ 
    System.out.println("移动端访问"); 
    session.setAttribute("ua","mobile"); 
   } else { 
    System.out.println("pc端访问"); 
    session.setAttribute("ua","pc"); 
   } 
  }catch(Exception e){} 
 }else{ 
  isFromMobile=session.getAttribute("ua").equals("mobile"); 
 } 
  
 return isFromMobile; 
} 

在登录的时候,或者在action的execute中调用这个方法,不用改动原先的业务逻辑,即可判断请求的是否为移动端,然后再根据结果去做相应处理,应该就简单多了。

其实我在做的过程中,还是遇到了一个比较头疼的问题。经理说移动端的应用要求使用json格式,所以我想统一做一个处理,如果是从移动端访问,那么就把request和session中设置的Attribute全部读取到map或者list中,然后再转化为json格式输出。想法的美好的,结果有点小残酷。就拿登录来说,登录以后要跳转到list.jsp页,结果现在直接输出list中的数据了,但是页面没有跳转。页面跳转和返回json是冲突的。输出json的话,输出流就会关闭,不让再跳转,否则会提示错误。不知道大家有没有好的解决方案,如果不行的话,只能每个请求单独处理了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MybatisPlus代码生成器使用示例

    MybatisPlus代码生成器使用示例

    MyBatis-Plus自动化的生成与数据库表对应的Java代码文件,本文主要介绍了MybatisPlus代码生成器使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • springboot如何通过session实现单点登入详解

    springboot如何通过session实现单点登入详解

    单点登录(SSO)的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面这篇文章主要给大家介绍了关于springboot如何通过session实现单点登入的相关资料,需要的朋友可以参考下
    2021-12-12
  • Java方法递归的形式和常见递归算法(方法递归结合File类查找文件)

    Java方法递归的形式和常见递归算法(方法递归结合File类查找文件)

    方法递归方法直接调用自己或者间接调用自己的形式称为方法递归( recursion),递归做为一种算法在程序设计语言中广泛应用,这篇文章主要介绍了Java方法递归的形式和常见递归算法-方法递归结合File类查找文件,需要的朋友可以参考下
    2023-02-02
  • 使用Java自带的mail API实现邮件发送功能全过程

    使用Java自带的mail API实现邮件发送功能全过程

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等,下面这篇文章主要给大家介绍了关于如何使用Java自带的mail API实现邮件发送功能的相关资料,需要的朋友可以参考下
    2023-04-04
  • 解决Request获取请求数据中文乱码问题

    解决Request获取请求数据中文乱码问题

    这篇文章主要介绍了Request获取请求数据中文乱码问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java设计模式之初识行为型模式

    Java设计模式之初识行为型模式

    今天带大家学习Java设计模式的相关知识点,文中对Java行为型模式做了非常详细的介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Springboot 对接支付宝实现扫码支付功能

    Springboot 对接支付宝实现扫码支付功能

    本文介绍了如何在Spring Boot项目中实现支付宝支付功能,包括沙箱环境配置、依赖引入、配置参数、订单类定义、测试接口编写等步骤,通过不同场景下的请求方式(PC端、二维码、回调处理、定时查询支付结果),展示了如何与支付宝API进行交互,感兴趣的朋友一起看看吧
    2025-03-03
  • Java锁擦除与锁粗化概念和使用详解

    Java锁擦除与锁粗化概念和使用详解

    这篇文章主要介绍了Java锁擦除与锁粗化概念和使用,锁擦除的主要判定依据来源于逃逸分析的数据支持,如果判断在一段代码中,堆上的所有数据都不会逃逸出去从而被其他线程访问到,那就可以把它们当做栈上数据对待,认为它们是线程私有的,同步加锁自然就无须进行
    2023-02-02
  • Java中new关键字和newInstance方法的区别分享

    Java中new关键字和newInstance方法的区别分享

    在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法一个是关键字外,最主要的区别是创建对象的方式不同
    2013-07-07
  • Java8新特性Optional类及新时间日期API示例详解

    Java8新特性Optional类及新时间日期API示例详解

    这篇文章主要为大家介绍了Java8新特性Optional类及新时间日期API示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论