首页 > 其他分享 >企业级微服务项目实战《学成在线》学习日志(二)

企业级微服务项目实战《学成在线》学习日志(二)

时间:2024-01-25 23:11:28浏览次数:29  
标签:学成 http 跨域 8601 192.168 企业级 浏览器 日志 localhost

下面正式开始开发!

课程查询

开发习惯从底层开始,所以就从DAO层(mapper层)开始写,再写service。

先在content-service写个测试类,配置和包看黑马的去。介绍下以前学过的分页查询插件courseBaseMapper,实质上就是在sql语句上加上limit等语句,可以看下测试类的代码:

@SpringBootTest
public class CourseBaseMapperTests {

    @Autowired
    CourseBaseMapper courseBaseMapper;
    @Test
    public void testCourse(){
        CourseBase courseBase = courseBaseMapper.selectById(18);
        Assertions.assertNotNull(courseBase);
    }
}

ctrl点击selectById就可以看到这个插件的底层实现原理。然后是分页查询的全部代码:

@Test
    public void testCourse(){
        CourseBase courseBase = courseBaseMapper.selectById(18);
        Assertions.assertNotNull(courseBase);

        //分页查询

        PageParams pageParams =new PageParams();
        pageParams.setPageNo(1L);
        pageParams.setPageSize(10L);

        QueryCourseParamsDto courseParamsDto =new QueryCourseParamsDto();
        courseParamsDto.setCourseName("java");
        LambdaQueryWrapper<CourseBase> queryWrapper = new LambdaQueryWrapper<>();
        //在sql中拼接course_base.name like '%值%'
        queryWrapper.like(StringUtils.isNotEmpty(courseParamsDto.getCourseName()),CourseBase::getName,courseParamsDto.getCourseName());
        //根据课程审核状态查询
        queryWrapper.eq(StringUtils.isNotEmpty(courseParamsDto.getAuditStatus()),CourseBase::getAuditStatus,courseParamsDto.getAuditStatus());

        Page<CourseBase> page = new Page<>(1,10);
        Page<CourseBase> pageResult = courseBaseMapper.selectPage(page, queryWrapper);
        PageResult<CourseBase> tPageResult = new PageResult<>(pageResult.getRecords(),pageResult.getTotal(),pageParams.getPageNo(),pageParams.getPageSize());
        System.out.println(tPageResult);
    }

运行出来拿到断点有结果就成了:

 大概流程就是利用LambdaQueryWrapper那个插件然后一直利用参数查询所需要的结果,一步一步装填数据,最终以PageResult的形式返回就行。

然后说一下根据课程状态进行查询,在实际开发中一般会以代码来代替课程状态的中文,也是为了方便修改和规范,所以有个xc2.0_system的dictionary的数据库表就拿来表示对应关系:

 直接在刚刚的代码下加一个条件:courseParamsDto.setAuditStatus("202004");

接下来就来测试接口,在默认文件里api模块下有个Controller类里面接口是写好的,然后就可以运行ContentApplication的springboot启动项,然后浏览器输入localhost:63040/content/swagger-ui.html,然后测试一下有数据就成功。还有个HttpClient插件接口测试,可以去下载搜一下,postman也可以。像我的就比较推荐httpclient直接就在idea里测试:

它还可以设置环境,在api-test下创建一个env.json文件,里面编写:


{
  "dev": {
    "access_token": "",
    "gateway_host": "localhost:63010",
    "content_host": "localhost:63040",
    "system_host": "localhost:63110",
    "media_host": "localhost:63050",
    "search_host": "localhost:63080",
    "auth_host": "localhost:63070",
    "checkcode_host": "localhost:63075",
    "learning_host": "localhost:63020"
  }
}

然后再在http里将localhost:63040换成{{content-host}}

前后端联调

