发表于: 2020-07-16 22:56:24

1 1281


今天做了什么:

完成任务二全部深度思考。

明天计划的事情: 

深入理解一下nginx。

遇到的问题: null

收获:


14.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开?  

端口的含义

在 Internet上,各主机间通过TCP/TP协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。

我们知道大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据报传送给众多同时运行的进程中的哪一个呢?

端口机制便由此被引入进来。

本地操作系统会给那些有需求的进程分配协议端口 (protocal port,即我们常说的端口),每个协议端口由一个正整数标识,如:80,139,445,等等。

判断占用

使用netstat命令然后 tasklist taskkill

判断防火墙拦截

telnet 本机 端口 看看通不通 因为这样不会经过防火墙 

在别的机器上telnet 刚才的ip 端口 看看通不通 这个肯定过防火墙

第一个通, 第二个不通 一般就是防火墙在拦截.

Telnet判断端口号是否打开

在cmd中输入 telnet ip 端口号,会有两种返回结果,

一种为: 正在连接到(ip)...不能打开到主机的连接,在端口(端口号):连接失败

这个为该IP该端口未开放的返回结果


另一种则会打开一个新的cdm窗口,并关闭原来的窗口,这就表示了该ip该窗口属于开放状态

15.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的?

通常就是 80(http)443(https)

有多个 web 服务就用 nginx 暴露出 80 443,接受到请求再映射到本地的其他服务的端口。

16.常用的性能统计命令有哪些,TopVmstat,free等命令都有什么用处,CPU占用率,内存使用分别代表什么含义?到什么情况下,应该产生报警信息?  

uptim  该命令可以大致的看出计算机的整体负载情况,load average后的数字分别表示计算机在1min、5min、15min内的平均负载

dmesg | tail 打印内核环形缓存区中的内容,可以用来查看一些错误;

vmstat 1 打印进程、内存、交换分区、IO和CPU等的统计信息;

mpstat -P ALL 1 该命令用于每秒打印一次每个CPU的统计信息,可用于查看CPU的调度是否均匀

pidstat 1 该命令用于打印各个进程对CPU的占用情况,类似top命令中显示的内容。pidstat的优势在于,可以滚动的打印进程运行情况,而不像top那样会清屏。

iostat -xz 1 类似vmstat,第一次输出的是从系统开机到统计这段时间的采样数据;

free -m 查看内存的使用情况

sar -n DEV 1 sar是System Activity Reporter的缩写,系统活动状态报告。

sar -n TCP,ETCP 1  该命令可以用于粗略的判断网络的吞吐量,如发起的网络连接数量和接收的网络连接数量;TCP, 报告关于TCPv4网络流量的统计信息; ETCP, 报告有关TCPv4网络错误的统计信息;

top  top命令包含更多的指标统计,相当于一个综合命令。


CPU占用就是你运行的程序占用的duCPU资源,表示你的机器在某个时间点的运行程序的情况。

内存占用指的是此进程所开销的内存。


驱动没有经过认证,造成CPU资源占用100%

电脑感染病毒或是木马

CPU温度过高

运行的程序太多


17.为什么要知道响应时间的分布情况,如果一个请求很慢,它的时间可能会被耗费在哪里?  

知道了响应时间分布才能发现问题并且去做优化。

读写数据库,机器负载过高,发送的数据过多

18.怎么查看Resin或者是Tomcat中的DB访问时间和Controller时间,有没有可能用Aop的方法自动记录Controller的时间和DB时间?Controller时间和DB时间的区别是什么,在你写的业务逻辑里,相差有多大? 

通过resin和tomcat的access.log文件查看

通过Aop的方法可以在Controller方法执行前后来切入记录日志。使用了环绕方法切入Controller和ServiceImpl来获取访问时间。首次部署的时候不知道为什么都有1000ms以上的时间,等到第一次访问加载完以后后续访问一般都是0ms~10ms以内,至于它们之间的差距不明显,个位数ms之间的差距。

19.怎么判断WEB容器是否收到了一个Http请求,WEB容器中的Access.log是什么意思,包含哪些字段,代表什么含义,是哪里配置修改字段的。 

 通过日志判断。

access.log就是使用日志,包含了基本上所有的访问信息。

nginx是在conf文件夹下的nginx.conf文件配置的:

具体属性如下:$remote_addr与$http_x_forwarded_for(反向)用以记录客户端的ip地址;

