天天看點

Spring Mobile 邏輯分析

目前版本:1.0.0.M3

Spring Mobile是針對Spring MVC的一個擴充,用來給普通的web應用加入mobile通路的支援;

Spring Mobile有三個組成部分:

1.Device resolution(裝置解析)

通過分析請求的headers來決定請求的裝置資訊;

這裡是通過Interceptor在實際處理請求前先以DeviceResolver拿到Device對象,再将其放入請求的attribute中,為随後的Controller/View使用;

通過mvc:argument-resolvers配置,可以将Device對象加入到Controller的方法參數中友善使用

Spring Mobile内置了一種簡單的DeviceResolver(官方文檔提到的另一個WurflDeviceResolver由于license不相容已移除)

LiteDeviceResolver:它隻區分MOBILE和NOT_MOBILE兩種狀态;它的檢測算法:

是否有“x-wap-profile”或"Profile"的header;

“User-Agent”是否以特定的詞為字首;

“Accept”的值中是否包含“wap”;

“User-Agent”是否包含特定的關鍵詞;

所有header名中是否包含有“OperaMini”

2.Site preference management(偏好管理)

有時手機想通路桌面版或者桌面想通路手機版,可以在頁面加上其他版本的連結,不同的版本隻有一個參數不一樣;

site_preference=normal或者site_preference=mobile

同樣會用一個Interceptor處理:

判斷是否有參數指定,

如果沒有會嘗試從cookie中取得;

如果仍沒有就使用上面Device對象的;[這意味着就不用再直接基于上面1中的Device對象判斷]

将結果寫入cookie

同樣也可以配置在Controller方法參數中加入這個SitePreference

3.Site switching(站點切換)

一些站點會為mobile通路提供不同的域名,例如m.google.com,站點切換就是做這個的了:

Spring Mobile提供了兩種替換方式,例如myapp.com可以切換到m.myapp.com或myapp.mobi

實作依然是一個Interceptor,它會首先拿到SitePreference[這意味着不用直接做上面2的判斷]

然後和目前域名比較,不同的話就會拼裝新的URL,然後做重定向.

ps.将Controller常用的對象提取到Interceptor再通過配置為Controller方法參數,是一種便捷的方法,

可以用在登入User等對象上。

繼續閱讀