提交 f2de5ee0 编写于 作者: W wizardforcel

2020-06-11 11:11:10

上级 cf964f8a
......@@ -34,7 +34,7 @@ Table of Contents
我总是更加强调代码注释。 配置文件也是如此。 添加配置文件标头总是非常有帮助的,该标头总结了配置文件中定义的 bean /属性。
春季配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如:
Spring配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如:
```java
<beans>
......
......@@ -31,7 +31,7 @@
**i)**您有一个用 Struts 编写的旧应用,并且想要使用 spring 来提高应用的功能很多倍。
**ii)**您确实想根据自己的原因来学习它。
否则,我不知道为什么有人会在春季选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。
否则,我不知道为什么有人会在Spring选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。
继续,在本教程中,我将**委托从 Struts 到 Spring** 进行动作管理。 进行委派的原因是,通过 Spring 上下文实例化 Action 类时,它可以使用 spring 在其自己的 MVC 实现中为其提供的 Controller 类的所有其他功能。 因此,您将获得所有 spring 功能以及 struts Action 类,以具有包括 ActionForm 概念在内的控制器逻辑。
......
......@@ -238,11 +238,11 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor
仍然有实力阅读更多。 在此处浏览更多 Java 面试问题。
## 4.春季面试题
## 4.Spring面试题
#### 4.1 [春季核心面试问题](https://howtodoinjava.com/interview-questions/top-spring-core-interview-questions-with-answers/)
#### 4.1 [Spring核心面试问题](https://howtodoinjava.com/interview-questions/top-spring-core-interview-questions-with-answers/)
我已经尝试收集一些春季热门核心面试问题,您将在下次技术面试中面对这些问题,例如
我已经尝试收集一些Spring热门核心面试问题,您将在下次技术面试中面对这些问题,例如
* 什么是控制反转(IoC)和依赖注入(DI)?
* BeanFactory 和 ApplicationContext 之间的区别?
......@@ -255,7 +255,7 @@ ThreadPoolExecutor 将任务创建和执行分开。 使用 ThreadPoolExecutor
* 构造函数注入和设置器注入之间的区别?
* 命名 Spring 框架中使用的一些设计模式?
#### 4.2 [春季 AOP 面试问题](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/)
#### 4.2 [Spring AOP 面试问题](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/)
Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP,因为它也提供了模块化。 在 OOP 中,关键单位是“对象”,但在 AOP 中,关键单位是方面或横切关注点,例如日志记录和安全性。 AOP 提供了一种使用简单的可插拔配置在实际逻辑之前,之后或周围动态添加横切关注点的方法
......@@ -263,7 +263,7 @@ Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP
* 关注点和跨领域关注点之间的区别?
* 有哪些可用的 AOP 实现?
* 春季 AOP 中有哪些不同的建议类型?
* Spring AOP 中有哪些不同的建议类型?
* 什么是 Spring AOP 代理?
* 什么是**接合点****切点**
* 什么是纵横编织?
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/](https://howtodoinjava.com/tomcat/running-multiple-instances-of-tomcat-with-single-server-installation/)
很多时候,我们遇到需要修改服务器配置以使其特定于应用的情况。 而且,如果我们有多个这样的应用,并且希望每个应用都具有自己定义的配置选项,那么它就需要某种配置。 在本教程中,我将讨论为每个应用使用**不同的 tomcat 实例而应进行的更改。**
很多时候,我们遇到需要修改服务器配置以使其特定于应用的情况。 而且,如果我们有多个这样的应用,并且希望每个应用都具有自己定义的配置选项,那么它就需要某种配置。 在本教程中,我将讨论为每个应用使用**不同的 tomcat 实例而应进行的更改**
## 配置 Tomcat 服务器的多个实例的步骤
......@@ -10,23 +10,23 @@
## 步骤 1)安装 Tomcat 服务器
这是非常明显的第一步。 假设我们的 tomcat 安装目录为“ **C:/ tomcatServer** ”。
这是非常明显的第一步。 假设我们的 tomcat 安装目录为“`C:/tomcatServer`”。
## 步骤 2)在不同位置创建 2 个新的不同文件夹
这些文件夹用于存储实例特定的配置和其他数据,例如日志,临时数据。
假设新文件夹为“ **C:/ tomcatInstanceOne** ”和“ **C:/ tomcatInstanceTwo** ”。
假设新文件夹为“`C:/tomcatInstanceOne`”和“`C:/tomcatInstanceTwo`”。
## 步骤 3)将“ conf”文件夹从服务器文件夹复制到 instances 文件夹
## 步骤 3)将“`conf`”文件夹从服务器文件夹复制到实例文件夹
为了使每个实例具有不同的配置,必须执行此步骤。 任何与实例特定的配置相关的更改应仅在相关实例文件夹中进行。
## 步骤 4)创建实例特定的 startup.bat 和 shutdown.bat
## 步骤 4)创建实例特定的`startup.bat`和`shutdown.bat`
启动和关闭特定实例将需要这些文件。 文件内容如下:
#### 启动.bat
#### `startup.bat`
```java
......@@ -36,7 +36,7 @@ C:\tomcatServer\bin\startup.bat
```
#### 关机
#### `shutdown.bat`
```java
......@@ -46,19 +46,19 @@ C:\tomcatServer\bin\shutdown.bat
```
将两个文件都放在两个实例特定文件夹内的“ **bin** ”文件夹中。 [ ***例如,创建文件夹 C:/ tomcatInstanceOne / bin 并复制两个文件*** ]
将两个文件都放在两个实例特定文件夹内的“`bin`”文件夹中。 例如,创建文件夹`C:/tomcatInstanceOne/bin`并复制两个文件
The first properties (**CATALINA_HOME**) points to the location of the common information shareable between all running instances, while the other property (**CATALINA_BASE**) points to the directory where all the instance specific information are stored.
第一个属性(`CATALINA_HOME`)指向所有正在运行的实例之间可共享的公共信息的位置,而其他属性(`CATALINA_BASE`)指向所有实例特定信息的存储目录。
## 步骤 5)创建 setenv.bat 以设置实例特定的环境配置
## 步骤 5)创建`setenv.bat`以设置实例特定的环境配置
在“ **C:\ tomcatInstanceOne \ bin** ”(以及第二个实例文件夹)目录中创建一个名为 setenv.bat 的文件,以设置 **C:\ tomcatServer \ bin \中提到的任何环境变量。 catalina.bat** 。 在这里设置系统属性,JPDA 地址等。
在“`C:\tomcatInstanceOne\bin`”(以及第二个实例文件夹)目录中创建一个名为`setenv.bat`的文件,以设置`C:\tomcatServer\bin\catalina.bat`中提到的任何环境变量。 在这里设置系统属性,JPDA 地址等。
## 步骤 6)为日志,温度等创建更多文件夹
## 步骤 6)为日志,临时文件等创建更多文件夹
现在是时候创建更多文件夹了,这些文件夹将在您的应用实际运行时使用。 这些文件夹类似于日志,临时文件,Web 应用和工作文件夹。 在两个实例文件夹中分别创建它们。
Just be sure to edit your **conf\server.xml** file so that the shutdown ports and HTTP connector ports don’t interfere with other tomcat instances that may be running.
只需确保编辑`conf\server.xml`文件,以使关闭端口和 HTTP 连接器端口不会干扰其他可能正在运行的 tomcat 实例。
例如,更改 tomcat 将要运行/调试的端口。
......
......@@ -6,7 +6,7 @@
当您想在由于某些原因无法安装实际 tomcat 的开发人员的机器上测试应用时,此功能非常有用。
Plugin’s latest version is `2.2`. It has Apache Tomcat7 support.
插件的最新版本是“2.2”。 它具有 Apache Tomcat7 支持。
## 如何添加 tomcat Maven 插件
......
# 春季,Tomcat – 在负载均衡器后面获取真实 IP
# Spring,Tomcat – 在负载均衡器后面获取真实 IP
> 原文: [https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/](https://howtodoinjava.com/tomcat/tomcat-get-real-ip-behind-load-balancer/)
......@@ -9,9 +9,9 @@ String httpServletAddress = request.getRemoteAddr();
```
但是,如果您的应用在负载均衡器代理后面运行,并且您希望转换用户使用的真实请求 IP 而不是我们的应用实例收到请求时来自代理的 IP,那么上述语句即可获取 IP 仅衡器代理的地址。
但是,如果您的应用在负载均衡器代理后面运行,并且您希望转换用户使用的真实请求 IP 而不是我们的应用实例收到请求时来自代理的 IP,那么上述语句即可获取 IP 仅衡器代理的地址。
## 使用 Tomcat 的 RemoteIpFilter
## 使用 Tomcat 的`RemoteIpFilter`
在上述情况下,可以使用 tomcat 提供的[`RemoteIpFilter`](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html) servlet 过滤器。
......@@ -28,7 +28,7 @@ public class WebConfiguration {
```
或使用 XML 配置,例如 web.xml – 使用`filter`标签。
或使用 XML 配置,例如`web.xml` – 使用`filter`标签。
```java
<filter>
......@@ -48,10 +48,10 @@ public class WebConfiguration {
现在,当您使用`request.remoteAddr()`方法时,您将获得呼叫客户端的正确 IP 地址。
Read More: [RemoteIpFilter](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html)
阅读更多:[`RemoteIpFilter`](https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/RemoteIpFilter.html)
`RemoteIpFilter`在内部集成了`X-Forwarded-For``X-Forwarded-Proto` HTTP 标头。
该 Servlet 过滤器的另一个功能是通过请求标头(例如“ X-Forwarded-Proto”),用代理或负载均衡器提供的方案替换表观方案(http / https)和服务器端口。
该 Servlet 过滤器的另一个功能是通过请求标头(例如“`X-Forwarded-Proto`”),用代理或负载均衡器提供的方案替换表观方案(http / https)和服务器端口。
学习愉快!
\ No newline at end of file
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/](https://howtodoinjava.com/tomcat/a-birds-eye-view-on-how-web-servers-work/)
许多时候,我们想知道 **Web 容器/ Web 服务器(例如 tomcat 或 jboss)如何工作?** 他们如何处理来自世界各地的传入 HTTP 请求? 幕后发生的原因是什么? Java Servlet API(例如 ServletContext,ServletRequest,ServletResponse 和 Session 之类的类)如何适应图片? 这些是非常重要的问题/概念,如果您是 Web 应用开发人员或渴望成为,则必须知道。 在这篇文章中,我将尝试找出上述问题的答案,即使不是全部。 从这里保持集中。
许多时候,我们想知道 **Web 容器 / Web 服务器(例如 tomcat 或 jboss)如何工作?** 他们如何处理来自世界各地的传入 HTTP 请求? 幕后发生的原因是什么? Java Servlet API(例如`ServletContext``ServletRequest``ServletResponse``Session`之类的类)如何适应图片? 这些是非常重要的问题/概念,如果您是 Web 应用开发人员或渴望成为,则必须知道。 在这篇文章中,我将尝试找出上述问题的答案,即使不是全部。 从这里保持集中。
```java
Table of Contents:
......@@ -19,31 +19,31 @@ How thread safety should be ensured?
我将首先讨论 **Web 服务器**和应用服务器。 我说一句
Historically they were different, but these two previously distinct categories slowly merged, and now should be seen as one entity in most of the cases and uses.
从历史上看,它们是不同的,但是这两个以前截然不同的类别逐渐合并,现在在大多数情况和用途中应被视为一个实体。
[**Mosaic**](https://en.wikipedia.org/wiki/Mosaic_%28web_browser%29 "Mosaic") 浏览器(通常被称为第一个图形化 Web 浏览器)和超链接内容的早期,出现了一种新概念“ Web 服务器”,用于服务静态网页内容 [**HTTP**](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol "http") 协议上的图像。 很简单。 如今,大多数内容都是静态的,HTTP 1.0 协议只是一种随身携带文件的方式。 但是很快,Web 服务器就发展为具有 [**CGI**](http://www.invir.com/int-prog-cgi.html "cgi") 功能。 这意味着在每个 Web 请求上有效启动一个流程以生成动态内容。 到那时,HTTP 协议也已经成熟,Web 服务器变得更加复杂,并具有诸如缓存,安全性和会话管理之类的附加功能。 随着技术的进一步成熟,我们从 Kiva 和 [**NetDynamics**](https://en.wikipedia.org/wiki/NetDynamics_Application_Server) 中获得了基于公司的基于 Java 的服务器端技术,最终它们全部合并为 JSP(java 服务器页面), 在当今大多数应用开发中使用。
[**Mosaic**](https://en.wikipedia.org/wiki/Mosaic_%28web_browser%29 "Mosaic") 浏览器(通常被称为第一个图形化 Web 浏览器)和超链接内容的早期,出现了一种新概念“Web 服务器”,用于服务静态网页内容[**HTTP**](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol "http") 协议上的图像。 很简单。 如今,大多数内容都是静态的,HTTP 1.0 协议只是一种随身携带文件的方式。 但是很快,Web 服务器就发展为具有 [**CGI**](http://www.invir.com/int-prog-cgi.html "cgi") 功能。 这意味着在每个 Web 请求上有效启动一个流程以生成动态内容。 到那时,HTTP 协议也已经成熟,Web 服务器变得更加复杂,并具有诸如缓存,安全性和会话管理之类的附加功能。 随着技术的进一步成熟,我们从 Kiva 和 [**NetDynamics**](https://en.wikipedia.org/wiki/NetDynamics_Application_Server) 中获得了基于公司的基于 Java 的服务器端技术,最终它们全部合并为 JSP(java 服务器页面), 在当今大多数应用开发中使用。
![web server application server](img/05bc1ad5a4f3b2a157a34589c114d54b.png)
这是关于网络服务器的。 现在,我们来讨论**应用服务器**
在并行类别中,应用服务器已经发展并存在了很长时间。 一些公司为 Unix 提供了诸如 [**Tuxedo**](https://en.wikipedia.org/wiki/Tuxedo_%28software%29 "Tuxedo") (面向事务的中间件), **TopEnd****Encina** 等产品,这些产品从大型机应用管理中衍生而来 和监视环境,例如 IMS 和 CICS。 这些产品大多数都指定了“封闭式”产品特定的通信协议,以将“胖”客户端互连到服务器。 在 90 年代,这些传统的应用服务器产品首先通过网关开始嵌入基本的 HTTP 通信功能。 很快,这两类之间的界限开始模糊。
在并行类别中,应用服务器已经发展并存在了很长时间。 一些公司为 Unix 提供了诸如 [**Tuxedo**](https://en.wikipedia.org/wiki/Tuxedo_%28software%29 "Tuxedo")(面向事务的中间件),**TopEnd****Encina** 等产品,这些产品从大型机应用管理中衍生而来 和监视环境,例如 IMS 和 CICS。 这些产品大多数都指定了“封闭式”产品特定的通信协议,以将“胖”客户端互连到服务器。 在 90 年代,这些传统的应用服务器产品首先通过网关开始嵌入基本的 HTTP 通信功能。 很快,这两类之间的界限开始模糊。
到那时,Web 服务器在处理更高的负载,更多的并发和更好的功能方面变得越来越成熟。 应用服务器开始提供越来越多的基于 HTTP 的通信功能。 所有这些都导致 Web 服务器和应用服务器之间的界限很窄。
在这一点上,“应用服务器”和“网络服务器”之间的界线是模糊的。 但是,作为重点,人们继续使用不同的术语。
When someone says “web server” you often think HTTP-centric, web UI oriented applications. When someone says “Application server” you may think “heavier loads, enterprise features, transactions and queuing, multi-channel communication (HTTP + more)”. But mostly it is the same product that serves both sets of requirements now-a-days.
当有人说“Web 服务器”时,您通常会想到以 HTTP 为中心,面向 Web UI 的应用。 当有人说“应用服务器”时,您可能会认为“负载较重,企业功能,事务和排队,多通道通信(HTTP 及其他)”。 但是大多数情况下,这是同一款产品,如今可以同时满足这两种要求。
这就是有关 Web 服务器和应用服务器的一切。 现在进入第三学期,即网络容器。
这就是有关 Web 服务器和应用服务器的一切。 现在进入第三个术语,即网络容器。
![web server servlet container](img/c1f4d661c48b66f7c54aff95ede27403.png)
[**Web 容器**](https://en.wikipedia.org/wiki/Web_container) ,尤其是 java 中的,应引用 servlet 容器。 Servlet 容器是与 Java Servlet 交互的 Web 服务器的组件。 Web 容器负责管理 Servlet 的生命周期,将 URL 映射到特定的 Servlet,并确保 URL 请求者具有正确的访问权限以及更多此类服务。 基本上,综合以上所有事实, **Servlet 容器是 Servlet 运行**并维持其生命周期的运行时环境。
[**Web 容器**](https://en.wikipedia.org/wiki/Web_container),尤其是 java 中的,应引用 servlet 容器。 Servlet 容器是与 Java Servlet 交互的 Web 服务器的组件。 Web 容器负责管理 Servlet 的生命周期,将 URL 映射到特定的 Servlet,并确保 URL 请求者具有正确的访问权限以及更多此类服务。 基本上,综合以上所有事实, **Servlet 容器是 Servlet 运行**并维持其生命周期的运行时环境。
## 什么是 Servlet? 他们如何提供帮助?
在 Java 中, **servlet 使您可以编写服务器端组件,以根据请求帮助生成动态内容**。 实际上,Servlet 是在 javax.servlet 包中定义的接口。 它声明了 Servlet 生命周期的三种基本方法 -init(),service()和 destroy()。 它们由每个 servlet(在 SDK 中定义或由用户定义)实现,并在服务器的生命周期中由服务器在特定时间调用。
在 Java 中,**servlet 使您可以编写服务器端组件,以根据请求帮助生成动态内容**。 实际上,Servlet 是在`javax.servlet`包中定义的接口。 它声明了 Servlet 生命周期的三种基本方法 - `init()``service()``destroy()`。 它们由每个 servlet(在 SDK 中定义或由用户定义)实现,并在服务器的生命周期中由服务器在特定时间调用。
Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加载到容器中。 **每个请求都在其自己的线程**中,并且 servlet 对象可以同时服务多个线程。 当不再使用它时,它将被 JVM 垃圾回收。
......@@ -55,25 +55,25 @@ Servlet 类由其类加载器通过**延迟加载或急切加载**动态地加
![Eagerly Loaded Servlet1](img/e917129361e32f00d214586083a50705.png) ![Eagerly Loaded Servlet](img/e034256511cf921b395c7f9f60892c0a.png)
## 什么是 ServletContext? 谁创造的?
## 什么是`ServletContext`? 谁创造的?
当 Servlet 容器启动时,它将部署并加载所有 Web 应用。 加载 Web 应用后,Servlet 容器将为每个应用创建一次 **ServletContext,并将其保留在服务器的内存中。 该 Web 应用的 web.xml 将被解析,并且在 web.xml 中找到的每个 Servlet,Filter 和 Listener 都将被创建一次并保存在服务器的内存中。 当 Servlet 容器关闭时,它将卸载所有 Web 应用,并且 ServletContext 以及所有 Servlet,Filter 和 Listener 实例都将被丢弃。**
当 Servlet 容器启动时,它将部署并加载所有 Web 应用。 加载 Web 应用后,Servlet 容器将为每个应用创建一次` ServletContext`,并将其保留在服务器的内存中。 该 Web 应用的`web.xml`将被解析,并且在`web.xml`中找到的每个 Servlet,过滤器和监听器都将被创建一次并保存在服务器的内存中。 当 Servlet 容器关闭时,它将卸载所有 Web 应用,并且`ServletContext`以及所有 Servlet,过滤器和监听器实例都将被丢弃。
根据 Java 文档, **ServletContext 定义了 Servlet 用于与其 Servlet 容器**通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。 对于 Web 应用**在其部署描述符**中标记为“已分发”的情况,每个虚拟机都有一个上下文实例。 在这种情况下,上下文**不能用作共享全局信息**的位置(因为该信息不是真正的全局信息)。 请改用外部资源,例如数据库。
根据 Java 文档, `ServletContext`定义了 Servlet 用于与其 Servlet 容器通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。 对于 Web 应用**在其部署描述符**中标记为“已分发”的情况,每个虚拟机都有一个上下文实例。 在这种情况下,上下文**不能用作共享全局信息**的位置(因为该信息不是真正的全局信息)。 请改用外部资源,例如数据库。
## ServletRequest 和 ServletResponse 适合生命周期的地方?
## `ServletRequest`和`ServletResponse`适合生命周期的地方?
Servlet 容器连接到 Web 服务器,该服务器在特定端口号(通常为 80)上监听 HTTP 请求。当客户端(具有 Web 浏览器的用户)发送 HTTP 请求时, **Servlet 容器将创建新的 HttpServletRequest。** **和 HttpServletResponse** 对象将其传递给 URL 样式与请求 URL 匹配的已创建 Filter 和 Servlet 实例的方法,所有这些都在同一线程中。
Servlet 容器连接到 Web 服务器,该服务器在特定端口号(通常为 80)上监听 HTTP 请求。当客户端(具有 Web 浏览器的用户)发送 HTTP 请求时, Servlet 容器将创建新的`HttpServletRequest``HttpServletResponse`对象将其传递给 URL 样式与请求 URL 匹配的已创建过滤器和 Servlet 实例的方法,所有这些都在同一线程中。
请求对象提供对 HTTP 请求的所有信息的访问,例如请求标头和请求正文。 响应对象提供了以所需方式控制和发送 HTTP 响应的功能,例如设置标头和正文(通常带有 JSP 文件中的 HTML 内容)。 提交并完成 HTTP 响应后,请求和响应对象都将被丢弃。
## 如何管理会话? 知道 cookie 吗?
当客户端首次访问 Web 应用和/或要通过 request.getSession()首次获取 HttpSession 时,则 Servlet 容器将创建它,并生成一个长而唯一的 ID(您可以 通过 session.getId()获取并存储在服务器的内存中。 servlet 容器还将在 HTTP 响应中设置 Cookie,其中 **JSESSIONID** 为 cookie 名称,唯一会话 ID 为 cookie 值。
当客户端首次访问 Web 应用和/或要通过`request.getSession()`首次获取`HttpSession`时,则 Servlet 容器将创建它,并生成一个长而唯一的 ID(您可以通过`session.getId()`获取并存储在服务器的内存中。 servlet 容器还将在 HTTP 响应中设置 Cookie,其中`JSESSIONID`为 cookie 名称,唯一会话 ID 为 cookie 值。
根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie") (体面的 Web 浏览器和 Web 服务器必须遵守的合同),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为 JSESSIONID 的 cookie,并使用其值从服务器的内存中获取关联的 HttpSession
根据 [**HTTP cookie 规范**](http://www.faqs.org/rfcs/rfc2965.html "http cookie")(体面的 Web 浏览器和 Web 服务器必须遵守的合同),要求客户端(Web 浏览器)在后续请求中将该 Cookie 发送回 只要 Cookie 有效即可。 Servlet 容器将确定每个传入的 HTTP 请求标头中是否存在名为`JSESSIONID`的 cookie,并使用其值从服务器的内存中获取关联的`HttpSession`
HttpSession 会一直存在,直到没有被使用为止,您可以在 web.xml 中指定该设置,该设置**默认为 30 分钟**。 因此,如果客户端超过 30 分钟不再访问该 Web 应用,则 Servlet 容器将破坏该会话。 即使指定了 cookie,每个后续请求都将无法再访问同一会话。 servlet 容器将创建一个新的。
`HttpSession`会一直存在,直到没有被使用为止,您可以在`web.xml`中指定该设置,该设置**默认为 30 分钟**。 因此,如果客户端超过 30 分钟不再访问该 Web 应用,则 Servlet 容器将破坏该会话。 即使指定了 cookie,每个后续请求都将无法再访问同一会话。 servlet 容器将创建一个新的。
**现有会话**
......@@ -83,11 +83,11 @@ HttpSession 会一直存在,直到没有被使用为止,您可以在 web.xml
![New session](img/adf2d37562aa73ff0230458f2450106e.png)
另一方面,客户端上的会话 cookie **具有默认生存期,该生存期只要浏览器实例正在运行**即可。 因此,当客户端关闭浏览器实例(所有选项卡/窗口)时,会话将在客户端被丢弃。 在新的浏览器实例中,与该会话关联的 cookie 将不再发送。 一个新的 request.getSession()将返回一个全新的 HttpSession 并设置一个具有全新会话 ID 的 cookie。
另一方面,客户端上的会话 cookie **具有默认生存期,该生存期只要浏览器实例正在运行**即可。 因此,当客户端关闭浏览器实例(所有选项卡/窗口)时,会话将在客户端被丢弃。 在新的浏览器实例中,与该会话关联的 cookie 将不再发送。 一个新的`request.getSession()`将返回一个全新的`HttpSession`并设置一个具有全新会话 ID 的 cookie。
## 应如何确保线程安全?
您现在应该已经了解到,Servlet 和过滤器在所有请求之间共享。 这是 Java 的优点,因为它是 [**多线程**](//howtodoinjava.com/category/java/multi-threading/ "multi-threading") ,并且不同的线程(即 HTTP 请求)可以使用同一实例。 否则,在每个请求上重新创建它会太昂贵。
您现在应该已经了解到,Servlet 和过滤器在所有请求之间共享。 这是 Java 的优点,因为它是[**多线程**](//howtodoinjava.com/category/java/multi-threading/ "multi-threading"),并且不同的线程(即 HTTP 请求)可以使用同一实例。 否则,在每个请求上重新创建它会太昂贵。
![thread-safety](img/f3fdaad0cb730dedd690a45f7d2bb4c7.png)
......
......@@ -54,7 +54,7 @@ Swagger2 Project Structure
将项目解压缩并将其作为现有的 maven 项目导入 Eclipse。 在此步骤中,将从 maven 仓库下载所有必需的依赖项。 在此步骤中执行全新的`mvn clean install`,以便正确下载所有与春季启动相关的工件。
将项目解压缩并将其作为现有的 maven 项目导入 Eclipse。 在此步骤中,将从 maven 仓库下载所有必需的依赖项。 在此步骤中执行全新的`mvn clean install`,以便正确下载所有与Spring启动相关的工件。
2. 打开`application.properties`并添加以下属性。 这将在`/swagger2-demo`上下文路径中启动应用。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册