开发者社区> developerguy> 正文

Spring Boot 使用 AOP 实现页面自适应

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

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

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

代码实现

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

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

1、添加 aop 的相关依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

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

/**
 * UserAgentType 枚举
 */
public enum UserAgentTypeEnum {

    // 电脑
    PC(0),
    // 平板电脑
    TABLET(1),
    // 手机
    PHONE(2);

    private int code;

    UserAgentTypeEnum(int code){
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

3、添加 UserAgent 识别工具类

/**
 * User-Agent 工具
 */
public class UserAgentTools {

    /**
     * 识别设备类型
     * @param userAgent 设备标识
     * @return 设备类型
     */
    public static Integer recognize(String userAgent){
        if(Pattern.compile("(Windows Phone|Android|iPhone|iPod)").matcher(userAgent).find()){
            return UserAgentTypeEnum.PHONE.getCode();
        }
        if(Pattern.compile("(iPad)").matcher(userAgent).find()){
            return UserAgentTypeEnum.TABLET.getCode();
        }
        return UserAgentTypeEnum.PC.getCode();
    }

}

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

/**
 * AOP 实现页面自适应
 */
@Aspect
@Component
@Log4j2
public class DeviceAdapter {

    private static final String MOBILE_PREFIX = "mobile/";

    /**
     * 切入点:cn.ictgu.controller 下所有 @GetMapping 方法
     */
    @Pointcut("execution(* cn.ictgu.controller..*(..)) && @annotation(org.springframework.web.bind.annotation.GetMapping)")
    public void controllerMethodPointcut() {
    }

    /**
     * 识别用户请求的设备并返回对应的页面
     */
    @Around("controllerMethodPointcut()")
    public String around(ProceedingJoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            try {
                HttpServletRequest request = attributes.getRequest();
                String userAgent = request.getHeader("User-Agent");
                log.info(userAgent);
                Integer deviceType = UserAgentTools.recognize(userAgent);
                String path = (String) joinPoint.proceed();
                return deviceType == UserAgentTypeEnum.PHONE.getCode() ?  MOBILE_PREFIX + path : path;
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
        throw new RuntimeException("DeviceAdapter,ServletRequestAttributes is null!");
    }

}

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

    @GetMapping(value = "/index")
    public String index() {
        return "index";
    }

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

转载请注明出处,谢谢!

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

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

版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
华为架构师复盘最全2340页面试题jvm+spring+redis+MQ+微服务
题库第2版 包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈! 话不多说直接上图
51 0
Spring Security 使用自定义认证页面|学习笔记
快速学习 Spring Security 使用自定义认证页面
65 0
【Spring Cloud】新闻头条微服务项目:分布式文件系统MinIO实现文章页面存取
主要介绍了MinIO的功能特点以及为什么要用MinIO,并且还介绍了如何封装MinIO为工具快速进行使用
244 0
【Spring MVC】(五)页面在 WEB-INF 下的处理方式(jsp页面、html页面)、SpringMVC 参数校验
【Spring MVC】(五)页面在 WEB-INF 下的处理方式(jsp页面、html页面)、SpringMVC 参数校验
350 0
Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
250 0
如何让Spring MVC显示自定义的404 Not Found页面
如何让Spring MVC显示自定义的404 Not Found页面
93 0
Spring之路(22)–SpringMVC+Bootstrap开发博客系统实例(引入Boostrap并实现浏览博客页面)
本文目录 1.背景 2. 浏览博客功能实现 3. 导入Bootsrap 4. 利用Bootstrap样式美化表格 5. 利用Bootstrap添加导航栏 6. 添加修改、删除链接 7. 总结
165 0
Spring(十八)之页面重定向
首先说明,该示例的maven依赖可以复用Spring(十七)之表单处理还有 还有就是对应的web.xml和servlet.xml文件都能复用,不必再次修改。 说到重定向不得不提到一个转发。这里概述一下转发与重定向的区别: 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。
1007 0
+关注
developerguy
A code cleanliness code farmers, A programmer concentrate on elegant design, A want to do with the product architect
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和便宜云服务器Docker仓库
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多


http://www.vxiaotou.com