当前位置: 首页 > news >正文

如何实现Web应用、网站状态的监控?

如何实现Web应用、网站状态的监控?

  • 关键词:网站监控,服务器监控,页面性能监控,用户体验监控
  • 本文通过代码分析、网站应用介绍网站状态监控的方式
  • 下文主要分为网站应用、技术实现两部分

一、网站应用

  • 现在网络上已经存在一些Web网站监控的服务,虽然功能五花八门,但限制较大,需付费使用
  • 本文介绍的技术运行网站见下方地址,不会关闭,可以直接使用
  • 一个朴实无华且免费的WEB网站监控工具
  • 先看下效果
    在这里插入图片描述

1. 打开网站

  • 【传送门】
https://www.xujian.tech/monitor

2. 微信扫码登录

  • 这里通过微信扫码取得小程序openid,利用openid标记用户,不涉及隐私
    在这里插入图片描述
  • 扫码完成后会自动跳转到系统

3. 进入监控表

  • 进入系统后,选中左侧菜单进入监控表页面
    在这里插入图片描述

4. 添加监控器

  • 监控器支持POST、GET两种请求方式
  • GET请求时,如有参数,请直接放置在地址中
  • POST请求时,如有参数,请在表单中填写JSON键值对对象
  • Header如果有需要,也可按JSON对象方式填写
  • 仅需如下三步,即可完成设置
  • 提交后,点击刷新即可在页面上看到监控器记录(此时还未执行)
    在这里插入图片描述

5. 说明和操作

5.1 关于成功率
  • 初次时显示“未执行”,执行正确计算
5.2 关于监控频率
  • 每次执行完成计算下一次执行时间,默认30分钟一次(免费用户暂不支持自定义频率)
  • 计时器每5分钟执行一次,发现监控器执行时间小于当前时间的,就执行请求
  • 所以监控频率并非严格按照30分钟一次
5.2 相关操作
  • 新增/编辑监控器后,可以点击“立即执行”进行一次请求,观察设置是否正确
  • 需要修改时,可点击“编辑”按钮对监控器内容进行修改
  • 点击运行记录,可查看近期运行的情况
  • 运行记录中,点击结果复制,可以复制运行的结果(当返回内容大于512b的时候,只存储前512个内容)
  • 需要邮件通知的用户,可点击右上角头像设置邮箱,在系统异常的时候,会通过邮件进行提示,邮件内容如下:
    在这里插入图片描述

6. 功能拓展

  • 如果有更多建议、合作,请在本文下方留言
  • 或按网站提示添加作者

二、技术实现

1. 技术栈

  • 实现一个监控器需前端、后端、数据库、缓存等技术
  • 本站主要应用了以下技术:
序号技术所属端
1VUE前端
2Vue Element Admin前端
3Java后端
4MySQL 数据库后端
5Redis缓存后端
6Nginx运维
7MyBaits-plus后端

2. 核心代码

  • 实现web应用监控的核心是定期按规则进行请求,并将结果记录,遇到错误时发送邮件提醒
  • 本文以在Spring Boot中实现为例,除Spring Boot基础依赖外,还需添加如下依赖
	<!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--糊涂工具,实现网络请求、工具类等--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.20</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.0</version></dependency>
2.1 监控器实体
  • 记录监控器基本属性、执行时间、统计结果等
  • 下方代码含实体和下次执行时间计算方法
