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

因为移动端和pc端还是略微有些差别的,我认为最好是在一个地儿统一推断,并且不要修改原先的代码,这样能够从一定程度上降低bug的数量。

我的想法是首先应该推断当前请求是否为移动端,然后设一个标识到session中,然后就能够随便处理了。无论你是单独处理。还是统一处理,直接读取session就能够做对应的推断了。

我封装成了一个类,如今分享给大家:

package com.tgb.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* 检測是否为移动端设备訪问
*
* @author : Cuichenglong
* @group : tgb8
* @Version : 1.00
* @Date : 2014-7-7 下午01:34:31
*/
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 : 2014-7-7 下午01:29:07
* @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 : 2014-7-7 下午03:55:19
* @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的话。输出流就会关闭,不让再跳转,否则会提示错误。

不知道大家有没有好的解决方式,假设不行的话,仅仅能每一个请求单独处理了。

javaweb:推断当前请求是否为移动设备訪问的更多相关文章

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

    由于移动端和pc端还是稍微有些区别的,我觉得最好是在一个地儿统一判断,而且不要改动原先的代码,这样可以从一定程度上减少bug的数量.我的想法是首先应该判断当前请求是否为移动端,然后设一个标识到sess ...

  2. JavaWeb 发送get请求

      JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...

  3. JavaWeb 发送post请求的2种方式(form、json)

      JavaWeb 发送post请求的2种方式(form.json) CreationTime--2018年6月20日10点15分 Author:Marydon 前提:通过HttpClient来实现 ...

  4. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...

  5. java使用线程请求訪问每次间隔10分钟连续5次,之后停止请求

    java使用线程请求訪问每次间隔10分钟连续5次,收到对应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestT ...

  6. jsonp突破同源策略,实现跨域訪问请求

    版权声明:本文为博主原创文章,未经博主同意不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] https://blog.csdn.net/xiao ...

  7. SharePoint 2013 开启訪问请求

    1.通常,我们进入SharePoint 2013网站,假设没权限会提示该网站未被共享,而没有切换账号或者申请訪问,实在是非常流氓:事实上,SharePoint为我们提供了訪问请求页面.可是可能须要手动 ...

  8. javaweb:判断当前请求是否为移动设备访问

    http://blog.csdn.net/educast/article/details/71157932

  9. javaWEB总结(14):请求的转发和重定向

    通俗理解请求转发与重定向的流程 通俗的来讲:我们可以把请求转发和重定向当成是一种借钱的情景模式. (1)请求的转发:A向B借钱,B自己没有钱,但是向C借到了钱,并且把钱借给了A.A只向B请求了一次. ...

随机推荐

  1. jquery的img的动态title换行

    因业务需要,需要在图片悬浮的时候显示动态加载的title,如果图片的title为固定的可以使用以下方式换行: <img src="1.jpg" title="第一行 ...

  2. bash, sh, dash 傻傻分不清楚

    原文链接,转载请注明出处: http://www.happycxz.com/m/?p=137 常见shell类型 Bourne shell (sh) UNIX 最初使用,且在每种 UNIX 上都可以使 ...

  3. man ctags

    ctags命令帮助   命令格式     ctags [options] [file(s)] 或     etags [options] [file(s)]   源文件参数     不同语言中对象的种 ...

  4. JQuery使用笔记

    1.选择器 id选择器: $('#btnShow') class选择器: $('.banner') tag选择器: $('input') 2.常用方法 取 / 设value: $('#btnShow' ...

  5. spring boot 中 Mybatis plus 多数据源的配置方法

    最近在学习spring boot,发现在jar包依赖方面做很少的工作量就可以了,对于数据库操作,我用的比较多的是mybatis plus,在中央仓库已经有mybatis-plus的插件了,对于单数据源 ...

  6. Ionic3学习笔记(十一)实现省市区三级联动

    本文为原创文章,转载请标明出处 目录 安装 ion-multi-picker 导入 app.module.ts 创建 provider 创建 page 一个坑 更多 效果图 1. 安装 ion-mul ...

  7. 【笔记】web 的回流与重绘及优化

    最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint).觉得以后面试或许会被问到所以做一下笔记: 课程从回流及重绘这两个点延伸出了一个知识点就是 ...

  8. oracle 物化视图 job

    在oracle数据库里边,创建物化视图之后,系统在DBMS_jobs文件夹下,会自动创建相应的job,右键执行job的时候报错如下: 问题:ORA-12012: 自动执行作业 198 出错 ORA-1 ...

  9. 关于Excel数据批量导入数据库的案例

    写这个案例主要是感觉这个功能挺实用,很多地方会用得到的,废话就不多说了,直接上对应的源码. 这个案例我运用的是Winform窗体程序实现数据的导入. 首先是数据库的登陆界面如下: 源码如下: usin ...

  10. ASP.NET Core 一步步搭建个人网站(持续更新中~~~)

    摘要 ASP.NET Core2.0发布有一阵子了,这是.NET 开源跨平台的一个重大里程碑, 也意味着比1.0版本要更加成熟.目前.net core具有开源.跨平台.灵活部署.模块化架构等等特性,吸 ...