$remote_user:用来记录客户端用户名称;

$time_local: 用来记录访问时间与时区;

$request: 用来记录请求的url与http协议;

$status: 用来记录请求状态;成功是200;

$body_bytes_sent :记录发送给客户端文件主体内容大小;

$http_referer:用来记录从那个页面链接访问过来的;

$http_user_agent:记录客户浏览器的相关信息;

20.为什么通常都是将部署文件放置在/data/盘下,在云服务器中数据盘和系统盘的区别是什么?  

部署文件集中在一起比较容易管理,2.习惯data一般都是部署网站的根目录

数据盘和系统盘就像是win的d盘和c盘,一般数据都不推荐放在系统盘

21.常用的主流数据库有哪些,Mysql有几种安装方式?

关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

NoSQL 划分为 4 种类型:键值数据库、列式数据库、文档数据库和图形数据库。

1.关系型数据库:

SQLITE ,Sybase,Db2(IBM公司),Oracle(甲骨文公司),Mysql,SQLServer(微软公司),Access

2.非关系型数据库

Redis,Hbase,MongodDB,Neo4j 

一种特殊的文件存放 HDF5

非传统的关系型数据库KDB+

3.Mysql有几种安装方式?  

Yum安装Mysql,rpm安装Mysql ,二进制安装


22.有哪些常用的云服务器公司,Linux服务器和Windows服务器的差别是什么,Linux有哪些主流的版本,不同版本之间的差别在哪里?  

云服务器公司:阿里云,腾讯云,西部数码,华为云

windows服务器容易上手,建站可视化简单,这是优势。

差在安全性、稳定性和性能。

Linux设计之初,主要的设计理念就是安全、稳定、高效,这些对于服务器来说可谓是重中之重,事实也说明,Linux在安全性和稳定性方面是非常出众的。

Linux开源免费,为企业节省相当一部分开支。当然收费版本的Linux提供的服务要更好一些,这就给企业提供了更多的选择。

Linux占用系统资源少,这就在大大降低对硬件要求的同时,在更大程度上提升了系统的性能。

Linux系统与Apache、nginx等服务器的先天相容性。Linux内核是采用C语言编写的,众多的服务器软件都是采用C语言编写,这就在代码层大大提高了服务器提供服务的能力


Arch Linux也许 Arch 最主要的特点之一就是,它是一个独立的开放源代码的发行版(这意味着它不基于任何其他的发行版),由于 Arch 采用滚动发布模式,因此你只要使用 pacman 执行定期的系统更新就可以获得最新的软件。

2、 CentOS虽然社区企业操作系统(Community ENTerprise Operating System)是用于 Linux 服务器的最有名、最常用的发行版,但是它的桌面版本还在继续不断完善中。另外,它的稳健性、稳定性、和 100% 的二进制兼容性,也使之成为了 Red Hat Enterprise Linux 的头号备选——特别是对云 VPS 供应商而言——也许这就是发行版持续增长的主要原因之一。

3、Manjaro基于 Arch Linux 的 Manjaro,目标在于利用让 Arch 成为一个伟大发行版的功能优势,同时提供一个更舒适的安装和运行体验,无论是新手还是有经验的 Linux 用户,都可以开箱即用。Manjaro 预装了桌面环境、图形应用程序(包括软件中心)和用于播放音频和视频的多媒体解码器。

4、 Mageia作为现在已经消失的 Mandriva Linux 的衍生品,受非盈利性组织支持的 Mageia 诞生于2010年,自那时起,成为了台式机和服务器上的著名的安全而稳定的 Linux 发行版。

5. Fedora由 Red Hat 支持的 Fedora Project 构建和维护,这是一个世界性的志愿者和开发人员社区,Fedora 之所以能够持续几年成为使用最广泛的发行版之一,是因为它有三个主要的可用版本:Workstation (用于台式机) ,Server 和 Cloud 镜像,以及ARM 版本用于基于 ARM(通常为无操控外设)的服务器。不过,也许 Fedora 最显着的特点是,它总是在率先将新的软件包版本和技术整合到发行版中。此外, Red Hat Enterprise Linux 和 CentOS 的新版本都是基于 Fedora 的。

6、openSUSE既是一个滚动发布版本,又可当作是一个独立的定期发布版本,openSUSE 根据其开发人员的不同,是系统管理员、开发人员和桌面用户 Linux 的发行版之选,无论你的经验水平处于哪种级别(受到初学者和极客们的一致好评)。最重要的是,著名又屡获殊荣的 SUSE Linux Enterprise 产品基于 openSUSE。

