业务需求说明2.1 业务逻辑APP请求后端检测是否有新版本优先判断是否有更高版本整包(packageType0)若无整包返回wgt热更新包(packageType1)后端返回下载URL前端不允许处理文件流必须返回纯浏览器下载地址。三、SpringBoot静态资源目录方案详解最终采用3.1 存放路径将APK安装包存放至项目内部路径src/main/resources/static/app/profile/apk/xxx.apk3.2 核心原理最重要SpringBoot 内置约定resources/static 为官方默认静态资源目录。SpringBoot 内置Tomcat服务器启动后会自动扫描、映射该目录不需要配置、不需要Nginx、不需要写任何代码。3.3 映射规则死记硬背static后面的路径 浏览器访问路径项目物理路径浏览器访问URLstatic/app/profile/apk/xxx.apkhttp://ip:port/app/profile/apk/xxx.apk3.4 为什么选用该方案无需编写文件流下载接口代码零侵入无需修改Nginx配置不用操作服务器返回纯URL前端不用处理流、不用解析二进制打包时APK打进Jar包部署简单线上本地一致。四、401认证失败 amp; SecurityConfig配置详解4.1 问题现象静态APK地址访问提示认证失败无法访问系统资源 401。4.2 产生原因若依框架Para内置SpringSecurity安全拦截机制默认除登录、验证码等白名单接口所有请求必须携带Token令牌静态资源默认放行不全apk不在放行名单中被拦截。4.3 解决方案代码.antMatchers(HttpMethod.GET, /, /*.html, /**/*.html, /**/*.css, /**/*.js, /profile/**, /app/profile/apk/**).permitAll()4.4 代码逐行详细解释HttpMethod.GET只放行GET请求/app/profile/apk/**匹配该路径下所有文件包含所有APKpermitAll()匿名访问不需要Token、不需要登录。五、两种放行方式详细区别新手必懂5.1 两种放行写法// 写法1指定请求方式放行.antMatchers(HttpMethod.GET, /app/profile/apk/**).permitAll()// 写法2不指定请求方式放行.antMatchers(/shanguoTrace/**).permitAll()5.2 核心区别放行方式支持请求类型适用场景安全性HttpMethod.GET仅放行GET静态资源apk、图片、html、js、css高推荐不指定请求方式GET/POST/PUT/DELETE全部放行页面、业务匿名接口低5.3 开发规范静态资源一律使用 GET 方式放行禁止全部请求放行防止恶意提交请求保证安全。六、本地不加端口号无法访问详解6.1 现象本地访问http://192\.168\.1\.143/app/profile/apk/xxx\.apk失败本地访问http://192\.168\.1\.143:8080/app/profile/apk/xxx\.apk成功6.2 根本原理你的SpringBoot项目运行端口8080浏览器默认端口80本地开发没有Nginx反向代理端口不一致浏览器找不到服务直接访问失败。6.3 线上为什么不用加端口线上服务器配置了Nginx反向代理用户访问80端口→ Nginx转发 → 后端8080端口所以线上下载地址不需要端口。6.4 通俗口诀本地无Nginx必须加端口线上有Nginx不用加端口。七、最终总结
SpringBoot + 若依 APP版本更新功能实战踩坑记录
业务需求说明2.1 业务逻辑APP请求后端检测是否有新版本优先判断是否有更高版本整包(packageType0)若无整包返回wgt热更新包(packageType1)后端返回下载URL前端不允许处理文件流必须返回纯浏览器下载地址。三、SpringBoot静态资源目录方案详解最终采用3.1 存放路径将APK安装包存放至项目内部路径src/main/resources/static/app/profile/apk/xxx.apk3.2 核心原理最重要SpringBoot 内置约定resources/static 为官方默认静态资源目录。SpringBoot 内置Tomcat服务器启动后会自动扫描、映射该目录不需要配置、不需要Nginx、不需要写任何代码。3.3 映射规则死记硬背static后面的路径 浏览器访问路径项目物理路径浏览器访问URLstatic/app/profile/apk/xxx.apkhttp://ip:port/app/profile/apk/xxx.apk3.4 为什么选用该方案无需编写文件流下载接口代码零侵入无需修改Nginx配置不用操作服务器返回纯URL前端不用处理流、不用解析二进制打包时APK打进Jar包部署简单线上本地一致。四、401认证失败 amp; SecurityConfig配置详解4.1 问题现象静态APK地址访问提示认证失败无法访问系统资源 401。4.2 产生原因若依框架Para内置SpringSecurity安全拦截机制默认除登录、验证码等白名单接口所有请求必须携带Token令牌静态资源默认放行不全apk不在放行名单中被拦截。4.3 解决方案代码.antMatchers(HttpMethod.GET, /, /*.html, /**/*.html, /**/*.css, /**/*.js, /profile/**, /app/profile/apk/**).permitAll()4.4 代码逐行详细解释HttpMethod.GET只放行GET请求/app/profile/apk/**匹配该路径下所有文件包含所有APKpermitAll()匿名访问不需要Token、不需要登录。五、两种放行方式详细区别新手必懂5.1 两种放行写法// 写法1指定请求方式放行.antMatchers(HttpMethod.GET, /app/profile/apk/**).permitAll()// 写法2不指定请求方式放行.antMatchers(/shanguoTrace/**).permitAll()5.2 核心区别放行方式支持请求类型适用场景安全性HttpMethod.GET仅放行GET静态资源apk、图片、html、js、css高推荐不指定请求方式GET/POST/PUT/DELETE全部放行页面、业务匿名接口低5.3 开发规范静态资源一律使用 GET 方式放行禁止全部请求放行防止恶意提交请求保证安全。六、本地不加端口号无法访问详解6.1 现象本地访问http://192\.168\.1\.143/app/profile/apk/xxx\.apk失败本地访问http://192\.168\.1\.143:8080/app/profile/apk/xxx\.apk成功6.2 根本原理你的SpringBoot项目运行端口8080浏览器默认端口80本地开发没有Nginx反向代理端口不一致浏览器找不到服务直接访问失败。6.3 线上为什么不用加端口线上服务器配置了Nginx反向代理用户访问80端口→ Nginx转发 → 后端8080端口所以线上下载地址不需要端口。6.4 通俗口诀本地无Nginx必须加端口线上有Nginx不用加端口。七、最终总结