vue的路由是由前端js来控制的,但是,当你刷新浏览器的时候,是向服务器发送请求的一个过程,当访问不到的时候必然会返回404。
这个没有好的解决方式!
对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。
为了达到这一目的,浏览器当前提供了以下两种支持:
hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。
比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)
这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。
因此可以说,hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。
那么hash是如何保证刷新的呢?它的前进后退为什么会有作用呢?
首先,hash只会发送主url,但url栈是所有地址栏里的东西,刷新后,缓存是不变的,存储变量是不变的,只是返回相同的vue架构,再读取这变量,就自动定位到目的地了。
主页会首先自动分析url,提取出信息,然后对应操作。
而history,则直接一个不知名url,对,然后返回后的东西会替换掉vue架构。然鹅前进和后退是不会访问服务器的。
vue的404,就是输入这个url,服务器找不到,返回主页,主页调用这个url,返回404。要是普通的就直接返回404了。
springboot的404捕获也恶心的很。。。如果用nginx来处理一下路由就好了!
springboot是如何处理404的呢?用一个拦截器好了。