7、 UbuntuCanonical,这个 Ubuntu 背后的公司,一直致力于使 Ubuntu 成为一个流行和普遍的发行版,并且现在你可在智能手机、平板电脑、个人电脑、服务器和云 VPS 的上面看到 Ubuntu 的身影。此外,Ubuntu 基于 Debian,并且是一款非常受新用户欢迎的发行版——这可能就是 Ubuntu 在一段时间内持续增长的原因。虽然在这个排名中没有计算进来,但 Ubuntu 是其他 Canonical 系列发行版,如 Kubuntu、Xubuntu、Lubuntu 的基础。8. Debian作为一个坚如磐石的 Linux 发行版,Debian 每2年发布新的稳定版本,并且你放心,每个版本都已经过彻底的测试。虽然它主要用于服务器上,但现在它的桌面版本已经在功能和外观上得到了明显的改善。9、 Linux MintLinux Mint 的著名口号 “From freedom came elegance” ,不只是说说而已。基于 Ubuntu 的 Linux Mint,是一个稳定、功能强大、完整、易于使用的 Linux 发行版——我们还有很多很多的褒义词可以用来形容 Mint。Mint 最显著的特点之一是,在安装过程中允许你从一个列表中选择桌面环境,并且你可以放心,一旦它安装完了之后,你无需任何额外的配置步骤就能播放音乐和视频文件,因为标准安装提供了多媒体解码器的开箱即用。

23.什么是ssh?如何在linux服务器上从网站下载文件?  

SecureShell的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

wget http://xxx.xxx.x.xxxx.tar.gz 而且linux也有自己的维护社区,也可以使用yum来进行安装,比如yum install xxx


24.C标签是什么,为什么要使用C标签,有哪些常见的指令?  

C标签即JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL的目标是为了简化JSP页面的设计。对于页面设计人员来说,使用脚本语言(默认值是JAVA语言)操作动态数据是比较困难的,而采用标签和表达式语言相对容易一些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。

      1  c:out    用于在JSP中显示数据

    2  c:set    用于保存数据

    3  c:remove    用于删除数据

    4  c:catch     用来处理产生错误的异常状况,并且将错误信息储存起来

    5  c:if    与我们在一般程序中用的if一样

    6  c:choose    本身只当做c:whenc:otherwise的父标签

    7  c:when     c:choose的子标签,用来判断条件是否成立

    8  c:otherwise     c:choose的子标签,接在c:when标签后,当c:when标签判断为false时被执行

    9  c:import     检索一个绝对或相对 URL,然后将其内容暴露给页面

    10  c:forEach     基础迭代标签,接受多种集合类型

    11  c:forTokens    根据指定的分隔符来分隔内容并迭代输出


25.什么叫反向代理?为什么要使用反向代理?  

正向代理代理的对象是客户端,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求

反向代理代理的对象是服务端,它隐藏了真实的服务端

1.保证内部服务器的安全,因为隐藏了内部服务器,外部可见的是代理服务器的IP和端口,信息资源又是放在内部服务器。

2.负载均衡,加快的内部服务器的访问速度,部署多个反向代理服务器,让不同的服务走不同的代理服务器,而且代理服务器还提供缓存功能也加快了用户的访问速度。

3.节约有限的IP资源

26.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗?  

nginx可作为HTTP代理服务和反向代理、可作为负载均衡、可作为Web缓存

好处:

1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高

2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度

3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡

4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源

5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的

6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行

别的反向代理服务器



27.为什么要用start.sh,stop.sh,deploy.sh 来完成容器的启动,停止和部署,而不是直接用容器自带的命令? 

 因为脚本部署比较快,方便管理,能够随时部署,不消耗时间。

改动方便,脚本语言可以很好的改动,比较灵活。

如果使用容器自带的命令也可以,但是每个web容器都有自己的规范和配置,所以不方便管理(多项目情况下)。而且容器自带的都是自己默认的属性,更何况有的(比如jetty)还能使用java命令部署,不统一,而且依赖java运行而运行

 

28.什么是Filter,什么是Interceptor,他们的区别是什么,和AOP又是什么关系?

Filter

就是过滤器,依赖Servlet容器,实现上基于函数回调,几乎对所有的请求进行过滤,过滤器的实例每次只在容器初始化时调用一次。