@Data
@Builder
@TableName("m_monitor")
public class MMonitor {@JsonFormat(shape = JsonFormat.Shape.STRING)private Long id;//监控器名称private String name;//创建时间private Date createdAt;//下次运行时间,定时器筛选时的重要指标private Date nextRunAt;//上次运行时间private Date lastRunAt;//计时器类型,1=分钟,2=小时,3=天private Integer timerType;//是否已伤处,1=已删除,0=正常private Integer isDeleted;//计时器步长,整数值private Integer timerLength;//监控器状态,1可用,0停用private Integer status;//用户微信小程序openidprivate String openid;//请求URLprivate String toUrl;//请求方法,GET、POSTprivate String toMethod;//请求参数,JSON Objectprivate String toParams;//请求header,JSON Objectprivate String toHeaders;//返回结果包含为成功,当toResultCode不等于200的时候生效private String toResult;//返回结果code为成功,200表示用code,其他表示包含字符串private Integer toResultCode;//POST请求体格式,0=json,1=formprivate Integer toBodyType;// 最新一次运行情况:1正常,0异常private Integer runStatus;// 最新一次运行情况中文,成功、失败、失败原因private String runResult;// 运行成功次数private Integer countSucceed;// 总运行次数private Integer countAll;//分钟数最短步长,即最短30分钟一次private static final int MIN_MINUTE_LENGTH = 30;// 下次执行时间计算方法public void calNextRunAt(){if(this.lastRunAt == null){this.lastRunAt = new Date();}timerType = timerType == null ? 1 : timerType;if(this.timerLength == null || this.timerLength < 1){this.timerLength = 30;}int addMinute = 0;switch (timerType){case 1:addMinute = timerLength;break;case 2:addMinute = 60 * timerLength;break;case 3:addMinute = 60 * 24 * timerLength;break;}addMinute = Math.max(addMinute,MIN_MINUTE_LENGTH);this.nextRunAt = new Date(System.currentTimeMillis() + 1000L * 60 * addMinute);}
}
2.2 计时器
  • 利用Spring Boot的Scheduled定时器实现
@Component
@Slf4j
public class MonitorTimerTask {@ResourceMMonitorMapper monitorMapper;@AutowiredMonitorService monitorService;@Scheduled(cron="0 0/5 * * * *")public void exec(){List<MMonitor> monitorList = monitorMapper.selectList(new LambdaQueryWrapper<MMonitor>().isNotNull(MMonitor::getNextRunAt).lt(MMonitor::getNextRunAt,DateUtil.formatDateTime(new Date())).eq(MMonitor::getStatus,1).eq(MMonitor::getIsDeleted,0));log.info(String.format("符合执行条件的监控器有%d个", monitorList.size()));for (MMonitor mMonitor : monitorList) {monitorService.run(mMonitor);}}
}
  • 定时器不生效?记得在SpringBootApplication上添加注解:@EnableScheduling
2.3 按规则进行请求
  • 即按监控器的toXX字段配置的内容填充请求参数,进行请求!
  • 本段不多说,直接上代码