解压打开前端文件这里用idea打开,然后去设置里配置npm和node的位置,打开根目录下的package.json ,运行serve的(idea它有),或者右键package.json选择查看npm脚本找到serve运行。对了如果运行失败,大概率是你的node版本与该项目的node文件版本不一致,两种办法,一是卸载项目里的node_moudels,再cnpm install安装自己版本的node文件,二是你自己更换node版本,这里是16.17.0,但是我用了第一种方法发现运行是没问题,但是一直报错,可能版本不同有些语法也不同吧哈哈哈,还是用第二种吧。

这里推荐另一个插件nvm,可以管理node的版本:windows下node更换版本(简单操作)_node版本更改-CSDN博客,有了它想切换哪个版本就切换。推荐我这样做,算是第三种方法吧qwq

将资料的system文件导入java项目中,复制api的resourse到service并修改下数据库的连接地址。

解决跨域问题

在浏览器通过http://localhost:8601/地址访问前端工程。

chrome浏览器报错如下:

Access to XMLHttpRequest at 'http://localhost:63110/system/dictionary/all' from origin 'http://localhost:8601' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

firefox浏览器报错如下:

已拦截跨源请求:同源策略禁止读取位于 http://localhost:63110/system/dictionary/all 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。状态码:200。

 

提示:从http://localhost:8601访问http://localhost:63110/system/dictionary/all被CORS policy阻止,因为没有Access-Control-Allow-Origin 头信息。CORS全称是 cross origin resource share 表示跨域资源共享。

出这个提示的原因是基于浏览器的同源策略,去判断是否跨域请求,同源策略是浏览器的一种安全机制,从一个地址请求另一个地址,如果协议、主机、端口三者全部一致则不属于跨域,否则有一个不一致就是跨域请求。

比如:

http://localhost:8601  到   http://localhost:8602  由于端口不同,是跨域。

http://192.168.101.10:8601  到   http://192.168.101.11:8601  由于主机不同,是跨域。

http://192.168.101.10:8601  到   https://192.168.101.10:8601  由于协议不同,是跨域。

注意:服务器之间不存在跨域请求。

浏览器判断是跨域请求会在请求头上添加origin,表示这个请求来源哪里。

比如:

GET / HTTP/1.1
Origin: http://localhost:8601

服务器收到请求判断这个Origin是否允许跨域,如果允许则在响应头中说明允许该来源的跨域请求,如下:

Access-Control-Allow-Origin:http://localhost:8601

如果允许任何域名来源的跨域请求,则响应如下:

Access-Control-Allow-Origin:*

解决跨域的方法:

1、JSONP

通过script标签的src属性进行跨域请求,如果服务端要响应内容则首先读取请求参数callback的值,callback是一个回调函数的名称,服务端读取callback的值后将响应内容通过调用callback函数的方式告诉请求方。如下图:

2、添加响应头

服务端在响应头添加 Access-Control-Allow-Origin:*

3、通过nginx代理跨域

由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址。

1)浏览器先访问http://192.168.101.10:8601 nginx提供的地址,进入页面

2)此页面要跨域访问http://192.168.101.11:8601 ,不能直接跨域访问http://www.baidu.com:8601  ,而是访问nginx的一个同源地址,比如:http://192.168.101.11:8601/api ,通过http://192.168.101.11:8601/api 的代理去访问http://www.baidu.com:8601

这样就实现了跨域访问。

浏览器到http://192.168.101.11:8601/api 没有跨域

nginx到http://www.baidu.com:8601通过服务端通信,没有跨域。

我们准备使用方案2解决跨域问题。在内容管理的api工程config包下编写GlobalCorsConfig.java,

或直接从课程资料/项目工程下拷贝,

代码如下:

package com.xuecheng.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * @description 跨域过虑器
 * @author Mr.M
 * @date 2022/9/7 11:04
 * @version 1.0
 */
 @Configuration
 public class GlobalCorsConfig {

  /**
   * 允许跨域调用的过滤器
   */
  @Bean
  public CorsFilter corsFilter() {
   CorsConfiguration config = new CorsConfiguration();
   //允许白名单域名进行跨域调用
   config.addAllowedOrigin("*");
   //允许跨越发送cookie
   config.setAllowCredentials(true);
   //放行全部原始头信息
   config.addAllowedHeader("*");
   //允许所有请求方法跨域调用
   config.addAllowedMethod("*");
   UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
   source.registerCorsConfiguration("/**", config);
   return new CorsFilter(source);
  }
 }