Interceptor

依赖于web框架,在Spring中依赖于SpringMVC框架。实现上基于java反射机制,AOP的运用。

区别:

(1)使用范围不同:Filter是Servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于Application、swing程序中。

(2)规范不同:Filter是在servlet规范中定义的,是Servlet容器支持的,而拦截器是在spring容器内的,是spring框架支持的。

(3)使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源,独享。例如service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter不能。

(4)深度不同:Filter只在Servlet前后起作用。而拦截器能深入到方法前后、异常抛出前后等。因此拦截器的使用灵活性更大。所以在Spring为基础的构架的程序中,优先使用拦截器。

①:拦截器是基于java的反射机制,而过滤器基于函数回调。

②:过滤器依赖于servlet容器,拦截器不依赖于servlet容器。

③:拦截器只能对action请求起作用,而过滤器几乎对所有的请求都起作用。

④:拦截器可以访问action上下文,值栈里的对象,而过滤器不能。

⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥:拦截器可以获取IOC容器中的各个bean,而过滤器就不行,(在拦截器里注入一个service,可以调用业务逻辑)。

⑦:过滤器是在请求进入容器后,但进入servlert前进行预处理的。响应请求也是,在servlet处理结束后,返回给客户端前触发。而拦截器提供了三个方法支持(1)preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现); 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。


29.使用Annotaion的时候需要有哪些配置,他的加载过程是怎么样的?  

配置 <context:componet-scan /> 标签。

通过动态代理和反射,在类加载过程中动态生成代理类,当初始化全局变量时,代理类跳到invoke方法,然后通过反射获取field字段对象,在method.invoke()的调用前即可实现注入。aop和拦截器以及常用注解等功能的实现都是基于动态代理实现的。

30.AnnotationXML两种配置的差别,为什么更喜欢使用Annotaion来配置Spring MVC

1.XML配置的优缺点: 

优点有: 

1. XML配置方式降低了耦合,更具扩展性,即使对配置文件进一步修改也不需要工程进行修改和重新编译。 

2. 在处理大的业务量的时候,用XML配置应该更加好一些。因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用。同时spring的相关配置也能一目了然。 

当然,有人会说,用XML配置,在大的业务量时候会使得XML文件过大,不容易查看。这一点我们完全可以利用业务分解书写多个XML配置文件就可以了。 

缺点有: 

配置文件读取和解析需要花费一定的时间,配置文件过多的时候难以管理,无法对配置的正确性进行校验,增加了测试难度。 

2.annotation配置的优缺点: 

优点有: 

1. 在class文件中,可以降低维护成本,annotation的配置机制很明显简单 

2. 不需要第三方的解析工具,利用java反射技术就可以完成任务 

3. 编辑期可以验证正确性,差错变得容易 

4. 提高开发效率 

缺点有: 

1. 如果需要对于annotation进行修改,那么要重新编译整个工程 

2. 业务类之间的关系不如XML配置那样容易把握。 

3. 如果在程序中annotation比较多,直接影响代码质量,对于代码的简洁度有一定的影响。

3.为什么更喜欢使用Annotaion来配置Spring MVC?

1. SpringMVC框架给出了专用的几个注解,使其层次更加分明

2. MVC层次较为简单,而url映射也十分简单,哪个网址出错可以立即找到其映射类。


31.web.xml里的主要配置都包括什么,都代表什么含义,比如怎么加载Spring 配置的?

  包括:前端控制器,字符过滤器,上下文监听器。

配置一个上下文监听器然后配置上下文属性加载到spring的配置

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>


32.Spring MVCStruts的区别是什么,为什么更倾向于使用Spring MVC

拦截机制的不同

Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。

SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

底层框架的不同 

Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

因为

Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。

spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

33.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些? 

 Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。它可以使用标准的互联网协议,像超文本传输协议HTTP和XML,将功能体现在互联网和企业内部网上。WebService平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用你喜欢的任何语言,在你喜欢的任何平台上写Web Service。

框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss  RESTEasy、sun JAX-WS(最简单、方便)、阿里巴巴  Dubbo(除外)

34.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?  

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象, 每一次完整的数据传输都必须经过建立连接,数据传输和终止连接3个过程,TCP建立连接的过程称为三次握手两次握手

