博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot 使用 AOP 实现页面自适应
阅读量:6331 次
发布时间:2019-06-22

本文共 2927 字,大约阅读时间需要 9 分钟。

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

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

代码实现

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

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

1、添加 aop 的相关依赖

org.springframework.boot
spring-boot-starter-aop

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@Log4j2public 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://www.spring4all.com/article/169

转载于:https://www.cnblogs.com/softidea/p/7831174.html

你可能感兴趣的文章
HDU 3836 Equivalent Sets
查看>>
深入理解JVM读书笔记思维导图
查看>>
String字符串位置移动
查看>>
MySQL无法插入中文的解决方案
查看>>
react16 渲染流程
查看>>
Android游戏与应用开发最佳学习路线图
查看>>
Android应用打开外部文件
查看>>
hadoop生态搭建(3节点)-05.mysql配置_单节点
查看>>
堆和栈的区别
查看>>
网易2017春招笔试真题编程题集合(2)——赶去公司
查看>>
top命令
查看>>
JS-键盘事件之方向键移动元素
查看>>
Compass(更新中。。。)
查看>>
bos开发时,测试卡在登录界面解决
查看>>
2013 Multi-University Training Contest 2
查看>>
ubuntu开机自动运行用Qt写的程序
查看>>
关于JSON的一些问题
查看>>
WebShell代码分析溯源(第1题)
查看>>
log4j的日志级别(ssm中log4j的配置)
查看>>
让开发更方便,让搜索更效率!
查看>>