JavaWeb_LeadNews_Day4-阿里云内容安全, 雪花算法, app文章保存, 自媒体文章审核

JavaWeb_LeadNews_Day4-阿里云内容安全, 雪花算法, app文章保存, 自媒体文章审核

  • 阿里云内容安全
  • 分布式主键策略-雪花算法
  • app文章保存
    • 具体实现
    • 总结
  • 自媒体文章审核
    • 提取内容和图片
    • 审核内容和图片
    • 保存app端文章
    • Feign远程调用降级
    • 发布文章异步调用
    • 自管理敏感词
    • 图片文字识别
      • 入门
      • 集成至文字审核
    • 静态文章生成, 异步
  • 来源

阿里云内容安全

  • 依赖
    <!-- 内容安全 -->
    <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId>
    </dependency>
    <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-green</artifactId>
    </dependency>
    
  • 实现
    @SpringBootTest(classes = WemediaApplication.class)
    @RunWith(SpringRunner.class)
    public class AliyunTest {@Autowiredprivate GreenTextScan greenTextScan;@Autowiredprivate FileStorageService fileStorageService;@Autowiredprivate GreenImageScan greenImageScan;/*** 测试文本内容审核*/@Testpublic void testScanText() throws Exception {Map map = greenTextScan.greeTextScan("我是一个好人, 冰毒");System.out.println(map);}/*** 测试图片审核*/@Testpublic void testScanImage() throws Exception {byte[] bytes = fileStorageService.downLoadFile("http://192.168.174.133:9000/leadnews/2023/07/22/7086dfbae7d1478f9ffc7784351e8708.png");List<byte[]> list = new ArrayList<>();list.add(bytes);Map map = greenImageScan.imageScan(list);System.out.println(map);}
    }
    
  • 总结
    • 工具类太复杂, 云盾内容安全也没开通(要企业认证), 看看测试好了
    • 测试图片审核会报错, 可能是没开通

分布式主键策略-雪花算法

  • 背景
    随着业务的增长,文章表可能要占用很大的物理存储空间,为了解决该问题,
    后期使用数据库分片技术。将一个数据库进行拆分,通过数据库中间件连接。
    如果数据库中该表选用ID自增策略,则可能产生重复的ID,
    此时应该使用分布式ID生成策略来生成ID。
    
  • 技术选型
    方案优势劣势
    redis(INCR)生成一个全局连续递增的数字类型主键增加了一个外部组件的依赖, Redis不可以, 则整个数据库将无法再插入
    UUID全局唯一, Mysql也有UUID实现36个字符组成, 占用空间大
    snowflake算法全局唯一, 数字类型, 存储成本低机器规模大于1024台无法支持
  • 雪花算法
    snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
    其核心思想是:使用41bit作为毫秒数,
    10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),
    12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),
    最后还有一个符号位,永远是0
    

app文章保存

具体实现

  • feign远程调用依赖
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  • 文章端远程接口
    // 定义接口
    @FeignClient("leadnews-article")
    public interface IArticleClient {@PostMapping("/api/v1/article/save")ResponseResult saveArticle(@RequestBody ArticleDto dto);
    }// 实现接口
    @RestController
    public class ArticleClient implements IArticleClient {@Autowiredprivate ApArticleService apArticleService;@PostMapping("/api/v1/article/save")@Overridepublic ResponseResult saveArticle(@RequestBody ArticleDto dto) {return apArticleService.saveArticle(dto);}
    }
    
  • app文章保存
    // Dto
    public class ArticleDto  extends ApArticle {/*** 文章内容*/private String content;
    }// Service
    public ResponseResult saveArticle(ArticleDto dto) {// 1. 检查参数if(dto == null){return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);}ApArticle apArticle = new ApArticle();BeanUtils.copyProperties(dto, apArticle);// 2. 保存或修改文章if(dto.getId() == null){// 2.1 不存在id// 保存文章save(apArticle);// 保存文章配置ApArticleConfig apArticleConfig = new ApArticleConfig(apArticle.getId());apArticleConfigMapper.insert(apArticleConfig);// 保存文章内容ApArticleContent apArticleContent = new ApArticleContent();apArticleContent.setArticleId(apArticle.getId());apArticleContent.setContent(dto.getContent());apArticleContentMapper.insert(apArticleContent);}else{// 2.2 存在id// 修改文章updateById(apArticle);// 修改文章内容LambdaQueryWrapper<ApArticleContent> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ApArticleContent::getArticleId, dto.getId());ApArticleContent apArticleContent = apArticleContentMapper.selectOne(queryWrapper);apArticleContentMapper.updateById(apArticleContent);}// 3. 返回文章idreturn ResponseResult.okResult(apArticle.getId());
    }
    