/*** 运行监控器的方法实现,运行从这里开始* */@Overridepublic void run(MMonitor monitor) {long timestamp = System.currentTimeMillis();if(monitor.getIsDeleted() != null && monitor.getIsDeleted() == 1){return;}Date date = new Date();boolean isSucceed = false;String resultMsg = "成功";String requestResult = "";int code = 0;try{HttpResponse httpResponse = null;if(monitor.getToMethod() != null && monitor.getToMethod().equalsIgnoreCase("GET")){HttpRequest httpRequest =  HttpRequest.get(monitor.getToUrl());setHeaders(httpRequest,monitor);httpResponse = httpRequest.execute(false);}else{HttpRequest httpRequest =  HttpRequest.post(monitor.getToUrl());setHeaders(httpRequest,monitor);setPostParams(httpRequest,monitor);httpResponse = httpRequest.execute(false);}code = httpResponse.getStatus();requestResult = httpResponse.body();if(monitor.getToResultCode() == 200){isSucceed = code == 200;if(!isSucceed){throw new Exception("返回结果HTTP CODE不为200");}}else {isSucceed = requestResult.contains(monitor.getToResult());if(!isSucceed){throw new Exception("返回结果缺少包含内容");}}}catch (Exception e){isSucceed = false;resultMsg = e.getMessage();}if(isSucceed){monitor.setCountSucceed(monitor.getCountSucceed() + 1);}monitor.setCountAll(monitor.getCountAll() + 1);monitor.setRunStatus(isSucceed ? 1 : 0);monitor.setRunResult(resultMsg);monitor.calNextRunAt();monitor.setLastRunAt(date);monitorMapper.updateById(monitor);timestamp = System.currentTimeMillis() - timestamp;log.info(monitor.getName() + String.format("检查完毕,耗时%dms.", timestamp));if(requestResult != null && requestResult.length() > 512){requestResult = requestResult.substring(0,511) + "...";}MRunRecord runRecord = MRunRecord.builder().monitorId(monitor.getId()).runCode(code).runResult(requestResult).runAt(date).timeSpent(timestamp).openid(monitor.getOpenid()).runStatus(isSucceed ? 1: 0).build();mRunRecordMapper.insert(runRecord);sendEmail(runRecord,monitor);}/*** 发送邮件* */private void sendEmail(MRunRecord runRecord,MMonitor monitor){if(runRecord.getRunStatus() != null && runRecord.getRunStatus() == 1){return;}new Thread(() -> {MUser user = userMapper.selectOne(new LambdaQueryWrapper<MUser>().eq(MUser::getOpenid,runRecord.getOpenid()).orderByDesc(MUser::getId).last(" LIMIT 1"));if(user == null || StrUtil.isBlank(user.getEmail()) || user.getEmail().length() < 5 || !user.getEmail().contains("@")){return;}String subject = "【亚特技术Web监控】【监控异常】" + monitor.getName();String text ="----------------详情登录网站查看----------------\n" +"-------------------请求内容-------------------\n" +"URL:" + monitor.getToUrl() + "\n" +"Method:" + monitor.getToMethod() + "\n" +"-------------------返回内容-------------------\n" +"HttpCode:" + runRecord.getRunCode() + "\n" +"Result:" + runRecord.getRunResult() + "\n";eMailUtils.sendTextMailMessage(user.getEmail(), subject, text);}).start();}/*** 分析规则设置Post参数* */private void setPostParams(HttpRequest httpRequest,MMonitor monitor){if(monitor.getToBodyType() != null && monitor.getToBodyType() == 1){//application/json 方式请求httpRequest.contentType("application/x-www-form-urlencoded;charset=GBK");try{if(!JSONUtil.isTypeJSONObject(monitor.getToParams())){return;}JSONObject joParams = new JSONObject(monitor.getToParams());Map<String, Object> paramsMap = new HashMap<>();for (String key : joParams.keySet()) {paramsMap.put(key,joParams.getStr(key));}httpRequest.form(paramsMap);}catch (Exception e){}}else if(monitor.getToBodyType() != null && monitor.getToBodyType() == 0){httpRequest.contentType("application/json");httpRequest.body(monitor.getToParams());}}/*** 分析规则设置header* */private void setHeaders(HttpRequest httpRequest,MMonitor monitor){try{if(!JSONUtil.isTypeJSONObject(monitor.getToHeaders())){return;}JSONObject joHeader = new JSONObject(monitor.getToHeaders());Map<String,String> headerMap = new HashMap<>();for (String key : joHeader.keySet()) {headerMap.put(key,joHeader.getStr(key));}httpRequest.addHeaders(headerMap);}catch (Exception e){}}

三、结尾说明

  • 第一部分说的网站已经可用了,欢迎试用、欢迎长期使用、欢迎联系合作、欢迎定制功能
  • 第二部分给出了核心内容,但这部分实际上不是实现整个网站最耗时的:前端开发工作也是费力不讨好的
  • 本人同时还提供Java开发一对一教学,有需要的添加微信:xujian_cq详聊
  • 欢迎点赞、收藏、评论

相关文章:

如何实现Web应用、网站状态的监控?

如何实现Web应用、网站状态的监控&#xff1f; 关键词&#xff1a;网站监控,服务器监控,页面性能监控,用户体验监控本文通过代码分析、网站应用介绍网站状态监控的方式下文主要分为网站应用、技术实现两部分 一、网站应用 现在网络上已经存在一些Web网站监控的服务&#xff…...

手撕排序之堆排序

一、概念&#xff1a; 什么是逻辑结构、物理结构&#xff1f; 逻辑结构&#xff1a;是我们自己想象出来的&#xff0c;就像内存中不存在一个真正的树 物理结构(存储结构)&#xff1a;实际上在内存中存储的形式。 堆的逻辑结构是一颗完全二叉树 堆的物理结构是一个数组 之…...

【奇想星球】重磅!我们的AIGC共创社区平台上线了!

文章目录 01 前言功能模块 02 相识缘起连接价值平台优势 03 奇想星球04 我们做了什么时间线 05 初心愿景06 可爱的小伙伴们后续开发及招募计划 07 结语 公众号原文链接 01 前言 2023年9月10日&#xff0c;我们的平台网站上线了&#xff01; 奇想星球 | AIGC共创社区平台。网站地…...

2023年数维杯数学建模B题节能列车运行控制优化策略求解全过程文档及程序

2023年数维杯数学建模 B题 节能列车运行控制优化策略 原题再现&#xff1a; 在城市交通电气化进程快速推进的同时&#xff0c;与之相应的能耗增长和负面效应也在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来负担。2018 年&#xff0c;北京、上海、…...

Python--测试代码

目录 1、使用pip安装pytest 1.1 更新pip 1.2 安装putest 2、测试函数 2.1 单元测试和测试用例 2.2 可通过的测试 2.3 运行测试 2.4 未通过的测试 2.5 解决测试未通过 2.6 添加新测试 3、测试类 3.1 各种断言 3.2 一个测试的类 3.3 测试AnonymousSurvey类 3.4 使…...

CentOS 系列版本搭建 Nginx 服务

目录 Nginx 介绍 Nginx 安装 CentOS 系列版本 Nginx 删除 CentOS 系列版本 Nginx 介绍 Nginx 是一个广泛使用的Web服务器和反向代理服务器。 反向代理和负载均衡&#xff1a;Nginx支持反向代理和负载均衡&#xff0c;能够分发请求到多个后端服务器&#xff0c;提高了可用性…...

目标检测YOLO实战应用案例100讲-基于机器视觉的输电线路小目标检测和缺 陷识别(下)

目录 3.3.1 输电线路所有尺寸目标检测性能对比 3.3.2 输电线路小目标检测性能对比...

argparse--命令行参数解析库

文章目录 位置参数help ->描述信息type -> 被转换的类型 可选参数action ->动作基本类型 (store_true)短选项 结合位置参数和可选参数choiceaction ->动作基本类型 (count)default -> 默认值 argparse模块使编写用户友好的命令行变得容易 接口。程序定义了它需要…...

elasticsearch4-文档操作

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…...

阿里云服务器上CentOS 7.6使用rpm包安装MySQL 8.0.31

我这里下载的是最新版本&#xff0c;需要到MySQL官网最新版本下载地址。 要是想要下载以前的版本需要到MySQL以前版本网址中。 1&#xff09;先使用wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar&#xff08;这个网址现在已经不…...

redis未授权漏洞

redis未授权漏洞是什么&#xff1f; Redis 默认情况下会绑定在 0.0.0.0:6379&#xff0c;这样将会将 Redis 服务暴露到公网上&#xff0c;如果在没有开启认证的情况下&#xff0c;可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取 Redis的数据 它有什么危…...

详解3dMax中渲染线框的两种简单方法

在3dMax中渲染线框是你在某个时候想要完成的事情&#xff0c;例如为了演示分解步骤&#xff0c;或是仅仅为了在模型上创建线框覆盖的独特效果。为三维模型渲染线框最常见的原因是能够在模型上显示干净的拓扑。这篇文章将带你了解在3dMax中渲染三维模型线框的两种最常见、最简单…...

Git - Git 工作流程

文章目录 Git WorkFlow图解小结 Git WorkFlow Git Flow是一种基于Git的工作流程&#xff0c;确实利用了Git作为分布式版本控制系统的优势。 本地代码库 (Local Repository): 每个开发者都维护自己的本地代码库&#xff0c;这是Git分布式性质的体现。本地代码库包含了完整的项目…...

ARM如何利用PMU的Cycle Counter(时钟周期)来计算出CPU的时钟频率

本章将学习如何利用ARM PMU的Cycle Counter&#xff0c;来计算出CPU的时钟周期&#xff0c;从而计算出CPU的时钟频率。在介绍计算方法前&#xff0c;有必要先介绍下什么是时钟周期、机器周期以及指令周期。 如何计算出CPU的时钟频率 一&#xff0c;时钟周期&#xff0c;机器周…...

56资源网系统源码搭建知识付费-含源码

内置了上万条数据资源 大致功能&#xff1a; 支持免费与付费&#xff08;增加了插件付费插件&#xff09;支持侧边栏支持添加各类型广告&#xff08;你所能用到的基本都有&#xff09;.支持网盘下载模块支持所有页面自定义支持文章页三方跳转支持添加页面支持自定义采集&#…...

【运营版】仿东郊到家上门服务app小程序开发同城美容家政预约推拿足浴SPA技师派单源码

套餐一:源码=小程序端+公众号端+APP端=280元 套餐二:全包服务 包服务器+域名+APP+认证小程序+H5+PC=1000元 后端:系统后端使用PHP语言开发 前端:前端使用uniapp进行前后端分离开发 用户端功能模块:技师选择 预约服务 优惠券 订单 技师服务...

uniapp项目实践总结(十五)使用websocket实现简易聊天室

导语:在一些社交软件中,经常可以看到各种聊天室的界面,接下来就总结一下聊天室的原理个实现方法,最后做一个简易的聊天室,包括登录/登出、加入/离开房间、发送接收聊天消息等功能。 目录 准备工作原理分析组件实现实战演练服务端搭建案例展示准备工作 在pages/index文件夹…...

论文阅读之Learning and Generalization of Motor Skills by Learning from Demonstration

论文阅读其实就是用自己的话讲一遍&#xff0c;然后理解其中的方法 0、论文基本信息 为什么阅读此篇论文&#xff1a;因为它是DMP经典论文&#xff0c;被引多次&#xff0c;学史可以明智&#xff0c;了解最初机理。 论文题目&#xff1a;Learning and Generalization of Moto…...

SpringCloud中的Eureka的集群配置

微服务框架中最为重要的就是注册中心&#xff0c;如果只是单注册中心&#xff0c;一旦出现问题&#xff0c;容易导致整个微服务环境不可用&#xff0c;所以建议注册中心集群。 目前SpringCloud框架中使用Eureka作为注册中心&#xff0c;本文简单介绍一下Eureka的集群配置&…...

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生&#xff0c;纯搞视觉多少还是有点与专业脱节&#xff0c;决定入坑嵌入式。选择STM32进行入门&#xff0c;并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境&#xff08;大一的时候玩过一段时间&#xff0c;但是没什么技术&#…...

负载均衡原理及应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

视频讲解|1033含sop的配电网重构(含风光可多时段拓展)

目录 1 主要内容 程序特点 讲解重点 2 视频链接 1 主要内容 该视频为含sop的配电网重构matlab代码讲解&#xff0c;对应资源下载链接为含sop的配电网重构&#xff08;含风光|可多时段拓展&#xff09;&#xff0c;程序主要内容是&#xff1a;针对含sop的配电网重构模型&…...

uni-app监听页面滚动

在uni-app中可以通过监听页面滚动事件来实现滚动效果或响应滚动事件 在需要监听滚动的页面或组件中&#xff0c;添加一个scroll元素&#xff0c;用于容纳内容并实现滚动效果。 <template><view class"container"><scroll-view scroll-y scroll"…...

[字符串和内存函数]strcmp字符串函数的详解和模拟

strcmp函数 strcmp函数是一个用于比较两个字符串的C标准库函数。它的原型为&#xff1a; int strcmp(const char* str1, const char* str2);strcmp函数会比较str1和str2两个字符串的字符序列&#xff0c;并返回一个整数值来表示它们之间的大小关系。返回值的含义如下&#xff…...

zookeeper 常见问题处理

调整jvm参数 [rootvm-02 conf]# cat /opt/app/zookeeper-3.4.14/bin/zkEnv.sh |grep java.env -A3 -B3ZOOCFG"$ZOOCFGDIR/$ZOOCFG"if [ -f "$ZOOCFGDIR/java.env" ] then. "$ZOOCFGDIR/java.env" fiif [ "x${ZOO_LOG_DIR}" "x&…...

repo 命令

repo命令是Google开发的用于管理Android版本库的一个工具。 repo命令并不是用于取代git&#xff0c;而是用Python对git进行了一定的封装&#xff0c;简化了对多个Git版本库的管理。 repo init -u -b -m <manifest 文件名称> repo sync 相当于 git clone 获取 git remote…...

一、 计算机网络概论

一、计算机网络概论 1、计算机网络概述 1.1、概念 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统 是一些互连的、自治的计算机系统的集合 以能够相互共享资源的方…...

从零学习开发一个RISC-V操作系统(一)丨计算机组成原理相关知识与RISC-V指令集简介

本篇文章的内容 一、计算机组成原理的相关知识1.1 计算机的硬件组成1.2 程序的存储与执行1.3 程序语言的设计和进化1.4 存储设备的层次结构1.5 操作系统 二、RISC-V的指令集ISA简介2.1 什么是ISA2.2 复杂指令集&#xff08;CISC&#xff09;和精简指令集&#xff08;RISC&#…...

C++ - 异常介绍和使用

前言 我们在日常编写代码的时候&#xff0c;难免会出现编写错误带来程序的奔溃&#xff0c;或者是用户在使用我们编写的程序时候&#xff0c;使用错误所带来程序的奔溃。 在C 当中 可以对你觉得可能发生 错误 的地方在运行之前进行判断&#xff0c;发生错误可以给出提示。 C…...

iText实战--在现有PDF上工作

6.1 使用PdfReader读取PDF 检索文档和页面信息 D:/data/iText/inAction/chapter03/image_direct.pdf Number of pages: 1 Size of page 1: [0.0,0.0,283.0,416.0] Rotation of page 1: 0 Page size with rotation of page 1: Rectangle: 283.0x416.0 (rot: 0 degrees) Is reb…...

wordpress主题 tob/推广app的软文案例

每天读一篇一线开发者原创好文问题引入&#xff1a;项目发展&#xff0c;自动化测试需要使用python模拟客户端发送http2.0请求。选型&#xff1a;目前网上盛行的python模拟客户端发送http2.0的库主要为hyper&#xff0c;毫无疑问&#xff0c;大胆一试。选型参考&#xff1a;htt…...

温州本地论坛/百度seo搜索营销新视角

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1234 Solved: 878[Submit][Status][Discuss]Description Farmer John新买了一块长方形的牧场&#xff0c;这块牧场被划分成M列N行(1<M<12; 1<N<12)&#xff0c;每一格…...

网站关键词排名优化技巧/免费网页制作网站

需要全部代码或者更多前端学习资料的可以私信我“前端”&#xff0c;自动回复。今天是520。一句温柔的问候&#xff0c;一束美丽的鲜花&#xff0c;一段真情的告白。但是作为一名与众不同的程序员&#xff0c;我们可不仅仅拥有上面的传情方法&#xff0c;别忘了每个人的手上可是…...

电子商务网购网页设计毕业论文/seo流量软件

2019独角兽企业重金招聘Python工程师标准>>> 最近从渗透开始研究渗透研究了很久仅限于知道一些扫描工具和简单入门谈不上的使用和方法。之前的回头在补渗透吧。有关国际化有关python的文件处理每行脚本的编辑和正则处理。还有eclipse的插件ResourceBundleEditor_v0.…...

男生跟男生做口视频网站/优化网站技术

原标题&#xff1a;Linux下iptables防火墙用法规则详解管理网络流量是系统管理员必需处理的最棘手工作之一&#xff0c;我们必需规定连接系统的用户满足防火墙的传入和传出要求&#xff0c;以最大限度保证系统免受。很多用户把 Linux 中的iptables当成一个防火墙&#xff0c;从…...

做企业的网站都要准备什么/爱站网关键词工具

//public——说明方法main()是公有方法&#xff0c;它可以被任何方法访问&#xff0c;包括java解释器。实际上&#xff0c;main()方法只被java解释器调用&#xff0c;其他方法一般不调用它。//static——告诉编译器main()方法是静态的&#xff0c;可用在类Demo中&#xff0c;不…...