javaweb:推断当前请求是否为移动设备訪问
这段时间都是在做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:推断当前请求是否为移动设备訪问的更多相关文章
- javaweb判断当前请求是否为移动设备访问的方法
由于移动端和pc端还是稍微有些区别的,我觉得最好是在一个地儿统一判断,而且不要改动原先的代码,这样可以从一定程度上减少bug的数量.我的想法是首先应该判断当前请求是否为移动端,然后设一个标识到sess ...
- JavaWeb 发送get请求
JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...
- JavaWeb 发送post请求的2种方式(form、json)
JavaWeb 发送post请求的2种方式(form.json) CreationTime--2018年6月20日10点15分 Author:Marydon 前提:通过HttpClient来实现 ...
- 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序
P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...
- java使用线程请求訪问每次间隔10分钟连续5次,之后停止请求
java使用线程请求訪问每次间隔10分钟连续5次,收到对应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestT ...
- jsonp突破同源策略,实现跨域訪问请求
版权声明:本文为博主原创文章,未经博主同意不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] https://blog.csdn.net/xiao ...
- SharePoint 2013 开启訪问请求
1.通常,我们进入SharePoint 2013网站,假设没权限会提示该网站未被共享,而没有切换账号或者申请訪问,实在是非常流氓:事实上,SharePoint为我们提供了訪问请求页面.可是可能须要手动 ...
- javaweb:判断当前请求是否为移动设备访问
http://blog.csdn.net/educast/article/details/71157932
- javaWEB总结(14):请求的转发和重定向
通俗理解请求转发与重定向的流程 通俗的来讲:我们可以把请求转发和重定向当成是一种借钱的情景模式. (1)请求的转发:A向B借钱,B自己没有钱,但是向C借到了钱,并且把钱借给了A.A只向B请求了一次. ...
随机推荐
- 浅谈postgresql的GIN索引(通用倒排索引)
1.倒排索引原理 倒排索引来源于搜索引擎的技术,可以说是搜索引擎的基石.正是有了倒排索引技术,搜索引擎才能有效率的进行数据库查找.删除等操作.在详细说明倒排索引之前,我们说一下与之相关的正排索引并与之 ...
- Cordova cannot add Android failed with exit code ENOENT
这可能是系统环境变量损坏了 解决方案:在系统变量path如果没用下面的变量就加上%SystemRoot%\system32; %SystemRoot%; %SystemRoot%\System32\W ...
- ldap数据库--ODSEE--ACI
查看跟DN下的aci ldapsearch -h hostname -p port -D "cn=Directory Manager" -w - -b "BASE_DN& ...
- 【APP问题定位(一)】夜神模拟器安装及问题
本文较少下夜神模拟器的使用,包括了夜神安装,APK安装,开发者选项打开. 安装夜神模拟器 到 夜神模拟器 网站自行下载安装文件,双击exe文件安装,选择"自定义安装" ...
- 关于帧动画steps属性的理解
CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ...
- word建立统一的表格样式
插入一个表格,一般border都是一样粗细,不美观, 这里推荐一种样式如下图(外框和首行都加粗,比较好看) 设置方法: 1.选中表格,上方出现设计选项卡 2.表格样式,点击"新建样式表&qu ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
- Golang 任务队列策略 -- 读《JOB QUEUES IN GO》
Golang 在异步处理上有着上佳的表现.因为 goroutines 和 channels 是非常容易使用且有效的异步处理手段.下面我们一起来看一看 Golang 的简易任务队列 一种"非任 ...
- 校门外的树-poj
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...