总结

  • dto中没有配置表的数据, 所以保存时设置配置的默认值, 修改时不用修改文章配置表
  • 返回文章id是需要在wm_news表中设置article_id, 新闻表中有个文章id字段

自媒体文章审核

提取内容和图片

  • 实现思路
  1. 通过id查询文章
  2. 查询文章状态, 需要是提交, 待审核状态
  3. 获取文章内容和图片
  • 具体实现
    @Service
    @Slf4j
    @Transactional
    public class WmNewsAutoScanServiceImpl implements WmNewsAutoScanService {@Autowiredprivate WmNewsMapper wmNewsMapper;/*** 自媒体文章审核* @param id*/@Overridepublic void autoScanWmNews(Integer id) throws Exception {// 查询文章WmNews wmNews = wmNewsMapper.selectById(id);if(wmNews == null){throw new RuntimeException("WmNewsAutoScanServiceImpl-文章不存在");}if(wmNews.getStatus() == WmNews.Status.SUBMIT.getCode()) {// 获取图片和文本内容Map<String, Object> textAndImages = handleTextAndImages(wmNews);}}  /*** 获取图片和文本内容* @param wmNews* @return*/private Map<String, Object> handleTextAndImages(WmNews wmNews) {// 图片路径List<String> imgList = new ArrayList<>();// 文本内容StringBuilder builder = new StringBuilder();// 从自媒体文章的内容中提取文章和图片if(StringUtils.isNotBlank(wmNews.getContent())) {List<Map> maps = JSONArray.parseArray(wmNews.getContent(), Map.class);for (Map map : maps) {if (map.get("type").equals("image")) {imgList.add((String) map.get("value"));} else if (map.get("type").equals("text")) {builder.append(map.get("value"));}}}// 提取文章的封面图片if(StringUtils.isNotBlank(wmNews.getImages())) {String[] split = wmNews.getImages().split(",");imgList.addAll(Arrays.asList(split));}Map<String, Object> resultMap = new HashMap<>();resultMap.put("content", builder.toString());resultMap.put("images", imgList);return resultMap;}
    }
    
  • 总结
    • Arrays.asListString数组转化为List<String>
    • ListaddAll方法可以将List<>直接全加进来

审核内容和图片

  • 具体实现
    
    @Service
    @Slf4j
    @Transactional
    public class WmNewsAutoScanServiceImpl implements WmNewsAutoScanService {@Autowiredprivate WmNewsMapper wmNewsMapper;@Autowiredprivate FileStorageService fileStorageService;@Autowiredprivate GreenTextScan greenTextScan;@Autowiredprivate GreenImageScan greenImageScan;/*** 自媒体文章审核* @param id*/@Overridepublic void autoScanWmNews(Integer id) throws Exception {...if(wmNews.getStatus() == WmNews.Status.SUBMIT.getCode()) {...// 2. 文章文本审核boolean isTextScan = handleTextScan((String) textAndImages.get("content"), wmNews);if(!isTextScan) return;// 3. 文章图片审核boolean isImageScan = handleImageScan((List<String>) textAndImages.get("images"), wmNews);if(!isImageScan) return;}}/*** 审核图片* @param images* @param wmNews* @return*/private boolean handleImageScan(List<String> images, WmNews wmNews) {boolean flag = true;if(images == null || images.size() == 0){return flag;}List<byte[]> list = new ArrayList<>();// 图片去重images = images.stream().distinct().collect(Collectors.toList());for (String image : images) {byte[] bytes = fileStorageService.downLoadFile(image);list.add(bytes);}try {Map map = greenImageScan.imageScan(list);if(map != null){// 违规内容if(map.get("suggestion").equals("block")){flag = false;updateWmNews(wmNews, 2, "当前文章中存在违规内容");}// 不确定内容, 需要人工审核if(map.get("suggestion").equals("review")){flag = false;updateWmNews(wmNews, 3, "当前文章中存在不确定内容");}}} catch (Exception e) {flag = false;throw new RuntimeException(e);}return flag;}/*** 审核纯文本内容* @param content* @param wmNews* @return*/private boolean handleTextScan(String content, WmNews wmNews) {boolean flag = true;content += wmNews.getTitle();if(StringUtils.isEmpty(content)){return flag;}try {Map map = greenTextScan.greeTextScan(content);if(map != null){// 违规内容if(map.get("suggestion").equals("block")){flag = false;updateWmNews(wmNews, 2, "当前文章中存在违规内容");}// 不确定内容, 需要人工审核if(map.get("suggestion").equals("review")){flag = false;updateWmNews(wmNews, 3, "当前文章中存在不确定内容");}}} catch (Exception e) {flag = false;e.printStackTrace();}return flag;}/*** 修改文章内容* @param wmNews* @param status* @param reason*/private void updateWmNews(WmNews wmNews, int status, String reason) {wmNews.setStatus((short) status);wmNews.setReason(reason);wmNewsMapper.updateById(wmNews);}
    }
    
  • 总结
    • 之前误以为stream流中可以通过return+collect(Collectors.toList)修改原数据内容, 而是stream().map((item)->{...})中的item若是对象, 则可以通过修改对象中的属性来修改原数据内容, 而直接通过给对象赋值来修改对象则不行, 因为这相当于让item指向新的地址, 这没有什么意义, 跟原本的数据无关.
    • idea快捷键: ctrl+alt+m, 抽取方法.

保存app端文章

  • 具体实现
@Service
@Slf4j
@Transactional
public class WmNewsAutoScanServiceImpl implements WmNewsAutoScanService {.../*** 自媒体文章审核* @param id*/@Overridepublic void autoScanWmNews(Integer id) throws Exception {...if(wmNews.getStatus() == WmNews.Status.SUBMIT.getCode()) {...// 4. 审核通过, 保存app端相关文章ResponseResult responseResult = saveAppArticle(wmNews);if(!responseResult.getCode().equals(200)){throw new RuntimeException("WmNewsAutoScanServiceImpl-文字审核, 保存app端相关文章数据失败");}// 回填article_idwmNews.setArticleId((Long) responseResult.getData());updateWmNews(wmNews, 9, "审核成功");}}@Autowiredprivate IArticleClient articleClient;@Autowiredprivate WmChannelMapper wmChannelMapper;@Autowiredprivate WmUserMapper wmUserMapper;/*** 保存app端相关的文章数据* @param wmNews*/private ResponseResult saveAppArticle(WmNews wmNews) {ArticleDto dto = new ArticleDto();BeanUtils.copyProperties(wmNews, dto);// 文章的布局dto.setLayout(wmNews.getType());// 频道WmChannel wmChannel = wmChannelMapper.selectById(wmNews.getChannelId());if(wmChannel != null){dto.setChannelName(wmChannel.getName());}// 作者dto.setAuthorId(Long.valueOf(wmNews.getUserId()));WmUser wmUser = wmUserMapper.selectById(wmNews.getUserId());if(wmNews != null){dto.setAuthorName(wmUser.getName());}// 设置文字idif(wmNews.getArticleId() != null){dto.setId(wmNews.getArticleId());}dto.setCreatedTime(new Date());ResponseResult responseResult = articleClient.saveArticle(dto);return responseResult;}
}
  • 总结
    • 保存完, 要将返回的文章id, 保存为news表中的article_id

Feign远程调用降级

  • 介绍
    • 服务降级是服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃
    • 服务降级虽然会导致请求失败,但是不会导致阻塞
  • 编写降级实现类
    @Component
    public class IArticleClientFallback implements IArticleClient {@Overridepublic ResponseResult saveArticle(ArticleDto dto)  {return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR,"获取数据失败");}
    }
    
  • 自媒体微服务扫描降级类
    @Configuration
    @ComponentScan("com.heima.apis.article.fallback")
    public class InitConfig {
    }
    
  • feign接口指定降级类
    @FeignClient(value = "leadnews-article",fallback = IArticleClientFallback.class)
    public interface IArticleClient {...
    }
    
  • 配置开启服务降级, 并指定响应时间
    feign:
    # 开启feign对hystrix熔断降级的支持
    hystrix:enabled: true
    # 修改调用超时时间
    client:config:default:connectTimeout: 2000readTimeout: 2000
    
  • 在文章微服务延时
    public ResponseResult saveArticle(ArticleDto dto) {// 测试feign调用降级try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}
    }
    
  • 总结: 麻

发布文章异步调用

  1. 在自动审核上加异步注解
    @Async
    public void autoScanWmNews(Integer id){...
    }
    
  2. 文章发布成功后, 调用自动审核
    public ResponseResult submitNews(WmNewsDto dto) {...wmNewsAutoScanService.autoScanWmNews(wmNews.getId());return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }
    
  3. 自媒体启动类添加注解
    @EnableAsync
    public class WemediaApplication {...
    }
    

自管理敏感词

  • 方案介绍
    方案说明
    数据库模糊查询效率太低
    String.indexOf(“”)查找数据库量大的话也是比较慢
    全文检索分词再匹配
    DFA算法确定有穷自动机(一种数据结构)
  • 具体实现
    private boolean handleSensitiveScan(String content, WmNews wmNews) {boolean flag = true;// 查询敏感词List<WmSensitive> wmSensitiveList = wmSensitiveMapper.selectList(Wrappers.<WmSensitive>lambdaQuery().select(WmSensitive::getSensitives));List<String> sensitiveList = wmSensitiveList.stream().map(WmSensitive::getSensitives).collect(Collectors.toList());// 初始化敏感词库SensitiveWordUtil.initMap(sensitiveList);// 查看文章中是否包含敏感词Map<String, Integer> wordMap = SensitiveWordUtil.matchWords(content);if(wordMap.size() > 0){updateWmNews(wmNews, 2, "当前文章中存在违规内容:" + wordMap);flag = false;}return flag;
    }
    
  • 总结
    • 使用DFA算法实现敏感词检测, 感觉DFA算法和字典树差不多

图片文字识别

入门

  • 什么是OCR
    OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,
    通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程
    
  • 方案
    方案说明
    百度OCR收费
    Tesseract-OCRGoogle维护的开源OCR引擎, 支持Java, Python等语言调用
    Test4j封装了Tesseract-OCR, 支持Java调用
  • tess4j依赖
    <dependencies><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.1.1</version></dependency>
    </dependencies>
    
  • 案例
    public static void main(String[] args) throws TesseractException {// 创建实例ITesseract tesseract = new Tesseract();// 设置字体库路径tesseract.setDatapath("D:\\workspace\\tessdata");// 设置语言 简体中文tesseract.setLanguage("chi_sim");File file = new File("D:\\csdn图库\\微服务.png");// 识别图片String res = tesseract.doOCR(file).replaceAll("\\r|\\n", "-");System.out.println("识别的结果为:"+res);
    }
    

集成至文字审核

  • 导入依赖, spring工厂加入工具类, 在调用工具类的服务中配置参数
  • 工具类
    @Getter
    @Setter
    @Component
    @ConfigurationProperties(prefix = "tess4j")
    public class Tess4jClient {private String dataPath;private String language;public String doOCR(BufferedImage image) throws TesseractException {//创建Tesseract对象ITesseract tesseract = new Tesseract();//设置字体库路径tesseract.setDatapath(dataPath);//中文识别tesseract.setLanguage(language);//执行ocr识别String result = tesseract.doOCR(image);//替换回车和tal键  使结果为一行result = result.replaceAll("\\r|\\n", "-").replaceAll(" ", "");return result;}
    }
    
  • 具体实现
    // 从byte[]转换为BufferedImage
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    BufferedImage imageFile = ImageIO.read(in);
    // 识别图片文字
    String result = tess4jClient.doOCR(imageFile);
    System.out.println("识别内容: " + result);
    // 审核是否包含敏感词
    boolean isSensitive = handleSensitiveScan(result, wmNews);
    if(!isSensitive){return isSensitive;
    }
    

静态文章生成, 异步

@Service
@Slf4j
@Transactional
public class ArticleFreemarkerServiceImpl implements ArticleFreemarkerService {@Autowiredprivate Configuration configuration;@Autowiredprivate FileStorageService fileStorageService;@Autowiredprivate ApArticleService apArticleService;/*** 生成静态文件上传到minIO中* @param article* @param content*/@Override@Asyncpublic void buildArticleToMinIO(ApArticle article, String content) {if(StringUtils.isNotBlank(content)) {// 2. 文章内容通过freemarker生成html文件Template template = null;StringWriter out = null;try {template = configuration.getTemplate("article.ftl");//    数据模型Map<String, Object> data = new HashMap<>();data.put("content", JSONArray.parseArray(content));out = new StringWriter();//    合成template.process(data, out);} catch (Exception e) {throw new RuntimeException(e);}// 3. 把html上传到minio中InputStream in = new ByteArrayInputStream(out.toString().getBytes());String path = fileStorageService.uploadHtmlFile("", article.getId()+".html", in);// 4. 修改ap_article表, 保存static_url字段apArticleService.update(Wrappers.<ApArticle>lambdaUpdate().eq(ApArticle::getId, article.getId()).set(ApArticle::getStaticUrl, path));}}
}

来源

黑马程序员. 黑马头条

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【【51单片机11.0592晶振红外遥控】】

51单片机11.0592晶振红外遥控 红外遥控&#xff0c;51单片机完结 这是初步实现的架构 怎么实现内部的详细逻辑 我们用状态机的方法 0状态时一个空闲状态 当它接收到下降沿开始计时然后转为1状态 1状态下 寻找start 或者repeat的信号 再来下降沿读出定时器的值 如果是start 那…

UE4/5C++多线程插件制作(十八、Graph线程封装,以及宏的设置)

目录​​​​​​​ 什么是Graph线程? MTPThreadGraphManage.h MTPThreadInterface.h MTPThreadGraphManage.h MTPManage.cpp void FMTPThreadGraphManage::Wait(const FGraphEventRef& EventRef)</

QT 常用数据结构整理

目录 QString篇 QString篇 //初始化bool bOk false;QString str "sd";QString strTemp(str);str QString("%1,%2").arg("11").arg("-gg");qDebug()<<str;str.sprintf("%s %d","ni",1);qDebug()<<…

网安笔记2

一、实例对象 1.对象是单个实物的抽象&#xff0c;是一个容器&#xff0c;封装了属性和方法 2.构造函数&#xff0c;构造函数就是一个普通的函数&#xff0c;但具有自己的特征和用法。 var Vehicle function () { this.price 1000; }; 上面代码中&#xff0c;Ve…

前端(Electron Nodejs)如何读取本地配置文件

使用electron封装了前端界面之后&#xff0c;最终打包为一个客户端&#xff08;exe&#xff09;。但是&#xff0c;最近项目组内做CS&#xff08;c开发&#xff09;的&#xff0c;想把所有的配置都放进安装目录的配置文件中&#xff08;比如config.json&#xff09;。这做法&am…

M 芯片的 macos 系统安装虚拟机 centos7 网络配置

centos 安装之前把网络配置配好或者是把网线插好 第一步找到这个 第二步打开网络适配器 选择图中所指位置 设置好之后 开机启动 centos 第三步 开机以后 编写网卡文件保存 重启网卡就可以了&#xff0c;如果重启网卡不管用&#xff0c;则重启虚拟机即可 “ ifcfg-ens160 ” 这…

黑苹果如何在macOS Sonoma中驱动博通网卡

准备资源&#xff08;百度&#xff1a;黑果魏叔 下载&#xff09; 资源包中包含&#xff1a;AirportBrcmFixup.kext/IOSkywalkFamily.kext/IO80211FamilyLegacy.kext/OpenCore-Patcher 使用方法&#xff1a; 1.将 csr-active-config 设置为 03080000 全选代码 复制 2.在 …

c++数据锁链

题目描述&#xff1a; 创建一个结构体为Node&#xff0c;具有value , next 两个属性&#xff1b; value为整型&#xff0c;用来储存结构体数值&#xff1b; next为Node类型指针&#xff0c;用来指向下一组数据地址&#xff1b; 第1组数据value 5&#xff1b; 第2组数据value …

php查询数据(日期查询)和fastadmin的日期查询

当前月查询 要在 PHP 中查询数据库中当前月份的数据&#xff0c;需要使用 SQL 查询语句来筛选出符合条件的数据。首先&#xff0c;确保数据库中有一个日期或时间类型的字段用于存储记录的日期信息。 假设你的数据库表名为 my_table&#xff0c;其中有一个名为 date_column 的…

MATLAB RANSAC平面拟合 (29)

MATLAB RANSAC平面拟合 (29) 一、算法简介二、函数介绍三、算法实现四、效果展示一、算法简介 将一个平面与一个从内点到平面的最大允许距离的点云相匹配。该函数返回描述平面的几何模型。该函数采用 M- 估计量样本一致性(MSAC)算法求解平面。MSAC 算法是随机样本一致性(RAN…

【C++】STL——list的介绍和使用、list增删查改函数的介绍和使用、push_back、pop_back

文章目录 1.list的使用2.list的增删查改函数&#xff08;1&#xff09;push_front 在list首元素前插入值为val的元素&#xff08;2&#xff09;pop_front 删除list中第一个元素&#xff08;3&#xff09;push_back 在list尾部插入值为val的元素&#xff08;4&#xff09;pop_ba…

常用的一些蓝图(持续更新)

文章目录 ADEIPS A Apply Damage: 对指定的actor应用伤害。 Add Mapping Context: 添加控制映射上下文。 D Do Once: 仅在第一次命中节点时触发&#xff0c;但可以重置。 Delay: 延迟执行。 Destroy Actor: 销毁指定的actor。 E Enhanced Input Local Player Subsystem: 从玩家…

Elasticsearch 分片策略

文章目录 分片索引设置分片获取索引分片信息示例 分片分配集群级分片分配索引级分片分配索引级分片筛选每个节点的分片总数索引恢复优先级节点掉线时延时分配 分片 和数据库中的表空间类似&#xff0c;不过分片是为每个索引设置&#xff0c;一个索引可以有多个分片&#xff0c…

TCP三次握手/四次挥手

三次握手 三次握手过程 TCP服务器进程先创建传输控制块TCB&#xff0c;时刻准备接受客户进程的连接请求&#xff0c;此时服务器就进入了LISTEN&#xff08;监听&#xff09;状态&#xff1b;TCP客户进程也是先创建传输控制块TCB&#xff0c;然后向服务器发出连接请求报文&…

【QT 网络云盘客户端】——登录界面功能的实现

目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面&#xff0c;将数据 输入 到 用户名&#xff0c;昵称&#xff0c;密码&#xff0c;确认密码&#xff0c;手机&#xff0c;邮箱 的输入框中&#xff0c; 点…

【C语言学习——————动态内存管理】

文章目录 一、什么是动态内存管理二、动态内存函数的介绍 1.malloc函数的介绍2.calloc函数的介绍3.realloc函数的介绍三、free函数的介绍 一.什么是动态内存管理 我们知道数据都是在内存中进行储存的&#xff0c;但是如果我们需要调用内存&#xff0c;我们可以通过定义一个变量…

HTML <p> 标签

实例 以下代码标记了一个段落&#xff1a; <p>This is some text in a very short paragraph</p> &#xff08;在页面下部&#xff0c;您可以找到更多实例。&#xff09; 浏览器支持 元素ChromeIEFirefoxSafariOpera<p>YesYesYesYesYes 所有主流浏览器都…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中&#xff0c;我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例&#xff0c;说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

TCP四次握手为什么客户端等待的时间是2MSL

目录 什么是MSL从第三次握手开始分析总结 什么是MSL MSL是Maximum Segment Lifetime英文的缩写&#xff0c;中文可以译为“报文最大生存时间”&#xff0c;他是任何报文在网络上存在的最长时间&#xff0c;超过这个时间报文将被丢弃。 从第三次握手开始分析 第三次握手服务端…

uniapp跳转到外部链接

// 一、先配置页面 {"path": "pages/webview/webview","style": {"navigationBarTitleText": ""} } // 二、编写页面 <template><web-view :src"src" /> </template><script> export def…