鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机、平板、电脑等设备。使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应。

如图所示,与普通项目相比而言,我们需要拦截用户的请求,获取 Request 中的 Header 的 User-Agent 属性,来判断用户的设备信息,然后修改 Controller 返回的页面路径,来适应设备的页面路径,从而达到页面自适应的效果。

代码实现

假设我们的静态资源目录如下

  1. resources/
  2. |-- mobile/
  3. |-- index.html #手机版首页
  4. |-- index.html #电脑版首页

1、添加 aop 的相关依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

2、定义设备的枚举类型 UserAgentTypeEnum.java

  1. /**
  2. * UserAgentType 枚举
  3. */
  4. public enum UserAgentTypeEnum {
  5. // 电脑
  6. PC(0),
  7. // 平板电脑
  8. TABLET(1),
  9. // 手机
  10. PHONE(2);
  11. private int code;
  12. UserAgentTypeEnum(int code){
  13. this.code = code;
  14. }
  15. public int getCode() {
  16. return code;
  17. }
  18. }

3、添加 UserAgent 识别工具类

  1. /**
  2. * User-Agent 工具
  3. */
  4. public class UserAgentTools {
  5. /**
  6. * 识别设备类型
  7. * @param userAgent 设备标识
  8. * @return 设备类型
  9. */
  10. public static Integer recognize(String userAgent){
  11. if(Pattern.compile("(Windows Phone|Android|iPhone|iPod)").matcher(userAgent).find()){
  12. return UserAgentTypeEnum.PHONE.getCode();
  13. }
  14. if(Pattern.compile("(iPad)").matcher(userAgent).find()){
  15. return UserAgentTypeEnum.TABLET.getCode();
  16. }
  17. return UserAgentTypeEnum.PC.getCode();
  18. }
  19. }

