javaweb判断当前请求是否为移动设备访问的方法
时间:2019-03-30
本文章向大家介绍javaweb判断当前请求是否为移动设备访问的方法,主要包括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的话,输出流就会关闭,不让再跳转,否则会提示错误。不知道大家有没有好的解决方案,如果不行的话,只能每个请求单独处理了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Codeforces 842A Kirill And The Game【暴力,水】
- Wannafly模拟赛 A.矩阵(二分答案+hash)
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
- Comparison of Apache Stream Processing Frameworks: Part 1
- 【LeetCode】关关的刷题日记23——Leetcode 66. Plus One
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861A k-roun
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- Comparison of Apache Stream Processing Frameworks: Part 2
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
- Python3选择排序
- 【DeepMind 公开课-深度强化学习教程代码实战01】迭代法评估4*4方格世界下的随机策略
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
- 蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
- .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载
- 蓝牙芯片----BK3431开发笔记------RW stack中添加自定义服务教程(4)
- 图像简单处理
- 蓝牙---BLE GATT介绍
- Access数据库密码破解 C#
- 没啥用,更换注册表信息使webbrower选择适合的版本
- linux下分割和合并压缩包
- 编译.net .net Core程序 代码,仅做备份
- js删除数组对象中符合条件的数据
- .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
- 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
- 一网打尽枚举操作 .net core
- Jenkins 发布.net core 程序,服务端无法下载nuget包的解决方法 error NU1102: 找不到版本为 (>= 3.1.6) 的包