Spring Mobile——探测客户端设备和系统

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。欢迎大家在评论区讨论。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

Linux的IPC命令

进程间通信有如下的目的:1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;2、共享数据,多个进程想要操作共享数据,一个进程...

15920
来自专栏程序猿DD

Spring Boot自动化配置的利弊及解决之道

双刃剑:自动化配置 之前在博客中发布的大量Spring Boot基础教程系列文章中,我们通过各种功能性示例体验了Spring Boot的自动化配置给我们所带来的...

44450
来自专栏码神联盟

框架 | SSH和SSM对比异同点、各自优势

当下流行的两种企业开发MVC开源框架,是我们Java程序猿必备知识能力。MVC,即模型(model)-视图(view)-控制器(controller)的缩写,一...

509140
来自专栏IMWeb前端团队

VS Code进阶

虽然关于VS Code的介绍文章已经不少了,但面对如此用心的IDE,还是忍不住要再“赞美”一番,希望可以拉更多开发小伙伴入坑,如果能真正提高大家的开发体验当然是...

45790
来自专栏日常分享

Spring 学习笔记(一)——Spring 基本概念和体系概览

简而言之,Spring 是一个轻量级的IoC(控制反转)和AOP(面向切面)的容器框架。

10930

在Debian 7上安装PocketMine服务器

PocketMine是适用于我的世界Android和iOS版本的第三方服务器。该服务支持插件,允许您与其他人自定义游戏。本指南详细介绍了在运行Debian 7的...

18340
来自专栏IT技术精选文摘

JMeter最多可以模拟多少测试用户数?

本文我们将讨论一个确切说没有准确答案的问题 - 即我们使用Apache JMeter™最多可以模拟多少用户来做测试? 像JMeter本身的限制一样,这样的限制因...

82670
来自专栏JAVA同学会

Spring Mobile——探测客户端设备和系统

今天闲来无事,浏览Spring的官方网站,发现了Spring Mobile项目,之前也看到过,还以为是针对手机端的项目,并没有细看。今天仔细看了一下,原来是可以...

12040
来自专栏程序猿DD

Spring Cloud Finchley版中Consul多实例注册的问题处理

问题:该问题可能在开发阶段不一定会发现,但是在线上部署多实例的时候,将会发现Consul中只有一个实例。

23140
来自专栏xingoo, 一个梦想做发明家的程序员

Tomcat 6 --- 使用Jasper引擎解析JSP

熟悉JAVA web开发的朋友都知道JSP会被转换成java文件(预编译),然后编译成class使用,即按照JSP-->java-->class的过程进行编译...

30270

扫码关注云+社区

领取腾讯云代金券