diff --git a/docs/misc2/132.md b/docs/misc2/132.md index 779255235206b17547dfdd03b102cb5795f12bce..e5c3df008e0f3b1e0a3610e37b619cab4709f819 100644 --- a/docs/misc2/132.md +++ b/docs/misc2/132.md @@ -34,7 +34,7 @@ Table of Contents 我总是更加强调代码注释。 配置文件也是如此。 添加配置文件标头总是非常有帮助的,该标头总结了配置文件中定义的 bean /属性。 -在春季配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如: +在Spring配置中,您可以像添加 XML 注释一样添加注释,也可以使用 description 元素。 例如: ```java diff --git a/docs/misc2/180.md b/docs/misc2/180.md index 18546ee161e3465c64942c752ed3d669a5820703..40d12d687fcb65c4339ca65772e98ed54e42b3a5 100644 --- a/docs/misc2/180.md +++ b/docs/misc2/180.md @@ -31,7 +31,7 @@ **i)**您有一个用 Struts 编写的旧应用,并且想要使用 spring 来提高应用的功能很多倍。 **ii)**您确实想根据自己的原因来学习它。 -否则,我不知道为什么有人会在春季选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。 +否则,我不知道为什么有人会在Spring选择支柱。 如果您知道其他一些好的理由,请与我们所有人分享。 那挺棒的。 继续,在本教程中,我将**委托从 Struts 到 Spring** 进行动作管理。 进行委派的原因是,通过 Spring 上下文实例化 Action 类时,它可以使用 spring 在其自己的 MVC 实现中为其提供的 Controller 类的所有其他功能。 因此,您将获得所有 spring 功能以及 struts Action 类,以具有包括 ActionForm 概念在内的控制器逻辑。 diff --git a/docs/misc2/208.md b/docs/misc2/208.md index 77d409b6e9edab4291bba4004f60de6abd1e73ad..2d3299c2e46d6ad590d9cc844955a9de5c4b17dc 100644 --- a/docs/misc2/208.md +++ b/docs/misc2/208.md @@ -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 代理? * 什么是**接合点**和**切点**? * 什么是纵横编织? diff --git a/docs/misc2/86.md b/docs/misc2/86.md index 42e33994c79c6990168baf35bb44b922639bd2e2..28cc6d4c8d35f8b67152fde0ccc188a4be5e96dd 100644 --- a/docs/misc2/86.md +++ b/docs/misc2/86.md @@ -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 将要运行/调试的端口。 diff --git a/docs/misc2/87.md b/docs/misc2/87.md index 16548c6383bcaa84e303d8bf9cab5748afeb3fcd..5debba6c7ebcb960fd030f7b4e9c8ad096fbe65c 100644 --- a/docs/misc2/87.md +++ b/docs/misc2/87.md @@ -6,7 +6,7 @@ 当您想在由于某些原因无法安装实际 tomcat 的开发人员的机器上测试应用时,此功能非常有用。 -Plugin’s latest version is `2.2`. It has Apache Tomcat7 support. +插件的最新版本是“2.2”。 它具有 Apache Tomcat7 支持。 ## 如何添加 tomcat Maven 插件 diff --git a/docs/misc2/88.md b/docs/misc2/88.md index 4426f6fed9b0eb0b2e124e65e054fa74333aa97c..08cd57701e07afaf12f8496fd7eca20e53d8ba0a 100644 --- a/docs/misc2/88.md +++ b/docs/misc2/88.md @@ -1,4 +1,4 @@ -# 春季,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 @@ -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 diff --git a/docs/misc2/89.md b/docs/misc2/89.md index f7ff00bd14ac1b7abb4054de5a9cf87088a474c9..f7eebf5b9c2d7046caff3971e08948c57e209620 100644 --- a/docs/misc2/89.md +++ b/docs/misc2/89.md @@ -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) diff --git a/docs/misc2/93.md b/docs/misc2/93.md index de7731a796a54caf4c70caa8627ece5890254b38..077e3e293eb0ea088424034f003a8f707aa87ef5 100644 --- a/docs/misc2/93.md +++ b/docs/misc2/93.md @@ -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`上下文路径中启动应用。