vite vue3下配置history模式路由的步骤记录

 更新时间:2023年01月28日 12:00:58   作者:pakchoily  
路由存在两者模式,一种是历史模式history,一种是hash模式,下面这篇文章主要给大家介绍了关于vite vue3下配置history模式路由的相关资料,需要的朋友可以参考下

dev 模式

利用vite 配置代理,可以解决前端浏览器限制跨域问题(当然后端要自己配置好)

export default defineConfig({
    // 配置在打包时,保障所有css\js能被找到
    base: './',
    
    //自带配置
    plugins: [vue()],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        }
    },
    
    // 配置/api代理
    server: {
        proxy: {
            '/api': {
                target: 'http://localhost:8080',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/api/, '')
            }
        }
    },

    //打包前先清空原有打包文件
    build: {
        emptyOutDir: true,
    }
})

配置.env

在dev 环境,默认会读取这个里面的内容

# .env.development

VITE_BASE_API=/api
VITE_BASE_URL=/vaccinationInfo
VITE_BASE_ENV=dev

配置axios

import axios from "axios";

const service = axios.create({
    baseURL: import.meta.env.VITE_BASE_API as string,
    timeout: 3600
})

这样在dev环境下,就可以使用代理来访问后端了

pro模式

打包时,会自动识别 .env.production

# .env.production 
VITE_BASE_API=http://localhost:8080
VITE_BASE_URL=/vaccinationInfo
VITE_BASE_ENV=pro

由于生产模式时,代理配置时不生效的,所以VITE_BASE_API直接指向服务器地址

history模式 时 还要进行以下配置

router\index.ts

history: createWebHistory(import.meta.env.VITE_BASE_URL as string),

用一个指定的url地址

nginx 配置

当然,打包后放到nginx也需要配置

  location /vaccinationInfo {
        alias  /usr/share/nginx/html/vaccinationInfo;
        index  index.html index.htm;
        try_files $uri $uri/ /vaccinationInfo/index.html; # 解决页面刷新404
    }	

然后在html中新建vaccinationInfo文件夹,把打包好的文件丢进去就行

后端配置

写一个配置类

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 允许跨域,以及自行配置
     *
     * @param registry 跨域注册器
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*") // SpringBoot2.4.0以上[allowedOriginPatterns]代替[allowedOrigins]
                .allowedMethods("*")
                .maxAge(3600)
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}

如果需要配置拦截器拦截JWT,可以采取以下操作

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private JWTTokenInterceptor jwtTokenInterceptor;

    private InterceptorPathBean interceptorPathBean;

    @Autowired
    public void setJwtTokenInterceptor(JWTTokenInterceptor jwtTokenInterceptor) {
        this.jwtTokenInterceptor = jwtTokenInterceptor;
    }

    @Autowired
    public void setInterceptorPathBean(InterceptorPathBean interceptorPathBean) {
        this.interceptorPathBean = interceptorPathBean;
    }

    /**
     * 允许跨域,以及自行配置
     *
     * @param registry 跨域注册器
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*") // SpringBoot2.4.0以上[allowedOriginPatterns]代替[allowedOrigins]
                .allowedMethods("*")
                .maxAge(3600)
                .allowedHeaders("*")
                .allowCredentials(true);
    }

    /**
     * 添加API拦截器,对所有数据API进行拦截
     *
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截规则
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(jwtTokenInterceptor);
        // 拦截配置
        interceptorRegistration.addPathPatterns(interceptorPathBean.getInclude());
    }

}

重写addInterceptors 方法

配置JWT拦截器

@Component
public class JWTTokenInterceptor implements HandlerInterceptor {

    @Resource
    private JWTResult jwtResult;

    /**
     * 拦截对数据API的请求,判断jwt令牌是否有效,没有则返回401
     *
     * @param request  请求
     * @param response 响应
     * @param handler  处理器
     * @return 是否继续执行,true继续执行,false不继续执行
     * @throws Exception 异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //非简单请求会预先使用OPTIONS方法请求一次,这里直接返回true
        if (request.getMethod().equals("OPTIONS")) {
            response.setStatus(200);
            //在拦截器中设置允许跨域
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Headers", "*");
            response.setHeader("Access-Control-Allow-Methods", "*");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Max-Age", "3600");
            return true;
        }

        //业务逻辑,自行发挥
        //这才是真正的请求,需要验证jwt令牌
        //请求数据API时的目标url
        String path = request.getRequestURI();
        String jwt = request.getHeader("Authorization");

        //对每次数据API请求进行拦截,如果jwt令牌不合法,则返回401;通过则继续放行,因此数据controller不需要再次判断jwt令牌是否合法
        boolean verify = jwtResult.verify(jwt,path);
        //如果校验不通过
        if (!verify) {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write("{\"code\":401,\"msg\":\"jwt校验失败\"}");
        }
        return verify;
    }

}

以上是重点处理 OPTIONS 预先请求,这个在非简单请求时会预先发出,典型场景就是打包后的前端工程,在请求后端是就会发出这个OPTIONS请求。

后面那些就是业务逻辑,自行发挥即可

补充几个文件

InterceptorPathBean

@Data
@Component
@ConfigurationProperties(prefix = "interceptor-config.path") // 配置文件的前缀
public class InterceptorPathBean {
    /*
     * 需要拦截的路径
     */
    private List<String> include;
}

