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的话,输出流就会关闭,不让再跳转,否则会提示错误。不知道大家有没有好的解决方案,如果不行的话,只能每个请求单独处理了。

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

(0)

相关推荐

  • JavaWeb项目实现文件上传动态显示进度实例

    很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之后网页就跳转了.后来我学习到了Ajax,我知道了浏览器可以异步的发送响应,这时我又有新的疑问,那就是在我上传一些文件的时候,那些网站的上传进度是怎么做到的,因为servlet直到上传完成之后才完成响应. 最近我们的项目中有一个地方中需要用到一个功能,当用户点击一个处理按钮时,前台会实时的显示后台处理

  • JavaWeb使用POI操作Excel文件实例

    1.为项目添加POI POI官网链接 点进去之后下载(上边的是编译好的类,下边的是源代码) 解压文件夹,把下面三个文件复制到WebComtent>WEB-INF>lib文件夹下 再把这三个文件复制到Tomcat的lib文件夹下,否则Tomcat会因为找不到类而报错(这个地方郁闷了一上午) 读取".xls"格式使用  import org.apache.poi.hssf.usermodel.*;包的内容,例如:HSSFWorkbook 读取".xlsx"格

  • JavaWeb中web.xml初始化加载顺序详解

    需求说明 做项目时,为了省事,起初把初始化的配置都放在每个类中 static加载,初始化配置一多,就想把它给整理一下,这里使用servlet中的init方法初始化. web.xml说明 首先了解下web.xml中元素的加载顺序: 启动web项目后,web容器首先回去找web.xml文件,读取这个文件 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部分都将共享这个上下文 容器将 转换为键值对,并交给 servletContext 容器创建 中的

  • 详解velocity模板使javaWeb的html+js实现模块化

    详解velocity模板使javaWeb的html+js实现模块化 页面上一些基础数据或者其他页面经常用到部分,可以独立出来做成小组件,组件预留调用入口,需要的页面直接调用即可. 如图,页面中的展示分类和搜索标签在多个页面重复使用,可以将这部分内容独立出来,做成组件,供后续开发调用: classify_search_tag.html文件如下,其中包含HTML节点和jQuery代码: <!-- 展示分类与搜索标签组件使用说明: 1.新增时父页面调用方法:页面加载时调用 goodsClassifyA

  • 关于javaWeb中405错误的解决方法

    今天写了一个servlet,可是一直405报错,开始以为web.xml里面的servlet配置有问题,可是那样的话应该报404错误啊 最后才发现在重写doPost和doGet方法的时候,写成了dopost和doget,因为java对大小写很敏感,故相当于没有重新httpservelt里面的方法. 反思:编程需谨慎!!! 以上这篇关于javaWeb中405错误的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • javaweb在线支付功能实现代码

    本文实例为大家分享了javaweb在线支付功能的具体实现代码,供大家参考,具体内容如下 package com.learning.web.servlet; import java.io.IOException; import java.util.ResourceBundle; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Ht

  • JavaWeb 文件的上传和下载功能简单实现代码

    一.文件的上传和下载 1.文件上传的原理分析 1.文件上传的必要前提: a.提供form表单,method必须是post           b.form表单的enctype必须是multipart/form-data           c.提供input type="file"类的上传输入域 2.enctype属性 作用:告知服务器请求正文的MIME类型(请求消息头:Content-Type作用是一致的)      可选值: application/x-www-form-urlen

  • javaWeb自定义标签用法实例详解

    本文实例讲述了javaWeb自定义标签用法.分享给大家供大家参考,具体如下: 自定义标签创建 自定义标签主要用于移除Jsp页面中的Java代码. 移除jsp页面中的java代码,只需要完成两个步骤: - 编写一个继承TagSupport的Java类,并覆盖doStartTag方法,把jsp页面中的java代码写到doStartTag方法中. - 编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述. 完成以上操作,即可在JSP页面中导入和使用自定义标签. 标签处理类:HelloTa

  • javaWeb项目部署到阿里云服务器步骤详解

    记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以完成打包,如下图: 2.安装Xshell和Xftp两种软件 简单介绍下这两种软件作用(详情请百度相关文档) Xshell:通过网络连接到远程服务器主机. Xftp:能在Linux.Unix和Windows之间互传文件. 3.通过Xshell连接远程主机,如下图    4.创建会话完成,点击连接,显示

  • javaweb中mysql数据库连接步骤方法及其实例

    一.直接连接,不封装到工具类中,主要步骤: 先导包:mysql-connector-java-5.0.8-bin.jar(点击跳转到下载界面),放在WebRoot/WEB-INF/lib/下 1.加载驱动//com.MySQL.jdbc.Driver 2.获取连接 Connection对象 3.获取用于向数据库发送SQL的Statement对象 4.执行sql,获取数据,解析数据 5.关闭连接,释放资源 /*协议:子协议://主机:端口/数据库名*/ Stringurl="jdbc:mysql:

随机推荐