spring boot开发常用(一)

一、跨域

在前后端分离项目中,在前端请求后端接口时浏览器会报如下错误:

Access to XMLHttpRequest at ‘http://127.0.0.1:8080/demo/sayHello’
from origin ‘https://blog.csdn.net’ has been blocked by CORS policy:
No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

1、后端跨域

这是应为spring boot为了防止跨域攻击,而使用了CORS策略,在未进行配置的情况下,所有的跨域请求都会被拒绝;造成请求失败;

  • 解决一:添加配置类

    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
    
        @Bean
        public WebMvcConfigurer corsConfigurer()
        {
            return new WebMvcConfigurer() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").
                            allowedOrigins("https://www.dustyblog.cn"). //允许跨域的域名,可以用*表示允许任何域名使用
                            allowedMethods("*"). //允许任何方法(post、get等)
    		                allowedHeaders("*"). //允许任何请求头
                            allowCredentials(true). //带上cookie信息
                       exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L); //maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果
                }
            };
        }
    }
    
  • 解决二:使用@CrossOrigin注解

    @RequestMapping("/demo2")
    @RestController
    //@CrossOrigin //所有域名均可访问该类下所有接口
    @CrossOrigin("https://blog.csdn.net") // 只有指定域名可以访问该类下所有接口
    public class CorsTest2Controller {
    
        @GetMapping("/sayHello")
        public String sayHello() {
            return "hello world --- 2";
        }
    }
    

    以上两种都会解决后端的跨域请求,但前后端分离项目中,也存在前端跨域问题,如vue框架,也需要在前端进行跨域配置;

2、前端跨域
  • 解决一:设置代理(vue)

    • 在main.js文件中引入axiso

      import axios from 'axios'
      //基础url
      axios.defaults.baseURL = '/api'
      //axios挂载
      Vue.prototype.$axios = axios
      
    • 配置vue.config.js,(vue 2中不存在时,手动添加)

      // eslint-disable-next-line no-unused-vars
      const webpack = require('webpack')
      module.exports = {
        configureWebpack: {
          devServer: {
            proxy: {
              '/api': {
                // 此处的写法,目的是为了 把上面  /api 替换成 http://127.0.0.1:3000/
                // 如果使用的是自己封装的请求函数 那么你应该这样写 baseURL: '',
                // 注意这里的 api 是必须的,因为是有代理的缘故
                target: 'http://localhost:8080/',
                // 允许跨域
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                  '^/api': ''
                }
              }
            }
          }
        }
      }
      
  • 解决二:修改请求头

    在后端添加过滤器或拦截器修改请求头

     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            HttpServletRequest request = (HttpServletRequest) req;
    
            // 不使用*,自动适配跨域域名,避免携带Cookie时失效
            String origin = request.getHeader("Origin");
            if(StringUtils.isNotBlank(origin)) {
                response.setHeader("Access-Control-Allow-Origin", origin);
            }
    
            // 自适应所有自定义头
            String headers = request.getHeader("Access-Control-Request-Headers");
            if(StringUtils.isNotBlank(headers)) {
                response.setHeader("Access-Control-Allow-Headers", headers);
                response.setHeader("Access-Control-Expose-Headers", headers);
            }
    
            // 允许跨域的请求方法类型
            response.setHeader("Access-Control-Allow-Methods", "*");
            // 预检命令(OPTIONS)缓存时间,单位:秒
            response.setHeader("Access-Control-Max-Age", "3600");
            // 明确许可客户端发送Cookie,不允许删除字段即可
            response.setHeader("Access-Control-Allow-Credentials", "true");
    
            chain.doFilter(request, response);
        }
    

二、mybatis-plus 代码自动生成器

public static void main(String[] args) {
    //代码生产器
    AutoGenerator mpg = new AutoGenerator();
    
    //全局配置
    GlobalConfig globalConfig = new GlobalConfig();
    //设置代码生成的根目录
    globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
    //设置开发者名称
    globalConfig.setAuthor("wujiahao");
    //多次运行是否文件覆盖
    globalConfig.setFileOverride(true);
    //service名称的前缀替换
    globalConfig.setServiceName("%sService");
    //是否自动打开资源管理器
    globalConfig.setOpen(false);
    //主键类型
    globalConfig.setIdType(IdType.ID_WORKER_STR);
    //日期类型
    globalConfig.setDateType(DateType.ONLY_DATE);
    mpg.setGlobalConfig(globalConfig);

    //数据源配置
    DataSourceConfig dataSourceConfig = new DataSourceConfig();
    //数据源链接
  dataSourceConfig.setUrl("jdbc:oracle:thin:@10.246.151.202:1521/scmqas.pcitc.com");
    //数据库驱动
    dataSourceConfig.setDriverName("oracle.jdbc.driver.OracleDriver");//数据源用户名
    dataSourceConfig.setUsername("myscm35");
    //数据源密码
    dataSourceConfig.setPassword("mt=35");
    mpg.setDataSource(dataSourceConfig);

    //包配置
    PackageConfig pc = new PackageConfig();
    //模块名
    pc.setModuleName(null);
    //包名
    pc.setParent("com.example.demo");
    pc.setController("Controller");
    pc.setEntity("Entity");
    pc.setMapper("Mapper");
    pc.setService("Service");
    pc.setServiceImpl("ServiceImp");
    mpg.setPackageInfo(pc);
    
    //策略配置
    StrategyConfig strategy = new StrategyConfig();
    //对那一张表生成代码,可接受数组
    strategy.setInclude("ITF_SHIPO_HEADER_I","ITF_SHIPO_LINE_I");
    //数据库表映射到实体的命名策略
    strategy.setNaming(NamingStrategy.underline_to_camel);
    //生成实体时去掉表前缀
    strategy.setTablePrefix(pc.getModuleName() + "_"); 
	//数据库表字段映射到实体的命名策略
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    // lombok 模型 @Accessors(chain = true) setter链式操作
    strategy.setEntityLombokModel(true); 
	//restful api风格控制器
    strategy.setRestControllerStyle(true); 
    //url中驼峰转连字符
    strategy.setControllerMappingHyphenStyle(true); 
    mpg.setStrategy(strategy);
    // 6、执行
    mpg.execute();
}

image-20210716170516229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值