此配置类实现了跨域过虑器,在响应头添加Access-Control-Allow-Origin。

重启系统管理服务,前端工程可以正常进入http://localhost:8601,观察浏览器记录,成功解决跨域。

标签:学成,http,跨域,8601,192.168,企业级,浏览器,日志,localhost
From: https://www.cnblogs.com/hepingan/p/17981502

相关文章

  • boss老虎的机制以及其他boss的工作日志
    1.Enegy每次技能所消耗的体力2.Angry老虎收到攻击,以及未攻击到敌人会增加怒气3.angry增加致一定比例,那么该enegy消耗增加,而技能冷却缩短4.当老虎血量下降到一定的比例,会触发大招等技能老虎转向有问题:√跳跃一定要跳到玩家面前替换解决方案(跳跃+移动)老虎跑到玩家吗,面前时......
  • Nginx日志检测分析工具 - WGCLOUD
    WGCLOUD可以对Nginx的日志文件进行全面分析,包括IP、sql注入、搜索引擎蜘蛛爬取记录、HTTP响应状态码、访问量最高的IP统计、扫描统计等效果如下图......
  • (十六):ELFK日志收集系统
    1、环境准备1.1、安装部署ES参考:(二):ElasticSearch环境安装。1.2、安装部署FileBeat参考:(十五):FileBeat。1.3、安装部署Kibana参考:(三):Kibana安装。1.4、安装部署Logstash参考:(十三):Logstash安装。2、配置1.1、FileBeat配置修改filebeat.yml配置如......
  • 【精品教程】如何查看iOS崩溃日志
    简介当一个应用程序崩溃,会产生一个崩溃报告(crashreport),并存储到设备中。崩溃报告描述了应用程序崩溃的条件,通常包含每个执行线程的完整回溯。查看崩溃报告可以帮助我们了解应用程序的崩溃情况,并尝试修复问题。符号化崩溃报告崩溃报告需要进行符号化(symbolicated),才能够进行分析......
  • IIS日志——统计IP访问次数的一种方法
    配置IIS网站的日志如果没有显示日志功能,到添加删除程序添加windows功能  下载进行日志分析的两个工具LogParser(命令行工具),下载地址:http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=24659LogParserStudio(图形化工具),下载地址:http://gallery.techn......
  • Logback排除指定包/类/方法日志输出
    排除指定包/类/方法日志输出如下为logback.xml的配置<springProfilename="pro"><appendername="BUSINESS_API"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>/data/log/${projectName}/api_${p......
  • k8s - Promtail 重写日志标签名
    1.Promtail重写日志标签名默认Promtail会导出Pod中的一些元数据,可以通过访问Promtail的web界面,获取可以拿到的原始标签#获取promtailPod的PodIP地址kubectlgetpo-A-owide|greppromtail#输出#lokipromtail-s2c2x......
  • 通过日志恢复MSSQL数据例子
        这段时间看了关于在SQLserver中通过日志和时间点来恢复数据。也看了一些网上的例子,看如何通过日志来恢复数据。    前提条件:数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项如果是简单模式:“完整”   测试环境:          1,建立数据......
  • 配置日志文件达到一定大小自动压缩
    1工具的安装apt-getinstalllogrotate2修改配置文件在/etc/logrotate.d目录下创建一个新的logrotate的配置文件,touch myapp.conf在该配置文件中添加以下内容:/path/to/your/logfile{size10M#设置日志文件最大大小为10MBrotate5#保存5份日志文件comp......
  • 日志工具
    颜色和类别枚举:EnumLogMsgColorpublicenumEnumLogMsgColor{Red,Green,Blue,Orange,Black,}EnumLogMsgLevelpublicenumEnumLogMsgLevel{///<summary>///普通消息///</summary>[Description("[普通日志]")]......