javaweb判斷當前請求是否為移動設(shè)備訪問的方法
這段時間都是在做pc端的業(yè)務(wù),結(jié)果經(jīng)理找到我說,可能要做移動端的應用,后臺邏輯還是用我寫的邏輯,但是需要改動一些,看看怎么處理。
由于移動端和pc端還是稍微有些區(qū)別的,我覺得最好是在一個地兒統(tǒng)一判斷,而且不要改動原先的代碼,這樣可以從一定程度上減少bug的數(shù)量。我的想法是首先應該判斷當前請求是否為移動端,然后設(shè)一個標識到session中,然后就可以隨便處理了。不管你是單獨處理,還是統(tǒng)一處理,直接讀取session就可以做相應的判斷了。
我封裝成了一個類,現(xiàn)在分享給大家:
package com.tgb.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 檢測是否為移動端設(shè)備訪問
*
* @author :
* @group :
* @Version :
* @Date :
*/
public class CheckMobile {
// \b 是單詞邊界(連著的兩個(字母字符 與 非字母字符) 之間的邏輯上的間隔),
// 字符串在編譯時會被轉(zhuǎn)碼一次,所以是 "\\b"
// \B 是單詞內(nèi)部邏輯間隔(連著的兩個字母字符之間的邏輯上的間隔)
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";
//移動設(shè)備正則匹配:手機端、平板
static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);
static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);
/**
* 檢測是否是移動設(shè)備訪問
*
* @Title: check
* @Date :
* @param userAgent 瀏覽器標識
* @return true:移動設(shè)備接入,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();
//檢查是否已經(jīng)記錄訪問方式(移動端或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中調(diào)用這個方法,不用改動原先的業(yè)務(wù)邏輯,即可判斷請求的是否為移動端,然后再根據(jù)結(jié)果去做相應處理,應該就簡單多了。
其實我在做的過程中,還是遇到了一個比較頭疼的問題。經(jīng)理說移動端的應用要求使用json格式,所以我想統(tǒng)一做一個處理,如果是從移動端訪問,那么就把request和session中設(shè)置的Attribute全部讀取到map或者list中,然后再轉(zhuǎn)化為json格式輸出。想法的美好的,結(jié)果有點小殘酷。就拿登錄來說,登錄以后要跳轉(zhuǎn)到list.jsp頁,結(jié)果現(xiàn)在直接輸出list中的數(shù)據(jù)了,但是頁面沒有跳轉(zhuǎn)。頁面跳轉(zhuǎn)和返回json是沖突的。輸出json的話,輸出流就會關(guān)閉,不讓再跳轉(zhuǎn),否則會提示錯誤。不知道大家有沒有好的解決方案,如果不行的話,只能每個請求單獨處理了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 程序設(shè)計總復習題(java基礎(chǔ)代碼)
這篇文章主要介紹了Java 程序設(shè)計總復習題,主要是java基礎(chǔ)代碼,方便學習java的同學2021-05-05
SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐
h2是內(nèi)存數(shù)據(jù)庫,查詢高效,可以在開發(fā)初期使用它。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐,具有一定的參考價值,感興趣的可以了解一下2021-09-09
java開發(fā)ServiceLoader實現(xiàn)機制及SPI應用
這篇文章主要為大家介紹了java開發(fā)ServiceLoader實現(xiàn)機制及SPI應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
spring?boot?Slf4j日志框架的體系結(jié)構(gòu)詳解
在項目開發(fā)中記錄日志是必做的一件事情,springboot內(nèi)置了slf4j日志框架,下面這篇文章主要給大家介紹了關(guān)于spring?boot?Slf4j日志框架的體系結(jié)構(gòu),需要的朋友可以參考下2022-05-05