4、添加切面处理逻辑,实现设备识别和页面路径修改,假设 Controller 类包 cn.ictgu.controller 下

  1. /**
  2. * AOP 实现页面自适应
  3. */
  4. @Aspect
  5. @Component
  6. @Log4j2
  7. public class DeviceAdapter {
  8. private static final String MOBILE_PREFIX = "mobile/";
  9. /**
  10. * 切入点:cn.ictgu.controller 下所有 @GetMapping 方法
  11. */
  12. @Pointcut("execution(* cn.ictgu.controller..*(..)) && @annotation(org.springframework.web.bind.annotation.GetMapping)")
  13. public void controllerMethodPointcut() {
  14. }
  15. /**
  16. * 识别用户请求的设备并返回对应的页面
  17. */
  18. @Around("controllerMethodPointcut()")
  19. public String around(ProceedingJoinPoint joinPoint) {
  20. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  21. if (attributes != null) {
  22. try {
  23. HttpServletRequest request = attributes.getRequest();
  24. String userAgent = request.getHeader("User-Agent");
  25. log.info(userAgent);
  26. Integer deviceType = UserAgentTools.recognize(userAgent);
  27. String path = (String) joinPoint.proceed();
  28. return deviceType == UserAgentTypeEnum.PHONE.getCode() ? MOBILE_PREFIX + path : path;
  29. } catch (Throwable e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. throw new RuntimeException("DeviceAdapter,ServletRequestAttributes is null!");
  34. }
  35. }

5、至此,基于 AOP 的页面自适应就完成了。示例:

  1. @GetMapping(value = "/index")
  2. public String index() {
  3. return "index";
  4. }

手机访问就会得到 mobile/index.html 的页面,其他设备就会得到 index.html 的页面。

转载请注明出处,谢谢!

有兴趣一起写代码的,可以 加入我们,基于 Spring Boot 2.x 版本的最佳实践。项目及演示地址 http://im.ictgu.cn/
开源, 等你!

http://www.spring4all.com/article/169

Spring Boot 使用 AOP 实现页面自适应的更多相关文章

  1. spring boot使用AOP切面编程

    spring boot使用AOP 1.在pom文件中添加依赖: <!--spring boot aop切面--> <dependency> <groupId>org ...

  2. Spring Boot + thymeleaf 后台与页面(二)

    Spring Boot推荐使用thymeleaf模板完成与页面的交互(已不支持JSP某些特性,不推荐JSP) 步骤 在一个Spring Boot Web项目基础上,也可以参考我前一篇文章建立的项目 1 ...

  3. Spring Boot学习——AOP编程的简单实现

    首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式.AOP的思想理念就是将通用逻辑从业务逻辑中分离 ...

  4. spring boot 中AOP的使用

    一.AOP统一处理请求日志 也谈AOP 1.AOP是一种编程范式 2.与语言无关,是一种程序设计思想 面向切面(AOP)Aspect Oriented Programming 面向对象(OOP)Obj ...

  5. Spring Boot 使用 Aop 实现日志全局拦截

    前面的章节我们学习到 Spring Boot Log 日志使用教程 和 Spring Boot 异常处理与全局异常处理,本章我们结合 Aop 面向切面编程来实现全局拦截异常并记录日志. 在 Sprin ...

  6. Spring Boot使用AOP的正确姿势

    一.为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显.当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录.性能监控等,如果采用面向对象编程的方法, ...

  7. Spring MVC或Spring Boot配置默认访问页面不生效?

    相信在开发项目过程中,设置默认访问页面应该都用过.但是有时候设置了却不起作用.你知道是什么原因吗?今天就来说说我遇到的问题. 首先说说配置默认访问页面有哪几种方式. 1.tomcat配置默认访问页面 ...

  8. Spring Boot 系列教程11-html页面解析-jsoup

    需求 需要对一个页面进行数据抓取,并导出doc文档 html解析器 jsoup 可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操 ...

  9. Spring Boot使用AOP在控制台打印请求、响应信息

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的 ...

随机推荐

  1. sql的sum函数(与group by,having子句混合使用)

    SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Custo ...

  2. android的Devices窗口中Online显示成Offline

    这种情况几率很低,如果出现,点击Reset adb就好了.

  3. HOW to Use QP_PREQ_PUB.PRICE_REQUEST API to Price an Item

    In this Document Goal   Solution   References APPLIES TO: Oracle Advanced Pricing - Version 11.5.10 ...

  4. PS 图像调整算法— —渐变映射

    这个调整简单来说就是先建立一张lookup table, 然后以图像的灰度值作为索引,映射得到相应的颜色值.图像的灰度值是由图像本身决定的,但是lookup table 却可以各种各样,所以不同的lo ...

  5. c语言部分库函数,代码实现,以及细节理解

    代码来自: http://blog.csdn.net/v_JULY_v //得9 分 //为了实现链式操作,将目的地址返回,加2 分! char * strcpy( char *strDest, co ...

  6. 关于STM32的延时问题

    最近一直在搞一辆智能小车,用STM32单片机驱动,往上面加了很多外设,外型如下: 今天下午打算在LCD显示一个温度,却发现怎么都显示不了,也找不出原因,还好我们公司的郑工帮我看出了问题,让我顺利改过来 ...

  7. 云技术:负载均衡SLB

    什么是SLB? SLB是Server Load Balance(负载均衡)的简称,XX云计算有限公司提供的负载均衡服务,通过设置虚拟服务IP,将位于同一机房的多台云服务器资源虚拟成一个高性能.高可用的 ...

  8. 详解基于vue,vue-router, vuex以及addRoutes进行权限控制

    基于vuex, vue-router,vuex的权限控制教程,完整代码地址见https://github.com/linrunzheng/vue-permission-control 接下来让我们模拟 ...

  9. 分享一个国内首个企业级开源的GO语言网关--GoKu API Gateway

    一. 简介 GoKu API Gateway,中文名:悟空API网关,是国内首个开源go语言API网关,帮助企业进行API服务治理与API性能安全维护,为企业数字化赋能. GoKu API Gatew ...

  10. 【大前端攻城狮之路】JavaScript函数式编程

    转眼之间已入五月,自己毕业也马上有三年了.大学计算机系的同学大多都在北京混迹,大家为了升职加薪,娶媳妇买房,熬夜加班跟上线,出差pk脑残客户.同学聚会时有不少兄弟已经体重飙升,开始关注13号地铁线上铺 ...