A(客户端)发送了一个请求,等待B(服务端)的回应。 B收到请求,知道A的发信机正常,自己的收信机正常。按照两次握手的协定,B(不管A的状态)理所当然认为连接已经成功地建立了,便给A发送数据分组。

可是,当B的应答分组在传输给A的途中丢失的话,A将不知道B是否已准备好,不知道B建议什么样的序列号,A甚至怀疑B是否收到自己的连接请求分组。 在这种情况下,A认为连接还未建立成功,将忽略B发来的任何数据分组,只等待连接确认应答分组。

后果

而B在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

B会对已建立的连接保存必要的资源,如果大量的这种情况,B会崩溃。

死锁:当某一进程提出资源的使用要求后,使得系统中一些进程处于无休止的阻塞状态,在无外力的作用下,这些进程永远也不能继续前进。我们称这种现象为死锁。

TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。

35.什么是http协议?getpost请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?

在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。因此,HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP协议栈来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

区别:

1)GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据。

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制.

POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3)安全性: POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为 (1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。

4)GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

然而,这些大多是Google出来的,很大一部分文章对get和post的描述都是如此。但是网上还是有不同的意见。具体内容:GET和POST没有什么除了语义之外的区别,他们就仅仅是个名字而已,如果服务器支持,完全可以把GET改个名字叫GET2;只有一点根本区别,一个用于获取数据,一个用于修改数据。


200多种。

主要的三种:

application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。这种方式用的比较多。

multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。一般上传文件才会使用这种方式。

text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。一般向服务端发送json数据会使用这种方式。


状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常


适用场景:公司OA服务,互联网服务。


36.了解mavenmodule  

Maven Module也是一个maven 工程,但是却是一个子工程,必须有父工程存在并依赖,Maven Module不能抛弃父工程单独存在。

Maven Project可以理解为一个单独、独立的工程,在打包为jar或者war时,可以单独运行。如果在pom文件中添加了对父工程的依赖,此时作为父工程的子工程。

37.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?

REST 的好处

REST 比其他方法(如 SOAP)要容易得多,SOAP 使开发人员不必在 HTTP 请求操作方面重新发明轮子。SOAP 还需要单独的服务器和客户端程序。

由于 REST 基于标准 HTTP 操作,因此它使用具有特定含义的动词,如"获取"或"删除",以避免歧义。为资源分配了单独的 URI,增加了灵活性。

使用 REST,生产和消费的信息与促进生产和消费的技术分离开来。因此,REST 性能良好,可伸缩性高、简单且易于修改和扩展。

rest之前使用的是 soap,这种方式可以让开发者以自己想要的结构来获取数据,但是最终由于其定义与约束越来越复杂访问过于缓慢而被淘汰。

 

38.生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json  

① 使用json工具类库转化生成,如FastJson(阿里巴巴)、Gson(谷歌)、Jackson等;

② 使用注解ResponseBody返回java对象或集合,自动转化生成;

③ 使用JsonTaglib在jsp中设置字段或者嵌套生成。

那为什么推荐使用JsonTaglib来处理Json呢?

因为使用JsonTaglib与其他的最大区别就是更加灵活,修改更加方便,只需要在jsp中修改即可,不需要修改controller中的代码。

并且,在项目简单的情况下,controller中的代码简洁度并不明显,但是当项目复杂时,可以很清晰的认识到代码的简洁、易读。而这其实也就是Json诞生原因之一。

39.一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?  

请求方法,请求地址,返回参数以及字段与备注。

标准:

   保持兼容性

    方法名子描述,看到名字就知道方法的作用,需要的数据

    便于使用者理解,不能定义过于复杂

    有必要的接口参数验证,返回的异常要足够全面

40.HttpHeader里面包含哪些字段,每个字段都有哪些含义?  

41.如何写shell脚本?尝试自己编写一个简单脚本。  

vim 脚本名.sh

#!/bin/bash

echo "Hello World !"

chmod +x ./test.sh  #使脚本具有执行权限

./test.sh  #执行脚本

42.Linux服务器上部署的时候,一般都要有哪些脚本,这些脚本该怎么编写? 

服务器启动脚本,流程控制脚本 

直接上shell脚本:

#!/bin/bash

#服务器路径

TOMCAT_HOME=/usr/local/src/tomcat

JETTY_HOME=/usr/local/src/jetty

RESIN_HOME=/usr/local/resin

WAR_HOME=/usr/local/task/task2/target

if test -d ${WAR_HOME} #-d:判断是不是目录,并是否存在

