Spring Mobile——探測客戶端設備和系統
今天閑來無事,瀏覽Spring的官方網站,發現了Spring Mobile項目,之前也看到過,還以為是針對手機端的項目,並沒有細看。今天仔細看了一下,原來是可以探測請求端的設備和系統。比如是手機、平板、還是正常的PC網站。它是Spring MVC的擴展,主要的目的是簡化手機web應用的開發。
它的主要特點是:
- 在服務端探測發起請求的設備,手機或平板等。
- 管理站點,統計每個用戶的偏好。
- 根據請求設備的不同,返回適合該設備的視圖
具體的在項目中使用也非常的簡單,例如我們使用Spring Boot搭建項目,然后引入Spring Mobile的starter,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mobile</artifactId> </dependency>
然后在application.properties文件中將sitepreference打開,如下:
spring.mobile.sitepreference.enabled=true
Spring Boot自動注入了3個類,DeviceResolverHandlerInterceptor,SitePreferenceHandlerInterceptor和SitePreferenceMethodArgumentResolver。DeviceResolverHandlerInterceptor是HandlerInterceptor的一個實現,從名字來看,它攔截到應用的請求,判斷發送請求設備的類型。當設備解決以后,SitePreferenceMethodArgumentResolver允許SpringMVC在Controller中使用SitePreference實體。在內部,DeviceResolverHandlerInterceptor判斷請求頭中的User-Agent,基於請求頭中的值,判斷請求是否來自瀏覽器(桌面)、手機、還是Pad。
SitePreferenceHandlerInterceptor利用探測到的設備,判斷用戶的初始站點偏好。如果用戶喜歡另一個站點,則選擇該站點,並在隨后的請求中使用,以覆蓋已解析的設備值。站點偏好是通過請求中特殊的查詢字符串設置的。一旦接收到,偏好將被持久化到cookie中,以供將來參考。站點偏好功能在Spring Boot中默認是打開的,可以通過上面的設置關閉它。
這樣我們就可以使用Spring Mobile了,我們在Controller中加了如下代碼:
@RequestMapping("index") public String index(HttpSession session,Page<User> page,SitePreference site,Device device){ System.out.println("site.isMobile:"+site.isMobile()); System.out.println("site.isTablet:"+site.isTablet()); System.out.println("site.isNormal:"+site.isNormal()); System.out.println("device.isMobile:"+device.isMobile()); System.out.println("device.isTablet:"+device.isTablet()); System.out.println("device.isNormal:"+device.isNormal()); System.out.println("device.Platform:"+device.getDevicePlatform()); System.out.println("site.name:"+site.name()); System.out.println(session.getId()); return null; }
運行后,后台打印出的值如下:
site.isMobile:true site.isTablet:false site.isNormal:false device.isMobile:true device.isTablet:false device.isNormal:false device.Platform:ANDROID site.name:MOBILE
測試時,我們可以通過瀏覽器的調試功能(F12),模擬不同的設備。這樣我們就可以捕獲到前端的設備類型了。
我們在開發時,可能針對不同的設備做不同的適配頁面。Spring Mobile也為我們提供了非常強大的視圖代理解析功能。我們只需要在applicaton.properties中配置即可。
spring.mobile.devicedelegatingviewresolver.enabled=true spring.mobile.devicedelegatingviewresolver.mobile-prefix= spring.mobile.devicedelegatingviewresolver.mobile-suffix= spring.mobile.devicedelegatingviewresolver.tablet-prefix= spring.mobile.devicedelegatingviewresolver.tablet-suffix= spring.mobile.devicedelegatingviewresolver.normal-prefix= spring.mobile.devicedelegatingviewresolver.normal-suffix=
我們將代理解析器打開,並配置3中設備類型的前綴和后綴。后6項也可以不配置,默認的3中類型的后綴都沒有,前綴手機類型的是/mobile,平板類型的是/tablet。瀏覽器是沒有前綴的,然后將3中視圖放在相應的目錄中,代碼如下:
@Controller public class GreetingController { @RequestMapping("/greeting") public String greeting() { return "greeting"; } }
頁面如下:
這樣,3個不同的設備就會訪問不同的頁面,很方便吧。示例代碼在我的GitHub中,https://github.com/bigbugliu/spring-boot-demo。歡迎大家在評論區討論。