application.yml

# 拦截器路径拦截
interceptor-config:
  path:
    #该路径下任何类型请求均拦截
    include:
      - /telInfo/**
      - /vaccinationInfo/**

以上,就可以在vue中站着用history模式了

总结

到此这篇关于vite vue3下配置history模式路由的文章就介绍到这了,更多相关vite vue3配置history模式路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue SPA单页面的应用和对比

    Vue SPA单页面的应用和对比

    单页面是指整个应用程序只有一个唯一完整的 HTML 页面,而其它所谓的页面,其实都是组件片段而已,切换页面也只是切换一个 HTML 中显示不同的组件片段。在今后所有的开发项目都是单页面应用
    2022-08-08
  • Vue引入vuetify框架你需要知道的几点知识

    Vue引入vuetify框架你需要知道的几点知识

    这篇文章主要介绍了Vue引入vuetify框架你需要知道的几点知识,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Vue入门学习笔记【基本概念、对象、过滤器、指令等】

    Vue入门学习笔记【基本概念、对象、过滤器、指令等】

    这篇文章主要介绍了Vue入门学习笔记,结合实例形式分析了vue.js的基本概念、对象、过滤器、指令等的相关原理与简单使用方法,需要的朋友可以参考下
    2019-04-04
  • Element-UI中<el-cascader />回显失败问题的完美解决

    Element-UI中<el-cascader />回显失败问题的完美解决

    我们在使用el-cascader控件往数据库保存的都是最后一级的数据,那如果再次编辑此条数据时,直接给el-cascader传入最后一级的数据,它是不会自动勾选的,下面这篇文章主要给大家介绍了关于Element-UI中<el-cascader />回显失败问题的完美解决办法,需要的朋友可以参考下
    2023-01-01
  • Vue实现批量注册全局组件的示例代码

    Vue实现批量注册全局组件的示例代码

    在项目开发中,我们经常会封装一些全局组件,然后在入口文件中统一导入,所以本文主要为大家详细介绍了Vue如何批量注册全局组件,感兴趣的小伙伴可以了解下
    2024-01-01
  • vue自定义翻页组件的方法

    vue自定义翻页组件的方法

    这篇文章主要为大家详细介绍了vue自定义翻页组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Vue Canvas实现电子签名

    Vue Canvas实现电子签名

    这篇文章主要为大家详细介绍了Vue Canvas实现电子签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • vue+element-ui监听滚动实现锚点定位方式(双向),锚点问题

    vue+element-ui监听滚动实现锚点定位方式(双向),锚点问题

    这篇文章主要介绍了vue+element-ui监听滚动实现锚点定位方式(双向),锚点问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue中iframe使用以及结合postMessage实现跨域通信

    vue中iframe使用以及结合postMessage实现跨域通信

    这篇文章主要介绍了vue中iframe使用以及结合postMessage实现跨域通信方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 通过vue写一个瀑布流插件代码实例

    通过vue写一个瀑布流插件代码实例

    这篇文章主要介绍了通过vue写一个瀑布流插件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论