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