一、跨域
在前后端分离项目中,在前端请求后端接口时浏览器会报如下错误:
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();
}