then

echo"task是目录,继续执行脚本"

else 

if test -e ${WAR_HOME}/*.war #-e:判断文件是否存在

then

echo “发现war包继续运行”

else "没有发现war包"

exit 0

fi

fi

echo "请输入数字:8088 关闭tomcat 8012 jetty 8080 关闭resin 0 全部依次关闭

188 启动tomcat 182 启动jetty 180 启动resin 1 全部依次打开部署 2 查看三个服务器的日志"

read x

echo "你输入的数字为:${x}"

case $x in

8088) #关闭tomcat

cd ${TOMCAT_HOME}/bin/

./shutdown.sh

sleep 2s #睡眠两秒 防止服务器没有关闭,就执行操作

;;

8012) #关闭jetty

cd ${JETTY_HOME}/bin/

./jetty.sh stop

sleep 2s #睡眠两秒 防止服务器没有关闭,就执行操作

;;

8080)

cd ${RESIN_HOME}/bin/

./resin.sh stop

sleep 2s

;;

0)#全部依次关闭

cd ${TOMCAT_HOME}/bin/

./shutdown.sh

sleep 2s #睡眠两秒 防止服务器没有关闭,就执行操作

cd ${JETTY_HOME}/bin/

./jetty.sh stop

sleep 2s #睡眠两秒 防止服务器没有关闭,就执行操作

/etc/init.d/resin stop

sleep 2s

;;

1)

 #启动tomcat

rm -rf  ${TOMCAT_HOME}/webapps/task*

cp -rf $WAR_HOME/*.war  $TOMCAT_HOME/webapps

echo "########启动tomcat############"

cd ${TOMCAT_HOME}/bin/

./startup.sh

 #启动jetty

rm -rf  ${JETTY_HOME}/webapps/task*

echo "######jetty部署开始###########"

cp ${WAR_HOME}/task*.*  ${JETTY_HOME}/webapps

cd  ${JETTY_HOME}/bin

./jetty.sh start

#启动resin

echo "#########resin部署开始#########"

cd ${RESIN_HOME}/bin

./resin.sh start

;;

2)echo "#######tomcat日志#######"

cd /usr/local/src/tomcat/logs

tail  localhost_access_log.2020-07-06.txt

echo "##########jetty日志#########"

cd /usr/local/src/jetty/logs

tail  2020_07_06.request.log

echo "#########resin日志##########"

cd /usr/local/resin/log

tail  access.log

;;

188) #启动tomcat

rm -rf  ${TOMCAT_HOME}/webapps/task*

echo "#############TOMCAT部署开始#############"

cp -rf $WAR_HOME/*.war  $TOMCAT_HOME/webapps

cd ${TOMCAT_HOME}/bin/

./startup.sh

echo "#############部署结束#############"

;;

182) #启动jetty

rm -rf  ${JETTY_HOME}/webapps/task*

echo "#############JETTY部署开始#############"

cp ${WAR_HOME}/task*.*  ${JETTY_HOME}/webapps

cd  ${JETTY_HOME}/bin

./jetty.sh start

echo"#############部署结束#############"

;;

180)#启动resin

echo "#############RESIN部署开始#############"

cd ${RESIN_HOME}/bin

./resin.sh start

echo "#############部署结束#############"

;;

*) echo"#######你没有输入可执行的数字#####"

;;

esac


43.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好? 

  最好配置多个容器,一个容器的死掉,会影响全部web服务,但是配置多个容器,对服务器的资源的要求要高,性能提高了,但是成本增加。

我觉得一个web配置一个容器更好。

44.Resin/tomcat/jettyWEB容器的内存大小,一般应该设置多大合适,怎么估算WEB程度占用内存的大小?  

内存配置一般1-2G。应该先通过实时数据或者压力测试调整,再根据最大占用估计内存大小

45.jetty,resin,tomcat的常见配置有哪些,内存,端口,日志文件都怎么配置?  

需要包括请求方法、uri、请求参数、返回参数、添加接口示例、接口文档版本号、版本修改内容、版本修改时间、修改人,错误代码等。 

接口分为四部分:方法、uri、请求参数、返回参数:

1)方法:常用的方法就是下面的四种:GET PUT POST DELETE

2)uri:以/a开头,如果需要登录才能调用的接口(如新增、修改;前台的用户个人信息,资金信息等)后面需要加/u,即:/a/u;中间一般放表名或者能表达这个接口的单词。get方法,若果是后台通过搜索查询列表,那么以/search结尾,如果是前台的查询列表,以/list结尾。uri地址里不逊于出现大写字母,如果是两个单词拼接,用/分开

3)请求参数和返回参数:请求参数和返回参数都分为:字段、说明、类型、备注、是否必填这5列。

46.jetty,resin,tomcat的差别在哪里,在线上服务应该选择哪一种WEB服务器?  

Tomcat服务器特点:

1、提供了可被服务器加载并执行的程序代码,并服务于来自客户端的请求。

2、Servlet不依赖浏览器,是允许在服务器端,所以不管浏览器是否支持java,都能请求访问servlet。

Resin服务器特点:

1、Resin包含了很多可靠的特性,包括服务器自动重启、检测并重启死锁的服务器、管理JVM内存以防止内存泄露等。

2、Resin可以将多个服务器作为一个服务器来对客户进行响应,从而增强服务器的扩展能力。

3、Resin可实现持久和分布的sessions:持久的session能够在服务器重启的时候保持现有的Http会话,分布式的session可以在多个服务器之间共享Http会话的状态。

Jetty服务器特点:

1、Jetty嵌入比较便利,它设计之初就是作为一个优秀的组件来设计的,因此Jetty可以非常容易的嵌入到应用程序当中而不需要程序为了使用Jetty做修改。

2、Jetty是轻量的web服务器,一般来说,它的默认配置便可以满足日常大部分需求,

如果要完成较为复杂的功能,只需修改相关的xml文件。jetty的嵌入只需少量的代码就可以做到。

3、Jetty易拓展,有许多非常良好的接口,因此在Jetty的某种实现无法满足用户的需要时,用户可以非常方便地对Jetty的某些实现进行修改,使得Jetty适用于特殊的应用程序的需求。

 

线上的选择需要根据实际情况来决定。

47.maven常用的打包插件有哪些?有什么区别?如何使用

1.maven-jar-plugin: jar 与依赖分开打包,生成的 jar 包比较小,需要放在 lib 文件夹中运行

2.maven-assembly-plugin:所有的依赖打包进同一个 jar包,生成的文件比较大,可以直接运行,但是可能会有缺失 spring xds 文件而无法运行的风险

3.maven-shade-plugin:所有的依赖放进同一个 jar 文件,可以直接运行


48.War包是什么,为什么WEB服务通常打出来的都是War包?除了War包,还有几种打包格式,他们之间的区别呢?  

war包:是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。

war包是Sun提出的一种web应用程序格式,与jar类似,是很多文件的压缩包。

war包中的文件按照一定目录结构来组织。根据其根目录下包含有html和jsp文件,或者包含有这两种文件的目录,另外还有WEB-INF目录。通常在WEB-INF目录下含有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的servlet类和jsp,或者servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也可以打包成jar包放在WEB-INF下的lib目录下。

 

还有 jar 包,是一种通用类,直接运行或者做依赖。


49.Put请求在Linux下的Tomcat或者是Resin中会收不到数据,怎么解决这个问题,原因是什么?为什么本地使用Jetty的时候往往是正常的? 

 没遇到过,暂时不清楚。

50.Content-type中的数据类型,在Spring MVC中都怎么接收数据?

@RequestMapping(method = RequestMethod.POST, consumes = "application/json")
public @ResponseBody
Map<String, Object> post(@RequestBody Student student) {
if (student.getName() == null || student.getName().equals("")) {
return Result.set(400, messageSource.getMessage("name.null",
               null, null));
   }else if(studentService.selectById(student.getId())!=null&&student.getId()==studentService.selectById(student.getId()).getId()){
//判断id是否重复。
       return Result.set(405,messageSource.getMessage("id.repeat",new Integer[]{student.getId()},null));
   }

studentService.insertStudent(student);
   return Result.set(200, "添加成功", student);
}

传来的数据类型是对象的话用@RequestBody注解接收,基本数据类型用@PathVariable注解接收.

51.什么是restfulrest的请求方法有哪些,有什么区别?

Restful 是一种交互方法的描述,现在主要用到的就是根据其约束来设计api  

GET用来获取资源,对应着查询.

POST用来新建资源(也可以用于更新资源),对应着新增.

PUT用来更新资源,对应着更改.

DELETE用来删除资源,对应删.




返回列表 返回列表
评论

    分享到