网络命令和实战
网络命令和实战
网络知识引导
HTTP协议的运作过程,Get和Post的区别有哪些?
这道题考核的是对HTTP协议的理解,HTTP协议是网络的基础协议,目前网络相关程序绝大部分都是基于HTTP协议的,深刻理解HTTP协议才能明白很多高级特性。
此题主要是了解HTTP协议运作的过程,加深理解。
HTTP协议理解
HTTP是一个属于应用层的面向对象的协议。HTTP1.0是基于请求与响应模式的、无状态、无连接的协议。无状态是指协议对于事务处理没有记忆能力。无连接的含义是限制每次连接只处理一个请求。
HTTP是一个属于应用层的面向对象的协议。HTTP1.0是基于请求与响应模式的、无状态、无连接的协议。
- 无状态指:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须��传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
- 无连接指:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
后来增加了HTTP1.1版本协议,HTTP1.0和HTTP1.1的主要区别:
- HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;【http1.0理论上也可以使用KeepAlive机制(KeepAlive是就是通常所称的长连接),即HTTP1.0需要在request中增加“Connection: keep-alive”header才能够支持】
- HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!
- 即: HTTP 1.0 一次连接只能传输一个文件, HTTP 1.1 一次连接可以传输多个文件. 还有一些细节上的差别, 例如HTTP 1.0 http头可以没有HOST域, 1.1必须有(可以是空值). 还有断点续传也是 1.1 才支持的。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
为了安全有了HTTPS协议,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。预防运营商劫持一个可用办法就是这个。
HTTP协议详解之URL篇
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下: [http://host[":"port]abs_path]
例如:
1.输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2.http:192.168.0.116:8080/index.jsp
HTTP协议详解之请求篇
http请求由三部分组成,分别是:请求行、消息报头【请求头】、请求正文
- 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version
根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。
URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。 - 请求头(Request Header) 包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
- 请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。
HTTP协议详解之应答篇
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
- 状态行,类似与请求行,HTTP-Version Status-Code Reason-Phrase(状态码文本)
HTTP应答码也称为状态码,它反映了Web服务器处理HTTP请求状态。
1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中
2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK
3XX-重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。
4XX-客户端错误(Client Error),表示客户端提交的请求有错误
例如:404 NOT Found,意味着请求中所引用的文档不存在。
5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500
对于我们Web开发人员来说掌握HTTP应答码有助于提高Web应用程序调试的效率和准确 - 响应头(Response Header)响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等:
- 响应正文就是服务器返回的HTML页面,响应头和正文之间也必须用空行分隔
本题答案
理解上面知识后,就知道我们一次web请求的全部过程,首先在客户端输入URL,然后会组装HTTP协议请求体,服务端处理成功后会返回HTTP协议应答体,然后浏览器根据HTTP协议应答体做一些处理(例如设置COOKIE,根据响应正文展示我们看见的页面等)
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT(把内容放到指定URL),DELETE(删除某个URL代表的资源)。(PUT和DELETE一般服务器基于安全原因都不支持,所以主要使用的就是GET和POST),HEAD(只请求页面的首部,GET方法与HEAD相同,只是将method改为GET,其他内容都一样)。
在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交,例如:
<form id="subForm" method="post" action="${ctx}/cert/certResult.do">
......
</form>
因此他们的区别为(这个必须掌握):
- 协议的区别:get协议请求体中无内容,post协议请求体中有数据
- url参数上的区别:get参数都在url中,通过浏览器可以看到;post参数在请求体中,通过浏览器看不到
- 适用场景的区别:post适用于参数比较多的情况,或者基于安全不希望参数在浏览器直接看到的情况(例如注册用户),get适用于参数比较少可以直接请求的情况
HTTP协议与HTTPS协议的区别
HTTPS协议=HTTP协议+SSL协议,基于TCP/IP四层模型,SSL层加密是在应用层和传输层之间:
一个https协议栈大致是这样的:
【答案解析】
- HTTPS协议是安全的,HTTP协议是非安全的
- 端口不同,HTTPS协议默认是443端口,URL以https开头,HTTP协议默认端口是80,URL是http开头的
- HTTPS相当于HTTP协议+SSL协议,基于TCP/IP四层模型,SSL层加密是在应用层和传输层之间
【备注】HTTP协议更多知识可以参照这个地址:HTTP协议详解
TCP/IP模型与OSI7层协议模型的区别
TCP/IP模型是实际使用的模型,OSI7层协议是一种理论上的
【答案解析】
TCP/IP模型
TCP/IP四层模型:
- 链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
- 网络层(互联网层):处理分组在网络中的活动,比如分组的选路。IP协议就工作在这一层(ICMP和IGMP目前了解就行)
- 运输层:主要为两台主机上的应用提供端到端的通信。TCP协议或者UDP协议
- 应用层:负责处理特定的应用程序细节。比如FTP协议,http协议等
假设在一个局域网(LAN)如以太网中有两台主机,二者运行FTP协议, 运作图形如下:
网络层与运输层的区别:
在TCP/TP协议族中,网络层IP提供的是一种不可靠的服务。它只是尽可能快地把分组从源节点送到目的节点,但不提供任何可靠性的保证。
Tcp在不可靠的ip层上,提供了一个可靠的运输层,为了提供这种可靠的服务,TCP采用了超时重传、发送和接受端到端的确认分组等机制。
OSI和TCP/IP对比:
OSI是一种理论下的模型,而TCP/IP已经被广泛应用,称为网络互联实施上的标准。
TCP和UDP协议的区别,各自用在什么场景下
TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。
基于上面的优缺点,那么: 什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……
有些应用场景对可靠性要求不高会用到UPD,比如长视频,要求速率
小结TCP与UDP的区别:
1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
HTTPS协议是如何工作的,TCP协议的三次握手与四次挥手为什么,实际项目中什么地方用到TCP协议,什么地方用到HTTP/HTTPS协议
【答案解析】
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。
这个图中的过程要理解了,就很容易记忆了
TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。连接建立整个过程
如下(即三次握手协议):
-
首先,客户机发送一个特殊的TCP报文段;
-
其次,服务器用另一个特殊的TCP报文段来响应;
-
最后,客户机再用第三个特殊报文段作为响应。
三次握手协议示意图如下:【TCP协议的三次握手和四次挥手面试也会问到,必须掌握】
HTTP协议是无状态的协议,B/S模式下客户端是浏览器(这个客户端操作系统都有了),这种情况下都是HTTP协议(例如咨询浏览,电商网站等),为了安全,会吧HTTP协议升级为HTTPS协议。
TCP协议是可靠的,建立连接后可以多次发送数据,因此公司内部高频传输数据等都基于TCP协议,或者某些应用为了实时(比如手机上的游戏,跟对手PK,发招了两个手机要基本同步感知),这个时候都会基于TCP协议开发(所以很多游戏APP卡网时需要等网络再次连接好才可以继续玩)
TCP的连接与终止过程:
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议.
TCP三次握手的过程如下
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
连接终止
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示:
- 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN
- 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
要释放一个TCP连接,需要通过四次握手过程,这是由TCP的半关闭特性造成的,因为TCP连接时全双工的,因此,需要TCP两端要单独执行关闭。值得注意的是,主动关闭的一端在发送FIN之后,依然还能正常接收对方的数据,只是通知对方它已经没有数据需要发送了,同理,被动关闭的一端在收到FIN之后,仍然可以发送数据,直到它自身同样发出FIN之后,才停止发送数据。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
Cookie是什么,底层如何实现的,设置Cookie有什么注意事项
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie(添加在response应答体的header中)。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
注意:Cookie功能需要浏览器的支持。如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。
Cookie具有不可跨域名性.
Cookie具有很多属性,比如domain(可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”,否则只有默认的域能访问);
Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie默认的maxAge值为–1(即当前浏览器关闭了就失效)
因此:设置Cookie的时候要设置domain和maxAge
Session的实现机制是什么样子的,分布式环境下有什么注意事项,如果注销Session,设置Session的时长如何操作,默认时长是多少呢
【答案解析】
session会话通过将会话过程中的sessionId保存在cookie中(cookie中的名称叫jsessionId),在每次会话时读取cookie来实现session的保持。
如果浏览器不支持Cookie或用户阻止了所有Cookie(实际中基本不会出现,因为很多网站都不能访问了),可以把session会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。
例如://www.bimowo.com/kstudy-web/clienttopic/view.do?type=javaweb&topicId=450&jsessionId=真实的ID
当用户关闭浏览器或者长时间不访问超时后或者服务器调用了HttpSession的invalidate()方法后,session失效。
tomcat中session的默认过期时间是20分钟,可以在web.xml中显示声明过期时间(一般不会修改这个),如下:
<session-config>
<session-timeout>300</session-timeout>单位为分钟
</session-config>
【注意】实际的项目中,tomcat一般都是集群的,然后客户的请求可能会分配到不同的tomcat上,因此如果使用session的话要考虑session共享的问题(这个要��力避免,因为对性能损耗比较大)Session机制详解及分布式中Session共享解决方案
解决方法
-
使用token代替session
-
这里token是JSON Web Token,一般用它来替换掉Session实现数据共享。
-
流程
-
客户端通过用户名和密码登录服务器;
-
服务端对客户端身份进行验证;
-
服务端对该用户生成Token,返回给客户端;
-
客户端将Token保存到本地浏览器,一般保存到cookie中;
-
客户端发起请求,需要携带该Token;
-
服务端收到请求后,首先验证Token,之后返回数据。
-
-
优点
- 无状态、可扩展 :在客户端存储的Token是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。
- 安全:请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。
- 可提供接口给第三方服务:使用token时,可以提供可选的权限给第三方应用程序。
- 多平台跨域
-
-
Spring-Session+Redis
- 当Web服务器接收到请求后,请求会进入对应的Filter进行过滤,将原本需要由Web服务器创建会话的过程转交给Spring-Session进行创建。Spring-Session会将原本应该保存在Web服务器内存的Session存放到Redis中。然后Web服务器之间通过连接Redis来共享数据,达到Sesson共享的目的。
J2EE web的核心组件:Servlet,Filter和Listener分别是什么,用在什么地方,jsp页面如何进行处理呢
【答案解析】
Servlet运行于Servlet容器中,可以被Servlet容器动态加载,来扩展服务器的功能,并提供特定的服务。Servlet按照请求/响应的方式工作(即Servlet处理用户的请求,处理完毕后输出返回内容)。
Filter组件:
ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。(通俗讲:对Servlet访问请求实际处理前后操作,例如可以在执行前判断用户是否登录,可以在Servlet执行完毕后修改返回的内容),Filter的核心是doFilter方法。
下图是filter调用关系的UML图:
一个filter必须实现javax.servlet.Filter。实现init,doFilter,destroy方法
filter常常用于网站过滤敏感词汇、设置字符集、日志等比较“公共性”的事件处理中。
Listerner组件:
监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。
例如:
- ServletContextListener监听ServletContext对象
- ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改
- HttpSessionListener监听Session对象
- HttpSessionActivationListener监听HTTP会话的active和passivate情况,passivate是指非活动的session被写入持久设备(比如硬盘),active相反
Jsp:
在传统的HTML文件中加入Java程序片段和JSP标签,就构成了JSP网页。Jsp一般用于在网页上展示Servlet的返回内容,
当JSP容器接收到Web用户的一个JSP文件请求时,它对JSP文件进行语法分析并生成Java Servlet源文件,然后对其编译。一般情况下。Servlet源文件的生成和编译仅在初次调用JSP时发生。如果原始的JSP文件被更新,JSP容器将检测所做的更新,在执行它之前重新生成Servlet并进行编译。
JSP容器初次执行JSP的过程:
【备注】
Servlet是J2ee的核心,各类web框架例如Spring都是基于Servlet开发的,请熟悉Servlet的各类属性
Servlet详细介绍和生命周期可以参照这个地址: Servlet介绍
Filter和Listerner详细介绍可以参照这个地址:Filter和Listener
Servlet和Filter必须掌握,Listerner也需要基本了解
共享数据在web引用范围有什么区别:page/request/session/application有什么区别
组件中传递数据就需要用到共享数据,比如Servlet中获取到user对象,现在要用jsp组件展示用户的详情,就需要在Servlet和jsp组件间共享数据,此时在Servlet中request.setAttribute(“user”,user)把对象输入到request中,然后jsp页面就可以通过jstl表达式从request中获取user对象
【答案解析】
共享数据在Web应用中的范围:
- Page:共享数据的有效范围是用户请求访问的当前页面。
- Request:共享数据的有效范围为“用户请求访问的当前Web组件,以及和当前Web组件共享同一个用户请求的其他Web组件。
- Session:共享数据存在于整个HTTP会话的生存周期内,同一个HTTP会话中的Web组件共享它。Session范围内的共享数据实际上是存放在HttpSession对象中。 session失效方法【客户端关闭浏览器后会话过期;服务器端调用了HttpSession的invalidate()方法 】
- Application:共享数据存在于整个Web应用的生命周期内,Web应用中的所有Web组件都能共享它,共享数据实际上存放在ServletCntext对象中。
Web组件的三种关联关系:请求转发、URL重定向和包含有什么区别,如何实现呢
Servlet中获取到user对象,然后用jsp组件展示用户的详情,此时Servlet和jsp组件间就会发生关联,Servlet会把请求转给jsp组件,然后jsp展示内容
【答案解析】
Web组件的三种关联关系:
请求转发
请求转发允许把请求转发给同一应用中的其他Web组件。这种技术通常用于Web应用控制层的Servlet流程控制器,它检查HTTP请求数据,并将请求转发到合适的目标组件,目标组件执行具体的请求处理操作,并生成响应结果。
一个Servlet把请求转发给另一个JSP组件的过程:
如果在Servlet组件转发请求给一个JSP组件,可以在Servlet的service()
方法中执行以下代码:
request.getRequestDispatcher("hello.jsp").forward(request.response);
如果在JSP页面中,可以使用标签来转发请求,例如:
<jsp:forward page=”hello.jsp”/>
对于请求转发,转发的源组件和目标组件共享request范围内的数据。
URL重定向
请求重定向类似请求转发,但是有一些重要区别:
Web组件可以将请求重定向到任一URL,而不进进是同一应用中的URL。
重定向的元组件和目标组件之间不共用同一个HttpServletRequest对象,因此不能共享request范围内的共享数据。
显示一个Servlet把请求重定向给另一个JSP组件的过程:
如果当前应用的Servlet组件要把请求转发给URL。可以在Servlet.service()
方法中执行:
response.sendRedirect(URL);
如果在JSP页面中,可以使用标签来重定向
<c:redirect url="url"/>
URL重定向后用户浏览器看到的地址会变化
包含
包含关系允许一个Web组件聚集来自同一个应用中的其他Web组件的输出数据,并使用被聚集的数据来创建响应结果。这种技术通常用于模板处理器,它可以控制网页���布局。模板中每个页面区域的内容都来自不同的URL,从而组成单个页面。
显示了一个Servlet包含另一个JSP组件的过程:
Servlet类使用javax.servlet.RequestDispatcher.include()方法包含其他的Web组件。
例如:当前Servlet组件包含了JSP文件:header.jsp,则在Servlet.service()
方法中执行如下代码:
req.getRequestDispatcher("/header.jsp").include(req,res);
在JSP文件中,可以通过指令来包含其他的Web资源,例如:
<%@include file="file url"%>
JSP动作
<jsp:include page="file url" flush="true|false"/>
jsp中静态引用和动态引用的区别
jsp中静态引用和动态引用都属于包含,两者还是有差别
【答案解析】
- <%@ include file=”page.jsp”%> 在servlet容器转化jsp为servlet时,将引入的jsp源码全部添加到当前jsp,一并转化成一个servlet,然后编译。 【可以理解为整合一个servlet,一起编译,一次执行】
- 发送请求给当前jsp,servlet调用当前jsp servlet编译后文件,到引用位置,调用编译后的page.jsp的servlet。class文件。【可以理解为,各自单独编译,互相调用编译的文件】
jsp页面中,采用jstl表达式,如何输出list元素呢?
jstl表达式随着使用要求能掌握,核心就是${user}
,${param.ursername}
还有等c开头的核心表达式,具体可以通过实际项目记忆。
【答案解析】
<c:forEach items="${item.nodes}" var="node" varStatus="status">
${status.count}遍历顺序数
${node.topicName},${node.id}获取元素的topicName和id等属性
</c:forEach>
Servlet是否是线程安全的呢?
【答案解析】
Servlet的单实例多线程,因此如果使用了公共属性的话就是非线程安全的,如下
public class CheckAccountServlet extends HttpServlet {
private String name;//这个属性可能导致多个线程同步修改,会非线程安全的
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
..........
session.setAttribute("account", account);
String login_suc = "success.jsp";
resp.sendRedirect(login_suc);//此处使用了重定向,所以要用session共享数据
return;
}
}
如果没有使用公共属性的话,这种情况下是线程安全的
【备注】Servlet的核心有init,doService,doGet和doPost方法,一般编写Servlet就继承HttpServlet,然后重写doGet和doPost方法
如何判断远程机器上某个端口是否开启呢?项目中需要查看域名在本地的解析IP,如何操作呢?
【答案解析】
使用 telnet 远程机器IP 具体端口来判断远程机器某个端口开启,可以使用curl命令来获取域名在本地的解析IP
Servlet中,调用jsp展示元素和返回String(即api,一般是json数据)有什么区别呢?
【答案解析】
获取对象后用jsp展示可以参照3.12中的数据,属于对象关联,然后交给jsp展示,如下:
public class CheckAccountServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
..........
req.setAttribute("account", account);
RequestDispatcher rd = req.getRequestDispatcher("hello.jsp");
rd.forward(req, resp); //3.12和这里面的写法都可以,一个是请求转发,一个是重定向(重定向了url会变,会跟客户端有一次额外交互)
return;
}
}
如果返回String的话就不需要调用其他组件展示了,就直接返回给请求客户端了,代码如下:
public class CheckAccountServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
..........
String str = JSON.toJSONString(account);//把account对象转换为String
resp.setContentType("text/json;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println(str);
out.flush();
out.close();
return;
}
}
nginx+tomcat模式下,服务器段如何获取客户端请求IP呢?
【答案解析】
一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
原因:由于在客户端和服务之间增加了中间代理,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。
如下图:
需要注意的是X-Forwarded-For和X-Real-IP都不是http的正式协议头,而是squid等反向代理软件最早引入的,之所以tomcat能拿到,是因为NGINX里一般缺省都会这么配置转发的http请求:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
PS:如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100,用户真实IP为: 192.168.1.110
J2EE的web项目的目录结构
一个Java Web项目要运行,它首先要放在tomcat之类的容器中,该JavaWeb项目的构成一定要包含下面几种文件以及文件夹:
-
META-INF : 存放一些meta information相关的文件的这么一个文件夹, 一般来说尽量不要自己手工放置文件到这个文件夹。
-
WEB-INF
-
classes:用于存放java字节码文件
-
lib:用于存放该工程用到的库,例如servlet-api.jar等等
-
web.xml:web工程的配置文件,完成用户请求的逻辑名称到真正的servlet类的映射
-
JSP文件以及静态资源文件
【备注,如果有自定义文件的话,也是放在WEB-INF下面,目录名称是tags】
某个地址一直打圈,如何解决这个问题?
熟悉常见命令,熟悉url的工作原理
ping 测试目的站是否可达及了解其有关状态
telnet 测试目标ip及端口
nslookup 测试网络连接过程
curl URL语法在命令行下工作的文件传输工具
【备注】这个就是访问某个域名一直不正常,怎么解决?
- ping查看ip
- telent查看端口是否正常
- 一般就正常了,不正常nslookup看看哪步卡了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!