diff --git a/src/tomcat/LICENSE b/src/tomcat/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..e6a6baf74814df2708effe0814a7bc89991b8e61 --- /dev/null +++ b/src/tomcat/LICENSE @@ -0,0 +1,1061 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +APACHE TOMCAT SUBCOMPONENTS: + +Apache Tomcat includes a number of subcomponents with separate copyright notices +and license terms. Your use of these subcomponents is subject to the terms and +conditions of the following licenses. + + +For the Eclipse JDT Core Batch Compiler (ecj-x.x.x.jar) component: + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation +distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or anyone +acting on such Contributor's behalf. Contributions do not include additions to +the Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free copyright license to +reproduce, prepare derivative works of, publicly display, publicly perform, +distribute and sublicense the Contribution of such Contributor, if any, and such +derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed +Patents to make, use, sell, offer to sell, import and otherwise transfer the +Contribution of such Contributor, if any, in source code and object code form. +This patent license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to +its Contributions set forth herein, no assurances are provided by any +Contributor that the Program does not infringe the patent or other intellectual +property rights of any other entity. Each Contributor disclaims any liability to +Recipient for claims brought by any other entity based on infringement of +intellectual property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. +For example, if a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire that license +before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright +rights in its Contribution, if any, to grant the copyright license set forth in +this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its +own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title and +non-infringement, and implied warranties or conditions of merchantability and +fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and consequential +damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by +that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, +and informs licensees how to obtain it in a reasonable manner on or through a +medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the +Program. + +Each Contributor must identify itself as the originator of its Contribution, if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, if +a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages +and costs (collectively "Losses") arising from claims, lawsuits and other legal +actions brought by a third party against the Indemnified Contributor to the +extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor +to control, and cooperate with the Commercial Contributor in, the defense and +any related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If that +Commercial Contributor then makes performance claims, or offers warranties +related to Product X, those performance claims and warranties are such +Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its exercise of +rights under this Agreement , including but not limited to the risks and costs +of program errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this Agreement, and without further action by the parties hereto, such +provision shall be reformed to the minimum extent necessary to make such +provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to time. +No one other than the Agreement Steward has the right to modify this Agreement. +The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation +may assign the responsibility to serve as the Agreement Steward to a suitable +separate entity. Each new version of the Agreement will be given a +distinguishing version number. The Program (including Contributions) may always +be distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to distribute the Program (including its Contributions) +under the new version. Except as expressly stated in Sections 2(a) and 2(b) +above, Recipient receives no rights or licenses to the intellectual property of +any Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted under +this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + + +For the Windows Installer component: + + * All NSIS source code, plug-ins, documentation, examples, header files and + graphics, with the exception of the compression modules and where + otherwise noted, are licensed under the zlib/libpng license. + * The zlib compression module for NSIS is licensed under the zlib/libpng + license. + * The bzip2 compression module for NSIS is licensed under the bzip2 license. + * The lzma compression module for NSIS is licensed under the Common Public + License version 1.0. + +zlib/libpng license + +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +bzip2 license + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a + product, an acknowledgment in the product documentation would be + appreciated but is not required. + 3. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 4. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +Julian Seward, Cambridge, UK. + +jseward@acm.org +Common Public License version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation +distributed under this Agreement, and b) in the case of each subsequent +Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or anyone +acting on such Contributor's behalf. Contributions do not include additions to +the Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free copyright license to +reproduce, prepare derivative works of, publicly display, publicly perform, +distribute and sublicense the Contribution of such Contributor, if any, and such +derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed +Patents to make, use, sell, offer to sell, import and otherwise transfer the +Contribution of such Contributor, if any, in source code and object code form. +This patent license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to +its Contributions set forth herein, no assurances are provided by any +Contributor that the Program does not infringe the patent or other intellectual +property rights of any other entity. Each Contributor disclaims any liability to +Recipient for claims brought by any other entity based on infringement of +intellectual property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. +For example, if a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire that license +before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright +rights in its Contribution, if any, to grant the copyright license set forth in +this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its +own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title and +non-infringement, and implied warranties or conditions of merchantability and +fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and consequential +damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by +that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, +and informs licensees how to obtain it in a reasonable manner on or through a +medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the +Program. + +Each Contributor must identify itself as the originator of its Contribution, if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, if +a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages +and costs (collectively "Losses") arising from claims, lawsuits and other legal +actions brought by a third party against the Indemnified Contributor to the +extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor to +control, and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may participate in +any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If that +Commercial Contributor then makes performance claims, or offers warranties +related to Product X, those performance claims and warranties are such +Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its exercise of +rights under this Agreement, including but not limited to the risks and costs of +program errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this Agreement, and without further action by the parties hereto, such +provision shall be reformed to the minimum extent necessary to make such +provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to +a patent applicable to software (including a cross-claim or counterclaim in a +lawsuit), then any patent licenses granted by that Contributor to such Recipient +under this Agreement shall terminate as of the date such litigation is filed. In +addition, if Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to time. +No one other than the Agreement Steward has the right to modify this Agreement. +IBM is the initial Agreement Steward. IBM may assign the responsibility to serve +as the Agreement Steward to a suitable separate entity. Each new version of the +Agreement will be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the Agreement +is published, Contributor may elect to distribute the Program (including its +Contributions) under the new version. Except as expressly stated in Sections +2(a) and 2(b) above, Recipient receives no rights or licenses to the +intellectual property of any Contributor under this Agreement, whether +expressly, by implication, estoppel or otherwise. All rights in the Program not +expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + +Special exception for LZMA compression module + +Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for +NSIS, expressly permit you to statically or dynamically link your code (or bind +by name) to the files from the LZMA compression module for NSIS without +subjecting your linked code to the terms of the Common Public license version +1.0. Any modifications or additions to files from the LZMA compression module +for NSIS, however, are subject to the terms of the Common Public License version +1.0. + + +For the following XML Schemas for Java EE Deployment Descriptors: + - javaee_5.xsd + - javaee_web_services_1_2.xsd + - javaee_web_services_client_1_2.xsd + - javaee_6.xsd + - javaee_web_services_1_3.xsd + - javaee_web_services_client_1_3.xsd + - jsp_2_2.xsd + - web-app_3_0.xsd + - web-common_3_0.xsd + - web-fragment_3_0.xsd + - javaee_7.xsd + - javaee_web_services_1_4.xsd + - javaee_web_services_client_1_4.xsd + - jsp_2_3.xsd + - web-app_3_1.xsd + - web-common_3_1.xsd + - web-fragment_3_1.xsd + - javaee_8.xsd + - web-app_4_0.xsd + - web-common_4_0.xsd + - web-fragment_4_0.xsd + +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 + +1. Definitions. + + 1.1. Contributor. means each individual or entity that creates or contributes + to the creation of Modifications. + + 1.2. Contributor Version. means the combination of the Original Software, + prior Modifications used by a Contributor (if any), and the + Modifications made by that particular Contributor. + + 1.3. Covered Software. means (a) the Original Software, or (b) Modifications, + or (c) the combination of files containing Original Software with files + containing Modifications, in each case including portions thereof. + + 1.4. Executable. means the Covered Software in any form other than Source + Code. + + 1.5. Initial Developer. means the individual or entity that first makes + Original Software available under this License. + + 1.6. Larger Work. means a work which combines Covered Software or portions + thereof with code not governed by the terms of this License. + + 1.7. License. means this document. + + 1.8. Licensable. means having the right to grant, to the maximum extent + possible, whether at the time of the initial grant or subsequently + acquired, any and all of the rights conveyed herein. + + 1.9. Modifications. means the Source Code and Executable form of any of the + following: + + A. Any file that results from an addition to, deletion from or + modification of the contents of a file containing Original Software + or previous Modifications; + + B. Any new file that contains any part of the Original Software or + previous Modification; or + + C. Any new file that is contributed or otherwise made available under + the terms of this License. + + 1.10. Original Software. means the Source Code and Executable form of + computer software code that is originally released under this License. + + 1.11. Patent Claims. means any patent claim(s), now owned or hereafter + acquired, including without limitation, method, process, and apparatus + claims, in any patent Licensable by grantor. + + 1.12. Source Code. means (a) the common form of computer software code in + which modifications are made and (b) associated documentation included + in or with such code. + + 1.13. You. (or .Your.) means an individual or a legal entity exercising + rights under, and complying with all of the terms of, this License. For + legal entities, .You. includes any entity which controls, is controlled + by, or is under common control with You. For purposes of this + definition, .control. means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + +2. License Grants. + + 2.1. The Initial Developer Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to + third party intellectual property claims, the Initial Developer hereby + grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) + Licensable by Initial Developer, to use, reproduce, modify, display, + perform, sublicense and distribute the Original Software (or + portions thereof), with or without Modifications, and/or as part of + a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of + Original Software, to make, have made, use, practice, sell, and + offer for sale, and/or otherwise dispose of the Original Software + (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the + date Initial Developer first distributes or otherwise makes the + Original Software available to a third party under the terms of this + License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: + (1) for code that You delete from the Original Software, or (2) for + infringements caused by: (i) the modification of the Original + Software, or (ii) the combination of the Original Software with + other software or devices. + + 2.2. Contributor Grant. + + Conditioned upon Your compliance with Section 3.1 below and subject to third + party intellectual property claims, each Contributor hereby grants You a + world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) + Licensable by Contributor to use, reproduce, modify, display, + perform, sublicense and distribute the Modifications created by such + Contributor (or portions thereof), either on an unmodified basis, + with other Modifications, as Covered Software and/or as part of a + Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of + Modifications made by that Contributor either alone and/or in + combination with its Contributor Version (or portions of such + combination), to make, use, sell, offer for sale, have made, and/or + otherwise dispose of: (1) Modifications made by that Contributor (or + portions thereof); and (2) the combination of Modifications made by + that Contributor with its Contributor Version (or portions of such + combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on + the date Contributor first distributes or otherwise makes the + Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: + (1) for any code that Contributor has deleted from the Contributor + Version; (2) for infringements caused by: (i) third party + modifications of Contributor Version, or (ii) the combination of + Modifications made by that Contributor with other software (except + as part of the Contributor Version) or other devices; or (3) under + Patent Claims infringed by Covered Software in the absence of + Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Availability of Source Code. + Any Covered Software that You distribute or otherwise make available in + Executable form must also be made available in Source Code form and that + Source Code form must be distributed only under the terms of this License. + You must include a copy of this License with every copy of the Source Code + form of the Covered Software You distribute or otherwise make available. + You must inform recipients of any such Covered Software in Executable form + as to how they can obtain such Covered Software in Source Code form in a + reasonable manner on or through a medium customarily used for software + exchange. + + 3.2. Modifications. + The Modifications that You create or to which You contribute are governed + by the terms of this License. You represent that You believe Your + Modifications are Your original creation(s) and/or You have sufficient + rights to grant the rights conveyed by this License. + + 3.3. Required Notices. + You must include a notice in each of Your Modifications that identifies + You as the Contributor of the Modification. You may not remove or alter + any copyright, patent or trademark notices contained within the Covered + Software, or any notices of licensing or any descriptive text giving + attribution to any Contributor or the Initial Developer. + + 3.4. Application of Additional Terms. + You may not offer or impose any terms on any Covered Software in Source + Code form that alters or restricts the applicable version of this License + or the recipients. rights hereunder. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability obligations to + one or more recipients of Covered Software. However, you may do so only on + Your own behalf, and not on behalf of the Initial Developer or any + Contributor. You must make it absolutely clear that any such warranty, + support, indemnity or liability obligation is offered by You alone, and + You hereby agree to indemnify the Initial Developer and every Contributor + for any liability incurred by the Initial Developer or such Contributor as + a result of warranty, support, indemnity or liability terms You offer. + + 3.5. Distribution of Executable Versions. + You may distribute the Executable form of the Covered Software under the + terms of this License or under the terms of a license of Your choice, + which may contain terms different from this License, provided that You are + in compliance with the terms of this License and that the license for the + Executable form does not attempt to limit or alter the recipient.s rights + in the Source Code form from the rights set forth in this License. If You + distribute the Covered Software in Executable form under a different + license, You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial Developer + or Contributor. You hereby agree to indemnify the Initial Developer and + every Contributor for any liability incurred by the Initial Developer or + such Contributor as a result of any such terms You offer. + + 3.6. Larger Works. + You may create a Larger Work by combining Covered Software with other code + not governed by the terms of this License and distribute the Larger Work + as a single product. In such a case, You must make sure the requirements + of this License are fulfilled for the Covered Software. + +4. Versions of the License. + + 4.1. New Versions. + Sun Microsystems, Inc. is the initial license steward and may publish + revised and/or new versions of this License from time to time. Each + version will be given a distinguishing version number. Except as provided + in Section 4.3, no one other than the license steward has the right to + modify this License. + + 4.2. Effect of New Versions. + You may always continue to use, distribute or otherwise make the Covered + Software available under the terms of the version of the License under + which You originally received the Covered Software. If the Initial + Developer includes a notice in the Original Software prohibiting it from + being distributed or otherwise made available under any subsequent version + of the License, You must distribute and make the Covered Software + available under the terms of the version of the License under which You + originally received the Covered Software. Otherwise, You may also choose + to use, distribute or otherwise make the Covered Software available under + the terms of any subsequent version of the License published by the + license steward. + + 4.3. Modified Versions. + When You are an Initial Developer and You want to create a new license for + Your Original Software, You may create and use a modified version of this + License if You: (a) rename the license and remove any references to the + name of the license steward (except to note that the license differs from + this License); and (b) otherwise make it clear that the license contains + terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + + COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT + LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, + MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK + AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD + ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL + DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY + SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN + ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED + HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + + 6.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to + cure such breach within 30 days of becoming aware of the breach. + Provisions which, by their nature, must remain in effect beyond the + termination of this License shall survive. + + 6.2. If You assert a patent infringement claim (excluding declaratory + judgment actions) against Initial Developer or a Contributor (the + Initial Developer or Contributor against whom You assert such claim + is referred to as .Participant.) alleging that the Participant + Software (meaning the Contributor Version where the Participant is a + Contributor or the Original Software where the Participant is the + Initial Developer) directly or indirectly infringes any patent, then + any and all rights granted directly or indirectly to You by such + Participant, the Initial Developer (if the Initial Developer is not + the Participant) and all Contributors under Sections 2.1 and/or 2.2 + of this License shall, upon 60 days notice from Participant terminate + prospectively and automatically at the expiration of such 60 day + notice period, unless if within such 60 day period You withdraw Your + claim with respect to the Participant Software against such + Participant either unilaterally or pursuant to a written agreement + with Participant. + + 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end + user licenses that have been validly granted by You or any + distributor hereunder prior to termination (excluding licenses + granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING + NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY + OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF + ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT + LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, + COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR + LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF + SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR + DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT + APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS + EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + + The Covered Software is a .commercial item,. as that term is defined in 48 + C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as + that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and commercial + computer software documentation. as such terms are used in 48 C.F.R. 12.212 + (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 + through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered + Software with only those rights set forth herein. This U.S. Government Rights + clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or + provision that addresses Government rights in computer software under this + License. + +9. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. This License shall be governed by the law of the jurisdiction + specified in a notice contained within the Original Software (except to the + extent applicable law, if any, provides otherwise), excluding such + jurisdiction's conflict-of-law provisions. Any litigation relating to this + License shall be subject to the jurisdiction of the courts located in the + jurisdiction and venue specified in a notice contained within the Original + Software, with the losing party responsible for costs, including, without + limitation, court costs and reasonable attorneys. fees and expenses. The + application of the United Nations Convention on Contracts for the + International Sale of Goods is expressly excluded. Any law or regulation + which provides that the language of a contract shall be construed against + the drafter shall not apply to this License. You agree that You alone are + responsible for compliance with the United States export administration + regulations (and the export control laws and regulation of any other + countries) when You use, distribute or otherwise make available any Covered + Software. + +10. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is responsible + for claims and damages arising, directly or indirectly, out of its + utilization of rights under this License and You agree to work with Initial + Developer and Contributors to distribute such responsibility on an equitable + basis. Nothing herein is intended or shall be deemed to constitute any + admission of liability. + + NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION + LICENSE (CDDL) + + The code released under the CDDL shall be governed by the laws of the State + of California (excluding conflict-of-law provisions). Any litigation relating + to this License shall be subject to the jurisdiction of the Federal Courts of + the Northern District of California and the state courts of the State of + California, with venue lying in Santa Clara County, California. + diff --git a/src/tomcat/NOTICE b/src/tomcat/NOTICE new file mode 100644 index 0000000000000000000000000000000000000000..d359afad34514ce56cf7078588b6374e9aea125a --- /dev/null +++ b/src/tomcat/NOTICE @@ -0,0 +1,55 @@ +Apache Tomcat +Copyright 1999-2018 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +This software contains code derived from netty-native +developed by the Netty project +(http://netty.io, https://github.com/netty/netty-tcnative/) +and from finagle-native developed at Twitter +(https://github.com/twitter/finagle). + +The Windows Installer is built with the Nullsoft +Scriptable Install System (NSIS), which is +open source software. The original software and +related information is available at +http://nsis.sourceforge.net. + +Java compilation software for JSP pages is provided by the Eclipse +JDT Core Batch Compiler component, which is open source software. +The original software and related information is available at +http://www.eclipse.org/jdt/core/. + +For portions of the Tomcat JNI OpenSSL API and the OpenSSL JSSE integration +The org.apache.tomcat.jni and the org.apache.tomcat.net.openssl packages +are derivative work originating from the Netty project and the finagle-native +project developed at Twitter +* Copyright 2014 The Netty Project +* Copyright 2014 Twitter + +The original XML Schemas for Java EE Deployment Descriptors: + - javaee_5.xsd + - javaee_web_services_1_2.xsd + - javaee_web_services_client_1_2.xsd + - javaee_6.xsd + - javaee_web_services_1_3.xsd + - javaee_web_services_client_1_3.xsd + - jsp_2_2.xsd + - web-app_3_0.xsd + - web-common_3_0.xsd + - web-fragment_3_0.xsd + - javaee_7.xsd + - javaee_web_services_1_4.xsd + - javaee_web_services_client_1_4.xsd + - jsp_2_3.xsd + - web-app_3_1.xsd + - web-common_3_1.xsd + - web-fragment_3_1.xsd + - javaee_8.xsd + - web-app_4_0.xsd + - web-common_4_0.xsd + - web-fragment_4_0.xsd + +may be obtained from: +http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html diff --git a/src/tomcat/RELEASE-NOTES b/src/tomcat/RELEASE-NOTES new file mode 100644 index 0000000000000000000000000000000000000000..52013a7e6997eaa16d3086daa602b1a60cfcf655 --- /dev/null +++ b/src/tomcat/RELEASE-NOTES @@ -0,0 +1,173 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + + Apache Tomcat Version 9.0.6 + Release Notes + + +========= +CONTENTS: +========= + +* Dependency Changes +* API Stability +* Bundled APIs +* Web application reloading and static fields in shared libraries +* Security manager URLs +* Symlinking static resources +* Viewing the Tomcat Change Log +* Cryptographic software notice +* When all else fails + + +=================== +Dependency Changes: +=================== +Tomcat 9.0 is designed to run on Java SE 8 and later. + + +============== +API Stability: +============== + +The public interfaces for the following classes are fixed and will not be +changed at all during the remaining lifetime of the 9.x series: +- All classes in the javax namespace + +The public interfaces for the following classes may be added to in order to +resolve bugs and/or add new features. No existing interface method will be +removed or changed although it may be deprecated. +- org.apache.catalina.* (excluding sub-packages) + +Note: As Tomcat 9 matures, the above list will be added to. The list is not + considered complete at this time. + +The remaining classes are considered part of the Tomcat internals and may change +without notice between point releases. + + +============= +Bundled APIs: +============= +A standard installation of Tomcat 9.0 makes all of the following APIs available +for use by web applications (by placing them in "lib"): +* annotations-api.jar (Annotations package) +* catalina.jar (Tomcat Catalina implementation) +* catalina-ant.jar (Tomcat Catalina Ant tasks) +* catalina-ha.jar (High availability package) +* catalina-storeconfig.jar (Generation of XML configuration from current state) +* catalina-tribes.jar (Group communication) +* ecj-4.6.3.jar (Eclipse JDT Java compiler) +* el-api.jar (EL 3.0 API) +* jasper.jar (Jasper 2 Compiler and Runtime) +* jasper-el.jar (Jasper 2 EL implementation) +* jsp-api.jar (JSP 2.3 API) +* servlet-api.jar (Servlet 4.0 API) +* tomcat-api.jar (Interfaces shared by Catalina and Jasper) +* tomcat-coyote.jar (Tomcat connectors and utility classes) +* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP) +* tomcat-jdbc.jar (Tomcat's database connection pooling solution) +* tomcat-jni.jar (Interface to the native component of the APR/native connector) +* tomcat-util.jar (Various utilities) +* tomcat-websocket.jar (WebSocket 1.1 implementation) +* websocket-api.jar (WebSocket 1.1 API) + +You can make additional APIs available to all of your web applications by +putting unpacked classes into a "classes" directory (not created by default), +or by placing them in JAR files in the "lib" directory. + +To override the XML parser implementation or interfaces, use the appropriate +feature for your JVM. For Java <= 8 use the endorsed standards override +feature. The default configuration defines JARs located in "endorsed" as endorsed. +For Java 9+ use the upgradeable modules feature. + + +================================================================ +Web application reloading and static fields in shared libraries: +================================================================ +Some shared libraries (many are part of the JDK) keep references to objects +instantiated by the web application. To avoid class loading related problems +(ClassCastExceptions, messages indicating that the classloader +is stopped, etc.), the shared libraries state should be reinitialized. + +Something which might help is to avoid putting classes which would be +referenced by a shared static field in the web application classloader, +and putting them in the shared classloader instead (JARs should be put in the +"lib" folder, and classes should be put in the "classes" folder). + + +====================== +Security manager URLs: +====================== +In order to grant security permissions to JARs located inside the +web application repository, use URLs of of the following format +in your policy file: + +file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar + + +============================ +Symlinking static resources: +============================ +By default, Unix symlinks will not work when used in a web application to link +resources located outside the web application root directory. + +This behavior is optional, and the "allowLinking" flag may be used to disable +the check. + + +============================== +Viewing the Tomcat Change Log: +============================== +The full change log is available from http://tomcat.apache.org and is also +included in the documentation web application. + + +============================= +Cryptographic software notice +============================= +This distribution includes cryptographic software. The country in +which you currently reside may have restrictions on the import, +possession, use, and/or re-export to another country, of +encryption software. BEFORE using any encryption software, please +check your country's laws, regulations and policies concerning the +import, possession, or use, and re-export of encryption software, to +see if this is permitted. See <http://www.wassenaar.org/> for more +information. + +The U.S. Government Department of Commerce, Bureau of Industry and +Security (BIS), has classified this software as Export Commodity +Control Number (ECCN) 5D002.C.1, which includes information security +software using or performing cryptographic functions with asymmetric +algorithms. The form and manner of this Apache Software Foundation +distribution makes it eligible for export under the License Exception +ENC Technology Software Unrestricted (TSU) exception (see the BIS +Export Administration Regulations, Section 740.13) for both object +code and source code. + +The following provides more details on the included cryptographic +software: + - Tomcat includes code designed to work with JSSE + - Tomcat includes code designed to work with OpenSSL + + +==================== +When all else fails: +==================== +See the FAQ +http://tomcat.apache.org/faq/ diff --git a/src/tomcat/RUNNING.txt b/src/tomcat/RUNNING.txt new file mode 100644 index 0000000000000000000000000000000000000000..654d7af57063d4687aa088fe68a4aa5cac6fb277 --- /dev/null +++ b/src/tomcat/RUNNING.txt @@ -0,0 +1,476 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + =================================================== + Running The Apache Tomcat 9.0 Servlet/JSP Container + =================================================== + +Apache Tomcat 9.0 requires a Java Standard Edition Runtime +Environment (JRE) version 8 or later. + +============================= +Running With JRE 8 Or Later +============================= + +(1) Download and Install a Java SE Runtime Environment (JRE) + +(1.1) Download a Java SE Runtime Environment (JRE), + release version 8 or later, from + http://www.oracle.com/technetwork/java/javase/downloads/index.html + +(1.2) Install the JRE according to the instructions included with the + release. + + You may also use a full Java Development Kit (JDK) rather than just + a JRE. + + +(2) Download and Install Apache Tomcat + +(2.1) Download a binary distribution of Tomcat from: + + http://tomcat.apache.org/ + +(2.2) Unpack the binary distribution so that it resides in its own + directory (conventionally named "apache-tomcat-[version]"). + + For the purposes of the remainder of this document, the name + "CATALINA_HOME" is used to refer to the full pathname of that + directory. + +NOTE: As an alternative to downloading a binary distribution, you can +create your own from the Tomcat source code, as described in +"BUILDING.txt". You can either + + a) Do the full "release" build and find the created distribution in the + "output/release" directory and then proceed with unpacking as above, or + + b) Do a simple build and use the "output/build" directory as + "CATALINA_HOME". Be warned that there are some differences between the + contents of the "output/build" directory and a full "release" + distribution. + + +(3) Configure Environment Variables + +Tomcat is a Java application and does not use environment variables directly. +Environment variables are used by the Tomcat startup scripts. The scripts use +the environment variables to prepare the command that starts Tomcat. + +(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional) + +The CATALINA_HOME environment variable should be set to the location of the +root directory of the "binary" distribution of Tomcat. + +The Tomcat startup scripts have some logic to set this variable +automatically if it is absent, based on the location of the startup script +in *nix and on the current directory in Windows. That logic might not work +in all circumstances, so setting the variable explicitly is recommended. + +The CATALINA_BASE environment variable specifies location of the root +directory of the "active configuration" of Tomcat. It is optional. It +defaults to be equal to CATALINA_HOME. + +Using distinct values for the CATALINA_HOME and CATALINA_BASE variables is +recommended to simplify further upgrades and maintenance. It is documented +in the "Multiple Tomcat Instances" section below. + + +(3.2) Set JRE_HOME or JAVA_HOME (required) + +These variables are used to specify location of a Java Runtime +Environment or of a Java Development Kit that is used to start Tomcat. + +The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME +variable is used to specify location of a JDK. + +Using JAVA_HOME provides access to certain additional startup options that +are not allowed when JRE_HOME is used. + +If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used. + +The recommended place to specify these variables is a "setenv" script. See +below. + + +(3.3) Other variables (optional) + +Other environment variables exist, besides the four described above. +See the comments at the top of catalina.bat or catalina.sh scripts for +the list and a description of each of them. + +One frequently used variable is CATALINA_OPTS. It allows specification of +additional options for the java command that starts Tomcat. + +See the Java documentation for the options that affect the Java Runtime +Environment. + +See the "System Properties" page in the Tomcat Configuration Reference for +the system properties that are specific to Tomcat. + +A similar variable is JAVA_OPTS. It is used less frequently. It allows +specification of options that are used both to start and to stop Tomcat as well +as for other commands. + +Note: Do not use JAVA_OPTS to specify memory limits. You do not need much +memory for a small process that is used to stop Tomcat. Those settings +belong to CATALINA_OPTS. + +Another frequently used variable is CATALINA_PID (on *nix only). It +specifies the location of the file where process id of the forked Tomcat +java process will be written. This setting is optional. It will enable the +following features: + + * better protection against duplicate start attempts and + * allows forceful termination of Tomcat process when it does not react to + the standard shutdown command. + + +(3.4) Using the "setenv" script (optional, recommended) + +Apart from CATALINA_HOME and CATALINA_BASE, all environment variables can +be specified in the "setenv" script. The script is placed either into +CATALINA_BASE/bin or into CATALINA_HOME/bin directory and is named +setenv.bat (on Windows) or setenv.sh (on *nix). The file has to be +readable. + +By default the setenv script file is absent. If the script file is present +both in CATALINA_BASE and in CATALINA_HOME, the one in CATALINA_BASE is +preferred. + +For example, to configure the JRE_HOME and CATALINA_PID variables you can +create the following script file: + +On Windows, %CATALINA_BASE%\bin\setenv.bat: + + set "JRE_HOME=%ProgramFiles%\Java\jre8" + exit /b 0 + +On *nix, $CATALINA_BASE/bin/setenv.sh: + + JRE_HOME=/usr/java/latest + CATALINA_PID="$CATALINA_BASE/tomcat.pid" + + +The CATALINA_HOME and CATALINA_BASE variables cannot be configured in the +setenv script, because they are used to locate that file. + +All the environment variables described here and the "setenv" script are +used only if you use the standard scripts to launch Tomcat. For example, if +you have installed Tomcat as a service on Windows, the service wrapper +launches Java directly and does not use the script files. + + +(4) Start Up Tomcat + +(4.1) Tomcat can be started by executing one of the following commands: + + On Windows: + + %CATALINA_HOME%\bin\startup.bat + + or + + %CATALINA_HOME%\bin\catalina.bat start + + On *nix: + + $CATALINA_HOME/bin/startup.sh + + or + + $CATALINA_HOME/bin/catalina.sh start + +(4.2) After startup, the default web applications included with Tomcat will be + available by visiting: + + http://localhost:8080/ + +(4.3) Further information about configuring and running Tomcat can be found in + the documentation included here, as well as on the Tomcat web site: + + http://tomcat.apache.org/ + + +(5) Shut Down Tomcat + +(5.1) Tomcat can be shut down by executing one of the following commands: + + On Windows: + + %CATALINA_HOME%\bin\shutdown.bat + + or + + %CATALINA_HOME%\bin\catalina.bat stop + + On *nix: + + $CATALINA_HOME/bin/shutdown.sh + + or + + $CATALINA_HOME/bin/catalina.sh stop + +================================================== +Advanced Configuration - Multiple Tomcat Instances +================================================== + +In many circumstances, it is desirable to have a single copy of a Tomcat +binary distribution shared among multiple users on the same server. To make +this possible, you can set the CATALINA_BASE environment variable to the +directory that contains the files for your 'personal' Tomcat instance. + +When running with a separate CATALINA_HOME and CATALINA_BASE, the files +and directories are split as following: + +In CATALINA_BASE: + + * bin - Only the following files: + + * setenv.sh (*nix) or setenv.bat (Windows), + * tomcat-juli.jar + + The setenv scripts were described above. The tomcat-juli library + is documented in the Logging chapter in the User Guide. + + * conf - Server configuration files (including server.xml) + + * lib - Libraries and classes, as explained below + + * logs - Log and output files + + * webapps - Automatically loaded web applications + + * work - Temporary working directories for web applications + + * temp - Directory used by the JVM for temporary files (java.io.tmpdir) + + +In CATALINA_HOME: + + * bin - Startup and shutdown scripts + + The following files will be used only if they are absent in + CATALINA_BASE/bin: + + setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar + + * lib - Libraries and classes, as explained below + + * endorsed - Libraries that override standard "Endorsed Standards" + libraries provided by JRE. See Classloading documentation + in the User Guide for details. + This is only supported for Java <= 8. + By default this "endorsed" directory is absent. + +In the default configuration the JAR libraries and classes both in +CATALINA_BASE/lib and in CATALINA_HOME/lib will be added to the common +classpath, but the ones in CATALINA_BASE will be added first and thus will +be searched first. + +The idea is that you may leave the standard Tomcat libraries in +CATALINA_HOME/lib and add other ones such as database drivers into +CATALINA_BASE/lib. + +In general it is advised to never share libraries between web applications, +but put them into WEB-INF/lib directories inside the applications. See +Classloading documentation in the User Guide for details. + + +It might be useful to note that the values of CATALINA_HOME and +CATALINA_BASE can be referenced in the XML configuration files processed +by Tomcat as ${catalina.home} and ${catalina.base} respectively. + +For example, the standard manager web application can be kept in +CATALINA_HOME/webapps/manager and loaded into CATALINA_BASE by using +the following trick: + + * Copy the CATALINA_HOME/webapps/manager/META-INF/context.xml + file as CATALINA_BASE/conf/Catalina/localhost/manager.xml + + * Add docBase attribute as shown below. + +The file will look like the following: + + <?xml version="1.0" encoding="UTF-8"?> + <Context docBase="${catalina.home}/webapps/manager" + antiResourceLocking="false" privileged="true" > + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.0\.0\.1" /> + </Context> + +See Deployer chapter in User Guide and Context and Host chapters in the +Configuration Reference for more information on contexts and web +application deployment. + + +================ +Troubleshooting +================ + +There are only really 2 things likely to go wrong during the stand-alone +Tomcat install: + +(1) The most common hiccup is when another web server (or any process for that + matter) has laid claim to port 8080. This is the default HTTP port that + Tomcat attempts to bind to at startup. To change this, open the file: + + $CATALINA_HOME/conf/server.xml + + and search for '8080'. Change it to a port that isn't in use, and is + greater than 1024, as ports less than or equal to 1024 require superuser + access to bind under UNIX. + + Restart Tomcat and you're in business. Be sure that you replace the "8080" + in the URL you're using to access Tomcat. For example, if you change the + port to 1977, you would request the URL http://localhost:1977/ in your + browser. + +(2) The 'localhost' machine isn't found. This could happen if you're behind a + proxy. If that's the case, make sure the proxy configuration for your + browser knows that you shouldn't be going through the proxy to access the + "localhost". + + In Firefox, this is under Tools/Preferences -> Advanced/Network -> + Connection -> Settings..., and in Internet Explorer it is Tools -> + Internet Options -> Connections -> LAN Settings. + + +==================== +Optional Components +==================== + +The following optional components may be included with the Apache Tomcat binary +distribution. If they are not included, you can install them separately. + + 1. Apache Tomcat Native library + + 2. Apache Commons Daemon service launcher + +Both of them are implemented in C language and as such have to be compiled +into binary code. The binary code will be specific for a platform and CPU +architecture and it must match the Java Runtime Environment executables +that will be used to launch Tomcat. + +The Windows-specific binary distributions of Apache Tomcat include binary +files for these components. On other platforms you would have to look for +binary versions elsewhere or compile them yourself. + +If you are new to Tomcat, do not bother with these components to start with. +If you do use them, do not forget to read their documentation. + + +Apache Tomcat Native library +----------------------------- + +It is a library that allows to use the "Apr" variant of HTTP and AJP +protocol connectors in Apache Tomcat. It is built around OpenSSL and Apache +Portable Runtime (APR) libraries. Those are the same libraries as used by +Apache HTTPD Server project. + +This feature was especially important in the old days when Java performance +was poor. It is less important nowadays, but it is still used and respected +by many. See Tomcat documentation for more details. + +For further reading: + + - Apache Tomcat documentation + + * Documentation for APR/Native library in the Tomcat User's Guide + + http://tomcat.apache.org/tomcat-9.0-doc/apr.html + + * Documentation for the HTTP and AJP protocol connectors in the Tomcat + Configuration Reference + + http://tomcat.apache.org/tomcat-9.0-doc/config/http.html + + http://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html + + - Apache Tomcat Native project home + + http://tomcat.apache.org/native-doc/ + + - Other projects + + * OpenSSL + + http://openssl.org/ + + * Apache Portable Runtime + + http://apr.apache.org/ + + * Apache HTTP Server + + http://httpd.apache.org/ + +To disable Apache Tomcat Native library: + + - To disable Apache Tomcat Native library when it is installed, or + - To remove the warning that is logged during Tomcat startup when the + library is not installed: + + Edit the "conf/server.xml" file and remove "AprLifecycleListener" from + it. + +The binary file of Apache Tomcat Native library is usually named + + - "tcnative-1.dll" on Windows + - "libtcnative-1.so" on *nix systems + + +Apache Commons Daemon +---------------------- + +Apache Commons Daemon project provides wrappers that can be used to +install Apache Tomcat as a service on Windows or as a daemon on *nix +systems. + +The Windows-specific implementation of Apache Commons Daemon is called +"procrun". The *nix-specific one is called "jsvc". + +For further reading: + + - Apache Commons Daemon project + + http://commons.apache.org/daemon/ + + - Apache Tomcat documentation + + * Installing Apache Tomcat + + http://tomcat.apache.org/tomcat-9.0-doc/setup.html + + * Windows service HOW-TO + + http://tomcat.apache.org/tomcat-9.0-doc/windows-service-howto.html + +The binary files of Apache Commons Daemon in Apache Tomcat distributions +for Windows are named: + + - "tomcat9.exe" + - "tomcat9w.exe" + +These files are renamed copies of "prunsrv.exe" and "prunmgr.exe" from +Apache Commons Daemon distribution. The file names have a meaning: they are +used as the service name to register the service in Windows, as well as the +key name to store distinct configuration for this installation of +"procrun". If you would like to install several instances of Tomcat 9.0 +in parallel, you have to further rename those files, using the same naming +scheme. diff --git a/src/tomcat/bin/bootstrap.jar b/src/tomcat/bin/bootstrap.jar new file mode 100644 index 0000000000000000000000000000000000000000..472d1d36b37d91866d1afe8d3d3e4ebf3ff71424 Binary files /dev/null and b/src/tomcat/bin/bootstrap.jar differ diff --git a/src/tomcat/bin/catalina-tasks.xml b/src/tomcat/bin/catalina-tasks.xml new file mode 100644 index 0000000000000000000000000000000000000000..c7c9c2855367661ba97370bc5f3c826dfca0cdbd --- /dev/null +++ b/src/tomcat/bin/catalina-tasks.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- + XML file for importing Catalina ant tasks. + <import file="${catalina.home}/bin/catalina-tasks.xml"/> +--> + +<project name="catalina-tasks"> + <description>Catalina Ant Manager, JMX and JSPC Tasks</description> + <!-- set catalina.home if it's not already set --> + <dirname property="catalina.home.bin.dir" file="${ant.file.catalina-tasks}"/> + <property name="catalina.home" value="${catalina.home.bin.dir}/.."/> + <typedef resource="org/apache/catalina/ant/catalina.tasks"> + <classpath> + <fileset file="${catalina.home}/bin/tomcat-juli.jar"/> + <fileset dir="${catalina.home}/lib" includes="*.jar"/> + </classpath> + </typedef> + <typedef resource="org/apache/catalina/ant/jmx/jmxaccessor.tasks"> + <classpath> + <fileset file="${catalina.home}/lib/catalina-ant.jar"/> + </classpath> + </typedef> +</project> diff --git a/src/tomcat/bin/catalina.bat b/src/tomcat/bin/catalina.bat new file mode 100644 index 0000000000000000000000000000000000000000..99ef0062a9ade755f36d325b62a7059052406b04 --- /dev/null +++ b/src/tomcat/bin/catalina.bat @@ -0,0 +1,371 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Start/Stop Script for the CATALINA Server +rem +rem Environment Variable Prerequisites +rem +rem Do not set the variables in this script. Instead put them into a script +rem setenv.bat in CATALINA_BASE/bin to keep your customizations separate. +rem +rem WHEN RUNNING TOMCAT AS A WINDOWS SERVICE: +rem Note that the environment variables that affect the behavior of this +rem script will have no effect at all on Windows Services. As such, any +rem local customizations made in a CATALINA_BASE/bin/setenv.bat script +rem will also have no effect on Tomcat when launched as a Windows Service. +rem The configuration that controls Windows Services is stored in the Windows +rem Registry, and is most conveniently maintained using the "tomcatXw.exe" +rem maintenance utility, where "X" is the major version of Tomcat you are +rem running. +rem +rem CATALINA_HOME May point at your Catalina "build" directory. +rem +rem CATALINA_BASE (Optional) Base directory for resolving dynamic portions +rem of a Catalina installation. If not present, resolves to +rem the same directory that CATALINA_HOME points to. +rem +rem CATALINA_OPTS (Optional) Java runtime options used when the "start", +rem "run" or "debug" command is executed. +rem Include here and not in JAVA_OPTS all options, that should +rem only be used by Tomcat itself, not by the stop process, +rem the version command etc. +rem Examples are heap size, GC logging, JMX ports etc. +rem +rem CATALINA_TMPDIR (Optional) Directory path location of temporary directory +rem the JVM should use (java.io.tmpdir). Defaults to +rem %CATALINA_BASE%\temp. +rem +rem JAVA_HOME Must point at your Java Development Kit installation. +rem Required to run the with the "debug" argument. +rem +rem JRE_HOME Must point at your Java Runtime installation. +rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME +rem are both set, JRE_HOME is used. +rem +rem JAVA_OPTS (Optional) Java runtime options used when any command +rem is executed. +rem Include here and not in CATALINA_OPTS all options, that +rem should be used by Tomcat and also by the stop process, +rem the version command etc. +rem Most options should go into CATALINA_OPTS. +rem +rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories +rem containing some jars in order to allow replacement of APIs +rem created outside of the JCP (i.e. DOM and SAX from W3C). +rem It can also be used to update the XML parser implementation. +rem This is only supported for Java <= 8. +rem Defaults to $CATALINA_HOME/endorsed. +rem +rem JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" +rem command is executed. The default is "dt_socket". +rem +rem JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" +rem command is executed. The default is localhost:8000. +rem +rem JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start" +rem command is executed. Specifies whether JVM should suspend +rem execution immediately after startup. Default is "n". +rem +rem JPDA_OPTS (Optional) Java runtime options used when the "jpda start" +rem command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS, +rem and JPDA_SUSPEND are ignored. Thus, all required jpda +rem options MUST be specified. The default is: +rem +rem -agentlib:jdwp=transport=%JPDA_TRANSPORT%, +rem address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% +rem +rem JSSE_OPTS (Optional) Java runtime options used to control the TLS +rem implementation when JSSE is used. Default is: +rem "-Djdk.tls.ephemeralDHKeySize=2048" +rem +rem LOGGING_CONFIG (Optional) Override Tomcat's logging config file +rem Example (all one line) +rem set LOGGING_CONFIG="-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties" +rem +rem LOGGING_MANAGER (Optional) Override Tomcat's logging manager +rem Example (all one line) +rem set LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +rem +rem TITLE (Optional) Specify the title of Tomcat window. The default +rem TITLE is Tomcat if it's not specified. +rem Example (all one line) +rem set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%] +rem --------------------------------------------------------------------------- + +setlocal + +rem Suppress Terminate batch job on CTRL+C +if not ""%1"" == ""run"" goto mainEntry +if "%TEMP%" == "" goto mainEntry +if exist "%TEMP%\%~nx0.run" goto mainEntry +echo Y>"%TEMP%\%~nx0.run" +if not exist "%TEMP%\%~nx0.run" goto mainEntry +echo Y>"%TEMP%\%~nx0.Y" +call "%~f0" %* <"%TEMP%\%~nx0.Y" +rem Use provided errorlevel +set RETVAL=%ERRORLEVEL% +del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1 +exit /B %RETVAL% +:mainEntry +del /Q "%TEMP%\%~nx0.run" >NUL 2>&1 + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome + +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +rem Copy CATALINA_BASE from CATALINA_HOME if not defined +if not "%CATALINA_BASE%" == "" goto gotBase +set "CATALINA_BASE=%CATALINA_HOME%" +:gotBase + +rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon +rem as this is used as the separator in the classpath and Java provides no +rem mechanism for escaping if the same character appears in the path. Check this +rem by replacing all occurrences of ';' with '' and checking that neither +rem CATALINA_HOME nor CATALINA_BASE have changed +if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon +echo Using CATALINA_HOME: "%CATALINA_HOME%" +echo Unable to start as CATALINA_HOME contains a semicolon (;) character +goto end +:homeNoSemicolon + +if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon +echo Using CATALINA_BASE: "%CATALINA_BASE%" +echo Unable to start as CATALINA_BASE contains a semicolon (;) character +goto end +:baseNoSemicolon + +rem Ensure that any user defined CLASSPATH variables are not used on startup, +rem but allow them to be specified in setenv.bat, in rare case when it is needed. +set CLASSPATH= + +rem Get standard environment variables +if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome +call "%CATALINA_BASE%\bin\setenv.bat" +goto setenvDone +:checkSetenvHome +if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" +:setenvDone + +rem Get standard Java environment variables +if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath +echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat" +echo This file is needed to run this program +goto end +:okSetclasspath +call "%CATALINA_HOME%\bin\setclasspath.bat" %1 +if errorlevel 1 goto end + +rem Add on extra jar file to CLASSPATH +rem Note that there are no quotes as we do not want to introduce random +rem quotes into the CLASSPATH +if "%CLASSPATH%" == "" goto emptyClasspath +set "CLASSPATH=%CLASSPATH%;" +:emptyClasspath +set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar" + +if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir +set "CATALINA_TMPDIR=%CATALINA_BASE%\temp" +:gotTmpdir + +rem Add tomcat-juli.jar to classpath +rem tomcat-juli.jar can be over-ridden per instance +if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome +set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar" +goto juliClasspathDone +:juliClasspathHome +set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar" +:juliClasspathDone + +if not "%JSSE_OPTS%" == "" goto gotJsseOpts +set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" +:gotJsseOpts +set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%" + +rem Register custom URL handlers +rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy +set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources" + +if not "%LOGGING_CONFIG%" == "" goto noJuliConfig +set LOGGING_CONFIG=-Dnop +if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig +set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" +:noJuliConfig + +if not "%LOGGING_MANAGER%" == "" goto noJuliManager +set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager +:noJuliManager + +rem Configure JAVA 9 specific start-up parameters +set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.base/java.lang=ALL-UNNAMED" +set "JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED" + +rem Java 9 no longer supports the java.endorsed.dirs +rem system property. Only try to use it if +rem JAVA_ENDORSED_DIRS was explicitly set +rem or CATALINA_HOME/endorsed exists. +set ENDORSED_PROP=ignore.endorsed.dirs +if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar +set ENDORSED_PROP=java.endorsed.dirs +goto doneEndorsed +:noEndorsedVar +if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed +set ENDORSED_PROP=java.endorsed.dirs +:doneEndorsed + +rem ----- Execute The Requested Command --------------------------------------- + +echo Using CATALINA_BASE: "%CATALINA_BASE%" +echo Using CATALINA_HOME: "%CATALINA_HOME%" +echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%" +if ""%1"" == ""debug"" goto use_jdk +echo Using JRE_HOME: "%JRE_HOME%" +goto java_dir_displayed +:use_jdk +echo Using JAVA_HOME: "%JAVA_HOME%" +:java_dir_displayed +echo Using CLASSPATH: "%CLASSPATH%" + +set _EXECJAVA=%_RUNJAVA% +set MAINCLASS=org.apache.catalina.startup.Bootstrap +set ACTION=start +set SECURITY_POLICY_FILE= +set DEBUG_OPTS= +set JPDA= + +if not ""%1"" == ""jpda"" goto noJpda +set JPDA=jpda +if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport +set JPDA_TRANSPORT=dt_socket +:gotJpdaTransport +if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress +set JPDA_ADDRESS=localhost:8000 +:gotJpdaAddress +if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend +set JPDA_SUSPEND=n +:gotJpdaSuspend +if not "%JPDA_OPTS%" == "" goto gotJpdaOpts +set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% +:gotJpdaOpts +shift +:noJpda + +if ""%1"" == ""debug"" goto doDebug +if ""%1"" == ""run"" goto doRun +if ""%1"" == ""start"" goto doStart +if ""%1"" == ""stop"" goto doStop +if ""%1"" == ""configtest"" goto doConfigTest +if ""%1"" == ""version"" goto doVersion + +echo Usage: catalina ( commands ... ) +echo commands: +echo debug Start Catalina in a debugger +echo debug -security Debug Catalina with a security manager +echo jpda start Start Catalina under JPDA debugger +echo run Start Catalina in the current window +echo run -security Start in the current window with security manager +echo start Start Catalina in a separate window +echo start -security Start in a separate window with security manager +echo stop Stop Catalina +echo configtest Run a basic syntax check on server.xml +echo version What version of tomcat are you running? +goto end + +:doDebug +shift +set _EXECJAVA=%_RUNJDB% +set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java" +if not ""%1"" == ""-security"" goto execCmd +shift +echo Using Security Manager +set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" +goto execCmd + +:doRun +shift +if not ""%1"" == ""-security"" goto execCmd +shift +echo Using Security Manager +set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" +goto execCmd + +:doStart +shift +if "%TITLE%" == "" set TITLE=Tomcat +set _EXECJAVA=start "%TITLE%" %_RUNJAVA% +if not ""%1"" == ""-security"" goto execCmd +shift +echo Using Security Manager +set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy" +goto execCmd + +:doStop +shift +set ACTION=stop +set CATALINA_OPTS= +goto execCmd + +:doConfigTest +shift +set ACTION=configtest +set CATALINA_OPTS= +goto execCmd + +:doVersion +%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo +goto end + + +:execCmd +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +rem Execute Java with the applicable properties +if not "%JPDA%" == "" goto doJpda +if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity +%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +goto end +:doSecurity +%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +goto end +:doJpda +if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda +%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +goto end +:doSecurityJpda +%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% +goto end + +:end diff --git a/src/tomcat/bin/catalina.sh b/src/tomcat/bin/catalina.sh new file mode 100644 index 0000000000000000000000000000000000000000..c7e26ea3ed0f069b393a920f23ab621bd382af2e --- /dev/null +++ b/src/tomcat/bin/catalina.sh @@ -0,0 +1,648 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Control Script for the CATALINA Server +# +# Environment Variable Prerequisites +# +# Do not set the variables in this script. Instead put them into a script +# setenv.sh in CATALINA_BASE/bin to keep your customizations separate. +# +# CATALINA_HOME May point at your Catalina "build" directory. +# +# CATALINA_BASE (Optional) Base directory for resolving dynamic portions +# of a Catalina installation. If not present, resolves to +# the same directory that CATALINA_HOME points to. +# +# CATALINA_OUT (Optional) Full path to a file where stdout and stderr +# will be redirected. +# Default is $CATALINA_BASE/logs/catalina.out +# +# CATALINA_OPTS (Optional) Java runtime options used when the "start", +# "run" or "debug" command is executed. +# Include here and not in JAVA_OPTS all options, that should +# only be used by Tomcat itself, not by the stop process, +# the version command etc. +# Examples are heap size, GC logging, JMX ports etc. +# +# CATALINA_TMPDIR (Optional) Directory path location of temporary directory +# the JVM should use (java.io.tmpdir). Defaults to +# $CATALINA_BASE/temp. +# +# JAVA_HOME Must point at your Java Development Kit installation. +# Required to run the with the "debug" argument. +# +# JRE_HOME Must point at your Java Runtime installation. +# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME +# are both set, JRE_HOME is used. +# +# JAVA_OPTS (Optional) Java runtime options used when any command +# is executed. +# Include here and not in CATALINA_OPTS all options, that +# should be used by Tomcat and also by the stop process, +# the version command etc. +# Most options should go into CATALINA_OPTS. +# +# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories +# containing some jars in order to allow replacement of APIs +# created outside of the JCP (i.e. DOM and SAX from W3C). +# It can also be used to update the XML parser implementation. +# This is only supported for Java <= 8. +# Defaults to $CATALINA_HOME/endorsed. +# +# JPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start" +# command is executed. The default is "dt_socket". +# +# JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start" +# command is executed. The default is localhost:8000. +# +# JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start" +# command is executed. Specifies whether JVM should suspend +# execution immediately after startup. Default is "n". +# +# JPDA_OPTS (Optional) Java runtime options used when the "jpda start" +# command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS, +# and JPDA_SUSPEND are ignored. Thus, all required jpda +# options MUST be specified. The default is: +# +# -agentlib:jdwp=transport=$JPDA_TRANSPORT, +# address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND +# +# JSSE_OPTS (Optional) Java runtime options used to control the TLS +# implementation when JSSE is used. Default is: +# "-Djdk.tls.ephemeralDHKeySize=2048" +# +# CATALINA_PID (Optional) Path of the file which should contains the pid +# of the catalina startup java process, when start (fork) is +# used +# +# LOGGING_CONFIG (Optional) Override Tomcat's logging config file +# Example (all one line) +# LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" +# +# LOGGING_MANAGER (Optional) Override Tomcat's logging manager +# Example (all one line) +# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +# +# UMASK (Optional) Override Tomcat's default UMASK of 0027 +# +# USE_NOHUP (Optional) If set to the string true the start command will +# use nohup so that the Tomcat process will ignore any hangup +# signals. Default is "false" unless running on HP-UX in which +# case the default is "true" +# ----------------------------------------------------------------------------- + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +os400=false +hpux=false +case "`uname`" in +CYGWIN*) cygwin=true;; +Darwin*) darwin=true;; +OS400*) os400=true;; +HP-UX*) hpux=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ]; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +# Get standard environment variables +PRGDIR=`dirname "$PRG"` + +# Only set CATALINA_HOME if not already set +[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` + +# Copy CATALINA_BASE from CATALINA_HOME if not already set +[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME" + +# Ensure that any user defined CLASSPATH variables are not used on startup, +# but allow them to be specified in setenv.sh, in rare case when it is needed. +CLASSPATH= + +if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then + . "$CATALINA_BASE/bin/setenv.sh" +elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then + . "$CATALINA_HOME/bin/setenv.sh" +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"` + [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"` + [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"` + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon +# as this is used as the separator in the classpath and Java provides no +# mechanism for escaping if the same character appears in the path. +case $CATALINA_HOME in + *:*) echo "Using CATALINA_HOME: $CATALINA_HOME"; + echo "Unable to start as CATALINA_HOME contains a colon (:) character"; + exit 1; +esac +case $CATALINA_BASE in + *:*) echo "Using CATALINA_BASE: $CATALINA_BASE"; + echo "Unable to start as CATALINA_BASE contains a colon (:) character"; + exit 1; +esac + +# For OS400 +if $os400; then + # Set job priority to standard for interactive (interactive - 6) by using + # the interactive priority - 6, the helper threads that respond to requests + # will be running at the same priority as interactive jobs. + COMMAND='chgjob job('$JOBNAME') runpty(6)' + system $COMMAND + + # Enable multi threading + export QIBM_MULTI_THREADED=Y +fi + +# Get standard Java environment variables +if $os400; then + # -r will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + . "$CATALINA_HOME"/bin/setclasspath.sh +else + if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then + . "$CATALINA_HOME"/bin/setclasspath.sh + else + echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh" + echo "This file is needed to run this program" + exit 1 + fi +fi + +# Add on extra jar files to CLASSPATH +if [ ! -z "$CLASSPATH" ] ; then + CLASSPATH="$CLASSPATH": +fi +CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar + +if [ -z "$CATALINA_OUT" ] ; then + CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out +fi + +if [ -z "$CATALINA_TMPDIR" ] ; then + # Define the java.io.tmpdir to use for Catalina + CATALINA_TMPDIR="$CATALINA_BASE"/temp +fi + +# Add tomcat-juli.jar to classpath +# tomcat-juli.jar can be over-ridden per instance +if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then + CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar +else + CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar +fi + +# Bugzilla 37848: When no TTY is available, don't output to console +have_tty=0 +if [ "`tty`" != "not a tty" ]; then + have_tty=1 +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` + JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"` + CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"` + CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"` + CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` +fi + +if [ -z "$JSSE_OPTS" ] ; then + JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" +fi +JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS" + +# Register custom URL handlers +# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy +JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources" + +# Set juli LogManager config file if it is present and an override has not been issued +if [ -z "$LOGGING_CONFIG" ]; then + if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then + LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" + else + # Bugzilla 45585 + LOGGING_CONFIG="-Dnop" + fi +fi + +if [ -z "$LOGGING_MANAGER" ]; then + LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +fi + +# Set UMASK unless it has been overridden +if [ -z "$UMASK" ]; then + UMASK="0027" +fi +umask $UMASK + +# Java 9 no longer supports the java.endorsed.dirs +# system property. Only try to use it if +# JAVA_ENDORSED_DIRS was explicitly set +# or CATALINA_HOME/endorsed exists. +ENDORSED_PROP=ignore.endorsed.dirs +if [ -n "$JAVA_ENDORSED_DIRS" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi +if [ -d "$CATALINA_HOME/endorsed" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi + +# Uncomment the following line to make the umask available when using the +# org.apache.catalina.security.SecurityListener +#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`" + +if [ -z "$USE_NOHUP" ]; then + if $hpux; then + USE_NOHUP="true" + else + USE_NOHUP="false" + fi +fi +unset _NOHUP +if [ "$USE_NOHUP" = "true" ]; then + _NOHUP=nohup +fi + +# Add the JAVA 9 specific start-up parameters required by Tomcat +JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.base/java.lang=ALL-UNNAMED" +JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED" +export JDK_JAVA_OPTIONS + +# ----- Execute The Requested Command ----------------------------------------- + +# Bugzilla 37848: only output this if we have a TTY +if [ $have_tty -eq 1 ]; then + echo "Using CATALINA_BASE: $CATALINA_BASE" + echo "Using CATALINA_HOME: $CATALINA_HOME" + echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR" + if [ "$1" = "debug" ] ; then + echo "Using JAVA_HOME: $JAVA_HOME" + else + echo "Using JRE_HOME: $JRE_HOME" + fi + echo "Using CLASSPATH: $CLASSPATH" + if [ ! -z "$CATALINA_PID" ]; then + echo "Using CATALINA_PID: $CATALINA_PID" + fi +fi + +if [ "$1" = "jpda" ] ; then + if [ -z "$JPDA_TRANSPORT" ]; then + JPDA_TRANSPORT="dt_socket" + fi + if [ -z "$JPDA_ADDRESS" ]; then + JPDA_ADDRESS="localhost:8000" + fi + if [ -z "$JPDA_SUSPEND" ]; then + JPDA_SUSPEND="n" + fi + if [ -z "$JPDA_OPTS" ]; then + JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND" + fi + CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS" + shift +fi + +if [ "$1" = "debug" ] ; then + if $os400; then + echo "Debug command not available on OS400" + exit 1 + else + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Djava.security.manager \ + -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -classpath "$CLASSPATH" \ + -sourcepath "$CATALINA_HOME"/../../java \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMPDIR" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + fi + +elif [ "$1" = "run" ]; then + + shift + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + else + eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start + fi + +elif [ "$1" = "start" ] ; then + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + echo "Existing PID file found during start." + if [ -r "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + ps -p $PID >/dev/null 2>&1 + if [ $? -eq 0 ] ; then + echo "Tomcat appears to still be running with PID $PID. Start aborted." + echo "If the following process is not a Tomcat process, remove the PID file and try again:" + ps -f -p $PID + exit 1 + else + echo "Removing/clearing stale PID file." + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "Unable to remove or clear stale PID file. Start aborted." + exit 1 + fi + fi + fi + else + echo "Unable to read PID file. Start aborted." + exit 1 + fi + else + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ ! -w "$CATALINA_PID" ]; then + echo "Unable to remove or write to empty PID file. Start aborted." + exit 1 + fi + fi + fi + fi + fi + + shift + touch "$CATALINA_OUT" + if [ "$1" = "-security" ] ; then + if [ $have_tty -eq 1 ]; then + echo "Using Security Manager" + fi + shift + eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Djava.security.manager \ + -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + else + eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" start \ + >> "$CATALINA_OUT" 2>&1 "&" + + fi + + if [ ! -z "$CATALINA_PID" ]; then + echo $! > "$CATALINA_PID" + fi + + echo "Tomcat started." + +elif [ "$1" = "stop" ] ; then + + shift + + SLEEP=5 + if [ ! -z "$1" ]; then + echo $1 | grep "[^0-9]" >/dev/null 2>&1 + if [ $? -gt 0 ]; then + SLEEP=$1 + shift + fi + fi + + FORCE=0 + if [ "$1" = "-force" ]; then + shift + FORCE=1 + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + if [ -s "$CATALINA_PID" ]; then + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + echo "PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted." + exit 1 + fi + else + echo "PID file is empty and has been ignored." + fi + else + echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted." + exit 1 + fi + fi + + eval "\"$_RUNJAVA\"" $JAVA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap "$@" stop + + # stop failed. Shutdown port disabled? Try a normal kill. + if [ $? != 0 ]; then + if [ ! -z "$CATALINA_PID" ]; then + echo "The stop command failed. Attempting to signal the process to stop through OS signal." + kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1 + fi + fi + + if [ ! -z "$CATALINA_PID" ]; then + if [ -f "$CATALINA_PID" ]; then + while [ $SLEEP -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + # If Tomcat has stopped don't try and force a stop with an empty PID file + FORCE=0 + else + echo "The PID file could not be removed or cleared." + fi + fi + echo "Tomcat stopped." + break + fi + if [ $SLEEP -gt 0 ]; then + sleep 1 + fi + if [ $SLEEP -eq 0 ]; then + echo "Tomcat did not stop in time." + if [ $FORCE -eq 0 ]; then + echo "PID file was not removed." + fi + echo "To aid diagnostics a thread dump has been written to standard out." + kill -3 `cat "$CATALINA_PID"` + fi + SLEEP=`expr $SLEEP - 1 ` + done + fi + fi + + KILL_SLEEP_INTERVAL=5 + if [ $FORCE -eq 1 ]; then + if [ -z "$CATALINA_PID" ]; then + echo "Kill failed: \$CATALINA_PID not set" + else + if [ -f "$CATALINA_PID" ]; then + PID=`cat "$CATALINA_PID"` + echo "Killing Tomcat with the PID: $PID" + kill -9 $PID + while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do + kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1 + if [ $? -gt 0 ]; then + rm -f "$CATALINA_PID" >/dev/null 2>&1 + if [ $? != 0 ]; then + if [ -w "$CATALINA_PID" ]; then + cat /dev/null > "$CATALINA_PID" + else + echo "The PID file could not be removed." + fi + fi + echo "The Tomcat process has been killed." + break + fi + if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then + sleep 1 + fi + KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 ` + done + if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then + echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE." + fi + fi + fi + fi + +elif [ "$1" = "configtest" ] ; then + + eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \ + -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ + -classpath "\"$CLASSPATH\"" \ + -Dcatalina.base="\"$CATALINA_BASE\"" \ + -Dcatalina.home="\"$CATALINA_HOME\"" \ + -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ + org.apache.catalina.startup.Bootstrap configtest + result=$? + if [ $result -ne 0 ]; then + echo "Configuration error detected!" + fi + exit $result + +elif [ "$1" = "version" ] ; then + + "$_RUNJAVA" \ + -classpath "$CATALINA_HOME/lib/catalina.jar" \ + org.apache.catalina.util.ServerInfo + +else + + echo "Usage: catalina.sh ( commands ... )" + echo "commands:" + if $os400; then + echo " debug Start Catalina in a debugger (not available on OS400)" + echo " debug -security Debug Catalina with a security manager (not available on OS400)" + else + echo " debug Start Catalina in a debugger" + echo " debug -security Debug Catalina with a security manager" + fi + echo " jpda start Start Catalina under JPDA debugger" + echo " run Start Catalina in the current window" + echo " run -security Start in the current window with security manager" + echo " start Start Catalina in a separate window" + echo " start -security Start in a separate window with security manager" + echo " stop Stop Catalina, waiting up to 5 seconds for the process to end" + echo " stop n Stop Catalina, waiting up to n seconds for the process to end" + echo " stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running" + echo " stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running" + echo " configtest Run a basic syntax check on server.xml - check exit code for result" + echo " version What version of tomcat are you running?" + echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined" + exit 1 + +fi diff --git a/src/tomcat/bin/ciphers.bat b/src/tomcat/bin/ciphers.bat new file mode 100644 index 0000000000000000000000000000000000000000..914181bb19fa7d3c1f8bc14e542cd93c347fb088 --- /dev/null +++ b/src/tomcat/bin/ciphers.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Script to digest password using the algorithm specified +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\tool-wrapper.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/ciphers.sh b/src/tomcat/bin/ciphers.sh new file mode 100644 index 0000000000000000000000000000000000000000..d4a87b58739c0ee486d1ebeabddbdbaea3ce5191 --- /dev/null +++ b/src/tomcat/bin/ciphers.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Script to digest password using the algorithm specified +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=tool-wrapper.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" org.apache.tomcat.util.net.openssl.ciphers.OpenSSLCipherConfigurationParser "$@" diff --git a/src/tomcat/bin/commons-daemon.jar b/src/tomcat/bin/commons-daemon.jar new file mode 100644 index 0000000000000000000000000000000000000000..173f67f1a4aac760e8b41f5aabf7a1951e83f8e6 Binary files /dev/null and b/src/tomcat/bin/commons-daemon.jar differ diff --git a/src/tomcat/bin/configtest.bat b/src/tomcat/bin/configtest.bat new file mode 100644 index 0000000000000000000000000000000000000000..c26b65d05b804c97069160cc4dbc5a3fe3b59ef7 --- /dev/null +++ b/src/tomcat/bin/configtest.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Configuration test script for the CATALINA Server +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" configtest %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/configtest.sh b/src/tomcat/bin/configtest.sh new file mode 100644 index 0000000000000000000000000000000000000000..9a8ebffd73d12e8f768c5ca8eed3e452e920d125 --- /dev/null +++ b/src/tomcat/bin/configtest.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Configuration Test Script for the CATALINA Server +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=catalina.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" configtest "$@" diff --git a/src/tomcat/bin/daemon.sh b/src/tomcat/bin/daemon.sh new file mode 100644 index 0000000000000000000000000000000000000000..ef9f708b5d7b03a28ab543c2ea4ccb3d0cf40f45 --- /dev/null +++ b/src/tomcat/bin/daemon.sh @@ -0,0 +1,273 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ----------------------------------------------------------------------------- +# Commons Daemon wrapper script. +# ----------------------------------------------------------------------------- +# +# resolve links - $0 may be a softlink +ARG0="$0" +while [ -h "$ARG0" ]; do + ls=`ls -ld "$ARG0"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + ARG0="$link" + else + ARG0="`dirname $ARG0`/$link" + fi +done +DIRNAME="`dirname $ARG0`" +PROGRAM="`basename $ARG0`" +while [ ".$1" != . ] +do + case "$1" in + --java-home ) + JAVA_HOME="$2" + shift; shift; + continue + ;; + --catalina-home ) + CATALINA_HOME="$2" + shift; shift; + continue + ;; + --catalina-base ) + CATALINA_BASE="$2" + shift; shift; + continue + ;; + --catalina-pid ) + CATALINA_PID="$2" + shift; shift; + continue + ;; + --tomcat-user ) + TOMCAT_USER="$2" + shift; shift; + continue + ;; + --service-start-wait-time ) + SERVICE_START_WAIT_TIME="$2" + shift; shift; + continue + ;; + * ) + break + ;; + esac +done +# OS specific support (must be 'true' or 'false'). +cygwin=false; +darwin=false; +case "`uname`" in + CYGWIN*) + cygwin=true + ;; + Darwin*) + darwin=true + ;; +esac + +# Use the maximum available, or set MAX_FD != -1 to use that +test ".$MAX_FD" = . && MAX_FD="maximum" +# Setup parameters for running the jsvc +# +test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat +# Set JAVA_HOME to working JDK or JRE +# JAVA_HOME=/opt/jdk-1.6.0.22 +# If not set we'll try to guess the JAVA_HOME +# from java binary if on the PATH +# +if [ -z "$JAVA_HOME" ]; then + JAVA_BIN="`which java 2>/dev/null || type java 2>&1`" + while [ -h "$JAVA_BIN" ]; do + ls=`ls -ld "$JAVA_BIN"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + JAVA_BIN="$link" + else + JAVA_BIN="`dirname $JAVA_BIN`/$link" + fi + done + test -x "$JAVA_BIN" && JAVA_HOME="`dirname $JAVA_BIN`" + test ".$JAVA_HOME" != . && JAVA_HOME=`cd "$JAVA_HOME/.." >/dev/null; pwd` +else + JAVA_BIN="$JAVA_HOME/bin/java" +fi + +# Only set CATALINA_HOME if not already set +test ".$CATALINA_HOME" = . && CATALINA_HOME=`cd "$DIRNAME/.." >/dev/null; pwd` +test ".$CATALINA_BASE" = . && CATALINA_BASE="$CATALINA_HOME" +test ".$CATALINA_MAIN" = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap +# If not explicitly set, look for jsvc in CATALINA_BASE first then CATALINA_HOME +if [ -z "$JSVC" ]; then + JSVC="$CATALINA_BASE/bin/jsvc" + if [ ! -x "$JSVC" ]; then + JSVC="$CATALINA_HOME/bin/jsvc" + fi +fi +# Set the default service-start wait time if necessary +test ".$SERVICE_START_WAIT_TIME" = . && SERVICE_START_WAIT_TIME=10 + +# Ensure that any user defined CLASSPATH variables are not used on startup, +# but allow them to be specified in setenv.sh, in rare case when it is needed. +CLASSPATH= +JAVA_OPTS= +if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then + . "$CATALINA_BASE/bin/setenv.sh" +elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then + . "$CATALINA_HOME/bin/setenv.sh" +fi + +# Add on extra jar files to CLASSPATH +test ".$CLASSPATH" != . && CLASSPATH="${CLASSPATH}:" +CLASSPATH="$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar" + +test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina-daemon.out" +test ".$CATALINA_TMP" = . && CATALINA_TMP="$CATALINA_BASE/temp" + +# Add tomcat-juli.jar to classpath +# tomcat-juli.jar can be over-ridden per instance +if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then + CLASSPATH="$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar" +else + CLASSPATH="$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar" +fi +# Set juli LogManager config file if it is present and an override has not been issued +if [ -z "$LOGGING_CONFIG" ]; then + if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then + LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" + else + # Bugzilla 45585 + LOGGING_CONFIG="-Dnop" + fi +fi + +test ".$LOGGING_MANAGER" = . && LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" +JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER" + +# Set -pidfile +test ".$CATALINA_PID" = . && CATALINA_PID="$CATALINA_BASE/logs/catalina-daemon.pid" + +# Increase the maximum file descriptors if we can +if [ "$cygwin" = "false" ]; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ "$?" -eq 0 ]; then + # Darwin does not allow RLIMIT_INFINITY on file soft limit + if [ "$darwin" = "true" -a "$MAX_FD_LIMIT" = "unlimited" ]; then + MAX_FD_LIMIT=`/usr/sbin/sysctl -n kern.maxfilesperproc` + fi + test ".$MAX_FD" = ".maximum" && MAX_FD="$MAX_FD_LIMIT" + ulimit -n $MAX_FD + if [ "$?" -ne 0 ]; then + echo "$PROGRAM: Could not set maximum file descriptor limit: $MAX_FD" + fi + else + echo "$PROGRAM: Could not query system maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# Java 9 no longer supports the java.endorsed.dirs +# system property. Only try to use it if +# JAVA_ENDORSED_DIRS was explicitly set +# or CATALINA_HOME/endorsed exists. +ENDORSED_PROP=ignore.endorsed.dirs +if [ -n "$JAVA_ENDORSED_DIRS" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi +if [ -d "$CATALINA_HOME/endorsed" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi + +# ----- Execute The Requested Command ----------------------------------------- +case "$1" in + run ) + shift + "$JSVC" $* \ + $JSVC_OPTS \ + -java-home "$JAVA_HOME" \ + -pidfile "$CATALINA_PID" \ + -wait "$SERVICE_START_WAIT_TIME" \ + -nodetach \ + -outfile "&1" \ + -errfile "&2" \ + -classpath "$CLASSPATH" \ + "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMP" \ + $CATALINA_MAIN + exit $? + ;; + start ) + "$JSVC" $JSVC_OPTS \ + -java-home "$JAVA_HOME" \ + -user $TOMCAT_USER \ + -pidfile "$CATALINA_PID" \ + -wait "$SERVICE_START_WAIT_TIME" \ + -outfile "$CATALINA_OUT" \ + -errfile "&1" \ + -classpath "$CLASSPATH" \ + "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMP" \ + $CATALINA_MAIN + exit $? + ;; + stop ) + "$JSVC" $JSVC_OPTS \ + -stop \ + -pidfile "$CATALINA_PID" \ + -classpath "$CLASSPATH" \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -Dcatalina.base="$CATALINA_BASE" \ + -Dcatalina.home="$CATALINA_HOME" \ + -Djava.io.tmpdir="$CATALINA_TMP" \ + $CATALINA_MAIN + exit $? + ;; + version ) + "$JSVC" \ + -java-home "$JAVA_HOME" \ + -pidfile "$CATALINA_PID" \ + -classpath "$CLASSPATH" \ + -errfile "&2" \ + -version \ + -check \ + $CATALINA_MAIN + if [ "$?" = 0 ]; then + "$JAVA_BIN" \ + -classpath "$CATALINA_HOME/lib/catalina.jar" \ + org.apache.catalina.util.ServerInfo + fi + exit $? + ;; + * ) + echo "Unknown command: \`$1'" + echo "Usage: $PROGRAM ( commands ... )" + echo "commands:" + echo " run Start Tomcat without detaching from console" + echo " start Start Tomcat" + echo " stop Stop Tomcat" + echo " version What version of commons daemon and Tomcat" + echo " are you running?" + exit 1 + ;; +esac diff --git a/src/tomcat/bin/digest.bat b/src/tomcat/bin/digest.bat new file mode 100644 index 0000000000000000000000000000000000000000..2c1ffaec2d79a4a5680316f7ef94d0f7a82f0174 --- /dev/null +++ b/src/tomcat/bin/digest.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Script to digest password using the algorithm specified +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\tool-wrapper.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" -server org.apache.catalina.realm.RealmBase %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/digest.sh b/src/tomcat/bin/digest.sh new file mode 100644 index 0000000000000000000000000000000000000000..62ed5d0a1e7cfe89eea66b62a2343d57ed1cfa34 --- /dev/null +++ b/src/tomcat/bin/digest.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Script to digest password using the algorithm specified +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=tool-wrapper.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" -server org.apache.catalina.realm.RealmBase "$@" diff --git a/src/tomcat/bin/setclasspath.bat b/src/tomcat/bin/setclasspath.bat new file mode 100644 index 0000000000000000000000000000000000000000..f67464ab0b18f63bec1dcd40d5b091a3b3a4b148 --- /dev/null +++ b/src/tomcat/bin/setclasspath.bat @@ -0,0 +1,96 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings +rem are valid and consistent with the selected start-up options and set up the +rem endorsed directory. +rem --------------------------------------------------------------------------- + +rem Make sure prerequisite environment variables are set + +rem In debug mode we need a real JDK (JAVA_HOME) +if ""%1"" == ""debug"" goto needJavaHome + +rem Otherwise either JRE or JDK are fine +if not "%JRE_HOME%" == "" goto gotJreHome +if not "%JAVA_HOME%" == "" goto gotJavaHome +echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined +echo At least one of these environment variable is needed to run this program +goto exit + +:needJavaHome +rem Check if we have a usable JDK +if "%JAVA_HOME%" == "" goto noJavaHome +if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome +if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome +if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome +if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome +set "JRE_HOME=%JAVA_HOME%" +goto okJava + +:noJavaHome +echo The JAVA_HOME environment variable is not defined correctly. +echo It is needed to run this program in debug mode. +echo NB: JAVA_HOME should point to a JDK not a JRE. +goto exit + +:gotJavaHome +rem No JRE given, use JAVA_HOME as JRE_HOME +set "JRE_HOME=%JAVA_HOME%" + +:gotJreHome +rem Check if we have a usable JRE +if not exist "%JRE_HOME%\bin\java.exe" goto noJreHome +if not exist "%JRE_HOME%\bin\javaw.exe" goto noJreHome +goto okJava + +:noJreHome +rem Needed at least a JRE +echo The JRE_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto exit + +:okJava +rem Don't override the endorsed dir if the user has set it previously +if not "%JAVA_ENDORSED_DIRS%" == "" goto gotEndorseddir +rem Java 9 no longer supports the java.endorsed.dirs +rem system property. Only try to use it if +rem CATALINA_HOME/endorsed exists. +if not exist "%CATALINA_HOME%\endorsed" goto gotEndorseddir +set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed" +:gotEndorseddir + +rem Don't override _RUNJAVA if the user has set it previously +if not "%_RUNJAVA%" == "" goto gotRunJava +rem Set standard command for invoking Java. +rem Also note the quoting as JRE_HOME may contain spaces. +set _RUNJAVA="%JRE_HOME%\bin\java.exe" +:gotRunJava + +rem Don't override _RUNJDB if the user has set it previously +rem Also note the quoting as JAVA_HOME may contain spaces. +if not "%_RUNJDB%" == "" goto gotRunJdb +set _RUNJDB="%JAVA_HOME%\bin\jdb.exe" +:gotRunJdb + +goto end + +:exit +exit /b 1 + +:end +exit /b 0 diff --git a/src/tomcat/bin/setclasspath.sh b/src/tomcat/bin/setclasspath.sh new file mode 100644 index 0000000000000000000000000000000000000000..5232b8e24b84228f7471367feee006d779d3555f --- /dev/null +++ b/src/tomcat/bin/setclasspath.sh @@ -0,0 +1,98 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings +# are valid and consistent with the selected start-up options and set up the +# endorsed directory. +# ----------------------------------------------------------------------------- + +# Make sure prerequisite environment variables are set +if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then + if $darwin; then + # Bugzilla 54390 + if [ -x '/usr/libexec/java_home' ] ; then + export JAVA_HOME=`/usr/libexec/java_home` + # Bugzilla 37284 (reviewed). + elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then + export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" + fi + else + JAVA_PATH=`which java 2>/dev/null` + if [ "x$JAVA_PATH" != "x" ]; then + JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null` + JRE_HOME=`dirname $JAVA_PATH 2>/dev/null` + fi + if [ "x$JRE_HOME" = "x" ]; then + # XXX: Should we try other locations? + if [ -x /usr/bin/java ]; then + JRE_HOME=/usr + fi + fi + fi + if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then + echo "Neither the JAVA_HOME nor the JRE_HOME environment variable is defined" + echo "At least one of these environment variable is needed to run this program" + exit 1 + fi +fi +if [ -z "$JAVA_HOME" -a "$1" = "debug" ]; then + echo "JAVA_HOME should point to a JDK in order to run in debug mode." + exit 1 +fi +if [ -z "$JRE_HOME" ]; then + JRE_HOME="$JAVA_HOME" +fi + +# If we're running under jdb, we need a full jdk. +if [ "$1" = "debug" ] ; then + if [ "$os400" = "true" ]; then + if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/javac ]; then + echo "The JAVA_HOME environment variable is not defined correctly" + echo "This environment variable is needed to run this program" + echo "NB: JAVA_HOME should point to a JDK not a JRE" + exit 1 + fi + else + if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/jdb -o ! -x "$JAVA_HOME"/bin/javac ]; then + echo "The JAVA_HOME environment variable is not defined correctly" + echo "This environment variable is needed to run this program" + echo "NB: JAVA_HOME should point to a JDK not a JRE" + exit 1 + fi + fi +fi + +# Don't override the endorsed dir if the user has set it previously +if [ -z "$JAVA_ENDORSED_DIRS" ]; then + # Java 9 no longer supports the java.endorsed.dirs + # system property. Only try to use it if + # CATALINA_HOME/endorsed exists. + if [ -d "$CATALINA_HOME"/endorsed ]; then + JAVA_ENDORSED_DIRS="$CATALINA_HOME"/endorsed + fi +fi + +# Set standard commands for invoking Java, if not already set. +if [ -z "$_RUNJAVA" ]; then + _RUNJAVA="$JRE_HOME"/bin/java +fi +if [ "$os400" != "true" ]; then + if [ -z "$_RUNJDB" ]; then + _RUNJDB="$JAVA_HOME"/bin/jdb + fi +fi diff --git a/src/tomcat/bin/shutdown.bat b/src/tomcat/bin/shutdown.bat new file mode 100644 index 0000000000000000000000000000000000000000..d7040e32bd87f38068c17feb866a82b7cec768e3 --- /dev/null +++ b/src/tomcat/bin/shutdown.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Stop script for the CATALINA Server +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" stop %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/shutdown.sh b/src/tomcat/bin/shutdown.sh new file mode 100644 index 0000000000000000000000000000000000000000..cd0c97dc21212db9bd37d81d236276debd7e41b6 --- /dev/null +++ b/src/tomcat/bin/shutdown.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Stop script for the CATALINA Server +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=catalina.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" stop "$@" diff --git a/src/tomcat/bin/startup.bat b/src/tomcat/bin/startup.bat new file mode 100644 index 0000000000000000000000000000000000000000..8c8f6632c9971745e0721a76261cf641754c7db5 --- /dev/null +++ b/src/tomcat/bin/startup.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Start script for the CATALINA Server +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" start %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/startup.sh b/src/tomcat/bin/startup.sh new file mode 100644 index 0000000000000000000000000000000000000000..7b102875486fc476784803d4bc56121c70486768 --- /dev/null +++ b/src/tomcat/bin/startup.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Start Script for the CATALINA Server +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=catalina.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" start "$@" diff --git a/src/tomcat/bin/tomcat-juli.jar b/src/tomcat/bin/tomcat-juli.jar new file mode 100644 index 0000000000000000000000000000000000000000..0dc29e6ba0af8ece4d615d1e758add4fd532b819 Binary files /dev/null and b/src/tomcat/bin/tomcat-juli.jar differ diff --git a/src/tomcat/bin/tool-wrapper.bat b/src/tomcat/bin/tool-wrapper.bat new file mode 100644 index 0000000000000000000000000000000000000000..94de4fe32670735c1079509da763d4cde61a1134 --- /dev/null +++ b/src/tomcat/bin/tool-wrapper.bat @@ -0,0 +1,110 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Wrapper script for command line tools +rem +rem Environment Variable Prerequisites +rem +rem CATALINA_HOME May point at your Catalina "build" directory. +rem +rem TOOL_OPTS (Optional) Java runtime options. +rem +rem JAVA_HOME Must point at your Java Development Kit installation. +rem Using JRE_HOME instead works as well. +rem +rem JRE_HOME Must point at your Java Runtime installation. +rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME +rem are both set, JRE_HOME is used. +rem +rem JAVA_OPTS (Optional) Java runtime options. +rem +rem JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories +rem containing some jars in order to allow replacement of APIs +rem created outside of the JCP (i.e. DOM and SAX from W3C). +rem It can also be used to update the XML parser implementation. +rem This is only supported for Java <= 8. +rem Defaults to $CATALINA_HOME/endorsed. +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +rem Ensure that any user defined CLASSPATH variables are not used on startup, +rem but allow them to be specified in setenv.bat, in rare case when it is needed. +set CLASSPATH= + +rem Get standard environment variables +if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" + +rem Get standard Java environment variables +if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath +echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat" +echo This file is needed to run this program +goto end +:okSetclasspath +call "%CATALINA_HOME%\bin\setclasspath.bat" %1 +if errorlevel 1 goto end + +rem Add on extra jar files to CLASSPATH +rem Note that there are no quotes as we do not want to introduce random +rem quotes into the CLASSPATH +if "%CLASSPATH%" == "" goto emptyClasspath +set "CLASSPATH=%CLASSPATH%;" +:emptyClasspath +set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\tomcat-juli.jar;%CATALINA_HOME%\lib\servlet-api.jar;%CATALINA_HOME%\lib\tomcat-util.jar" + +set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager + +rem Java 9 no longer supports the java.endorsed.dirs +rem system property. Only try to use it if +rem JAVA_ENDORSED_DIRS was explicitly set +rem or CATALINA_HOME/endorsed exists. +set ENDORSED_PROP=ignore.endorsed.dirs +if "%JAVA_ENDORSED_DIRS%" == "" goto noEndorsedVar +set ENDORSED_PROP=java.endorsed.dirs +goto doneEndorsed +:noEndorsedVar +if not exist "%CATALINA_HOME%\endorsed" goto doneEndorsed +set ENDORSED_PROP=java.endorsed.dirs +:doneEndorsed + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +%_RUNJAVA% %JAVA_OPTS% %TOOL_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.home="%CATALINA_HOME%" org.apache.catalina.startup.Tool %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/tool-wrapper.sh b/src/tomcat/bin/tool-wrapper.sh new file mode 100644 index 0000000000000000000000000000000000000000..99dd2094a1dd7861e6d52e8c87f3966e8612db27 --- /dev/null +++ b/src/tomcat/bin/tool-wrapper.sh @@ -0,0 +1,153 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Wrapper script for command line tools +# +# Environment Variable Prerequisites +# +# CATALINA_HOME May point at your Catalina "build" directory. +# +# TOOL_OPTS (Optional) Java runtime options. +# +# JAVA_HOME Must point at your Java Development Kit installation. +# Using JRE_HOME instead works as well. +# +# JRE_HOME Must point at your Java Runtime installation. +# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME +# are both set, JRE_HOME is used. +# +# JAVA_OPTS (Optional) Java runtime options. +# +# JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories +# containing some jars in order to allow replacement of APIs +# created outside of the JCP (i.e. DOM and SAX from W3C). +# It can also be used to update the XML parser implementation. +# This is only supported for Java <= 8. +# Defaults to $CATALINA_HOME/endorsed. +# ----------------------------------------------------------------------------- + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +os400=false +case "`uname`" in +CYGWIN*) cygwin=true;; +Darwin*) darwin=true;; +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ]; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +# Get standard environment variables +PRGDIR=`dirname "$PRG"` + +# Only set CATALINA_HOME if not already set +[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` + +# Ensure that any user defined CLASSPATH variables are not used on startup, +# but allow them to be specified in setenv.sh, in rare case when it is needed. +CLASSPATH= + +if [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then + . "$CATALINA_HOME/bin/setenv.sh" +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"` + [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"` + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For OS400 +if $os400; then + # Set job priority to standard for interactive (interactive - 6) by using + # the interactive priority - 6, the helper threads that respond to requests + # will be running at the same priority as interactive jobs. + COMMAND='chgjob job('$JOBNAME') runpty(6)' + system $COMMAND + + # Enable multi threading + export QIBM_MULTI_THREADED=Y +fi + +# Get standard Java environment variables +if $os400; then + # -r will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + . "$CATALINA_HOME"/bin/setclasspath.sh +else + if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then + . "$CATALINA_HOME"/bin/setclasspath.sh + else + echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh" + echo "This file is needed to run this program" + exit 1 + fi +fi + +# Add on extra jar files to CLASSPATH +if [ ! -z "$CLASSPATH" ] ; then + CLASSPATH="$CLASSPATH": +fi +CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar:"$CATALINA_HOME"/bin/tomcat-juli.jar:"$CATALINA_HOME"/lib/servlet-api.jar:"$CATALINA_HOME"/lib/tomcat-util.jar + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` + JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"` + CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` +fi + +# Java 9 no longer supports the java.endorsed.dirs +# system property. Only try to use it if +# JAVA_ENDORSED_DIRS was explicitly set +# or CATALINA_HOME/endorsed exists. +ENDORSED_PROP=ignore.endorsed.dirs +if [ -n "$JAVA_ENDORSED_DIRS" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi +if [ -d "$CATALINA_HOME/endorsed" ]; then + ENDORSED_PROP=java.endorsed.dirs +fi + +JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" + +# ----- Execute The Requested Command ----------------------------------------- + +exec "$_RUNJAVA" $JAVA_OPTS $TOOL_OPTS \ + -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ + -classpath "$CLASSPATH" \ + -Dcatalina.home="$CATALINA_HOME" \ + org.apache.catalina.startup.Tool "$@" diff --git a/src/tomcat/bin/version.bat b/src/tomcat/bin/version.bat new file mode 100644 index 0000000000000000000000000000000000000000..6c807bb9d3e3fc431eb4faa526c0b1cca2084a10 --- /dev/null +++ b/src/tomcat/bin/version.bat @@ -0,0 +1,58 @@ +@echo off +rem Licensed to the Apache Software Foundation (ASF) under one or more +rem contributor license agreements. See the NOTICE file distributed with +rem this work for additional information regarding copyright ownership. +rem The ASF licenses this file to You under the Apache License, Version 2.0 +rem (the "License"); you may not use this file except in compliance with +rem the License. You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + +rem --------------------------------------------------------------------------- +rem Version script for the CATALINA Server +rem --------------------------------------------------------------------------- + +setlocal + +rem Guess CATALINA_HOME if not defined +set "CURRENT_DIR=%cd%" +if not "%CATALINA_HOME%" == "" goto gotHome +set "CATALINA_HOME=%CURRENT_DIR%" +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +cd .. +set "CATALINA_HOME=%cd%" +cd "%CURRENT_DIR%" +:gotHome +if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome +echo The CATALINA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end +:okHome + +set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" + +rem Check that target executable exists +if exist "%EXECUTABLE%" goto okExec +echo Cannot find "%EXECUTABLE%" +echo This file is needed to run this program +goto end +:okExec + +rem Get remaining unshifted command line arguments and save them in the +set CMD_LINE_ARGS= +:setArgs +if ""%1""=="""" goto doneSetArgs +set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 +shift +goto setArgs +:doneSetArgs + +call "%EXECUTABLE%" version %CMD_LINE_ARGS% + +:end diff --git a/src/tomcat/bin/version.sh b/src/tomcat/bin/version.sh new file mode 100644 index 0000000000000000000000000000000000000000..1cb19bdaa0a164b637410f8d48a08788c3d0b6ac --- /dev/null +++ b/src/tomcat/bin/version.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ----------------------------------------------------------------------------- +# Version Script for the CATALINA Server +# ----------------------------------------------------------------------------- + +# Better OS/400 detection: see Bugzilla 31132 +os400=false +case "`uname`" in +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +PRGDIR=`dirname "$PRG"` +EXECUTABLE=catalina.sh + +# Check that target executable exists +if $os400; then + # -x will Only work on the os400 if the files are: + # 1. owned by the user + # 2. owned by the PRIMARY group of the user + # this will not work if the user belongs in secondary groups + eval +else + if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then + echo "Cannot find $PRGDIR/$EXECUTABLE" + echo "The file is absent or does not have execute permission" + echo "This file is needed to run this program" + exit 1 + fi +fi + +exec "$PRGDIR"/"$EXECUTABLE" version "$@" diff --git a/src/tomcat/conf/catalina.policy b/src/tomcat/conf/catalina.policy new file mode 100644 index 0000000000000000000000000000000000000000..ca481788a3bd6be1724515ebe0e21cd7f1be8620 --- /dev/null +++ b/src/tomcat/conf/catalina.policy @@ -0,0 +1,274 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ============================================================================ +// catalina.policy - Security Policy Permissions for Tomcat +// +// This file contains a default set of security policies to be enforced (by the +// JVM) when Catalina is executed with the "-security" option. In addition +// to the permissions granted here, the following additional permissions are +// granted to each web application: +// +// * Read access to the web application's document root directory +// * Read, write and delete access to the web application's working directory +// ============================================================================ + + +// ========== SYSTEM CODE PERMISSIONS ========================================= + + +// These permissions apply to javac +grant codeBase "file:${java.home}/lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions +grant codeBase "file:${java.home}/jre/lib/ext/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/../lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions when +// ${java.home} points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/lib/ext/-" { + permission java.security.AllPermission; +}; + + +// ========== CATALINA CODE PERMISSIONS ======================================= + + +// These permissions apply to the daemon code +grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the logging API +// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home}, +// update this section accordingly. +// grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..} +grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" { + permission java.io.FilePermission + "${java.home}${file.separator}lib${file.separator}logging.properties", "read"; + + permission java.io.FilePermission + "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read"; + permission java.io.FilePermission + "${catalina.base}${file.separator}logs", "read, write"; + permission java.io.FilePermission + "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete"; + + permission java.lang.RuntimePermission "shutdownHooks"; + permission java.lang.RuntimePermission "getClassLoader"; + permission java.lang.RuntimePermission "setContextClassLoader"; + + permission java.lang.management.ManagementPermission "monitor"; + + permission java.util.logging.LoggingPermission "control"; + + permission java.util.PropertyPermission "java.util.logging.config.class", "read"; + permission java.util.PropertyPermission "java.util.logging.config.file", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncLoggerPollInterval", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncMaxRecordCount", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncOverflowDropType", "read"; + permission java.util.PropertyPermission "org.apache.juli.ClassLoaderLogManager.debug", "read"; + permission java.util.PropertyPermission "catalina.base", "read"; + + // Note: To enable per context logging configuration, permit read access to + // the appropriate file. Be sure that the logging configuration is + // secure before enabling such access. + // E.g. for the examples web application (uncomment and unwrap + // the following to be on a single line): + // permission java.io.FilePermission "${catalina.base}${file.separator} + // webapps${file.separator}examples${file.separator}WEB-INF + // ${file.separator}classes${file.separator}logging.properties", "read"; +}; + +// These permissions apply to the server startup code +grant codeBase "file:${catalina.home}/bin/bootstrap.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the servlet API classes +// and those that are shared across all class loaders +// located in the "lib" directory +grant codeBase "file:${catalina.home}/lib/-" { + permission java.security.AllPermission; +}; + + +// If using a per instance lib directory, i.e. ${catalina.base}/lib, +// then the following permission will need to be uncommented +// grant codeBase "file:${catalina.base}/lib/-" { +// permission java.security.AllPermission; +// }; + + +// ========== WEB APPLICATION PERMISSIONS ===================================== + + +// These permissions are granted by default to all web applications +// In addition, a web application will be given a read FilePermission +// for all files and directories in its document root. +grant { + // Required for JNDI lookup of named JDBC DataSource's and + // javamail named MimePart DataSource used to send mail + permission java.util.PropertyPermission "java.home", "read"; + permission java.util.PropertyPermission "java.naming.*", "read"; + permission java.util.PropertyPermission "javax.sql.*", "read"; + + // OS Specific properties to allow read access + permission java.util.PropertyPermission "os.name", "read"; + permission java.util.PropertyPermission "os.version", "read"; + permission java.util.PropertyPermission "os.arch", "read"; + permission java.util.PropertyPermission "file.separator", "read"; + permission java.util.PropertyPermission "path.separator", "read"; + permission java.util.PropertyPermission "line.separator", "read"; + + // JVM properties to allow read access + permission java.util.PropertyPermission "java.version", "read"; + permission java.util.PropertyPermission "java.vendor", "read"; + permission java.util.PropertyPermission "java.vendor.url", "read"; + permission java.util.PropertyPermission "java.class.version", "read"; + permission java.util.PropertyPermission "java.specification.version", "read"; + permission java.util.PropertyPermission "java.specification.vendor", "read"; + permission java.util.PropertyPermission "java.specification.name", "read"; + + permission java.util.PropertyPermission "java.vm.specification.version", "read"; + permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; + permission java.util.PropertyPermission "java.vm.specification.name", "read"; + permission java.util.PropertyPermission "java.vm.version", "read"; + permission java.util.PropertyPermission "java.vm.vendor", "read"; + permission java.util.PropertyPermission "java.vm.name", "read"; + + // Required for OpenJMX + permission java.lang.RuntimePermission "getAttribute"; + + // Allow read of JAXP compliant XML parser debug + permission java.util.PropertyPermission "jaxp.debug", "read"; + + // All JSPs need to be able to read this package + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat"; + + // Precompiled JSPs need access to these packages. + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime"; + permission java.lang.RuntimePermission + "accessClassInPackage.org.apache.jasper.runtime.*"; + + // Precompiled JSPs need access to these system properties. + permission java.util.PropertyPermission + "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read"; + permission java.util.PropertyPermission + "org.apache.el.parser.COERCE_TO_ZERO", "read"; + + // The cookie code needs these. + permission java.util.PropertyPermission + "org.apache.catalina.STRICT_SERVLET_COMPLIANCE", "read"; + permission java.util.PropertyPermission + "org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING", "read"; + permission java.util.PropertyPermission + "org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR", "read"; + + // Applications using WebSocket need to be able to access these packages + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server"; +}; + + +// The Manager application needs access to the following packages to support the +// session display functionality. It also requires the custom Tomcat +// DeployXmlPermission to enable the use of META-INF/context.xml +// These settings support the following configurations: +// - default CATALINA_HOME == CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME +grant codeBase "file:${catalina.base}/webapps/manager/-" { + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util"; + permission org.apache.catalina.security.DeployXmlPermission "manager"; +}; +grant codeBase "file:${catalina.home}/webapps/manager/-" { + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util"; + permission org.apache.catalina.security.DeployXmlPermission "manager"; +}; + +// The Host Manager application needs the custom Tomcat DeployXmlPermission to +// enable the use of META-INF/context.xml +// These settings support the following configurations: +// - default CATALINA_HOME == CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, per instance Host Manager in CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, shared Host Manager in CATALINA_HOME +grant codeBase "file:${catalina.base}/webapps/host-manager/-" { + permission org.apache.catalina.security.DeployXmlPermission "host-manager"; +}; +grant codeBase "file:${catalina.home}/webapps/host-manager/-" { + permission org.apache.catalina.security.DeployXmlPermission "host-manager"; +}; + + +// You can assign additional permissions to particular web applications by +// adding additional "grant" entries here, based on the code base for that +// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files. +// +// Different permissions can be granted to JSP pages, classes loaded from +// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/ +// directory, or even to individual jar files in the /WEB-INF/lib/ directory. +// +// For instance, assume that the standard "examples" application +// included a JDBC driver that needed to establish a network connection to the +// corresponding database and used the scrape taglib to get the weather from +// the NOAA web server. You might create a "grant" entries like this: +// +// The permissions granted to the context root directory apply to JSP pages. +// grant codeBase "file:${catalina.base}/webapps/examples/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; +// +// The permissions granted to the context WEB-INF/classes directory +// grant codeBase "file:${catalina.base}/webapps/examples/WEB-INF/classes/-" { +// }; +// +// The permission granted to your JDBC driver +// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// }; +// The permission granted to the scrape taglib +// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-" { +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; + +// To grant permissions for web applications using packed WAR files, use the +// Tomcat specific WAR url scheme. +// +// The permissions granted to the entire web application +// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" { +// }; +// +// The permissions granted to a specific JAR +// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" { +// }; \ No newline at end of file diff --git a/src/tomcat/conf/catalina.properties b/src/tomcat/conf/catalina.properties new file mode 100644 index 0000000000000000000000000000000000000000..f1913e7dad2279b49ea5defb8ca37fdadc09b637 --- /dev/null +++ b/src/tomcat/conf/catalina.properties @@ -0,0 +1,148 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageAccess unless the +# corresponding RuntimePermission ("accessClassInPackage."+package) has +# been granted. +package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat. +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageDefinition unless the +# corresponding RuntimePermission ("defineClassInPackage."+package) has +# been granted. +# +# by default, no packages are restricted for definition, and none of +# the class loaders supplied with the JDK call checkPackageDefinition. +# +package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,\ +org.apache.jasper.,org.apache.naming.,org.apache.tomcat. + +# +# +# List of comma-separated paths defining the contents of the "common" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. +# If left as blank,the JVM system loader will be used as Catalina's "common" +# loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# +# Note: Values are enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" + +# +# List of comma-separated paths defining the contents of the "server" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. +# If left as blank, the "common" loader will be used as Catalina's "server" +# loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# +# Note: Values may be enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +server.loader= + +# +# List of comma-separated paths defining the contents of the "shared" +# classloader. Prefixes should be used to define what is the repository type. +# Path may be relative to the CATALINA_BASE path or absolute. If left as blank, +# the "common" loader will be used as Catalina's "shared" loader. +# Examples: +# "foo": Add this folder as a class repository +# "foo/*.jar": Add all the JARs of the specified folder as class +# repositories +# "foo/bar.jar": Add bar.jar as a class repository +# Please note that for single jars, e.g. bar.jar, you need the URL form +# starting with file:. +# +# Note: Values may be enclosed in double quotes ("...") in case either the +# ${catalina.base} path or the ${catalina.home} path contains a comma. +# Because double quotes are used for quoting, the double quote character +# may not appear in a path. +shared.loader= + +# Default list of JAR files that should not be scanned using the JarScanner +# functionality. This is typically used to scan JARs for configuration +# information. JARs that do not contain such information may be excluded from +# the scan to speed up the scanning process. This is the default list. JARs on +# this list are excluded from all scans. The list must be a comma separated list +# of JAR file names. +# The list of JARs to skip may be over-ridden at a Context level for individual +# scan types by configuring a JarScanner with a nested JarScanFilter. +# The JARs listed below include: +# - Tomcat Bootstrap JARs +# - Tomcat API JARs +# - Catalina JARs +# - Jasper JARs +# - Tomcat JARs +# - Common non-Tomcat JARs +# - Test JARs (JUnit, Cobertura and dependencies) +tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\ +bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\ +annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,\ +jaspic-api.jar,\ +catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,\ +catalina-tribes.jar,\ +jasper.jar,jasper-el.jar,ecj-*.jar,\ +tomcat-api.jar,tomcat-util.jar,tomcat-util-scan.jar,tomcat-coyote.jar,\ +tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,\ +tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\ +tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\ +tomcat-jdbc.jar,\ +tools.jar,\ +commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\ +commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\ +commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\ +commons-math*.jar,commons-pool*.jar,\ +jstl.jar,taglibs-standard-spec-*.jar,\ +geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\ +ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\ +jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\ +xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\ +junit.jar,junit-*.jar,hamcrest-*.jar,easymock-*.jar,cglib-*.jar,\ +objenesis-*.jar,ant-launcher.jar,\ +cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom-*.jar,\ +jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,\ +xom-*.jar + +# Default list of JAR files that should be scanned that overrides the default +# jarsToSkip list above. This is typically used to include a specific JAR that +# has been excluded by a broad file name pattern in the jarsToSkip list. +# The list of JARs to scan may be over-ridden at a Context level for individual +# scan types by configuring a JarScanner with a nested JarScanFilter. +tomcat.util.scan.StandardJarScanFilter.jarsToScan=\ +log4j-web*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar + +# String cache configuration. +tomcat.util.buf.StringCache.byte.enabled=true +#tomcat.util.buf.StringCache.char.enabled=true +#tomcat.util.buf.StringCache.trainThreshold=500000 +#tomcat.util.buf.StringCache.cacheSize=5000 diff --git a/src/tomcat/conf/context.xml b/src/tomcat/conf/context.xml new file mode 100644 index 0000000000000000000000000000000000000000..4f6fc0cd977997a5644b993e91ed5eca49f48033 --- /dev/null +++ b/src/tomcat/conf/context.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- The contents of this file will be loaded for each web application --> +<Context> + + <!-- Default set of monitored resources. If one of these changes, the --> + <!-- web application will be reloaded. --> + <WatchedResource>WEB-INF/web.xml</WatchedResource> + <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource> + <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> + + <!-- Uncomment this to disable session persistence across Tomcat restarts --> + <!-- + <Manager pathname="" /> + --> +</Context> diff --git a/src/tomcat/conf/jaspic-providers.xml b/src/tomcat/conf/jaspic-providers.xml new file mode 100644 index 0000000000000000000000000000000000000000..cdebf872537969aba60edf8bf44029e4441925da --- /dev/null +++ b/src/tomcat/conf/jaspic-providers.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<jaspic-providers xmlns="http://tomcat.apache.org/xml" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://tomcat.apache.org/xml jaspic-providers.xsd" + version="1.0"> + <!-- No JASPIC providers configured by default --> +</jaspic-providers> diff --git a/src/tomcat/conf/jaspic-providers.xsd b/src/tomcat/conf/jaspic-providers.xsd new file mode 100644 index 0000000000000000000000000000000000000000..1004a119149188c54a4ff541fbdd87553fe768da --- /dev/null +++ b/src/tomcat/conf/jaspic-providers.xsd @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tomcat.apache.org/xml" + xmlns:jaspic="http://tomcat.apache.org/xml" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" + attributeFormDefault="unqualified" + version="1.0"> + <xs:element name="jaspic-providers"> + <xs:complexType> + <xs:sequence> + <xs:element name="provider" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" use="required" type="jaspic:propertyname" /> + <xs:attribute name="value" use="required" type="xs:string" /> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="className" type="xs:string" /> + <xs:attribute name="layer" type="xs:string" /> + <xs:attribute name="appContext" type="xs:string" /> + <xs:attribute name="description" type="xs:string" /> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="version" type="xs:string" /> + </xs:complexType> + </xs:element> + <xs:simpleType name="propertyname"> + <xs:restriction base="xs:string"> + <xs:minLength value="1"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> \ No newline at end of file diff --git a/src/tomcat/conf/logging.properties b/src/tomcat/conf/logging.properties new file mode 100644 index 0000000000000000000000000000000000000000..39edff659628719996c115258c54478e993c467a --- /dev/null +++ b/src/tomcat/conf/logging.properties @@ -0,0 +1,74 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler + +.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +1catalina.org.apache.juli.AsyncFileHandler.level = FINE +1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs +1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. +1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90 + +2localhost.org.apache.juli.AsyncFileHandler.level = FINE +2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs +2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. +2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90 + +3manager.org.apache.juli.AsyncFileHandler.level = FINE +3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs +3manager.org.apache.juli.AsyncFileHandler.prefix = manager. +3manager.org.apache.juli.AsyncFileHandler.maxDays = 90 + +4host-manager.org.apache.juli.AsyncFileHandler.level = FINE +4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs +4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. +4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90 + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter + + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler + +# For example, set the org.apache.catalina.util.LifecycleBase logger to log +# each component that extends LifecycleBase changing state: +#org.apache.catalina.util.LifecycleBase.level = FINE + +# To see debug messages in TldLocationsCache, uncomment the following line: +#org.apache.jasper.compiler.TldLocationsCache.level = FINE + +# To see debug messages for HTTP/2 handling, uncomment the following line: +#org.apache.coyote.http2.level = FINE + +# To see debug messages for WebSocket handling, uncomment the following line: +#org.apache.tomcat.websocket.level = FINE diff --git a/src/tomcat/conf/server.xml b/src/tomcat/conf/server.xml new file mode 100644 index 0000000000000000000000000000000000000000..fce8922b01942ac2387dedec4c88e4ab9404be3c --- /dev/null +++ b/src/tomcat/conf/server.xml @@ -0,0 +1,167 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Note: A "Server" is not itself a "Container", so you may not + define subcomponents such as "Valves" at this level. + Documentation at /docs/config/server.html + --> +<Server port="8005" shutdown="SHUTDOWN"> + <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> + <!-- Security listener. Documentation at /docs/config/listeners.html + <Listener className="org.apache.catalina.security.SecurityListener" /> + --> + <!--APR library loader. Documentation at /docs/apr.html --> + <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> + <!-- Prevent memory leaks due to use of particular java/javax APIs--> + <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> + <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> + <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> + + <!-- Global JNDI resources + Documentation at /docs/jndi-resources-howto.html + --> + <GlobalNamingResources> + <!-- Editable user database that can also be used by + UserDatabaseRealm to authenticate users + --> + <Resource name="UserDatabase" auth="Container" + type="org.apache.catalina.UserDatabase" + description="User database that can be updated and saved" + factory="org.apache.catalina.users.MemoryUserDatabaseFactory" + pathname="conf/tomcat-users.xml" /> + </GlobalNamingResources> + + <!-- A "Service" is a collection of one or more "Connectors" that share + a single "Container" Note: A "Service" is not itself a "Container", + so you may not define subcomponents such as "Valves" at this level. + Documentation at /docs/config/service.html + --> + <Service name="Catalina"> + + <!--The connectors can use a shared executor, you can define one or more named thread pools--> + <!-- + <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" + maxThreads="150" minSpareThreads="4"/> + --> + + + <!-- A "Connector" represents an endpoint by which requests are received + and responses are returned. Documentation at : + Java HTTP Connector: /docs/config/http.html + Java AJP Connector: /docs/config/ajp.html + APR (HTTP/AJP) Connector: /docs/apr.html + Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 + --> + <Connector port="8080" protocol="HTTP/1.1" + connectionTimeout="20000" + redirectPort="8443" /> + <!-- A "Connector" using the shared thread pool--> + <!-- + <Connector executor="tomcatThreadPool" + port="8080" protocol="HTTP/1.1" + connectionTimeout="20000" + redirectPort="8443" /> + --> + <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 + This connector uses the NIO implementation. The default + SSLImplementation will depend on the presence of the APR/native + library and the useOpenSSL attribute of the + AprLifecycleListener. + Either JSSE or OpenSSL style configuration may be used regardless of + the SSLImplementation selected. JSSE style configuration is used below. + --> + <!-- + <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" + maxThreads="150" SSLEnabled="true"> + <SSLHostConfig> + <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" + type="RSA" /> + </SSLHostConfig> + </Connector> + --> + <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 + This connector uses the APR/native implementation which always uses + OpenSSL for TLS. + Either JSSE or OpenSSL style configuration may be used. OpenSSL style + configuration is used below. + --> + <!-- + <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" + maxThreads="150" SSLEnabled="true" > + <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> + <SSLHostConfig> + <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" + certificateFile="conf/localhost-rsa-cert.pem" + certificateChainFile="conf/localhost-rsa-chain.pem" + type="RSA" /> + </SSLHostConfig> + </Connector> + --> + + <!-- Define an AJP 1.3 Connector on port 8009 --> + <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> + + + <!-- An Engine represents the entry point (within Catalina) that processes + every request. The Engine implementation for Tomcat stand alone + analyzes the HTTP headers included with the request, and passes them + on to the appropriate Host (virtual host). + Documentation at /docs/config/engine.html --> + + <!-- You should set jvmRoute to support load-balancing via AJP ie : + <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> + --> + <Engine name="Catalina" defaultHost="localhost"> + + <!--For clustering, please take a look at documentation at: + /docs/cluster-howto.html (simple how to) + /docs/config/cluster.html (reference documentation) --> + <!-- + <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> + --> + + <!-- Use the LockOutRealm to prevent attempts to guess user passwords + via a brute-force attack --> + <Realm className="org.apache.catalina.realm.LockOutRealm"> + <!-- This Realm uses the UserDatabase configured in the global JNDI + resources under the key "UserDatabase". Any edits + that are performed against this UserDatabase are immediately + available for use by the Realm. --> + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase"/> + </Realm> + + <Host name="localhost" appBase="webapps" + unpackWARs="true" autoDeploy="true"> + + <!-- SingleSignOn valve, share authentication between web applications + Documentation at: /docs/config/valve.html --> + <!-- + <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> + --> + + <!-- Access log processes all example. + Documentation at: /docs/config/valve.html + Note: The pattern used is equivalent to using pattern="common" --> + <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" + prefix="localhost_access_log" suffix=".txt" + pattern="%h %l %u %t "%r" %s %b" /> + + </Host> + </Engine> + </Service> +</Server> diff --git a/src/tomcat/conf/tomcat-users.xml b/src/tomcat/conf/tomcat-users.xml new file mode 100644 index 0000000000000000000000000000000000000000..aef66d0f4c8831f593da674e66fb4432b37b796b --- /dev/null +++ b/src/tomcat/conf/tomcat-users.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<tomcat-users xmlns="http://tomcat.apache.org/xml" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" + version="1.0"> +<!-- + NOTE: By default, no user is included in the "manager-gui" role required + to operate the "/manager/html" web application. If you wish to use this app, + you must define such a user - the username and password are arbitrary. It is + strongly recommended that you do NOT use one of the users in the commented out + section below since they are intended for use with the examples web + application. +--> +<!-- + NOTE: The sample user and role entries below are intended for use with the + examples web application. They are wrapped in a comment and thus are ignored + when reading this file. If you wish to configure these users for use with the + examples web application, do not forget to remove the <!.. ..> that surrounds + them. You will also need to set the passwords to something appropriate. +--> +<!-- + <role rolename="tomcat"/> + <role rolename="role1"/> + <user username="tomcat" password="<must-be-changed>" roles="tomcat"/> + <user username="both" password="<must-be-changed>" roles="tomcat,role1"/> + <user username="role1" password="<must-be-changed>" roles="role1"/> +--> +</tomcat-users> diff --git a/src/tomcat/conf/tomcat-users.xsd b/src/tomcat/conf/tomcat-users.xsd new file mode 100644 index 0000000000000000000000000000000000000000..948bd015217513b7e5c0029dd4d8c119b82b8199 --- /dev/null +++ b/src/tomcat/conf/tomcat-users.xsd @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tomcat.apache.org/xml" + xmlns:users="http://tomcat.apache.org/xml" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" + attributeFormDefault="unqualified" + version="1.0"> + <xs:element name="tomcat-users"> + <xs:complexType> + <xs:sequence> + <xs:element name="role" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="rolename" use="required" type="users:entityname" /> + <xs:attribute name="description" type="xs:string" /> + </xs:complexType> + </xs:element> + <xs:element name="group" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="groupname" use="required" type="users:entityname" /> + <xs:attribute name="description" type="xs:string" /> + <xs:attribute name="roles" type="xs:string" /> + </xs:complexType> + </xs:element> + <xs:element name="user" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="username" use="required" type="users:entityname" /> + <xs:attribute name="fullname" type="xs:string" /> + <xs:attribute name="password" type="xs:string" /> + <xs:attribute name="roles" type="xs:string" /> + <xs:attribute name="groups" type="xs:string" /> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="version" type="xs:string" /> + </xs:complexType> + </xs:element> + <xs:simpleType name="entityname"> + <xs:restriction base="xs:string"> + <xs:minLength value="1"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> \ No newline at end of file diff --git a/src/tomcat/conf/web.xml b/src/tomcat/conf/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3ebce2160adae49f2108e1a95de8814ed07144e --- /dev/null +++ b/src/tomcat/conf/web.xml @@ -0,0 +1,4710 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0"> + + <!-- ======================== Introduction ============================== --> + <!-- This document defines default values for *all* web applications --> + <!-- loaded into this instance of Tomcat. As each application is --> + <!-- deployed, this file is processed, followed by the --> + <!-- "/WEB-INF/web.xml" deployment descriptor from your own --> + <!-- applications. --> + <!-- --> + <!-- WARNING: Do not configure application-specific resources here! --> + <!-- They should go in the "/WEB-INF/web.xml" file in your application. --> + + + <!-- ================== Built In Servlet Definitions ==================== --> + + + <!-- The default servlet for all web applications, that serves static --> + <!-- resources. It processes all requests that are not mapped to other --> + <!-- servlets with servlet mappings (defined either here or in your own --> + <!-- web.xml file). This servlet supports the following initialization --> + <!-- parameters (default values are in square brackets): --> + <!-- --> + <!-- debug Debugging detail level for messages logged --> + <!-- by this servlet. Useful values are 0, 1, and --> + <!-- 11 where higher values mean more detail. [0] --> + <!-- --> + <!-- fileEncoding Encoding to be used to read static resources --> + <!-- [platform default] --> + <!-- --> + <!-- useBomIfPresent If a static file contains a byte order mark --> + <!-- (BOM), should this be used to determine the --> + <!-- file encoding in preference to fileEncoding. --> + <!-- [true] --> + <!-- --> + <!-- input Input buffer size (in bytes) when reading --> + <!-- resources to be served. [2048] --> + <!-- --> + <!-- listings Should directory listings be produced if there --> + <!-- is no welcome file in this directory? [false] --> + <!-- WARNING: Listings for directories with many --> + <!-- entries can be slow and may consume --> + <!-- significant proportions of server resources. --> + <!-- --> + <!-- output Output buffer size (in bytes) when writing --> + <!-- resources to be served. [2048] --> + <!-- --> + <!-- readonly Is this context "read only", so HTTP --> + <!-- commands like PUT and DELETE are --> + <!-- rejected? [true] --> + <!-- --> + <!-- readmeFile File to display together with the directory --> + <!-- contents. [null] --> + <!-- --> + <!-- sendfileSize If the connector used supports sendfile, this --> + <!-- represents the minimal file size in KB for --> + <!-- which sendfile will be used. Use a negative --> + <!-- value to always disable sendfile. [48] --> + <!-- --> + <!-- useAcceptRanges Should the Accept-Ranges header be included --> + <!-- in responses where appropriate? [true] --> + <!-- --> + <!-- For directory listing customization. Checks localXsltFile, then --> + <!-- globalXsltFile, then defaults to original behavior. --> + <!-- --> + <!-- localXsltFile Make directory listings an XML doc and --> + <!-- pass the result to this style sheet residing --> + <!-- in that directory. This overrides --> + <!-- contextXsltFile and globalXsltFile[null] --> + <!-- --> + <!-- contextXsltFile Make directory listings an XML doc and --> + <!-- pass the result to this style sheet which is --> + <!-- relative to the context root. This overrides --> + <!-- globalXsltFile[null] --> + <!-- --> + <!-- globalXsltFile Site wide configuration version of --> + <!-- localXsltFile. This argument must either be an --> + <!-- absolute or relative (to either --> + <!-- $CATALINA_BASE/conf or $CATALINA_HOME/conf) --> + <!-- path that points to a location below either --> + <!-- $CATALINA_BASE/conf (checked first) or --> + <!-- $CATALINA_HOME/conf (checked second).[null] --> + <!-- --> + <!-- showServerInfo Should server information be presented in the --> + <!-- response sent to clients when directory --> + <!-- listings is enabled? [true] --> + + <servlet> + <servlet-name>default</servlet-name> + <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + <init-param> + <param-name>listings</param-name> + <param-value>false</param-value> + </init-param> + <load-on-startup>1</load-on-startup> + </servlet> + + + <!-- The JSP page compiler and execution servlet, which is the mechanism --> + <!-- used by Tomcat to support JSP pages. Traditionally, this servlet --> + <!-- is mapped to the URL pattern "*.jsp". This servlet supports the --> + <!-- following initialization parameters (default values are in square --> + <!-- brackets): --> + <!-- --> + <!-- checkInterval If development is false and checkInterval is --> + <!-- greater than zero, background compilations are --> + <!-- enabled. checkInterval is the time in seconds --> + <!-- between checks to see if a JSP page (and its --> + <!-- dependent files) needs to be recompiled. [0] --> + <!-- --> + <!-- classdebuginfo Should the class file be compiled with --> + <!-- debugging information? [true] --> + <!-- --> + <!-- classpath What class path should I use while compiling --> + <!-- generated servlets? [Created dynamically --> + <!-- based on the current web application] --> + <!-- --> + <!-- compiler Which compiler Ant should use to compile JSP --> + <!-- pages. See the jasper documentation for more --> + <!-- information. --> + <!-- --> + <!-- compilerSourceVM Compiler source VM. [1.8] --> + <!-- --> + <!-- compilerTargetVM Compiler target VM. [1.8] --> + <!-- --> + <!-- development Is Jasper used in development mode? If true, --> + <!-- the frequency at which JSPs are checked for --> + <!-- modification may be specified via the --> + <!-- modificationTestInterval parameter. [true] --> + <!-- --> + <!-- displaySourceFragment --> + <!-- Should a source fragment be included in --> + <!-- exception messages? [true] --> + <!-- --> + <!-- dumpSmap Should the SMAP info for JSR45 debugging be --> + <!-- dumped to a file? [false] --> + <!-- False if suppressSmap is true --> + <!-- --> + <!-- enablePooling Determines whether tag handler pooling is --> + <!-- enabled. This is a compilation option. It will --> + <!-- not alter the behaviour of JSPs that have --> + <!-- already been compiled. [true] --> + <!-- --> + <!-- engineOptionsClass Allows specifying the Options class used to --> + <!-- configure Jasper. If not present, the default --> + <!-- EmbeddedServletOptions will be used. --> + <!-- This option is ignored when running under a --> + <!-- SecurityManager. --> + <!-- --> + <!-- errorOnUseBeanInvalidClassAttribute --> + <!-- Should Jasper issue an error when the value of --> + <!-- the class attribute in an useBean action is --> + <!-- not a valid bean class? [true] --> + <!-- --> + <!-- fork Tell Ant to fork compiles of JSP pages so that --> + <!-- a separate JVM is used for JSP page compiles --> + <!-- from the one Tomcat is running in. [true] --> + <!-- --> + <!-- genStringAsCharArray --> + <!-- Should text strings be generated as char --> + <!-- arrays, to improve performance in some cases? --> + <!-- [false] --> + <!-- --> + <!-- ieClassId The class-id value to be sent to Internet --> + <!-- Explorer when using <jsp:plugin> tags. --> + <!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] --> + <!-- --> + <!-- javaEncoding Java file encoding to use for generating java --> + <!-- source files. [UTF8] --> + <!-- --> + <!-- keepgenerated Should we keep the generated Java source code --> + <!-- for each page instead of deleting it? [true] --> + <!-- --> + <!-- mappedfile Should we generate static content with one --> + <!-- print statement per input line, to ease --> + <!-- debugging? [true] --> + <!-- --> + <!-- maxLoadedJsps The maximum number of JSPs that will be loaded --> + <!-- for a web application. If more than this --> + <!-- number of JSPs are loaded, the least recently --> + <!-- used JSPs will be unloaded so that the number --> + <!-- of JSPs loaded at any one time does not exceed --> + <!-- this limit. A value of zero or less indicates --> + <!-- no limit. [-1] --> + <!-- --> + <!-- jspIdleTimeout The amount of time in seconds a JSP can be --> + <!-- idle before it is unloaded. A value of zero --> + <!-- or less indicates never unload. [-1] --> + <!-- --> + <!-- modificationTestInterval --> + <!-- Causes a JSP (and its dependent files) to not --> + <!-- be checked for modification during the --> + <!-- specified time interval (in seconds) from the --> + <!-- last time the JSP was checked for --> + <!-- modification. A value of 0 will cause the JSP --> + <!-- to be checked on every access. --> + <!-- Used in development mode only. [4] --> + <!-- --> + <!-- recompileOnFail If a JSP compilation fails should the --> + <!-- modificationTestInterval be ignored and the --> + <!-- next access trigger a re-compilation attempt? --> + <!-- Used in development mode only and is disabled --> + <!-- by default as compilation may be expensive and --> + <!-- could lead to excessive resource usage. --> + <!-- [false] --> + <!-- --> + <!-- scratchdir What scratch directory should we use when --> + <!-- compiling JSP pages? [default work directory --> + <!-- for the current web application] --> + <!-- This option is ignored when running under a --> + <!-- SecurityManager. --> + <!-- --> + <!-- suppressSmap Should the generation of SMAP info for JSR45 --> + <!-- debugging be suppressed? [false] --> + <!-- --> + <!-- trimSpaces Should template text that consists entirely of --> + <!-- whitespace be removed from the output (true), --> + <!-- replaced with a single space (single) or left --> + <!-- unchanged (false)? Note that if a JSP page or --> + <!-- tag file specifies a trimDirectiveWhitespaces --> + <!-- value of true, that will take precedence over --> + <!-- this configuration setting for that page/tag. --> + <!-- [false] --> + <!-- --> + <!-- xpoweredBy Determines whether X-Powered-By response --> + <!-- header is added by generated servlet. [false] --> + <!-- --> + <!-- strictQuoteEscaping When scriptlet expressions are used for --> + <!-- attribute values, should the rules in JSP.1.6 --> + <!-- for the escaping of quote characters be --> + <!-- strictly applied? [true] --> + <!-- --> + <!-- quoteAttributeEL When EL is used in an attribute value on a --> + <!-- JSP page should the rules for quoting of --> + <!-- attributes described in JSP.1.6 be applied to --> + <!-- the expression? [true] --> + + <servlet> + <servlet-name>jsp</servlet-name> + <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> + <init-param> + <param-name>fork</param-name> + <param-value>false</param-value> + </init-param> + <init-param> + <param-name>xpoweredBy</param-name> + <param-value>false</param-value> + </init-param> + <load-on-startup>3</load-on-startup> + </servlet> + + + <!-- NOTE: An SSI Filter is also available as an alternative SSI --> + <!-- implementation. Use either the Servlet or the Filter but NOT both. --> + <!-- --> + <!-- Server Side Includes processing servlet, which processes SSI --> + <!-- directives in HTML pages consistent with similar support in web --> + <!-- servers like Apache. Traditionally, this servlet is mapped to the --> + <!-- URL pattern "*.shtml". This servlet supports the following --> + <!-- initialization parameters (default values are in square brackets): --> + <!-- --> + <!-- buffered Should output from this servlet be buffered? --> + <!-- (0=false, 1=true) [0] --> + <!-- --> + <!-- debug Debugging detail level for messages logged --> + <!-- by this servlet. [0] --> + <!-- --> + <!-- expires The number of seconds before a page with SSI --> + <!-- directives will expire. [No default] --> + <!-- --> + <!-- isVirtualWebappRelative --> + <!-- Should "virtual" paths be interpreted as --> + <!-- relative to the context root, instead of --> + <!-- the server root? [false] --> + <!-- --> + <!-- inputEncoding The encoding to assume for SSI resources if --> + <!-- one is not available from the resource. --> + <!-- [Platform default] --> + <!-- --> + <!-- outputEncoding The encoding to use for the page that results --> + <!-- from the SSI processing. [UTF-8] --> + <!-- --> + <!-- allowExec Is use of the exec command enabled? [false] --> + +<!-- + <servlet> + <servlet-name>ssi</servlet-name> + <servlet-class> + org.apache.catalina.ssi.SSIServlet + </servlet-class> + <init-param> + <param-name>buffered</param-name> + <param-value>1</param-value> + </init-param> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + <init-param> + <param-name>expires</param-name> + <param-value>666</param-value> + </init-param> + <init-param> + <param-name>isVirtualWebappRelative</param-name> + <param-value>false</param-value> + </init-param> + <load-on-startup>4</load-on-startup> + </servlet> +--> + + + <!-- Common Gateway Includes (CGI) processing servlet, which supports --> + <!-- execution of external applications that conform to the CGI spec --> + <!-- requirements. Typically, this servlet is mapped to the URL pattern --> + <!-- "/cgi-bin/*", which means that any CGI applications that are --> + <!-- executed must be present within the web application. This servlet --> + <!-- supports the following initialization parameters (default values --> + <!-- are in square brackets): --> + <!-- --> + <!-- cgiPathPrefix The CGI search path will start at --> + <!-- webAppRootDir + File.separator + this prefix. --> + <!-- If not set, then webAppRootDir is used. --> + <!-- Recommended value: WEB-INF/cgi --> + <!-- --> + <!-- enableCmdLineArguments --> + <!-- Are command line parameters generated from --> + <!-- the query string as per section 4.4 of 3875 --> + <!-- RFC? [false] --> + <!-- --> + <!-- executable Name of the executable used to run the --> + <!-- script. [perl] --> + <!-- --> + <!-- envHttpHeaders A regular expression used to select the HTTP --> + <!-- headers passed to the CGI process as --> + <!-- environment variables. Note that headers are --> + <!-- converted to upper case before matching and --> + <!-- that the entire header name must match the --> + <!-- pattern. --> + <!-- [ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST| --> + <!-- IF-[-0-9A-Z]*|REFERER|USER-AGENT] --> + <!-- --> + <!-- environment-variable- An environment to be set for the execution --> + <!-- environment of the CGI script. The name of --> + <!-- variable is taken from the parameter name. --> + <!-- To configure an environment variable named --> + <!-- FOO, configure a parameter named --> + <!-- environment-variable-FOO. The parameter value --> + <!-- is used as the environment variable value. --> + <!-- The default is no environment variables. --> + <!-- --> + <!-- parameterEncoding Name of parameter encoding to be used with --> + <!-- CGI servlet. --> + <!-- [System.getProperty("file.encoding","UTF-8")] --> + <!-- --> + <!-- passShellEnvironment Should the shell environment variables (if --> + <!-- any) be passed to the CGI script? [false] --> + <!-- --> + <!-- stderrTimeout The time (in milliseconds) to wait for the --> + <!-- reading of stderr to complete before --> + <!-- terminating the CGI process. [2000] --> + +<!-- + <servlet> + <servlet-name>cgi</servlet-name> + <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> + <init-param> + <param-name>cgiPathPrefix</param-name> + <param-value>WEB-INF/cgi</param-value> + </init-param> + <load-on-startup>5</load-on-startup> + </servlet> +--> + + + <!-- ================ Built In Servlet Mappings ========================= --> + + + <!-- The servlet mappings for the built in servlets defined above. Note --> + <!-- that, by default, the CGI and SSI servlets are *not* mapped. You --> + <!-- must uncomment these mappings (or add them to your application's own --> + <!-- web.xml deployment descriptor) to enable these services --> + + <!-- The mapping for the default servlet --> + <servlet-mapping> + <servlet-name>default</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + + <!-- The mappings for the JSP servlet --> + <servlet-mapping> + <servlet-name>jsp</servlet-name> + <url-pattern>*.jsp</url-pattern> + <url-pattern>*.jspx</url-pattern> + </servlet-mapping> + + <!-- The mapping for the SSI servlet --> +<!-- + <servlet-mapping> + <servlet-name>ssi</servlet-name> + <url-pattern>*.shtml</url-pattern> + </servlet-mapping> +--> + + <!-- The mapping for the CGI Gateway servlet --> + +<!-- + <servlet-mapping> + <servlet-name>cgi</servlet-name> + <url-pattern>/cgi-bin/*</url-pattern> + </servlet-mapping> +--> + + + <!-- ================== Built In Filter Definitions ===================== --> + + <!-- A filter that sets various security related HTTP Response headers. --> + <!-- This filter supports the following initialization parameters --> + <!-- (default values are in square brackets): --> + <!-- --> + <!-- hstsEnabled Should the HTTP Strict Transport Security --> + <!-- (HSTS) header be added to the response? See --> + <!-- RFC 6797 for more information on HSTS. [true] --> + <!-- --> + <!-- hstsMaxAgeSeconds The max age value that should be used in the --> + <!-- HSTS header. Negative values will be treated --> + <!-- as zero. [0] --> + <!-- --> + <!-- hstsIncludeSubDomains --> + <!-- Should the includeSubDomains parameter be --> + <!-- included in the HSTS header. --> + <!-- --> + <!-- antiClickJackingEnabled --> + <!-- Should the anti click-jacking header --> + <!-- X-Frame-Options be added to every response? --> + <!-- [true] --> + <!-- --> + <!-- antiClickJackingOption --> + <!-- What value should be used for the header. Must --> + <!-- be one of DENY, SAMEORIGIN, ALLOW-FROM --> + <!-- (case-insensitive). [DENY] --> + <!-- --> + <!-- antiClickJackingUri IF ALLOW-FROM is used, what URI should be --> + <!-- allowed? [] --> + <!-- --> + <!-- blockContentTypeSniffingEnabled --> + <!-- Should the header that blocks content type --> + <!-- sniffing be added to every response? [true] --> +<!-- + <filter> + <filter-name>httpHeaderSecurity</filter-name> + <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> + <async-supported>true</async-supported> + </filter> +--> + + <!-- A filter that sets character encoding that is used to decode --> + <!-- parameters in a POST request --> +<!-- + <filter> + <filter-name>setCharacterEncodingFilter</filter-name> + <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class> + <init-param> + <param-name>encoding</param-name> + <param-value>UTF-8</param-value> + </init-param> + <async-supported>true</async-supported> + </filter> +--> + + <!-- A filter that triggers request parameters parsing and rejects the --> + <!-- request if some parameters were skipped because of parsing errors or --> + <!-- request size limitations. --> +<!-- + <filter> + <filter-name>failedRequestFilter</filter-name> + <filter-class> + org.apache.catalina.filters.FailedRequestFilter + </filter-class> + <async-supported>true</async-supported> + </filter> +--> + + + <!-- NOTE: An SSI Servlet is also available as an alternative SSI --> + <!-- implementation. Use either the Servlet or the Filter but NOT both. --> + <!-- --> + <!-- Server Side Includes processing filter, which processes SSI --> + <!-- directives in HTML pages consistent with similar support in web --> + <!-- servers like Apache. Traditionally, this filter is mapped to the --> + <!-- URL pattern "*.shtml", though it can be mapped to "*" as it will --> + <!-- selectively enable/disable SSI processing based on mime types. For --> + <!-- this to work you will need to uncomment the .shtml mime type --> + <!-- definition towards the bottom of this file. --> + <!-- The contentType init param allows you to apply SSI processing to JSP --> + <!-- pages, javascript, or any other content you wish. This filter --> + <!-- supports the following initialization parameters (default values are --> + <!-- in square brackets): --> + <!-- --> + <!-- contentType A regex pattern that must be matched before --> + <!-- SSI processing is applied. --> + <!-- [text/x-server-parsed-html(;.*)?] --> + <!-- --> + <!-- debug Debugging detail level for messages logged --> + <!-- by this servlet. [0] --> + <!-- --> + <!-- expires The number of seconds before a page with SSI --> + <!-- directives will expire. [No default] --> + <!-- --> + <!-- isVirtualWebappRelative --> + <!-- Should "virtual" paths be interpreted as --> + <!-- relative to the context root, instead of --> + <!-- the server root? [false] --> + <!-- --> + <!-- allowExec Is use of the exec command enabled? [false] --> + +<!-- + <filter> + <filter-name>ssi</filter-name> + <filter-class> + org.apache.catalina.ssi.SSIFilter + </filter-class> + <init-param> + <param-name>contentType</param-name> + <param-value>text/x-server-parsed-html(;.*)?</param-value> + </init-param> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + <init-param> + <param-name>expires</param-name> + <param-value>666</param-value> + </init-param> + <init-param> + <param-name>isVirtualWebappRelative</param-name> + <param-value>false</param-value> + </init-param> + </filter> +--> + + + <!-- ==================== Built In Filter Mappings ====================== --> + + <!-- The mapping for the HTTP header security Filter --> +<!-- + <filter-mapping> + <filter-name>httpHeaderSecurity</filter-name> + <url-pattern>/*</url-pattern> + <dispatcher>REQUEST</dispatcher> + </filter-mapping> +--> + + <!-- The mapping for the Set Character Encoding Filter --> +<!-- + <filter-mapping> + <filter-name>setCharacterEncodingFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> +--> + + <!-- The mapping for the Failed Request Filter --> +<!-- + <filter-mapping> + <filter-name>failedRequestFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> +--> + + <!-- The mapping for the SSI Filter --> +<!-- + <filter-mapping> + <filter-name>ssi</filter-name> + <url-pattern>*.shtml</url-pattern> + </filter-mapping> +--> + + + <!-- ==================== Default Session Configuration ================= --> + <!-- You can set the default session timeout (in minutes) for all newly --> + <!-- created sessions by modifying the value below. --> + + <session-config> + <session-timeout>30</session-timeout> + </session-config> + + + <!-- ===================== Default MIME Type Mappings =================== --> + <!-- When serving static resources, Tomcat will automatically generate --> + <!-- a "Content-Type" header based on the resource's filename extension, --> + <!-- based on these mappings. Additional mappings can be added here (to --> + <!-- apply to all web applications), or in your own application's web.xml --> + <!-- deployment descriptor. --> + <!-- Note: Extensions are always matched in a case-insensitive manner. --> + + <mime-mapping> + <extension>123</extension> + <mime-type>application/vnd.lotus-1-2-3</mime-type> + </mime-mapping> + <mime-mapping> + <extension>3dml</extension> + <mime-type>text/vnd.in3d.3dml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>3ds</extension> + <mime-type>image/x-3ds</mime-type> + </mime-mapping> + <mime-mapping> + <extension>3g2</extension> + <mime-type>video/3gpp2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>3gp</extension> + <mime-type>video/3gpp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>7z</extension> + <mime-type>application/x-7z-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aab</extension> + <mime-type>application/x-authorware-bin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aac</extension> + <mime-type>audio/x-aac</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aam</extension> + <mime-type>application/x-authorware-map</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aas</extension> + <mime-type>application/x-authorware-seg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>abs</extension> + <mime-type>audio/x-mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>abw</extension> + <mime-type>application/x-abiword</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ac</extension> + <mime-type>application/pkix-attr-cert</mime-type> + </mime-mapping> + <mime-mapping> + <extension>acc</extension> + <mime-type>application/vnd.americandynamics.acc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ace</extension> + <mime-type>application/x-ace-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>acu</extension> + <mime-type>application/vnd.acucobol</mime-type> + </mime-mapping> + <mime-mapping> + <extension>acutc</extension> + <mime-type>application/vnd.acucorp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>adp</extension> + <mime-type>audio/adpcm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aep</extension> + <mime-type>application/vnd.audiograph</mime-type> + </mime-mapping> + <mime-mapping> + <extension>afm</extension> + <mime-type>application/x-font-type1</mime-type> + </mime-mapping> + <mime-mapping> + <extension>afp</extension> + <mime-type>application/vnd.ibm.modcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ahead</extension> + <mime-type>application/vnd.ahead.space</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ai</extension> + <mime-type>application/postscript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aif</extension> + <mime-type>audio/x-aiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aifc</extension> + <mime-type>audio/x-aiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aiff</extension> + <mime-type>audio/x-aiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aim</extension> + <mime-type>application/x-aim</mime-type> + </mime-mapping> + <mime-mapping> + <extension>air</extension> + <mime-type>application/vnd.adobe.air-application-installer-package+zip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ait</extension> + <mime-type>application/vnd.dvb.ait</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ami</extension> + <mime-type>application/vnd.amiga.ami</mime-type> + </mime-mapping> + <mime-mapping> + <extension>anx</extension> + <mime-type>application/annodex</mime-type> + </mime-mapping> + <mime-mapping> + <extension>apk</extension> + <mime-type>application/vnd.android.package-archive</mime-type> + </mime-mapping> + <mime-mapping> + <extension>appcache</extension> + <mime-type>text/cache-manifest</mime-type> + </mime-mapping> + <mime-mapping> + <extension>application</extension> + <mime-type>application/x-ms-application</mime-type> + </mime-mapping> + <mime-mapping> + <extension>apr</extension> + <mime-type>application/vnd.lotus-approach</mime-type> + </mime-mapping> + <mime-mapping> + <extension>arc</extension> + <mime-type>application/x-freearc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>art</extension> + <mime-type>image/x-jg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>asc</extension> + <mime-type>application/pgp-signature</mime-type> + </mime-mapping> + <mime-mapping> + <extension>asf</extension> + <mime-type>video/x-ms-asf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>asm</extension> + <mime-type>text/x-asm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aso</extension> + <mime-type>application/vnd.accpac.simply.aso</mime-type> + </mime-mapping> + <mime-mapping> + <extension>asx</extension> + <mime-type>video/x-ms-asf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>atc</extension> + <mime-type>application/vnd.acucorp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>atom</extension> + <mime-type>application/atom+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>atomcat</extension> + <mime-type>application/atomcat+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>atomsvc</extension> + <mime-type>application/atomsvc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>atx</extension> + <mime-type>application/vnd.antix.game-component</mime-type> + </mime-mapping> + <mime-mapping> + <extension>au</extension> + <mime-type>audio/basic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>avi</extension> + <mime-type>video/x-msvideo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>avx</extension> + <mime-type>video/x-rad-screenplay</mime-type> + </mime-mapping> + <mime-mapping> + <extension>aw</extension> + <mime-type>application/applixware</mime-type> + </mime-mapping> + <mime-mapping> + <extension>axa</extension> + <mime-type>audio/annodex</mime-type> + </mime-mapping> + <mime-mapping> + <extension>axv</extension> + <mime-type>video/annodex</mime-type> + </mime-mapping> + <mime-mapping> + <extension>azf</extension> + <mime-type>application/vnd.airzip.filesecure.azf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>azs</extension> + <mime-type>application/vnd.airzip.filesecure.azs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>azw</extension> + <mime-type>application/vnd.amazon.ebook</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bat</extension> + <mime-type>application/x-msdownload</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bcpio</extension> + <mime-type>application/x-bcpio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bdf</extension> + <mime-type>application/x-font-bdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bdm</extension> + <mime-type>application/vnd.syncml.dm+wbxml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bed</extension> + <mime-type>application/vnd.realvnc.bed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bh2</extension> + <mime-type>application/vnd.fujitsu.oasysprs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bin</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>blb</extension> + <mime-type>application/x-blorb</mime-type> + </mime-mapping> + <mime-mapping> + <extension>blorb</extension> + <mime-type>application/x-blorb</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bmi</extension> + <mime-type>application/vnd.bmi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bmp</extension> + <mime-type>image/bmp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>body</extension> + <mime-type>text/html</mime-type> + </mime-mapping> + <mime-mapping> + <extension>book</extension> + <mime-type>application/vnd.framemaker</mime-type> + </mime-mapping> + <mime-mapping> + <extension>box</extension> + <mime-type>application/vnd.previewsystems.box</mime-type> + </mime-mapping> + <mime-mapping> + <extension>boz</extension> + <mime-type>application/x-bzip2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bpk</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>btif</extension> + <mime-type>image/prs.btif</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bz</extension> + <mime-type>application/x-bzip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>bz2</extension> + <mime-type>application/x-bzip2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c11amc</extension> + <mime-type>application/vnd.cluetrust.cartomobile-config</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c11amz</extension> + <mime-type>application/vnd.cluetrust.cartomobile-config-pkg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c4d</extension> + <mime-type>application/vnd.clonk.c4group</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c4f</extension> + <mime-type>application/vnd.clonk.c4group</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c4g</extension> + <mime-type>application/vnd.clonk.c4group</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c4p</extension> + <mime-type>application/vnd.clonk.c4group</mime-type> + </mime-mapping> + <mime-mapping> + <extension>c4u</extension> + <mime-type>application/vnd.clonk.c4group</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cab</extension> + <mime-type>application/vnd.ms-cab-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>caf</extension> + <mime-type>audio/x-caf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cap</extension> + <mime-type>application/vnd.tcpdump.pcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>car</extension> + <mime-type>application/vnd.curl.car</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cat</extension> + <mime-type>application/vnd.ms-pki.seccat</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cb7</extension> + <mime-type>application/x-cbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cba</extension> + <mime-type>application/x-cbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cbr</extension> + <mime-type>application/x-cbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cbt</extension> + <mime-type>application/x-cbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cbz</extension> + <mime-type>application/x-cbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cc</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cct</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ccxml</extension> + <mime-type>application/ccxml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdbcmsg</extension> + <mime-type>application/vnd.contact.cmsg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdf</extension> + <mime-type>application/x-cdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdkey</extension> + <mime-type>application/vnd.mediastation.cdkey</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdmia</extension> + <mime-type>application/cdmi-capability</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdmic</extension> + <mime-type>application/cdmi-container</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdmid</extension> + <mime-type>application/cdmi-domain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdmio</extension> + <mime-type>application/cdmi-object</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdmiq</extension> + <mime-type>application/cdmi-queue</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdx</extension> + <mime-type>chemical/x-cdx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdxml</extension> + <mime-type>application/vnd.chemdraw+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cdy</extension> + <mime-type>application/vnd.cinderella</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cer</extension> + <mime-type>application/pkix-cert</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cfs</extension> + <mime-type>application/x-cfs-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cgm</extension> + <mime-type>image/cgm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>chat</extension> + <mime-type>application/x-chat</mime-type> + </mime-mapping> + <mime-mapping> + <extension>chm</extension> + <mime-type>application/vnd.ms-htmlhelp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>chrt</extension> + <mime-type>application/vnd.kde.kchart</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cif</extension> + <mime-type>chemical/x-cif</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cii</extension> + <mime-type>application/vnd.anser-web-certificate-issue-initiation</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cil</extension> + <mime-type>application/vnd.ms-artgalry</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cla</extension> + <mime-type>application/vnd.claymore</mime-type> + </mime-mapping> + <mime-mapping> + <extension>class</extension> + <mime-type>application/java</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clkk</extension> + <mime-type>application/vnd.crick.clicker.keyboard</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clkp</extension> + <mime-type>application/vnd.crick.clicker.palette</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clkt</extension> + <mime-type>application/vnd.crick.clicker.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clkw</extension> + <mime-type>application/vnd.crick.clicker.wordbank</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clkx</extension> + <mime-type>application/vnd.crick.clicker</mime-type> + </mime-mapping> + <mime-mapping> + <extension>clp</extension> + <mime-type>application/x-msclip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cmc</extension> + <mime-type>application/vnd.cosmocaller</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cmdf</extension> + <mime-type>chemical/x-cmdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cml</extension> + <mime-type>chemical/x-cml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cmp</extension> + <mime-type>application/vnd.yellowriver-custom-menu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cmx</extension> + <mime-type>image/x-cmx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cod</extension> + <mime-type>application/vnd.rim.cod</mime-type> + </mime-mapping> + <mime-mapping> + <extension>com</extension> + <mime-type>application/x-msdownload</mime-type> + </mime-mapping> + <mime-mapping> + <extension>conf</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cpio</extension> + <mime-type>application/x-cpio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cpp</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cpt</extension> + <mime-type>application/mac-compactpro</mime-type> + </mime-mapping> + <mime-mapping> + <extension>crd</extension> + <mime-type>application/x-mscardfile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>crl</extension> + <mime-type>application/pkix-crl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>crt</extension> + <mime-type>application/x-x509-ca-cert</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cryptonote</extension> + <mime-type>application/vnd.rig.cryptonote</mime-type> + </mime-mapping> + <mime-mapping> + <extension>csh</extension> + <mime-type>application/x-csh</mime-type> + </mime-mapping> + <mime-mapping> + <extension>csml</extension> + <mime-type>chemical/x-csml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>csp</extension> + <mime-type>application/vnd.commonspace</mime-type> + </mime-mapping> + <mime-mapping> + <extension>css</extension> + <mime-type>text/css</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cst</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>csv</extension> + <mime-type>text/csv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cu</extension> + <mime-type>application/cu-seeme</mime-type> + </mime-mapping> + <mime-mapping> + <extension>curl</extension> + <mime-type>text/vnd.curl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cww</extension> + <mime-type>application/prs.cww</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cxt</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>cxx</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dae</extension> + <mime-type>model/vnd.collada+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>daf</extension> + <mime-type>application/vnd.mobius.daf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dart</extension> + <mime-type>application/vnd.dart</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dataless</extension> + <mime-type>application/vnd.fdsn.seed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>davmount</extension> + <mime-type>application/davmount+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dbk</extension> + <mime-type>application/docbook+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dcr</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dcurl</extension> + <mime-type>text/vnd.curl.dcurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dd2</extension> + <mime-type>application/vnd.oma.dd2+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ddd</extension> + <mime-type>application/vnd.fujixerox.ddd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>deb</extension> + <mime-type>application/x-debian-package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>def</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>deploy</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>der</extension> + <mime-type>application/x-x509-ca-cert</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dfac</extension> + <mime-type>application/vnd.dreamfactory</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dgc</extension> + <mime-type>application/x-dgc-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dib</extension> + <mime-type>image/bmp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dic</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dir</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dis</extension> + <mime-type>application/vnd.mobius.dis</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dist</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>distz</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>djv</extension> + <mime-type>image/vnd.djvu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>djvu</extension> + <mime-type>image/vnd.djvu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dll</extension> + <mime-type>application/x-msdownload</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dmg</extension> + <mime-type>application/x-apple-diskimage</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dmp</extension> + <mime-type>application/vnd.tcpdump.pcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dms</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dna</extension> + <mime-type>application/vnd.dna</mime-type> + </mime-mapping> + <mime-mapping> + <extension>doc</extension> + <mime-type>application/msword</mime-type> + </mime-mapping> + <mime-mapping> + <extension>docm</extension> + <mime-type>application/vnd.ms-word.document.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>docx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dot</extension> + <mime-type>application/msword</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dotm</extension> + <mime-type>application/vnd.ms-word.template.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dotx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dp</extension> + <mime-type>application/vnd.osgi.dp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dpg</extension> + <mime-type>application/vnd.dpgraph</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dra</extension> + <mime-type>audio/vnd.dra</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dsc</extension> + <mime-type>text/prs.lines.tag</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dssc</extension> + <mime-type>application/dssc+der</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dtb</extension> + <mime-type>application/x-dtbook+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dtd</extension> + <mime-type>application/xml-dtd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dts</extension> + <mime-type>audio/vnd.dts</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dtshd</extension> + <mime-type>audio/vnd.dts.hd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dump</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dv</extension> + <mime-type>video/x-dv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dvb</extension> + <mime-type>video/vnd.dvb.file</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dvi</extension> + <mime-type>application/x-dvi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dwf</extension> + <mime-type>model/vnd.dwf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dwg</extension> + <mime-type>image/vnd.dwg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dxf</extension> + <mime-type>image/vnd.dxf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dxp</extension> + <mime-type>application/vnd.spotfire.dxp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>dxr</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ecelp4800</extension> + <mime-type>audio/vnd.nuera.ecelp4800</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ecelp7470</extension> + <mime-type>audio/vnd.nuera.ecelp7470</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ecelp9600</extension> + <mime-type>audio/vnd.nuera.ecelp9600</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ecma</extension> + <mime-type>application/ecmascript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>edm</extension> + <mime-type>application/vnd.novadigm.edm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>edx</extension> + <mime-type>application/vnd.novadigm.edx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>efif</extension> + <mime-type>application/vnd.picsel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ei6</extension> + <mime-type>application/vnd.pg.osasli</mime-type> + </mime-mapping> + <mime-mapping> + <extension>elc</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>emf</extension> + <mime-type>application/x-msmetafile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>eml</extension> + <mime-type>message/rfc822</mime-type> + </mime-mapping> + <mime-mapping> + <extension>emma</extension> + <mime-type>application/emma+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>emz</extension> + <mime-type>application/x-msmetafile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>eol</extension> + <mime-type>audio/vnd.digital-winds</mime-type> + </mime-mapping> + <mime-mapping> + <extension>eot</extension> + <mime-type>application/vnd.ms-fontobject</mime-type> + </mime-mapping> + <mime-mapping> + <extension>eps</extension> + <mime-type>application/postscript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>epub</extension> + <mime-type>application/epub+zip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>es3</extension> + <mime-type>application/vnd.eszigno3+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>esa</extension> + <mime-type>application/vnd.osgi.subsystem</mime-type> + </mime-mapping> + <mime-mapping> + <extension>esf</extension> + <mime-type>application/vnd.epson.esf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>et3</extension> + <mime-type>application/vnd.eszigno3+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>etx</extension> + <mime-type>text/x-setext</mime-type> + </mime-mapping> + <mime-mapping> + <extension>eva</extension> + <mime-type>application/x-eva</mime-type> + </mime-mapping> + <mime-mapping> + <extension>evy</extension> + <mime-type>application/x-envoy</mime-type> + </mime-mapping> + <mime-mapping> + <extension>exe</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>exi</extension> + <mime-type>application/exi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ext</extension> + <mime-type>application/vnd.novadigm.ext</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ez</extension> + <mime-type>application/andrew-inset</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ez2</extension> + <mime-type>application/vnd.ezpix-album</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ez3</extension> + <mime-type>application/vnd.ezpix-package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>f</extension> + <mime-type>text/x-fortran</mime-type> + </mime-mapping> + <mime-mapping> + <extension>f4v</extension> + <mime-type>video/x-f4v</mime-type> + </mime-mapping> + <mime-mapping> + <extension>f77</extension> + <mime-type>text/x-fortran</mime-type> + </mime-mapping> + <mime-mapping> + <extension>f90</extension> + <mime-type>text/x-fortran</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fbs</extension> + <mime-type>image/vnd.fastbidsheet</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fcdt</extension> + <mime-type>application/vnd.adobe.formscentral.fcdt</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fcs</extension> + <mime-type>application/vnd.isac.fcs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fdf</extension> + <mime-type>application/vnd.fdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fe_launch</extension> + <mime-type>application/vnd.denovo.fcselayout-link</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fg5</extension> + <mime-type>application/vnd.fujitsu.oasysgp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fgd</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fh</extension> + <mime-type>image/x-freehand</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fh4</extension> + <mime-type>image/x-freehand</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fh5</extension> + <mime-type>image/x-freehand</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fh7</extension> + <mime-type>image/x-freehand</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fhc</extension> + <mime-type>image/x-freehand</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fig</extension> + <mime-type>application/x-xfig</mime-type> + </mime-mapping> + <mime-mapping> + <extension>flac</extension> + <mime-type>audio/flac</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fli</extension> + <mime-type>video/x-fli</mime-type> + </mime-mapping> + <mime-mapping> + <extension>flo</extension> + <mime-type>application/vnd.micrografx.flo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>flv</extension> + <mime-type>video/x-flv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>flw</extension> + <mime-type>application/vnd.kde.kivio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>flx</extension> + <mime-type>text/vnd.fmi.flexstor</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fly</extension> + <mime-type>text/vnd.fly</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fm</extension> + <mime-type>application/vnd.framemaker</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fnc</extension> + <mime-type>application/vnd.frogans.fnc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>for</extension> + <mime-type>text/x-fortran</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fpx</extension> + <mime-type>image/vnd.fpx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>frame</extension> + <mime-type>application/vnd.framemaker</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fsc</extension> + <mime-type>application/vnd.fsc.weblaunch</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fst</extension> + <mime-type>image/vnd.fst</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ftc</extension> + <mime-type>application/vnd.fluxtime.clip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fti</extension> + <mime-type>application/vnd.anser-web-funds-transfer-initiation</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fvt</extension> + <mime-type>video/vnd.fvt</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fxp</extension> + <mime-type>application/vnd.adobe.fxp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fxpl</extension> + <mime-type>application/vnd.adobe.fxp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>fzs</extension> + <mime-type>application/vnd.fuzzysheet</mime-type> + </mime-mapping> + <mime-mapping> + <extension>g2w</extension> + <mime-type>application/vnd.geoplan</mime-type> + </mime-mapping> + <mime-mapping> + <extension>g3</extension> + <mime-type>image/g3fax</mime-type> + </mime-mapping> + <mime-mapping> + <extension>g3w</extension> + <mime-type>application/vnd.geospace</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gac</extension> + <mime-type>application/vnd.groove-account</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gam</extension> + <mime-type>application/x-tads</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gbr</extension> + <mime-type>application/rpki-ghostbusters</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gca</extension> + <mime-type>application/x-gca-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gdl</extension> + <mime-type>model/vnd.gdl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>geo</extension> + <mime-type>application/vnd.dynageo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gex</extension> + <mime-type>application/vnd.geometry-explorer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ggb</extension> + <mime-type>application/vnd.geogebra.file</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ggt</extension> + <mime-type>application/vnd.geogebra.tool</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ghf</extension> + <mime-type>application/vnd.groove-help</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gif</extension> + <mime-type>image/gif</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gim</extension> + <mime-type>application/vnd.groove-identity-message</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gml</extension> + <mime-type>application/gml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gmx</extension> + <mime-type>application/vnd.gmx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gnumeric</extension> + <mime-type>application/x-gnumeric</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gph</extension> + <mime-type>application/vnd.flographit</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gpx</extension> + <mime-type>application/gpx+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gqf</extension> + <mime-type>application/vnd.grafeq</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gqs</extension> + <mime-type>application/vnd.grafeq</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gram</extension> + <mime-type>application/srgs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gramps</extension> + <mime-type>application/x-gramps-xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gre</extension> + <mime-type>application/vnd.geometry-explorer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>grv</extension> + <mime-type>application/vnd.groove-injector</mime-type> + </mime-mapping> + <mime-mapping> + <extension>grxml</extension> + <mime-type>application/srgs+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gsf</extension> + <mime-type>application/x-font-ghostscript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gtar</extension> + <mime-type>application/x-gtar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gtm</extension> + <mime-type>application/vnd.groove-tool-message</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gtw</extension> + <mime-type>model/vnd.gtw</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gv</extension> + <mime-type>text/vnd.graphviz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gxf</extension> + <mime-type>application/gxf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gxt</extension> + <mime-type>application/vnd.geonext</mime-type> + </mime-mapping> + <mime-mapping> + <extension>gz</extension> + <mime-type>application/x-gzip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>h</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>h261</extension> + <mime-type>video/h261</mime-type> + </mime-mapping> + <mime-mapping> + <extension>h263</extension> + <mime-type>video/h263</mime-type> + </mime-mapping> + <mime-mapping> + <extension>h264</extension> + <mime-type>video/h264</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hal</extension> + <mime-type>application/vnd.hal+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hbci</extension> + <mime-type>application/vnd.hbci</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hdf</extension> + <mime-type>application/x-hdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hh</extension> + <mime-type>text/x-c</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hlp</extension> + <mime-type>application/winhlp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hpgl</extension> + <mime-type>application/vnd.hp-hpgl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hpid</extension> + <mime-type>application/vnd.hp-hpid</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hps</extension> + <mime-type>application/vnd.hp-hps</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hqx</extension> + <mime-type>application/mac-binhex40</mime-type> + </mime-mapping> + <mime-mapping> + <extension>htc</extension> + <mime-type>text/x-component</mime-type> + </mime-mapping> + <mime-mapping> + <extension>htke</extension> + <mime-type>application/vnd.kenameaapp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>htm</extension> + <mime-type>text/html</mime-type> + </mime-mapping> + <mime-mapping> + <extension>html</extension> + <mime-type>text/html</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hvd</extension> + <mime-type>application/vnd.yamaha.hv-dic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hvp</extension> + <mime-type>application/vnd.yamaha.hv-voice</mime-type> + </mime-mapping> + <mime-mapping> + <extension>hvs</extension> + <mime-type>application/vnd.yamaha.hv-script</mime-type> + </mime-mapping> + <mime-mapping> + <extension>i2g</extension> + <mime-type>application/vnd.intergeo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>icc</extension> + <mime-type>application/vnd.iccprofile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ice</extension> + <mime-type>x-conference/x-cooltalk</mime-type> + </mime-mapping> + <mime-mapping> + <extension>icm</extension> + <mime-type>application/vnd.iccprofile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ico</extension> + <mime-type>image/x-icon</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ics</extension> + <mime-type>text/calendar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ief</extension> + <mime-type>image/ief</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ifb</extension> + <mime-type>text/calendar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ifm</extension> + <mime-type>application/vnd.shana.informed.formdata</mime-type> + </mime-mapping> + <mime-mapping> + <extension>iges</extension> + <mime-type>model/iges</mime-type> + </mime-mapping> + <mime-mapping> + <extension>igl</extension> + <mime-type>application/vnd.igloader</mime-type> + </mime-mapping> + <mime-mapping> + <extension>igm</extension> + <mime-type>application/vnd.insors.igm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>igs</extension> + <mime-type>model/iges</mime-type> + </mime-mapping> + <mime-mapping> + <extension>igx</extension> + <mime-type>application/vnd.micrografx.igx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>iif</extension> + <mime-type>application/vnd.shana.informed.interchange</mime-type> + </mime-mapping> + <mime-mapping> + <extension>imp</extension> + <mime-type>application/vnd.accpac.simply.imp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ims</extension> + <mime-type>application/vnd.ms-ims</mime-type> + </mime-mapping> + <mime-mapping> + <extension>in</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ink</extension> + <mime-type>application/inkml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>inkml</extension> + <mime-type>application/inkml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>install</extension> + <mime-type>application/x-install-instructions</mime-type> + </mime-mapping> + <mime-mapping> + <extension>iota</extension> + <mime-type>application/vnd.astraea-software.iota</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ipfix</extension> + <mime-type>application/ipfix</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ipk</extension> + <mime-type>application/vnd.shana.informed.package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>irm</extension> + <mime-type>application/vnd.ibm.rights-management</mime-type> + </mime-mapping> + <mime-mapping> + <extension>irp</extension> + <mime-type>application/vnd.irepository.package+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>iso</extension> + <mime-type>application/x-iso9660-image</mime-type> + </mime-mapping> + <mime-mapping> + <extension>itp</extension> + <mime-type>application/vnd.shana.informed.formtemplate</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ivp</extension> + <mime-type>application/vnd.immervision-ivp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ivu</extension> + <mime-type>application/vnd.immervision-ivu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jad</extension> + <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jam</extension> + <mime-type>application/vnd.jam</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jar</extension> + <mime-type>application/java-archive</mime-type> + </mime-mapping> + <mime-mapping> + <extension>java</extension> + <mime-type>text/x-java-source</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jisp</extension> + <mime-type>application/vnd.jisp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jlt</extension> + <mime-type>application/vnd.hp-jlyt</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jnlp</extension> + <mime-type>application/x-java-jnlp-file</mime-type> + </mime-mapping> + <mime-mapping> + <extension>joda</extension> + <mime-type>application/vnd.joost.joda-archive</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpe</extension> + <mime-type>image/jpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpeg</extension> + <mime-type>image/jpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpg</extension> + <mime-type>image/jpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpgm</extension> + <mime-type>video/jpm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpgv</extension> + <mime-type>video/jpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jpm</extension> + <mime-type>video/jpm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>js</extension> + <mime-type>application/javascript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jsf</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>json</extension> + <mime-type>application/json</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jsonml</extension> + <mime-type>application/jsonml+json</mime-type> + </mime-mapping> + <mime-mapping> + <extension>jspf</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kar</extension> + <mime-type>audio/midi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>karbon</extension> + <mime-type>application/vnd.kde.karbon</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kfo</extension> + <mime-type>application/vnd.kde.kformula</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kia</extension> + <mime-type>application/vnd.kidspiration</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kml</extension> + <mime-type>application/vnd.google-earth.kml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kmz</extension> + <mime-type>application/vnd.google-earth.kmz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kne</extension> + <mime-type>application/vnd.kinar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>knp</extension> + <mime-type>application/vnd.kinar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kon</extension> + <mime-type>application/vnd.kde.kontour</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kpr</extension> + <mime-type>application/vnd.kde.kpresenter</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kpt</extension> + <mime-type>application/vnd.kde.kpresenter</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kpxx</extension> + <mime-type>application/vnd.ds-keypoint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ksp</extension> + <mime-type>application/vnd.kde.kspread</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ktr</extension> + <mime-type>application/vnd.kahootz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ktx</extension> + <mime-type>image/ktx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ktz</extension> + <mime-type>application/vnd.kahootz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kwd</extension> + <mime-type>application/vnd.kde.kword</mime-type> + </mime-mapping> + <mime-mapping> + <extension>kwt</extension> + <mime-type>application/vnd.kde.kword</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lasxml</extension> + <mime-type>application/vnd.las.las+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>latex</extension> + <mime-type>application/x-latex</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lbd</extension> + <mime-type>application/vnd.llamagraphics.life-balance.desktop</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lbe</extension> + <mime-type>application/vnd.llamagraphics.life-balance.exchange+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>les</extension> + <mime-type>application/vnd.hhe.lesson-player</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lha</extension> + <mime-type>application/x-lzh-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>link66</extension> + <mime-type>application/vnd.route66.link66+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>list</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>list3820</extension> + <mime-type>application/vnd.ibm.modcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>listafp</extension> + <mime-type>application/vnd.ibm.modcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lnk</extension> + <mime-type>application/x-ms-shortcut</mime-type> + </mime-mapping> + <mime-mapping> + <extension>log</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lostxml</extension> + <mime-type>application/lost+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lrf</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lrm</extension> + <mime-type>application/vnd.ms-lrm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ltf</extension> + <mime-type>application/vnd.frogans.ltf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lvp</extension> + <mime-type>audio/vnd.lucent.voice</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lwp</extension> + <mime-type>application/vnd.lotus-wordpro</mime-type> + </mime-mapping> + <mime-mapping> + <extension>lzh</extension> + <mime-type>application/x-lzh-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m13</extension> + <mime-type>application/x-msmediaview</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m14</extension> + <mime-type>application/x-msmediaview</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m1v</extension> + <mime-type>video/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m21</extension> + <mime-type>application/mp21</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m2a</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m2v</extension> + <mime-type>video/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m3a</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m3u</extension> + <mime-type>audio/x-mpegurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m3u8</extension> + <mime-type>application/vnd.apple.mpegurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m4a</extension> + <mime-type>audio/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m4b</extension> + <mime-type>audio/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m4r</extension> + <mime-type>audio/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m4u</extension> + <mime-type>video/vnd.mpegurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>m4v</extension> + <mime-type>video/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ma</extension> + <mime-type>application/mathematica</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mac</extension> + <mime-type>image/x-macpaint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mads</extension> + <mime-type>application/mads+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mag</extension> + <mime-type>application/vnd.ecowin.chart</mime-type> + </mime-mapping> + <mime-mapping> + <extension>maker</extension> + <mime-type>application/vnd.framemaker</mime-type> + </mime-mapping> + <mime-mapping> + <extension>man</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mar</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mathml</extension> + <mime-type>application/mathml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mb</extension> + <mime-type>application/mathematica</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mbk</extension> + <mime-type>application/vnd.mobius.mbk</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mbox</extension> + <mime-type>application/mbox</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mc1</extension> + <mime-type>application/vnd.medcalcdata</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mcd</extension> + <mime-type>application/vnd.mcd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mcurl</extension> + <mime-type>text/vnd.curl.mcurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mdb</extension> + <mime-type>application/x-msaccess</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mdi</extension> + <mime-type>image/vnd.ms-modi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>me</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mesh</extension> + <mime-type>model/mesh</mime-type> + </mime-mapping> + <mime-mapping> + <extension>meta4</extension> + <mime-type>application/metalink4+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>metalink</extension> + <mime-type>application/metalink+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mets</extension> + <mime-type>application/mets+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mfm</extension> + <mime-type>application/vnd.mfmp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mft</extension> + <mime-type>application/rpki-manifest</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mgp</extension> + <mime-type>application/vnd.osgeo.mapguide.package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mgz</extension> + <mime-type>application/vnd.proteus.magazine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mid</extension> + <mime-type>audio/midi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>midi</extension> + <mime-type>audio/midi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mie</extension> + <mime-type>application/x-mie</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mif</extension> + <mime-type>application/x-mif</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mime</extension> + <mime-type>message/rfc822</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mj2</extension> + <mime-type>video/mj2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mjp2</extension> + <mime-type>video/mj2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mk3d</extension> + <mime-type>video/x-matroska</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mka</extension> + <mime-type>audio/x-matroska</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mks</extension> + <mime-type>video/x-matroska</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mkv</extension> + <mime-type>video/x-matroska</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mlp</extension> + <mime-type>application/vnd.dolby.mlp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mmd</extension> + <mime-type>application/vnd.chipnuts.karaoke-mmd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mmf</extension> + <mime-type>application/vnd.smaf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mmr</extension> + <mime-type>image/vnd.fujixerox.edmics-mmr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mng</extension> + <mime-type>video/x-mng</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mny</extension> + <mime-type>application/x-msmoney</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mobi</extension> + <mime-type>application/x-mobipocket-ebook</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mods</extension> + <mime-type>application/mods+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mov</extension> + <mime-type>video/quicktime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>movie</extension> + <mime-type>video/x-sgi-movie</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp1</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp2</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp21</extension> + <mime-type>application/mp21</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp2a</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp3</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp4</extension> + <mime-type>video/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp4a</extension> + <mime-type>audio/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp4s</extension> + <mime-type>application/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mp4v</extension> + <mime-type>video/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpa</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpc</extension> + <mime-type>application/vnd.mophun.certificate</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpe</extension> + <mime-type>video/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpeg</extension> + <mime-type>video/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpega</extension> + <mime-type>audio/x-mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpg</extension> + <mime-type>video/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpg4</extension> + <mime-type>video/mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpga</extension> + <mime-type>audio/mpeg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpkg</extension> + <mime-type>application/vnd.apple.installer+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpm</extension> + <mime-type>application/vnd.blueice.multipass</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpn</extension> + <mime-type>application/vnd.mophun.application</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpp</extension> + <mime-type>application/vnd.ms-project</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpt</extension> + <mime-type>application/vnd.ms-project</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpv2</extension> + <mime-type>video/mpeg2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mpy</extension> + <mime-type>application/vnd.ibm.minipay</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mqy</extension> + <mime-type>application/vnd.mobius.mqy</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mrc</extension> + <mime-type>application/marc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mrcx</extension> + <mime-type>application/marcxml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ms</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mscml</extension> + <mime-type>application/mediaservercontrol+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mseed</extension> + <mime-type>application/vnd.fdsn.mseed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mseq</extension> + <mime-type>application/vnd.mseq</mime-type> + </mime-mapping> + <mime-mapping> + <extension>msf</extension> + <mime-type>application/vnd.epson.msf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>msh</extension> + <mime-type>model/mesh</mime-type> + </mime-mapping> + <mime-mapping> + <extension>msi</extension> + <mime-type>application/x-msdownload</mime-type> + </mime-mapping> + <mime-mapping> + <extension>msl</extension> + <mime-type>application/vnd.mobius.msl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>msty</extension> + <mime-type>application/vnd.muvee.style</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mts</extension> + <mime-type>model/vnd.mts</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mus</extension> + <mime-type>application/vnd.musician</mime-type> + </mime-mapping> + <mime-mapping> + <extension>musicxml</extension> + <mime-type>application/vnd.recordare.musicxml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mvb</extension> + <mime-type>application/x-msmediaview</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mwf</extension> + <mime-type>application/vnd.mfer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mxf</extension> + <mime-type>application/mxf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mxl</extension> + <mime-type>application/vnd.recordare.musicxml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mxml</extension> + <mime-type>application/xv+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mxs</extension> + <mime-type>application/vnd.triscape.mxs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>mxu</extension> + <mime-type>video/vnd.mpegurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>n-gage</extension> + <mime-type>application/vnd.nokia.n-gage.symbian.install</mime-type> + </mime-mapping> + <mime-mapping> + <extension>n3</extension> + <mime-type>text/n3</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nb</extension> + <mime-type>application/mathematica</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nbp</extension> + <mime-type>application/vnd.wolfram.player</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nc</extension> + <mime-type>application/x-netcdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ncx</extension> + <mime-type>application/x-dtbncx+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nfo</extension> + <mime-type>text/x-nfo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ngdat</extension> + <mime-type>application/vnd.nokia.n-gage.data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nitf</extension> + <mime-type>application/vnd.nitf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nlu</extension> + <mime-type>application/vnd.neurolanguage.nlu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nml</extension> + <mime-type>application/vnd.enliven</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nnd</extension> + <mime-type>application/vnd.noblenet-directory</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nns</extension> + <mime-type>application/vnd.noblenet-sealer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nnw</extension> + <mime-type>application/vnd.noblenet-web</mime-type> + </mime-mapping> + <mime-mapping> + <extension>npx</extension> + <mime-type>image/vnd.net-fpx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nsc</extension> + <mime-type>application/x-conference</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nsf</extension> + <mime-type>application/vnd.lotus-notes</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ntf</extension> + <mime-type>application/vnd.nitf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>nzb</extension> + <mime-type>application/x-nzb</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oa2</extension> + <mime-type>application/vnd.fujitsu.oasys2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oa3</extension> + <mime-type>application/vnd.fujitsu.oasys3</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oas</extension> + <mime-type>application/vnd.fujitsu.oasys</mime-type> + </mime-mapping> + <mime-mapping> + <extension>obd</extension> + <mime-type>application/x-msbinder</mime-type> + </mime-mapping> + <mime-mapping> + <extension>obj</extension> + <mime-type>application/x-tgif</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oda</extension> + <mime-type>application/oda</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Database --> + <extension>odb</extension> + <mime-type>application/vnd.oasis.opendocument.database</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Chart --> + <extension>odc</extension> + <mime-type>application/vnd.oasis.opendocument.chart</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Formula --> + <extension>odf</extension> + <mime-type>application/vnd.oasis.opendocument.formula</mime-type> + </mime-mapping> + <mime-mapping> + <extension>odft</extension> + <mime-type>application/vnd.oasis.opendocument.formula-template</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Drawing --> + <extension>odg</extension> + <mime-type>application/vnd.oasis.opendocument.graphics</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Image --> + <extension>odi</extension> + <mime-type>application/vnd.oasis.opendocument.image</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Master Document --> + <extension>odm</extension> + <mime-type>application/vnd.oasis.opendocument.text-master</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Presentation --> + <extension>odp</extension> + <mime-type>application/vnd.oasis.opendocument.presentation</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Spreadsheet --> + <extension>ods</extension> + <mime-type>application/vnd.oasis.opendocument.spreadsheet</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Text --> + <extension>odt</extension> + <mime-type>application/vnd.oasis.opendocument.text</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oga</extension> + <mime-type>audio/ogg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ogg</extension> + <mime-type>audio/ogg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ogv</extension> + <mime-type>video/ogg</mime-type> + </mime-mapping> + <mime-mapping> + <!-- xiph mime types --> + <extension>ogx</extension> + <mime-type>application/ogg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>omdoc</extension> + <mime-type>application/omdoc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>onepkg</extension> + <mime-type>application/onenote</mime-type> + </mime-mapping> + <mime-mapping> + <extension>onetmp</extension> + <mime-type>application/onenote</mime-type> + </mime-mapping> + <mime-mapping> + <extension>onetoc</extension> + <mime-type>application/onenote</mime-type> + </mime-mapping> + <mime-mapping> + <extension>onetoc2</extension> + <mime-type>application/onenote</mime-type> + </mime-mapping> + <mime-mapping> + <extension>opf</extension> + <mime-type>application/oebps-package+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>opml</extension> + <mime-type>text/x-opml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oprc</extension> + <mime-type>application/vnd.palm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>org</extension> + <mime-type>application/vnd.lotus-organizer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>osf</extension> + <mime-type>application/vnd.yamaha.openscoreformat</mime-type> + </mime-mapping> + <mime-mapping> + <extension>osfpvg</extension> + <mime-type>application/vnd.yamaha.openscoreformat.osfpvg+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>otc</extension> + <mime-type>application/vnd.oasis.opendocument.chart-template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>otf</extension> + <mime-type>font/otf</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Drawing Template --> + <extension>otg</extension> + <mime-type>application/vnd.oasis.opendocument.graphics-template</mime-type> + </mime-mapping> + <mime-mapping> + <!-- HTML Document Template --> + <extension>oth</extension> + <mime-type>application/vnd.oasis.opendocument.text-web</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oti</extension> + <mime-type>application/vnd.oasis.opendocument.image-template</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Presentation Template --> + <extension>otp</extension> + <mime-type>application/vnd.oasis.opendocument.presentation-template</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Spreadsheet Template --> + <extension>ots</extension> + <mime-type>application/vnd.oasis.opendocument.spreadsheet-template</mime-type> + </mime-mapping> + <mime-mapping> + <!-- OpenDocument Text Template --> + <extension>ott</extension> + <mime-type>application/vnd.oasis.opendocument.text-template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oxps</extension> + <mime-type>application/oxps</mime-type> + </mime-mapping> + <mime-mapping> + <extension>oxt</extension> + <mime-type>application/vnd.openofficeorg.extension</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p</extension> + <mime-type>text/x-pascal</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p10</extension> + <mime-type>application/pkcs10</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p12</extension> + <mime-type>application/x-pkcs12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p7b</extension> + <mime-type>application/x-pkcs7-certificates</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p7c</extension> + <mime-type>application/pkcs7-mime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p7m</extension> + <mime-type>application/pkcs7-mime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p7r</extension> + <mime-type>application/x-pkcs7-certreqresp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p7s</extension> + <mime-type>application/pkcs7-signature</mime-type> + </mime-mapping> + <mime-mapping> + <extension>p8</extension> + <mime-type>application/pkcs8</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pas</extension> + <mime-type>text/x-pascal</mime-type> + </mime-mapping> + <mime-mapping> + <extension>paw</extension> + <mime-type>application/vnd.pawaafile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pbd</extension> + <mime-type>application/vnd.powerbuilder6</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pbm</extension> + <mime-type>image/x-portable-bitmap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pcap</extension> + <mime-type>application/vnd.tcpdump.pcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pcf</extension> + <mime-type>application/x-font-pcf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pcl</extension> + <mime-type>application/vnd.hp-pcl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pclxl</extension> + <mime-type>application/vnd.hp-pclxl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pct</extension> + <mime-type>image/pict</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pcurl</extension> + <mime-type>application/vnd.curl.pcurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pcx</extension> + <mime-type>image/x-pcx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pdb</extension> + <mime-type>application/vnd.palm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pdf</extension> + <mime-type>application/pdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pfa</extension> + <mime-type>application/x-font-type1</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pfb</extension> + <mime-type>application/x-font-type1</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pfm</extension> + <mime-type>application/x-font-type1</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pfr</extension> + <mime-type>application/font-tdpfr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pfx</extension> + <mime-type>application/x-pkcs12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pgm</extension> + <mime-type>image/x-portable-graymap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pgn</extension> + <mime-type>application/x-chess-pgn</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pgp</extension> + <mime-type>application/pgp-encrypted</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pic</extension> + <mime-type>image/pict</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pict</extension> + <mime-type>image/pict</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pkg</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pki</extension> + <mime-type>application/pkixcmp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pkipath</extension> + <mime-type>application/pkix-pkipath</mime-type> + </mime-mapping> + <mime-mapping> + <extension>plb</extension> + <mime-type>application/vnd.3gpp.pic-bw-large</mime-type> + </mime-mapping> + <mime-mapping> + <extension>plc</extension> + <mime-type>application/vnd.mobius.plc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>plf</extension> + <mime-type>application/vnd.pocketlearn</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pls</extension> + <mime-type>audio/x-scpls</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pml</extension> + <mime-type>application/vnd.ctc-posml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>png</extension> + <mime-type>image/png</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pnm</extension> + <mime-type>image/x-portable-anymap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pnt</extension> + <mime-type>image/x-macpaint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>portpkg</extension> + <mime-type>application/vnd.macports.portpkg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pot</extension> + <mime-type>application/vnd.ms-powerpoint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>potm</extension> + <mime-type>application/vnd.ms-powerpoint.template.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>potx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.presentationml.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppam</extension> + <mime-type>application/vnd.ms-powerpoint.addin.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppd</extension> + <mime-type>application/vnd.cups-ppd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppm</extension> + <mime-type>image/x-portable-pixmap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pps</extension> + <mime-type>application/vnd.ms-powerpoint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppsm</extension> + <mime-type>application/vnd.ms-powerpoint.slideshow.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppsx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slideshow</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ppt</extension> + <mime-type>application/vnd.ms-powerpoint</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pptm</extension> + <mime-type>application/vnd.ms-powerpoint.presentation.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pptx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pqa</extension> + <mime-type>application/vnd.palm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>prc</extension> + <mime-type>application/x-mobipocket-ebook</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pre</extension> + <mime-type>application/vnd.lotus-freelance</mime-type> + </mime-mapping> + <mime-mapping> + <extension>prf</extension> + <mime-type>application/pics-rules</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ps</extension> + <mime-type>application/postscript</mime-type> + </mime-mapping> + <mime-mapping> + <extension>psb</extension> + <mime-type>application/vnd.3gpp.pic-bw-small</mime-type> + </mime-mapping> + <mime-mapping> + <extension>psd</extension> + <mime-type>image/vnd.adobe.photoshop</mime-type> + </mime-mapping> + <mime-mapping> + <extension>psf</extension> + <mime-type>application/x-font-linux-psf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pskcxml</extension> + <mime-type>application/pskc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ptid</extension> + <mime-type>application/vnd.pvi.ptid1</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pub</extension> + <mime-type>application/x-mspublisher</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pvb</extension> + <mime-type>application/vnd.3gpp.pic-bw-var</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pwn</extension> + <mime-type>application/vnd.3m.post-it-notes</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pya</extension> + <mime-type>audio/vnd.ms-playready.media.pya</mime-type> + </mime-mapping> + <mime-mapping> + <extension>pyv</extension> + <mime-type>video/vnd.ms-playready.media.pyv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qam</extension> + <mime-type>application/vnd.epson.quickanime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qbo</extension> + <mime-type>application/vnd.intu.qbo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qfx</extension> + <mime-type>application/vnd.intu.qfx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qps</extension> + <mime-type>application/vnd.publishare-delta-tree</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qt</extension> + <mime-type>video/quicktime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qti</extension> + <mime-type>image/x-quicktime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qtif</extension> + <mime-type>image/x-quicktime</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qwd</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qwt</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qxb</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qxd</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qxl</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>qxt</extension> + <mime-type>application/vnd.quark.quarkxpress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ra</extension> + <mime-type>audio/x-pn-realaudio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ram</extension> + <mime-type>audio/x-pn-realaudio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rar</extension> + <mime-type>application/x-rar-compressed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ras</extension> + <mime-type>image/x-cmu-raster</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rcprofile</extension> + <mime-type>application/vnd.ipunplugged.rcprofile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rdf</extension> + <mime-type>application/rdf+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rdz</extension> + <mime-type>application/vnd.data-vision.rdz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rep</extension> + <mime-type>application/vnd.businessobjects</mime-type> + </mime-mapping> + <mime-mapping> + <extension>res</extension> + <mime-type>application/x-dtbresource+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rgb</extension> + <mime-type>image/x-rgb</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rif</extension> + <mime-type>application/reginfo+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rip</extension> + <mime-type>audio/vnd.rip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ris</extension> + <mime-type>application/x-research-info-systems</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rl</extension> + <mime-type>application/resource-lists+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rlc</extension> + <mime-type>image/vnd.fujixerox.edmics-rlc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rld</extension> + <mime-type>application/resource-lists-diff+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rm</extension> + <mime-type>application/vnd.rn-realmedia</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rmi</extension> + <mime-type>audio/midi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rmp</extension> + <mime-type>audio/x-pn-realaudio-plugin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rms</extension> + <mime-type>application/vnd.jcp.javame.midlet-rms</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rmvb</extension> + <mime-type>application/vnd.rn-realmedia-vbr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rnc</extension> + <mime-type>application/relax-ng-compact-syntax</mime-type> + </mime-mapping> + <mime-mapping> + <extension>roa</extension> + <mime-type>application/rpki-roa</mime-type> + </mime-mapping> + <mime-mapping> + <extension>roff</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rp9</extension> + <mime-type>application/vnd.cloanto.rp9</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rpss</extension> + <mime-type>application/vnd.nokia.radio-presets</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rpst</extension> + <mime-type>application/vnd.nokia.radio-preset</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rq</extension> + <mime-type>application/sparql-query</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rs</extension> + <mime-type>application/rls-services+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rsd</extension> + <mime-type>application/rsd+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rss</extension> + <mime-type>application/rss+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rtf</extension> + <mime-type>application/rtf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>rtx</extension> + <mime-type>text/richtext</mime-type> + </mime-mapping> + <mime-mapping> + <extension>s</extension> + <mime-type>text/x-asm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>s3m</extension> + <mime-type>audio/s3m</mime-type> + </mime-mapping> + <mime-mapping> + <extension>saf</extension> + <mime-type>application/vnd.yamaha.smaf-audio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sbml</extension> + <mime-type>application/sbml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sc</extension> + <mime-type>application/vnd.ibm.secure-container</mime-type> + </mime-mapping> + <mime-mapping> + <extension>scd</extension> + <mime-type>application/x-msschedule</mime-type> + </mime-mapping> + <mime-mapping> + <extension>scm</extension> + <mime-type>application/vnd.lotus-screencam</mime-type> + </mime-mapping> + <mime-mapping> + <extension>scq</extension> + <mime-type>application/scvp-cv-request</mime-type> + </mime-mapping> + <mime-mapping> + <extension>scs</extension> + <mime-type>application/scvp-cv-response</mime-type> + </mime-mapping> + <mime-mapping> + <extension>scurl</extension> + <mime-type>text/vnd.curl.scurl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sda</extension> + <mime-type>application/vnd.stardivision.draw</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdc</extension> + <mime-type>application/vnd.stardivision.calc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdd</extension> + <mime-type>application/vnd.stardivision.impress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdkd</extension> + <mime-type>application/vnd.solent.sdkm+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdkm</extension> + <mime-type>application/vnd.solent.sdkm+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdp</extension> + <mime-type>application/sdp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sdw</extension> + <mime-type>application/vnd.stardivision.writer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>see</extension> + <mime-type>application/vnd.seemail</mime-type> + </mime-mapping> + <mime-mapping> + <extension>seed</extension> + <mime-type>application/vnd.fdsn.seed</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sema</extension> + <mime-type>application/vnd.sema</mime-type> + </mime-mapping> + <mime-mapping> + <extension>semd</extension> + <mime-type>application/vnd.semd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>semf</extension> + <mime-type>application/vnd.semf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ser</extension> + <mime-type>application/java-serialized-object</mime-type> + </mime-mapping> + <mime-mapping> + <extension>setpay</extension> + <mime-type>application/set-payment-initiation</mime-type> + </mime-mapping> + <mime-mapping> + <extension>setreg</extension> + <mime-type>application/set-registration-initiation</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sfd-hdstx</extension> + <mime-type>application/vnd.hydrostatix.sof-data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sfs</extension> + <mime-type>application/vnd.spotfire.sfs</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sfv</extension> + <mime-type>text/x-sfv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sgi</extension> + <mime-type>image/sgi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sgl</extension> + <mime-type>application/vnd.stardivision.writer-global</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sgm</extension> + <mime-type>text/sgml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sgml</extension> + <mime-type>text/sgml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sh</extension> + <mime-type>application/x-sh</mime-type> + </mime-mapping> + <mime-mapping> + <extension>shar</extension> + <mime-type>application/x-shar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>shf</extension> + <mime-type>application/shf+xml</mime-type> + </mime-mapping> + <!-- + <mime-mapping> + <extension>shtml</extension> + <mime-type>text/x-server-parsed-html</mime-type> + </mime-mapping> + --> + <mime-mapping> + <extension>sid</extension> + <mime-type>image/x-mrsid-image</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sig</extension> + <mime-type>application/pgp-signature</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sil</extension> + <mime-type>audio/silk</mime-type> + </mime-mapping> + <mime-mapping> + <extension>silo</extension> + <mime-type>model/mesh</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sis</extension> + <mime-type>application/vnd.symbian.install</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sisx</extension> + <mime-type>application/vnd.symbian.install</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sit</extension> + <mime-type>application/x-stuffit</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sitx</extension> + <mime-type>application/x-stuffitx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>skd</extension> + <mime-type>application/vnd.koan</mime-type> + </mime-mapping> + <mime-mapping> + <extension>skm</extension> + <mime-type>application/vnd.koan</mime-type> + </mime-mapping> + <mime-mapping> + <extension>skp</extension> + <mime-type>application/vnd.koan</mime-type> + </mime-mapping> + <mime-mapping> + <extension>skt</extension> + <mime-type>application/vnd.koan</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sldm</extension> + <mime-type>application/vnd.ms-powerpoint.slide.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sldx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slide</mime-type> + </mime-mapping> + <mime-mapping> + <extension>slt</extension> + <mime-type>application/vnd.epson.salt</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sm</extension> + <mime-type>application/vnd.stepmania.stepchart</mime-type> + </mime-mapping> + <mime-mapping> + <extension>smf</extension> + <mime-type>application/vnd.stardivision.math</mime-type> + </mime-mapping> + <mime-mapping> + <extension>smi</extension> + <mime-type>application/smil+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>smil</extension> + <mime-type>application/smil+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>smv</extension> + <mime-type>video/x-smv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>smzip</extension> + <mime-type>application/vnd.stepmania.package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>snd</extension> + <mime-type>audio/basic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>snf</extension> + <mime-type>application/x-font-snf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>so</extension> + <mime-type>application/octet-stream</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spc</extension> + <mime-type>application/x-pkcs7-certificates</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spf</extension> + <mime-type>application/vnd.yamaha.smaf-phrase</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spl</extension> + <mime-type>application/x-futuresplash</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spot</extension> + <mime-type>text/vnd.in3d.spot</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spp</extension> + <mime-type>application/scvp-vp-response</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spq</extension> + <mime-type>application/scvp-vp-request</mime-type> + </mime-mapping> + <mime-mapping> + <extension>spx</extension> + <mime-type>audio/ogg</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sql</extension> + <mime-type>application/x-sql</mime-type> + </mime-mapping> + <mime-mapping> + <extension>src</extension> + <mime-type>application/x-wais-source</mime-type> + </mime-mapping> + <mime-mapping> + <extension>srt</extension> + <mime-type>application/x-subrip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sru</extension> + <mime-type>application/sru+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>srx</extension> + <mime-type>application/sparql-results+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ssdl</extension> + <mime-type>application/ssdl+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sse</extension> + <mime-type>application/vnd.kodak-descriptor</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ssf</extension> + <mime-type>application/vnd.epson.ssf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ssml</extension> + <mime-type>application/ssml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>st</extension> + <mime-type>application/vnd.sailingtracker.track</mime-type> + </mime-mapping> + <mime-mapping> + <extension>stc</extension> + <mime-type>application/vnd.sun.xml.calc.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>std</extension> + <mime-type>application/vnd.sun.xml.draw.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>stf</extension> + <mime-type>application/vnd.wt.stf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sti</extension> + <mime-type>application/vnd.sun.xml.impress.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>stk</extension> + <mime-type>application/hyperstudio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>stl</extension> + <mime-type>application/vnd.ms-pki.stl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>str</extension> + <mime-type>application/vnd.pg.format</mime-type> + </mime-mapping> + <mime-mapping> + <extension>stw</extension> + <mime-type>application/vnd.sun.xml.writer.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sub</extension> + <mime-type>text/vnd.dvb.subtitle</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sus</extension> + <mime-type>application/vnd.sus-calendar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>susp</extension> + <mime-type>application/vnd.sus-calendar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sv4cpio</extension> + <mime-type>application/x-sv4cpio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sv4crc</extension> + <mime-type>application/x-sv4crc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>svc</extension> + <mime-type>application/vnd.dvb.service</mime-type> + </mime-mapping> + <mime-mapping> + <extension>svd</extension> + <mime-type>application/vnd.svd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>svg</extension> + <mime-type>image/svg+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>svgz</extension> + <mime-type>image/svg+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>swa</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>swf</extension> + <mime-type>application/x-shockwave-flash</mime-type> + </mime-mapping> + <mime-mapping> + <extension>swi</extension> + <mime-type>application/vnd.aristanetworks.swi</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxc</extension> + <mime-type>application/vnd.sun.xml.calc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxd</extension> + <mime-type>application/vnd.sun.xml.draw</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxg</extension> + <mime-type>application/vnd.sun.xml.writer.global</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxi</extension> + <mime-type>application/vnd.sun.xml.impress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxm</extension> + <mime-type>application/vnd.sun.xml.math</mime-type> + </mime-mapping> + <mime-mapping> + <extension>sxw</extension> + <mime-type>application/vnd.sun.xml.writer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>t</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>t3</extension> + <mime-type>application/x-t3vm-image</mime-type> + </mime-mapping> + <mime-mapping> + <extension>taglet</extension> + <mime-type>application/vnd.mynfc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tao</extension> + <mime-type>application/vnd.tao.intent-module-archive</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tar</extension> + <mime-type>application/x-tar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tcap</extension> + <mime-type>application/vnd.3gpp2.tcap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tcl</extension> + <mime-type>application/x-tcl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>teacher</extension> + <mime-type>application/vnd.smart.teacher</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tei</extension> + <mime-type>application/tei+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>teicorpus</extension> + <mime-type>application/tei+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tex</extension> + <mime-type>application/x-tex</mime-type> + </mime-mapping> + <mime-mapping> + <extension>texi</extension> + <mime-type>application/x-texinfo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>texinfo</extension> + <mime-type>application/x-texinfo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>text</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tfi</extension> + <mime-type>application/thraud+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tfm</extension> + <mime-type>application/x-tex-tfm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tga</extension> + <mime-type>image/x-tga</mime-type> + </mime-mapping> + <mime-mapping> + <extension>thmx</extension> + <mime-type>application/vnd.ms-officetheme</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tif</extension> + <mime-type>image/tiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tiff</extension> + <mime-type>image/tiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tmo</extension> + <mime-type>application/vnd.tmobile-livetv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>torrent</extension> + <mime-type>application/x-bittorrent</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tpl</extension> + <mime-type>application/vnd.groove-tool-template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tpt</extension> + <mime-type>application/vnd.trid.tpt</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tr</extension> + <mime-type>text/troff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tra</extension> + <mime-type>application/vnd.trueapp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>trm</extension> + <mime-type>application/x-msterminal</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tsd</extension> + <mime-type>application/timestamped-data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>tsv</extension> + <mime-type>text/tab-separated-values</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ttc</extension> + <mime-type>font/collection</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ttf</extension> + <mime-type>font/ttf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ttl</extension> + <mime-type>text/turtle</mime-type> + </mime-mapping> + <mime-mapping> + <extension>twd</extension> + <mime-type>application/vnd.simtech-mindmapper</mime-type> + </mime-mapping> + <mime-mapping> + <extension>twds</extension> + <mime-type>application/vnd.simtech-mindmapper</mime-type> + </mime-mapping> + <mime-mapping> + <extension>txd</extension> + <mime-type>application/vnd.genomatix.tuxedo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>txf</extension> + <mime-type>application/vnd.mobius.txf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>txt</extension> + <mime-type>text/plain</mime-type> + </mime-mapping> + <mime-mapping> + <extension>u32</extension> + <mime-type>application/x-authorware-bin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>udeb</extension> + <mime-type>application/x-debian-package</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ufd</extension> + <mime-type>application/vnd.ufdl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ufdl</extension> + <mime-type>application/vnd.ufdl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ulw</extension> + <mime-type>audio/basic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ulx</extension> + <mime-type>application/x-glulx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>umj</extension> + <mime-type>application/vnd.umajin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>unityweb</extension> + <mime-type>application/vnd.unity</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uoml</extension> + <mime-type>application/vnd.uoml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uri</extension> + <mime-type>text/uri-list</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uris</extension> + <mime-type>text/uri-list</mime-type> + </mime-mapping> + <mime-mapping> + <extension>urls</extension> + <mime-type>text/uri-list</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ustar</extension> + <mime-type>application/x-ustar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>utz</extension> + <mime-type>application/vnd.uiq.theme</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uu</extension> + <mime-type>text/x-uuencode</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uva</extension> + <mime-type>audio/vnd.dece.audio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvd</extension> + <mime-type>application/vnd.dece.data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvf</extension> + <mime-type>application/vnd.dece.data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvg</extension> + <mime-type>image/vnd.dece.graphic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvh</extension> + <mime-type>video/vnd.dece.hd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvi</extension> + <mime-type>image/vnd.dece.graphic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvm</extension> + <mime-type>video/vnd.dece.mobile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvp</extension> + <mime-type>video/vnd.dece.pd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvs</extension> + <mime-type>video/vnd.dece.sd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvt</extension> + <mime-type>application/vnd.dece.ttml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvu</extension> + <mime-type>video/vnd.uvvu.mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvv</extension> + <mime-type>video/vnd.dece.video</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvva</extension> + <mime-type>audio/vnd.dece.audio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvd</extension> + <mime-type>application/vnd.dece.data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvf</extension> + <mime-type>application/vnd.dece.data</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvg</extension> + <mime-type>image/vnd.dece.graphic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvh</extension> + <mime-type>video/vnd.dece.hd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvi</extension> + <mime-type>image/vnd.dece.graphic</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvm</extension> + <mime-type>video/vnd.dece.mobile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvp</extension> + <mime-type>video/vnd.dece.pd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvs</extension> + <mime-type>video/vnd.dece.sd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvt</extension> + <mime-type>application/vnd.dece.ttml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvu</extension> + <mime-type>video/vnd.uvvu.mp4</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvv</extension> + <mime-type>video/vnd.dece.video</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvx</extension> + <mime-type>application/vnd.dece.unspecified</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvvz</extension> + <mime-type>application/vnd.dece.zip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvx</extension> + <mime-type>application/vnd.dece.unspecified</mime-type> + </mime-mapping> + <mime-mapping> + <extension>uvz</extension> + <mime-type>application/vnd.dece.zip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcard</extension> + <mime-type>text/vcard</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcd</extension> + <mime-type>application/x-cdlink</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcf</extension> + <mime-type>text/x-vcard</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcg</extension> + <mime-type>application/vnd.groove-vcard</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcs</extension> + <mime-type>text/x-vcalendar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vcx</extension> + <mime-type>application/vnd.vcx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vis</extension> + <mime-type>application/vnd.visionary</mime-type> + </mime-mapping> + <mime-mapping> + <extension>viv</extension> + <mime-type>video/vnd.vivo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vob</extension> + <mime-type>video/x-ms-vob</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vor</extension> + <mime-type>application/vnd.stardivision.writer</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vox</extension> + <mime-type>application/x-authorware-bin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vrml</extension> + <mime-type>model/vrml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vsd</extension> + <mime-type>application/vnd.visio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vsf</extension> + <mime-type>application/vnd.vsf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vss</extension> + <mime-type>application/vnd.visio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vst</extension> + <mime-type>application/vnd.visio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vsw</extension> + <mime-type>application/vnd.visio</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vtu</extension> + <mime-type>model/vnd.vtu</mime-type> + </mime-mapping> + <mime-mapping> + <extension>vxml</extension> + <mime-type>application/voicexml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>w3d</extension> + <mime-type>application/x-director</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wad</extension> + <mime-type>application/x-doom</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wav</extension> + <mime-type>audio/x-wav</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wax</extension> + <mime-type>audio/x-ms-wax</mime-type> + </mime-mapping> + <mime-mapping> + <!-- Wireless Bitmap --> + <extension>wbmp</extension> + <mime-type>image/vnd.wap.wbmp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wbs</extension> + <mime-type>application/vnd.criticaltools.wbs+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wbxml</extension> + <mime-type>application/vnd.wap.wbxml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wcm</extension> + <mime-type>application/vnd.ms-works</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wdb</extension> + <mime-type>application/vnd.ms-works</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wdp</extension> + <mime-type>image/vnd.ms-photo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>weba</extension> + <mime-type>audio/webm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>webm</extension> + <mime-type>video/webm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>webp</extension> + <mime-type>image/webp</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wg</extension> + <mime-type>application/vnd.pmi.widget</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wgt</extension> + <mime-type>application/widget</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wks</extension> + <mime-type>application/vnd.ms-works</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wm</extension> + <mime-type>video/x-ms-wm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wma</extension> + <mime-type>audio/x-ms-wma</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wmd</extension> + <mime-type>application/x-ms-wmd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wmf</extension> + <mime-type>application/x-msmetafile</mime-type> + </mime-mapping> + <mime-mapping> + <!-- WML Source --> + <extension>wml</extension> + <mime-type>text/vnd.wap.wml</mime-type> + </mime-mapping> + <mime-mapping> + <!-- Compiled WML --> + <extension>wmlc</extension> + <mime-type>application/vnd.wap.wmlc</mime-type> + </mime-mapping> + <mime-mapping> + <!-- WML Script Source --> + <extension>wmls</extension> + <mime-type>text/vnd.wap.wmlscript</mime-type> + </mime-mapping> + <mime-mapping> + <!-- Compiled WML Script --> + <extension>wmlsc</extension> + <mime-type>application/vnd.wap.wmlscriptc</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wmv</extension> + <mime-type>video/x-ms-wmv</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wmx</extension> + <mime-type>video/x-ms-wmx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wmz</extension> + <mime-type>application/x-msmetafile</mime-type> + </mime-mapping> + <mime-mapping> + <extension>woff</extension> + <mime-type>font/woff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>woff2</extension> + <mime-type>font/woff2</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wpd</extension> + <mime-type>application/vnd.wordperfect</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wpl</extension> + <mime-type>application/vnd.ms-wpl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wps</extension> + <mime-type>application/vnd.ms-works</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wqd</extension> + <mime-type>application/vnd.wqd</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wri</extension> + <mime-type>application/x-mswrite</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wrl</extension> + <mime-type>model/vrml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wsdl</extension> + <mime-type>application/wsdl+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wspolicy</extension> + <mime-type>application/wspolicy+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wtb</extension> + <mime-type>application/vnd.webturbo</mime-type> + </mime-mapping> + <mime-mapping> + <extension>wvx</extension> + <mime-type>video/x-ms-wvx</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x32</extension> + <mime-type>application/x-authorware-bin</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3d</extension> + <mime-type>model/x3d+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3db</extension> + <mime-type>model/x3d+binary</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3dbz</extension> + <mime-type>model/x3d+binary</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3dv</extension> + <mime-type>model/x3d+vrml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3dvz</extension> + <mime-type>model/x3d+vrml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>x3dz</extension> + <mime-type>model/x3d+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xaml</extension> + <mime-type>application/xaml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xap</extension> + <mime-type>application/x-silverlight-app</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xar</extension> + <mime-type>application/vnd.xara</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xbap</extension> + <mime-type>application/x-ms-xbap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xbd</extension> + <mime-type>application/vnd.fujixerox.docuworks.binder</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xbm</extension> + <mime-type>image/x-xbitmap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xdf</extension> + <mime-type>application/xcap-diff+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xdm</extension> + <mime-type>application/vnd.syncml.dm+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xdp</extension> + <mime-type>application/vnd.adobe.xdp+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xdssc</extension> + <mime-type>application/dssc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xdw</extension> + <mime-type>application/vnd.fujixerox.docuworks</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xenc</extension> + <mime-type>application/xenc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xer</extension> + <mime-type>application/patch-ops-error+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xfdf</extension> + <mime-type>application/vnd.adobe.xfdf</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xfdl</extension> + <mime-type>application/vnd.xfdl</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xht</extension> + <mime-type>application/xhtml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xhtml</extension> + <mime-type>application/xhtml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xhvml</extension> + <mime-type>application/xv+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xif</extension> + <mime-type>image/vnd.xiff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xla</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlam</extension> + <mime-type>application/vnd.ms-excel.addin.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlc</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlf</extension> + <mime-type>application/x-xliff+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlm</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xls</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlsb</extension> + <mime-type>application/vnd.ms-excel.sheet.binary.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlsm</extension> + <mime-type>application/vnd.ms-excel.sheet.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlsx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlt</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xltm</extension> + <mime-type>application/vnd.ms-excel.template.macroenabled.12</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xltx</extension> + <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.template</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xlw</extension> + <mime-type>application/vnd.ms-excel</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xm</extension> + <mime-type>audio/xm</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xml</extension> + <mime-type>application/xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xo</extension> + <mime-type>application/vnd.olpc-sugar</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xop</extension> + <mime-type>application/xop+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpi</extension> + <mime-type>application/x-xpinstall</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpl</extension> + <mime-type>application/xproc+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpm</extension> + <mime-type>image/x-xpixmap</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpr</extension> + <mime-type>application/vnd.is-xpr</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xps</extension> + <mime-type>application/vnd.ms-xpsdocument</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpw</extension> + <mime-type>application/vnd.intercon.formnet</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xpx</extension> + <mime-type>application/vnd.intercon.formnet</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xsl</extension> + <mime-type>application/xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xslt</extension> + <mime-type>application/xslt+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xsm</extension> + <mime-type>application/vnd.syncml+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xspf</extension> + <mime-type>application/xspf+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xul</extension> + <mime-type>application/vnd.mozilla.xul+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xvm</extension> + <mime-type>application/xv+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xvml</extension> + <mime-type>application/xv+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xwd</extension> + <mime-type>image/x-xwindowdump</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xyz</extension> + <mime-type>chemical/x-xyz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>xz</extension> + <mime-type>application/x-xz</mime-type> + </mime-mapping> + <mime-mapping> + <extension>yang</extension> + <mime-type>application/yang</mime-type> + </mime-mapping> + <mime-mapping> + <extension>yin</extension> + <mime-type>application/yin+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z</extension> + <mime-type>application/x-compress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>Z</extension> + <mime-type>application/x-compress</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z1</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z2</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z3</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z4</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z5</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z6</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z7</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>z8</extension> + <mime-type>application/x-zmachine</mime-type> + </mime-mapping> + <mime-mapping> + <extension>zaz</extension> + <mime-type>application/vnd.zzazz.deck+xml</mime-type> + </mime-mapping> + <mime-mapping> + <extension>zip</extension> + <mime-type>application/zip</mime-type> + </mime-mapping> + <mime-mapping> + <extension>zir</extension> + <mime-type>application/vnd.zul</mime-type> + </mime-mapping> + <mime-mapping> + <extension>zirz</extension> + <mime-type>application/vnd.zul</mime-type> + </mime-mapping> + <mime-mapping> + <extension>zmm</extension> + <mime-type>application/vnd.handheld-entertainment+xml</mime-type> + </mime-mapping> + + <!-- ==================== Default Welcome File List ===================== --> + <!-- When a request URI refers to a directory, the default servlet looks --> + <!-- for a "welcome file" within that directory and, if present, to the --> + <!-- corresponding resource URI for display. --> + <!-- If no welcome files are present, the default servlet either serves a --> + <!-- directory listing (see default servlet configuration on how to --> + <!-- customize) or returns a 404 status, depending on the value of the --> + <!-- listings setting. --> + <!-- --> + <!-- If you define welcome files in your own application's web.xml --> + <!-- deployment descriptor, that list *replaces* the list configured --> + <!-- here, so be sure to include any of the default values that you wish --> + <!-- to use within your application. --> + + <welcome-file-list> + <welcome-file>index.html</welcome-file> + <welcome-file>index.htm</welcome-file> + <welcome-file>index.jsp</welcome-file> + </welcome-file-list> + +</web-app> diff --git a/src/tomcat/lib/annotations-api.jar b/src/tomcat/lib/annotations-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..99697b268f4d8dbf4255303341b68b9f84acd97e Binary files /dev/null and b/src/tomcat/lib/annotations-api.jar differ diff --git a/src/tomcat/lib/catalina-ant.jar b/src/tomcat/lib/catalina-ant.jar new file mode 100644 index 0000000000000000000000000000000000000000..eb9706676f01340025c5b9bdab2c98f6d4a384e5 Binary files /dev/null and b/src/tomcat/lib/catalina-ant.jar differ diff --git a/src/tomcat/lib/catalina-ha.jar b/src/tomcat/lib/catalina-ha.jar new file mode 100644 index 0000000000000000000000000000000000000000..5278ca178f85fcc432e3bcdafd34bb8c2d451044 Binary files /dev/null and b/src/tomcat/lib/catalina-ha.jar differ diff --git a/src/tomcat/lib/catalina-storeconfig.jar b/src/tomcat/lib/catalina-storeconfig.jar new file mode 100644 index 0000000000000000000000000000000000000000..ab5c6d77e4c409ef82bc62da938f94bc572c8e03 Binary files /dev/null and b/src/tomcat/lib/catalina-storeconfig.jar differ diff --git a/src/tomcat/lib/catalina-tribes.jar b/src/tomcat/lib/catalina-tribes.jar new file mode 100644 index 0000000000000000000000000000000000000000..eb64a15690440380880877a507205c3e50eecb72 Binary files /dev/null and b/src/tomcat/lib/catalina-tribes.jar differ diff --git a/src/tomcat/lib/catalina.jar b/src/tomcat/lib/catalina.jar new file mode 100644 index 0000000000000000000000000000000000000000..f86010643d72706a38eca122f516b10b74947a74 Binary files /dev/null and b/src/tomcat/lib/catalina.jar differ diff --git a/src/tomcat/lib/ecj-4.6.3.jar b/src/tomcat/lib/ecj-4.6.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..04652f3cb80f0e9d26450f8a9b878876e1ee3c31 Binary files /dev/null and b/src/tomcat/lib/ecj-4.6.3.jar differ diff --git a/src/tomcat/lib/el-api.jar b/src/tomcat/lib/el-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..a0cecdfb78cbde3917b323abac3288a3c3f9c122 Binary files /dev/null and b/src/tomcat/lib/el-api.jar differ diff --git a/src/tomcat/lib/jasper-el.jar b/src/tomcat/lib/jasper-el.jar new file mode 100644 index 0000000000000000000000000000000000000000..8b1f8cdd76e86ea6fde6f827a6a8ae5fab895c84 Binary files /dev/null and b/src/tomcat/lib/jasper-el.jar differ diff --git a/src/tomcat/lib/jasper.jar b/src/tomcat/lib/jasper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a60239180c93071a17ccc2e1b1af4a578d4b546f Binary files /dev/null and b/src/tomcat/lib/jasper.jar differ diff --git a/src/tomcat/lib/jaspic-api.jar b/src/tomcat/lib/jaspic-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..f672aca0eb1f7d291c8e31f33d42bf5388969c6b Binary files /dev/null and b/src/tomcat/lib/jaspic-api.jar differ diff --git a/src/tomcat/lib/jsp-api.jar b/src/tomcat/lib/jsp-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..f0a1c062c364db3e8bedc36ddd6ee4a26a37a78c Binary files /dev/null and b/src/tomcat/lib/jsp-api.jar differ diff --git a/src/tomcat/lib/servlet-api.jar b/src/tomcat/lib/servlet-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..e752d05b2b6b353512264d50920d7a8120a45322 Binary files /dev/null and b/src/tomcat/lib/servlet-api.jar differ diff --git a/src/tomcat/lib/tomcat-api.jar b/src/tomcat/lib/tomcat-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..22550edbdb50a187241993c5bc04821e43a7f035 Binary files /dev/null and b/src/tomcat/lib/tomcat-api.jar differ diff --git a/src/tomcat/lib/tomcat-coyote.jar b/src/tomcat/lib/tomcat-coyote.jar new file mode 100644 index 0000000000000000000000000000000000000000..b8f963b7102ad11d75ac8660eab04e3cb20eec32 Binary files /dev/null and b/src/tomcat/lib/tomcat-coyote.jar differ diff --git a/src/tomcat/lib/tomcat-dbcp.jar b/src/tomcat/lib/tomcat-dbcp.jar new file mode 100644 index 0000000000000000000000000000000000000000..e8ff4d56ee6a3f4c9f80c5dd0456231f0153ad78 Binary files /dev/null and b/src/tomcat/lib/tomcat-dbcp.jar differ diff --git a/src/tomcat/lib/tomcat-i18n-es.jar b/src/tomcat/lib/tomcat-i18n-es.jar new file mode 100644 index 0000000000000000000000000000000000000000..7ad750542570ca7a1af256db9e5766a9553469ed Binary files /dev/null and b/src/tomcat/lib/tomcat-i18n-es.jar differ diff --git a/src/tomcat/lib/tomcat-i18n-fr.jar b/src/tomcat/lib/tomcat-i18n-fr.jar new file mode 100644 index 0000000000000000000000000000000000000000..07559fbdb125907a22e4386b1e4f6b0da63d13c8 Binary files /dev/null and b/src/tomcat/lib/tomcat-i18n-fr.jar differ diff --git a/src/tomcat/lib/tomcat-i18n-ja.jar b/src/tomcat/lib/tomcat-i18n-ja.jar new file mode 100644 index 0000000000000000000000000000000000000000..aca377a747e78d8f981d7b56b5a28d54cce815b4 Binary files /dev/null and b/src/tomcat/lib/tomcat-i18n-ja.jar differ diff --git a/src/tomcat/lib/tomcat-jdbc.jar b/src/tomcat/lib/tomcat-jdbc.jar new file mode 100644 index 0000000000000000000000000000000000000000..63ea0cf4077e298872d124915b1861ff467508a3 Binary files /dev/null and b/src/tomcat/lib/tomcat-jdbc.jar differ diff --git a/src/tomcat/lib/tomcat-jni.jar b/src/tomcat/lib/tomcat-jni.jar new file mode 100644 index 0000000000000000000000000000000000000000..e7d24011c93915e04c7e923c01b8ad28aa8f809a Binary files /dev/null and b/src/tomcat/lib/tomcat-jni.jar differ diff --git a/src/tomcat/lib/tomcat-util-scan.jar b/src/tomcat/lib/tomcat-util-scan.jar new file mode 100644 index 0000000000000000000000000000000000000000..0f03cce3723dac5451dc1b1421c668763c760bdf Binary files /dev/null and b/src/tomcat/lib/tomcat-util-scan.jar differ diff --git a/src/tomcat/lib/tomcat-util.jar b/src/tomcat/lib/tomcat-util.jar new file mode 100644 index 0000000000000000000000000000000000000000..f40632c9e02195a6268244053a830b8629d0f8cf Binary files /dev/null and b/src/tomcat/lib/tomcat-util.jar differ diff --git a/src/tomcat/lib/tomcat-websocket.jar b/src/tomcat/lib/tomcat-websocket.jar new file mode 100644 index 0000000000000000000000000000000000000000..78384eb951e590058ff01a86b228668a06b58312 Binary files /dev/null and b/src/tomcat/lib/tomcat-websocket.jar differ diff --git a/src/tomcat/lib/websocket-api.jar b/src/tomcat/lib/websocket-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..f719ec9ad8ad5678178516601997e95b1f1db498 Binary files /dev/null and b/src/tomcat/lib/websocket-api.jar differ diff --git a/src/tomcat/logs/localhost_access_log.2018-03-12.txt b/src/tomcat/logs/localhost_access_log.2018-03-12.txt new file mode 100644 index 0000000000000000000000000000000000000000..0a512e5eaee0aff0a3735d190e89a609bad60ebd --- /dev/null +++ b/src/tomcat/logs/localhost_access_log.2018-03-12.txt @@ -0,0 +1,41 @@ +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:20 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:20 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:20 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:39:21 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:32 -0400] "GET /manager/status HTTP/1.1" 401 2536 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/setup.html HTTP/1.1" 200 14614 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/docs-stylesheet.css HTTP/1.1" 200 6082 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/asf-logo.svg HTTP/1.1" 200 20712 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/fonts/fonts.css HTTP/1.1" 200 1996 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/fonts/OpenSans600.woff HTTP/1.1" 200 22604 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/fonts/OpenSans400.woff HTTP/1.1" 200 21956 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:42:52 -0400] "GET /docs/images/fonts/OpenSans700.woff HTTP/1.1" 200 22748 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:07 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:08 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:09 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:09 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:11 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:24 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:48:49 -0400] "GET /trawl-site HTTP/1.1" 404 1083 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:49:02 -0400] "GET /trawl-site/form.html HTTP/1.1" 404 1097 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:50:51 -0400] "GET /trawl-site/result.jdp HTTP/1.1" 404 1098 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:50:55 -0400] "GET /trawl-site/result.jsp HTTP/1.1" 404 1098 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:51:09 -0400] "GET /Trawl-Site/result.jsp HTTP/1.1" 500 2671 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:53:14 -0400] "GET /Trawl-Site/result.jsp HTTP/1.1" 500 2671 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:53:14 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:54:09 -0400] "GET /Trawl-Site/result.jsp HTTP/1.1" 500 2657 +0:0:0:0:0:0:0:1 - - [12/Mar/2018:16:54:10 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 diff --git a/src/tomcat/logs/localhost_access_log.2018-03-13.txt b/src/tomcat/logs/localhost_access_log.2018-03-13.txt new file mode 100644 index 0000000000000000000000000000000000000000..fada7c3c6a6de252dc198522cfb16c222565d62b --- /dev/null +++ b/src/tomcat/logs/localhost_access_log.2018-03-13.txt @@ -0,0 +1,131 @@ +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:09 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:57 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:58 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:14:51:59 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:19 -0400] "GET /Trawl-Site/beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:19 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:27 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:29 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:29 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:32 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:34 -0400] "GET /manager/html HTTP/1.1" 401 2536 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/ HTTP/1.1" 200 17240 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/docs-stylesheet.css HTTP/1.1" 200 6082 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/asf-logo.svg HTTP/1.1" 200 20712 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/fonts/fonts.css HTTP/1.1" 200 1996 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/fonts/OpenSans600.woff HTTP/1.1" 200 22604 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/fonts/OpenSans400.woff HTTP/1.1" 200 21956 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/fonts/OpenSans700.woff HTTP/1.1" 200 22748 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:01:51 -0400] "GET /docs/images/fonts/OpenSans400italic.woff HTTP/1.1" 200 21092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:02:11 -0400] "GET /Trawl-Site/beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:02:52 -0400] "GET /Trawl-Site/SelectBeer.do HTTP/1.1" 405 1115 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:03:25 -0400] "GET /Trawl-Site/SelectBeer.do HTTP/1.1" 405 1115 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:03:25 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:05:08 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:00 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:00 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:01 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:01 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:13 -0400] "GET /Trawl-Site/form.html HTTP/1.1" 200 1937 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:13 -0400] "GET /Trawl-Site/style.css HTTP/1.1" 404 1097 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:13 -0400] "GET /Trawl-Site/script.js HTTP/1.1" 404 1097 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:13 -0400] "GET /Trawl-Site/color-picker.css HTTP/1.1" 404 1104 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:13 -0400] "GET /Trawl-Site/color-picker.js HTTP/1.1" 404 1103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:15 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:20 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:24 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:28 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:34 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:38 -0400] "POST /Trawl-Site/SelectBeer.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:06:51 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:02 -0400] "GET /Trawl-Site/SelectBeer.do HTTP/1.1" 405 1115 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:08 -0400] "GET /Trawl-Site/Beer HTTP/1.1" 404 1092 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/index.html HTTP/1.1" 200 1937 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/style.css HTTP/1.1" 404 1097 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/color-picker.css HTTP/1.1" 404 1104 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/color-picker.js HTTP/1.1" 404 1103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/script.js HTTP/1.1" 404 1097 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:15:07:19 -0400] "GET /Trawl-Site/color-picker.css HTTP/1.1" 404 1104 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:32 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:51 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1592 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:51 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:00:55 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:08:39 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1622 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:08:39 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:08:39 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:08:46 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 500 1509 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:36 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1616 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:36 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:36 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:52 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1548 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:52 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:09:52 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:02 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1510 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:02 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:02 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:27 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1505 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:27 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:27 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:53 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:53 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:10:53 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:18:36 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:18:36 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:18:36 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:18:38 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:19:46 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:19:53 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:21 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:21 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:21 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:22 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:41 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:41 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:42 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:23:45 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:24:37 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:24:37 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:24:37 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:24:38 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:24:46 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 134 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:28:02 -0400] "GET /Trawl/index.html HTTP/1.1" 304 - +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:28:05 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 130 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:29:19 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 119 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:29:32 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 123 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:34:11 -0400] "GET /Trawl/index.html HTTP/1.1" 200 1520 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:34:11 -0400] "GET /Trawl/style.css HTTP/1.1" 200 139 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:34:11 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:34:13 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 119 +0:0:0:0:0:0:0:1 - - [13/Mar/2018:17:34:52 -0400] "POST /Trawl/callServlet.do HTTP/1.1" 200 145 diff --git a/src/tomcat/logs/localhost_access_log.2018-03-21.txt b/src/tomcat/logs/localhost_access_log.2018-03-21.txt new file mode 100644 index 0000000000000000000000000000000000000000..3e56030bea2099f956a8881197a684dcbb04e28b --- /dev/null +++ b/src/tomcat/logs/localhost_access_log.2018-03-21.txt @@ -0,0 +1,25 @@ +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:30 -0400] "GET / HTTP/1.1" 200 11450 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:30 -0400] "GET /tomcat.css HTTP/1.1" 200 5931 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:30 -0400] "GET /tomcat.png HTTP/1.1" 200 5103 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /bg-middle.png HTTP/1.1" 200 1918 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /asf-logo-wide.svg HTTP/1.1" 200 27530 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /bg-upper.png HTTP/1.1" 200 3103 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /bg-button.png HTTP/1.1" 200 713 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /bg-nav.png HTTP/1.1" 200 1401 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:31 -0400] "GET /favicon.ico HTTP/1.1" 200 21630 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:49 -0400] "GET /host-manager/html HTTP/1.1" 401 2098 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:54 -0400] "GET /manager/html HTTP/1.1" 401 2536 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:30:58 -0400] "GET /manager/status HTTP/1.1" 401 2536 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:39 -0400] "GET /examples/ HTTP/1.1" 200 1156 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:41 -0400] "GET /examples/jsp HTTP/1.1" 302 - +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:41 -0400] "GET /examples/jsp/ HTTP/1.1" 200 14613 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:41 -0400] "GET /examples/jsp/images/execute.gif HTTP/1.1" 200 1242 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:42 -0400] "GET /examples/jsp/images/code.gif HTTP/1.1" 200 292 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:42 -0400] "GET /examples/jsp/images/return.gif HTTP/1.1" 200 1231 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:46 -0400] "GET /examples/jsp/jsp2/el/basic-arithmetic.jsp HTTP/1.1" 200 1582 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:50 -0400] "GET /examples/jsp/jsp2/el/basic-arithmetic.html HTTP/1.1" 200 1358 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:31:51 -0400] "GET /examples/jsp/jsp2/el/basic-arithmetic.jsp.html HTTP/1.1" 200 2892 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:35:58 -0400] "GET /examples/jsp/dates/date.jsp HTTP/1.1" 200 400 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:36:05 -0400] "GET /examples/jsp/dates/date.html HTTP/1.1" 200 1316 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:36:07 -0400] "GET /examples/jsp/dates/date.jsp.html HTTP/1.1" 200 2032 +0:0:0:0:0:0:0:1 - - [21/Mar/2018:09:37:36 -0400] "GET /examples/jsp/cal/calendar.html HTTP/1.1" 200 1697 diff --git a/src/tomcat/temp/safeToDelete.tmp b/src/tomcat/temp/safeToDelete.tmp new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/tomcat/webapps/ROOT/RELEASE-NOTES.txt b/src/tomcat/webapps/ROOT/RELEASE-NOTES.txt new file mode 100644 index 0000000000000000000000000000000000000000..52013a7e6997eaa16d3086daa602b1a60cfcf655 --- /dev/null +++ b/src/tomcat/webapps/ROOT/RELEASE-NOTES.txt @@ -0,0 +1,173 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + + Apache Tomcat Version 9.0.6 + Release Notes + + +========= +CONTENTS: +========= + +* Dependency Changes +* API Stability +* Bundled APIs +* Web application reloading and static fields in shared libraries +* Security manager URLs +* Symlinking static resources +* Viewing the Tomcat Change Log +* Cryptographic software notice +* When all else fails + + +=================== +Dependency Changes: +=================== +Tomcat 9.0 is designed to run on Java SE 8 and later. + + +============== +API Stability: +============== + +The public interfaces for the following classes are fixed and will not be +changed at all during the remaining lifetime of the 9.x series: +- All classes in the javax namespace + +The public interfaces for the following classes may be added to in order to +resolve bugs and/or add new features. No existing interface method will be +removed or changed although it may be deprecated. +- org.apache.catalina.* (excluding sub-packages) + +Note: As Tomcat 9 matures, the above list will be added to. The list is not + considered complete at this time. + +The remaining classes are considered part of the Tomcat internals and may change +without notice between point releases. + + +============= +Bundled APIs: +============= +A standard installation of Tomcat 9.0 makes all of the following APIs available +for use by web applications (by placing them in "lib"): +* annotations-api.jar (Annotations package) +* catalina.jar (Tomcat Catalina implementation) +* catalina-ant.jar (Tomcat Catalina Ant tasks) +* catalina-ha.jar (High availability package) +* catalina-storeconfig.jar (Generation of XML configuration from current state) +* catalina-tribes.jar (Group communication) +* ecj-4.6.3.jar (Eclipse JDT Java compiler) +* el-api.jar (EL 3.0 API) +* jasper.jar (Jasper 2 Compiler and Runtime) +* jasper-el.jar (Jasper 2 EL implementation) +* jsp-api.jar (JSP 2.3 API) +* servlet-api.jar (Servlet 4.0 API) +* tomcat-api.jar (Interfaces shared by Catalina and Jasper) +* tomcat-coyote.jar (Tomcat connectors and utility classes) +* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP) +* tomcat-jdbc.jar (Tomcat's database connection pooling solution) +* tomcat-jni.jar (Interface to the native component of the APR/native connector) +* tomcat-util.jar (Various utilities) +* tomcat-websocket.jar (WebSocket 1.1 implementation) +* websocket-api.jar (WebSocket 1.1 API) + +You can make additional APIs available to all of your web applications by +putting unpacked classes into a "classes" directory (not created by default), +or by placing them in JAR files in the "lib" directory. + +To override the XML parser implementation or interfaces, use the appropriate +feature for your JVM. For Java <= 8 use the endorsed standards override +feature. The default configuration defines JARs located in "endorsed" as endorsed. +For Java 9+ use the upgradeable modules feature. + + +================================================================ +Web application reloading and static fields in shared libraries: +================================================================ +Some shared libraries (many are part of the JDK) keep references to objects +instantiated by the web application. To avoid class loading related problems +(ClassCastExceptions, messages indicating that the classloader +is stopped, etc.), the shared libraries state should be reinitialized. + +Something which might help is to avoid putting classes which would be +referenced by a shared static field in the web application classloader, +and putting them in the shared classloader instead (JARs should be put in the +"lib" folder, and classes should be put in the "classes" folder). + + +====================== +Security manager URLs: +====================== +In order to grant security permissions to JARs located inside the +web application repository, use URLs of of the following format +in your policy file: + +file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar + + +============================ +Symlinking static resources: +============================ +By default, Unix symlinks will not work when used in a web application to link +resources located outside the web application root directory. + +This behavior is optional, and the "allowLinking" flag may be used to disable +the check. + + +============================== +Viewing the Tomcat Change Log: +============================== +The full change log is available from http://tomcat.apache.org and is also +included in the documentation web application. + + +============================= +Cryptographic software notice +============================= +This distribution includes cryptographic software. The country in +which you currently reside may have restrictions on the import, +possession, use, and/or re-export to another country, of +encryption software. BEFORE using any encryption software, please +check your country's laws, regulations and policies concerning the +import, possession, or use, and re-export of encryption software, to +see if this is permitted. See <http://www.wassenaar.org/> for more +information. + +The U.S. Government Department of Commerce, Bureau of Industry and +Security (BIS), has classified this software as Export Commodity +Control Number (ECCN) 5D002.C.1, which includes information security +software using or performing cryptographic functions with asymmetric +algorithms. The form and manner of this Apache Software Foundation +distribution makes it eligible for export under the License Exception +ENC Technology Software Unrestricted (TSU) exception (see the BIS +Export Administration Regulations, Section 740.13) for both object +code and source code. + +The following provides more details on the included cryptographic +software: + - Tomcat includes code designed to work with JSSE + - Tomcat includes code designed to work with OpenSSL + + +==================== +When all else fails: +==================== +See the FAQ +http://tomcat.apache.org/faq/ diff --git a/src/tomcat/webapps/ROOT/WEB-INF/web.xml b/src/tomcat/webapps/ROOT/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..d94a86b195dc54c5be150d9bc8214a66fb2690c1 --- /dev/null +++ b/src/tomcat/webapps/ROOT/WEB-INF/web.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" + metadata-complete="true"> + + <display-name>Welcome to Tomcat</display-name> + <description> + Welcome to Tomcat + </description> + +</web-app> diff --git a/src/tomcat/webapps/ROOT/asf-logo-wide.svg b/src/tomcat/webapps/ROOT/asf-logo-wide.svg new file mode 100644 index 0000000000000000000000000000000000000000..5743c4212646ecad6143c68cf7ab6f278120e09f --- /dev/null +++ b/src/tomcat/webapps/ROOT/asf-logo-wide.svg @@ -0,0 +1,295 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Apache_Logo_Horizontal" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" viewBox="0 0 9835 1713.9" enable-background="new 0 0 9835 1713.9" xml:space="preserve"> +<path fill="#6D6E71" d="M1069.6,296.4v92.2h-11.8v-92.2h-33.7V285h79.4v11.4H1069.6z"/> +<path fill="#6D6E71" d="M1234.8,388.5V343h-62.4v45.6h-11.8V285h11.8v46.8h62.4V285h11.8v103.6H1234.8z"/> +<path fill="#6D6E71" d="M1329.2,296.4v34h52.2v11.4h-52.2v35.5h60.4v11.3h-72.2V285h70.3v11.4H1329.2z"/> +<path fill="#D22128" d="M933.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H933.7z M1205.4,575.2 + l-121.7,292.5h240L1205.4,575.2z"/> +<path fill="#D22128" d="M1540.1,1098.5V506.9h245c101.7,0,175,94.2,175,185.8c0,96.7-68.3,187.5-170,187.5h-192.5v218.3H1540.1z + M1597.6,828.5h189.1c70,0,115-64.2,115-135.8c0-74.2-55-134.2-120-134.2h-184.1V828.5z"/> +<path fill="#D22128" d="M1927.7,1098.5l247.5-591.6h47.5l247.5,591.6h-62.5l-76.7-185h-265.8l-75.8,185H1927.7z M2199.3,575.2 + l-121.7,292.5h240L2199.3,575.2z"/> +<path fill="#D22128" d="M2750.1,503.6c105,0,181.6,53.3,218.3,129.2l-46.7,28.3c-37.5-78.3-110.8-105-175-105 + c-141.7,0-219.1,126.7-219.1,245.8c0,130.8,95.8,249.1,221.6,249.1c66.7,0,145-33.3,182.5-110l48.3,25 + c-38.3,88.3-143.3,137.5-234.1,137.5c-162.5,0-276.6-155-276.6-305C2469.3,656,2571.7,503.6,2750.1,503.6z"/> +<path fill="#D22128" d="M3528,506.9v591.6h-58.3V821.9h-350.8v276.6h-57.5V506.9h57.5v263.3h350.8V506.9H3528z"/> +<path fill="#D22128" d="M4059.1,1046.8v51.7h-397.5V506.9h390v51.7h-332.5v213.3h290V821h-290v225.8H4059.1z"/> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4229.6655" y1="-4143.6401" x2="-3987.5886" y2="-3860.573" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0" style="stop-color:#F69923"/> + <stop offset="0.3123" style="stop-color:#F79A23"/> + <stop offset="0.8383" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M729.5,8.1C702.6,24,657.9,68.9,604.6,134l49,92.5c34.4-49.2,69.3-93.4,104.5-131.2 + c2.7-3,4.1-4.4,4.1-4.4c-1.4,1.5-2.7,3-4.1,4.4c-11.4,12.6-46,52.9-98.2,133.1c50.2-2.5,127.5-12.8,190.4-23.5 + c18.7-105-18.4-153-18.4-153S784.8-24.6,729.5,8.1z"/> +<path fill="none" d="M646.5,535.5c0.4-0.1,0.7-0.1,1.1-0.2l-7.1,0.8c-0.4,0.2-0.8,0.4-1.2,0.6C641.7,536.3,644.1,535.9,646.5,535.5z + "/> +<path fill="none" d="M596.5,701.1c-4,0.9-8.1,1.6-12.3,2.2C588.4,702.7,592.5,702,596.5,701.1z"/> +<path fill="none" d="M256.7,1072.7c0.5-1.4,1-2.8,1.6-4.1c10.8-28.5,21.5-56.1,32-83.1c11.9-30.2,23.6-59.5,35.2-87.9 + c12.2-29.9,24.3-58.8,36.1-86.8c12.5-29.3,24.7-57.5,36.8-84.7c9.8-22.1,19.5-43.5,29-64.2c3.2-6.9,6.3-13.7,9.5-20.5 + c6.2-13.4,12.4-26.6,18.5-39.4c5.6-11.9,11.2-23.5,16.8-34.9c1.8-3.8,3.7-7.6,5.5-11.3c0.3-0.6,0.6-1.2,0.9-1.8l-6,0.7l-4.8-9.4 + c-0.5,0.9-0.9,1.8-1.4,2.7c-8.6,17.1-17.1,34.3-25.6,51.7c-4.9,10-9.7,20.1-14.6,30.3c-13.4,28.1-26.5,56.5-39.5,85 + c-13.1,28.8-25.9,57.8-38.5,86.9c-12.4,28.5-24.5,57.1-36.3,85.5c-11.8,28.4-23.4,56.8-34.7,84.9c-11.8,29.4-23.3,58.5-34.4,87.3 + c-2.5,6.5-5,13-7.5,19.4c-8.9,23.2-17.6,46.2-26.1,68.8l7.5,14.9l6.7-0.7c0.2-0.7,0.5-1.4,0.7-2 + C235.2,1129.9,246,1100.9,256.7,1072.7z"/> +<path fill="none" d="M581.2,703.8L581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8C581.2,703.8,581.2,703.8,581.2,703.8z"/> +<path fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6 + C558.6,785.9,561.8,785.3,564.9,784.6z"/> +<path opacity="0.35" fill="#BE202E" d="M564.9,784.6c-6.3,1.1-12.7,2.2-19.3,3.4c0,0-0.1,0-0.1,0.1c3.3-0.5,6.6-1,9.9-1.6 + C558.6,785.9,561.8,785.3,564.9,784.6z"/> +<path fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1c1-0.1,2.1-0.3,3.1-0.5 + c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/> +<path opacity="0.35" fill="#BE202E" d="M581.3,703.7C581.3,703.8,581.3,703.8,581.3,703.7c-0.1,0-0.1,0.1-0.1,0.1 + c1-0.1,2.1-0.3,3.1-0.5c4.2-0.6,8.3-1.3,12.3-2.2C591.6,702,586.5,702.9,581.3,703.7L581.3,703.7L581.3,703.7z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-6021.2769" y1="-4174.8843" x2="-4294.1865" y2="-4174.8843" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M509.2,465.4c14.9-27.8,30-55,45.2-81.5c15.8-27.5,31.8-54.2,48-79.9c1-1.5,1.9-3.1,2.9-4.6 + c16-25.3,32.1-49.6,48.4-72.9l-49-92.5c-3.7,4.5-7.4,9.1-11.1,13.7c-14.1,17.6-28.8,36.5-43.8,56.6c-17,22.6-34.4,46.8-52.1,72.2 + c-16.3,23.4-32.9,48-49.5,73.4c-14.1,21.6-28.3,43.9-42.4,66.7c-0.5,0.8-1,1.7-1.6,2.6l63.7,125.9 + C481.4,518.1,495.2,491.5,509.2,465.4z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-5812.7939" y1="-4001.6594" x2="-4783.6157" y2="-4001.6594" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M218.8,1174.8c-8.4,23.2-16.9,46.8-25.4,70.9c-0.1,0.4-0.2,0.7-0.4,1.1c-1.2,3.4-2.4,6.8-3.6,10.2 + c-5.7,16.3-10.7,30.9-22.1,64.2c18.8,8.6,33.9,31.1,48.1,56.7c-1.5-26.5-12.5-51.4-33.3-70.7c92.6,4.2,172.4-19.2,213.6-86.9 + c3.7-6,7.1-12.4,10.1-19.1c-18.8,23.8-42,33.8-85.7,31.4c-0.1,0-0.2,0.1-0.3,0.1c0.1,0,0.2-0.1,0.3-0.1 + c64.4-28.8,96.7-56.5,125.3-102.3c6.8-10.9,13.3-22.7,20.1-35.9c-56.3,57.8-121.6,74.3-190.3,61.8l-51.6,5.7 + C222,1166.1,220.4,1170.4,218.8,1174.8z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4190.9775" x2="-4197.1841" y2="-4190.9775" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M242.9,1059.3c11.1-28.8,22.6-57.9,34.4-87.3c11.3-28.1,22.9-56.5,34.7-84.9 + c11.8-28.5,24-57,36.3-85.5c12.6-29,25.4-58,38.5-86.9c12.9-28.5,26.1-56.9,39.5-85c4.8-10.1,9.7-20.2,14.6-30.3 + c8.4-17.4,17-34.6,25.6-51.7c0.5-0.9,0.9-1.8,1.4-2.7l-63.7-125.9c-1,1.7-2.1,3.4-3.1,5.1c-14.9,24.3-29.6,49.1-44.1,74.4 + c-14.7,25.6-29.1,51.7-43.1,78.1c-11.9,22.3-23.5,44.8-34.7,67.5c-2.3,4.6-4.5,9.2-6.7,13.7c-13.9,28.6-26.4,56.2-37.8,82.8 + c-12.9,30.1-24.2,58.8-34.1,86.1c-6.5,17.9-12.5,35.2-17.9,51.9c-4.5,14.2-8.7,28.4-12.7,42.6c-9.5,33.4-17.7,66.7-24.5,99.8 + l64,126.4c8.5-22.6,17.1-45.6,26.1-68.8C237.9,1072.3,240.4,1065.8,242.9,1059.3z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-5798.3159" y1="-4167.6108" x2="-4890.6782" y2="-4167.6108" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M144.4,1025.6c-8,40.5-13.8,80.8-16.6,120.8c-0.1,1.4-0.2,2.8-0.3,4.2c-20-32-73.5-63.3-73.4-63 + c38.3,55.5,67.4,110.7,71.7,164.8c-20.5,4.2-48.6-1.9-81.1-13.8c33.9,31.1,59.3,39.7,69.2,42c-31.1,1.9-63.5,23.3-96.1,47.9 + c47.7-19.5,86.3-27.2,113.9-20.9c-43.8,124-87.7,260.9-131.6,406.2c13.5-4,21.5-13,26-25.3c7.8-26.3,59.8-199,141.2-425.9 + c2.3-6.5,4.6-12.9,7-19.5c0.7-1.8,1.3-3.6,2-5.4c8.6-23.8,17.5-48.1,26.7-72.9c2.1-5.6,4.2-11.3,6.3-17c0-0.1,0.1-0.2,0.1-0.3 + l-64-126.4C145,1022.6,144.7,1024.1,144.4,1025.6z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-4012.23" x2="-4197.1841" y2="-4012.23" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M477.7,555.7c-1.8,3.7-3.7,7.5-5.5,11.3c-5.5,11.4-11.1,23-16.8,34.9c-6.1,12.8-12.3,26-18.5,39.4 + c-3.1,6.8-6.3,13.6-9.5,20.5c-9.5,20.7-19.2,42.1-29,64.2c-12.1,27.2-24.3,55.4-36.8,84.7c-11.9,27.9-23.9,56.8-36.1,86.8 + c-11.6,28.4-23.3,57.7-35.2,87.9c-10.6,27-21.3,54.6-32,83.1c-0.5,1.4-1,2.8-1.6,4.1c-10.7,28.3-21.5,57.3-32.4,87 + c-0.2,0.7-0.5,1.4-0.7,2l51.6-5.7c-1-0.2-2-0.3-3.1-0.5c61.6-7.7,143.6-53.7,196.5-110.6c24.4-26.2,46.5-57.1,67-93.3 + c15.2-26.9,29.6-56.8,43.2-89.8c11.9-28.9,23.3-60.1,34.4-94c-14.2,7.5-30.4,12.9-48.3,16.7c-3.1,0.7-6.3,1.3-9.6,1.9 + c-3.2,0.6-6.5,1.1-9.9,1.6l0,0l0,0c0,0,0.1,0,0.1-0.1c57.5-22.1,93.7-64.8,120.1-117.1c-15.1,10.3-39.7,23.8-69.2,30.3 + c-4,0.9-8.1,1.6-12.3,2.2c-1,0.1-2.1,0.3-3.1,0.5l0,0l0,0c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0l0,0c19.9-8.3,36.8-17.7,51.4-28.7 + c3.1-2.4,6.2-4.8,9.1-7.3c4.5-3.8,8.7-7.9,12.7-12.2c2.6-2.7,5.1-5.5,7.5-8.4c5.7-6.8,11.1-14.2,16.1-22.1c1.5-2.4,3-4.9,4.5-7.5 + c1.9-3.7,3.7-7.3,5.5-10.8c8-16.1,14.5-30.5,19.6-43.2c2.6-6.3,4.8-12.2,6.7-17.6c0.8-2.2,1.5-4.3,2.2-6.3c2-6.1,3.7-11.5,5-16.2 + c2-7.1,3.1-12.7,3.8-16.8l0,0l0,0c-1.9,1.5-4.2,3.1-6.7,4.6c-17.3,10.4-47.1,19.8-71.1,24.2l47.3-5.2l-47.3,5.2 + c-0.4,0.1-0.7,0.1-1.1,0.2c-2.4,0.4-4.8,0.8-7.2,1.2c0.4-0.2,0.8-0.4,1.2-0.6l-161.9,17.7C478.3,554.5,478,555.1,477.7,555.7z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-6031.4116" y1="-4021.106" x2="-4304.3213" y2="-4021.106" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M660,228.4c-14.4,22.1-30.1,47.2-47.1,75.6c-0.9,1.5-1.8,3-2.7,4.5c-14.6,24.6-30.1,51.6-46.4,81.2 + c-14.1,25.5-28.8,52.9-44,82.4c-13.3,25.7-27,52.9-41.1,81.7l161.9-17.7c47.2-21.7,68.3-41.3,88.7-69.7c5.4-7.8,10.9-16,16.3-24.5 + c16.6-26,32.9-54.6,47.5-83c14.1-27.4,26.5-54.7,36-79.2c6.1-15.6,10.9-30.1,14.3-42.8c2.9-11.2,5.3-21.9,7.1-32.1 + C787.5,215.6,710.2,225.9,660,228.4z"/> +<path fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/> +<path opacity="0.35" fill="#BE202E" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3959.0669" x2="-4197.1841" y2="-3959.0669" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M555.4,786.4c-3.2,0.6-6.5,1.1-9.9,1.6l0,0C548.8,787.5,552.1,787,555.4,786.4z"/> +<path fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/> +<path opacity="0.35" fill="#BE202E" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-5924.2744" y1="-3965.1499" x2="-4197.1841" y2="-3965.1499" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M581.2,703.8c1-0.1,2.1-0.3,3.1-0.5C583.2,703.5,582.2,703.7,581.2,703.8L581.2,703.8z"/> +<path fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8 + C581.3,703.8,581.3,703.8,581.3,703.8z"/> +<path opacity="0.35" fill="#BE202E" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8 + C581.3,703.8,581.3,703.8,581.3,703.8z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-4954.02" y1="-3966.3701" x2="-4572.2764" y2="-3966.3701" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 6189.0356 -1936.8361)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M581.3,703.8C581.3,703.8,581.3,703.8,581.3,703.8L581.3,703.8L581.3,703.8L581.3,703.8 + C581.3,703.8,581.3,703.8,581.3,703.8z"/> +<path fill="#6D6E71" d="M4552.4,508.2c12,3.6,22.6,8.4,31.5,14.5l-10.5,23c-9.2-6.1-19-10.6-29.4-13.6c-10.4-3-20.3-4.5-29.7-4.5 + c-13.8,0-24.9,2.5-33.2,7.5c-8.3,5-12.4,12-12.4,21.1c0,7.8,2.3,14.2,6.9,19.3c4.6,5.1,10.3,9,17.3,11.9c6.9,2.8,16.4,6.1,28.5,9.8 + c14.6,4.7,26.4,9.1,35.3,13.1c8.9,4.1,16.5,10.1,22.9,18.1c6.3,8,9.5,18.5,9.5,31.5c0,11.9-3.2,22.2-9.6,31.1 + c-6.4,8.9-15.5,15.7-27.3,20.6c-11.8,4.9-25.3,7.3-40.6,7.3c-15.3,0-30.2-3-44.7-8.9c-14.4-5.9-26.8-13.9-37.2-23.8l10.9-22 + c9.8,9.6,21,17,33.8,22.3c12.8,5.3,25.3,7.9,37.4,7.9c15.5,0,27.8-3,36.8-9c9-6,13.4-14.1,13.4-24.3c0-8-2.3-14.5-7-19.7 + c-4.7-5.2-10.5-9.2-17.4-12.1c-6.9-2.9-16.4-6.1-28.5-9.7c-14.4-4.3-26.2-8.4-35.2-12.4c-9-4-16.6-9.9-22.9-17.8 + c-6.2-7.9-9.3-18.2-9.3-31.1c0-11.1,3.1-20.8,9.2-29.1c6.1-8.4,14.8-14.8,26.1-19.4c11.3-4.6,24.2-6.9,38.9-6.9 + C4528.2,502.8,4540.3,504.6,4552.4,508.2z"/> +<path fill="#6D6E71" d="M4870.3,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5 + c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3 + c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3 + C4834.4,503.1,4853.2,507.9,4870.3,517.6z M4770.5,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7 + c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7 + c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4 + C4798.4,526.4,4783.8,530.2,4770.5,537.8z"/> +<path fill="#6D6E71" d="M5080.3,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H5080.3z"/> +<path fill="#6D6E71" d="M5390.7,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H5390.7z"/> +<path fill="#6D6E71" d="M5777.5,718l-57.8-180.5L5661.1,718h-25l-71.7-214.3h26.3l58.9,185.9l58.1-185.6l24.5-0.3l58.7,185.9 + l58.1-185.9h25.4L5802.6,718H5777.5z"/> +<path fill="#6D6E71" d="M5996.7,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H5996.7z M6054.9,531.7 + l-47.7,108.6h96.1L6054.9,531.7z"/> +<path fill="#6D6E71" d="M6377,649.7c-6.1,0.4-10.9,0.6-14.3,0.6h-56.9V718h-24.5V503.7h81.4c26.7,0,47.4,6.3,62.2,18.8 + c14.8,12.6,22.2,30.3,22.2,53.2c0,17.5-4.1,32.2-12.4,44c-8.3,11.8-20.1,20.3-35.6,25.5l50.1,72.8h-27.8L6377,649.7z M6407.7,614 + c10.5-8.6,15.8-21.1,15.8-37.7c0-16.1-5.3-28.3-15.8-36.6c-10.5-8.3-25.5-12.4-45.1-12.4h-56.9v99.5h56.9 + C6382.2,626.9,6397.2,622.6,6407.7,614z"/> +<path fill="#6D6E71" d="M6608.2,527.3v70.4h108v23.6h-108v73.4h124.9V718h-149.4V503.7H6729v23.6H6608.2z"/> +<path fill="#6D6E71" d="M7074.8,527.3v75.3h100.1v23.6h-100.1V718h-24.5V503.7h136.1v23.6H7074.8z"/> +<path fill="#6D6E71" d="M7457.7,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5 + c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3 + c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3 + C7421.8,503.1,7440.5,507.9,7457.7,517.6z M7357.9,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7 + c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7 + c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4 + C7385.7,526.4,7371.2,530.2,7357.9,537.8z"/> +<path fill="#6D6E71" d="M7794.8,695.5c-15.9,15.8-37.9,23.7-65.9,23.7c-28.2,0-50.3-7.9-66.3-23.7c-16-15.8-24-37.7-24-65.7V503.7 + h24.5v126.1c0,20.6,5.9,36.7,17.6,48.3c11.8,11.6,27.8,17.4,48.1,17.4c20.4,0,36.4-5.7,48-17.3c11.6-11.5,17.3-27.7,17.3-48.5V503.7 + h24.5v126.1C7818.7,657.8,7810.7,679.7,7794.8,695.5z"/> +<path fill="#6D6E71" d="M8115.1,718l-128.5-172v172h-24.5V503.7h25.4L8116,676V503.7h24.2V718H8115.1z"/> +<path fill="#6D6E71" d="M8429.3,517.9c16.7,9.4,29.9,22.3,39.6,38.6c9.7,16.3,14.6,34.4,14.6,54.5s-4.9,38.2-14.6,54.5 + c-9.7,16.3-23,29.2-40,38.6c-16.9,9.4-35.8,14-56.5,14h-85.8V503.7h86.7C8394,503.7,8412.6,508.4,8429.3,517.9z M8311.2,694.7h62.5 + c15.7,0,30.1-3.6,43-10.8c12.9-7.2,23.2-17.2,30.7-30c7.5-12.7,11.3-27,11.3-42.7c0-15.7-3.8-30-11.5-42.7 + c-7.7-12.7-18-22.7-31.1-30.1c-13.1-7.4-27.5-11.1-43.3-11.1h-61.6V694.7z"/> +<path fill="#6D6E71" d="M8622.8,663.9l-23.9,54.1h-26l96.1-214.3h25.4l95.8,214.3h-26.6l-23.9-54.1H8622.8z M8681,531.7l-47.7,108.6 + h96.1L8681,531.7z"/> +<path fill="#6D6E71" d="M8950.8,527.3V718h-24.5V527.3h-69.6v-23.6h164.2v23.6H8950.8z"/> +<path fill="#6D6E71" d="M9138.9,718V503.7h24.5V718H9138.9z"/> +<path fill="#6D6E71" d="M9462.2,517.6c17.1,9.6,30.7,22.6,40.7,39.1c10,16.4,15,34.5,15,54.2c0,19.8-5,38-15,54.5 + c-10,16.5-23.6,29.6-40.7,39.3c-17.1,9.7-35.9,14.5-56.2,14.5c-20.6,0-39.5-4.8-56.6-14.5c-17.1-9.7-30.7-22.8-40.7-39.3 + c-10-16.5-15-34.7-15-54.5c0-19.8,5-38,15-54.5c10-16.5,23.6-29.5,40.7-39c17.1-9.5,36-14.3,56.6-14.3 + C9426.4,503.1,9445.1,507.9,9462.2,517.6z M9362.4,537.8c-13.4,7.6-24,17.8-32,30.6c-8,12.9-12,27-12,42.4c0,15.5,4,29.8,12,42.7 + c8,13,18.6,23.2,32,30.7c13.3,7.5,27.9,11.3,43.6,11.3c15.7,0,30.2-3.8,43.4-11.3c13.2-7.5,23.7-17.8,31.6-30.7 + c7.9-12.9,11.8-27.2,11.8-42.7s-3.9-29.7-11.8-42.5c-7.9-12.8-18.4-23-31.7-30.6c-13.3-7.6-27.7-11.4-43.3-11.4 + C9390.3,526.4,9375.8,530.2,9362.4,537.8z"/> +<path fill="#6D6E71" d="M9800.8,718l-128.5-172v172h-24.5V503.7h25.4L9801.7,676V503.7h24.2V718H9800.8z"/> +<path fill="#6D6E71" d="M4204.9,500.9c9,9,13.5,19.9,13.5,32.6c0,12.7-4.5,23.6-13.5,32.7c-9,9.1-20,13.7-32.8,13.7 + c-12.9,0-23.8-4.5-32.7-13.5c-8.9-9-13.4-19.9-13.4-32.6c0-12.7,4.5-23.6,13.5-32.7c9-9.1,19.9-13.7,32.7-13.7 + C4185,487.4,4195.9,491.9,4204.9,500.9z M4201,562.4c7.9-8,11.8-17.6,11.8-28.8c0-11.2-3.9-20.7-11.7-28.6 + c-7.8-7.9-17.4-11.9-28.7-11.9c-11.3,0-20.9,4-28.8,11.9c-7.8,8-11.8,17.6-11.8,28.8c0,11.2,3.9,20.8,11.6,28.7 + c7.8,7.9,17.3,11.9,28.6,11.9S4193.1,570.4,4201,562.4z M4194.5,524.7c0,8.3-3.6,13.5-10.9,15.6l13.3,18h-10.7l-12-16.7h-11v16.7 + h-8.7v-50h18.8c7.6,0,13,1.3,16.3,3.9C4192.9,514.8,4194.5,519,4194.5,524.7z M4183.4,531.7c1.7-1.4,2.6-3.8,2.6-7.1 + c0-3.3-0.9-5.6-2.7-6.8c-1.8-1.3-4.9-1.9-9.5-1.9h-10.6v18h10.4C4178.4,533.9,4181.6,533.2,4183.4,531.7z"/> +<path fill="#6D6E71" d="M4540.6,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4 + c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959 + C4483.1,932.2,4506.2,918.6,4540.6,918.2z"/> +<path fill="#6D6E71" d="M4823.7,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7 + c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7 + C4804.6,1072.7,4814,1069.6,4823.7,1063.6z"/> +<path fill="#6D6E71" d="M5027.8,1063.6l7.4,21.3c-12.8,8.8-26.2,13.3-40.2,13.5c-13.7,0-24.7-4.2-32.9-12.7 + c-8.2-8.4-12.3-21.1-12.3-38V946.2h-25.6v-21.3h25.6V878h26v46.9l56.3-0.3v21.6h-56.3v96.8c0,19.8,7.9,29.7,23.6,29.7 + C5008.7,1072.7,5018.1,1069.6,5027.8,1063.6z"/> +<path fill="#6D6E71" d="M5244.1,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5 + c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C5189.5,931.3,5212.4,918.2,5244.1,918.2z + M5239.4,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7 + c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C5205.4,1067.8,5220.7,1074,5239.4,1074z"/> +<path fill="#6D6E71" d="M5449.9,964.4c4.5,0,8.3,1.7,11.5,5.1c3.2,3.4,4.7,7.5,4.7,12.5s-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1 + c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5s1.6-9.1,4.7-12.5C5441.2,966.1,5445.2,964.4,5449.9,964.4z M5449.9,1064.6 + c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1 + c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5C5441.2,1066.3,5445.2,1064.6,5449.9,1064.6z"/> +<path fill="#6D6E71" d="M5574.1,1138.1h-22.9l105.3-317.8h23.3L5574.1,1138.1z"/> +<path fill="#6D6E71" d="M5753.6,1138.1h-22.9l105.3-317.8h23.3L5753.6,1138.1z"/> +<path fill="#6D6E71" d="M6140.5,1097h-27.3l-52.3-144.4l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5 + l52-150.5h27.3L6140.5,1097z"/> +<path fill="#6D6E71" d="M6504.6,1097h-27.3L6425,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5 + l52-150.5h27.3L6504.6,1097z"/> +<path fill="#6D6E71" d="M6868.6,1097h-27.3L6789,952.6l-52,144.4h-27.3l-66.5-177.8h27.7l52.6,150.5l51.6-150.5h27.7l52.3,150.5 + l52-150.5h27.3L6868.6,1097z"/> +<path fill="#6D6E71" d="M7034.6,1064.6c4.5,0,8.3,1.7,11.5,5c3.2,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5 + c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5 + C7026,1066.3,7029.9,1064.6,7034.6,1064.6z"/> +<path fill="#6D6E71" d="M7283,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39 + c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8 + c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2s23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2 + c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7283z M7222.9,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3 + h-55.3c-30.1,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7200.6,1072.5,7210.5,1075.4,7222.9,1075.4z"/> +<path fill="#6D6E71" d="M7536.3,918.2c25.2,0,45.7,8.4,61.6,25.3c15.9,16.9,23.8,38.6,23.8,65.1c0,26.3-7.8,47.8-23.5,64.5 + c-15.6,16.6-36,25-61.2,25c-32.2,0-55.2-13-69.2-39.1v103.6h-26.3V919.2h26.3v38.4C7481.8,931.3,7504.6,918.2,7536.3,918.2z + M7531.6,1074c18.4,0,33.6-6.2,45.5-18.6c11.9-12.3,17.9-28.2,17.9-47.6c0-19.1-6-34.9-17.9-47.4c-11.9-12.5-27.1-18.7-45.5-18.7 + c-18.7,0-34,6.2-45.9,18.6c-11.9,12.4-17.9,28.2-17.9,47.6c0,19.3,6,35.2,17.9,47.6C7497.6,1067.8,7512.9,1074,7531.6,1074z"/> +<path fill="#6D6E71" d="M7850.8,1097v-27.3c-14.2,19.1-35.9,28.7-65.1,28.7c-18,0-32.6-5.1-43.7-15.4c-11.1-10.2-16.7-23.2-16.7-39 + c0-15.5,5.8-27.8,17.5-37c11.7-9.1,28-13.8,48.9-14h58.4v-10.5c0-13.3-4.1-23.5-12.1-30.7c-8.1-7.2-19.9-10.8-35.4-10.8 + c-18,0-36.8,6.7-56.4,20.2l-11.1-19.2c12.6-8.3,24.2-14.4,34.9-18.2c10.7-3.8,23.2-5.7,37.6-5.7c21.8,0,38.6,5.4,50.4,16.2 + c11.8,10.8,17.8,25.9,18.1,45.2l0.3,117.4H7850.8z M7790.7,1075.4c15.1,0,27.9-3.5,38.6-10.6c10.7-7.1,17.7-16.8,21.1-29.2v-21.3 + h-55.3c-30.2,0-45.2,9.6-45.2,28.7c0,9.9,3.7,17.8,11.1,23.6C7768.5,1072.5,7778.4,1075.4,7790.7,1075.4z"/> +<path fill="#6D6E71" d="M8077.8,918.5c28.6-0.2,51.4,8.5,68.5,26.3l-14.5,18.6c-14.4-13.7-32.1-20.6-53-20.6 + c-18.4,0-33.6,6.1-45.4,18.2c-11.8,12.1-17.7,27.9-17.7,47.2s5.9,35.2,17.7,47.4c11.8,12.3,26.9,18.4,45.4,18.4 + c23.8,0,42.2-7.6,55-22.9l15.2,16.2c-16.9,20.5-40.6,30.7-71.2,30.7c-25.9,0-47-8.3-63.4-25c-16.4-16.6-24.6-38.2-24.6-64.8 + c0-26.3,8.3-47.9,24.8-64.6C8031.1,926.9,8052.2,918.5,8077.8,918.5z"/> +<path fill="#6D6E71" d="M8366.7,918.2c21.1,0,37.7,6.1,49.6,18.4c11.9,12.3,17.9,29.2,17.9,50.8V1097h-26.3V994.4 + c0-15.7-4.4-28-13.3-36.8s-21.2-13.2-36.9-13.2c-18.7,0.2-33.3,6.3-44,18.2c-10.7,11.9-16,27.5-16,46.9v87.4h-26.3V846.6h26.3V959 + C8309.2,932.2,8332.2,918.6,8366.7,918.2z"/> +<path fill="#6D6E71" d="M8635.6,918.5c28.1-0.2,49.3,8.7,63.6,26.6c14.3,18,20.8,42.4,19.4,73.2h-145.1c2.2,17.3,9.2,31.1,20.9,41.3 + c11.7,10.2,26.2,15.4,43.5,15.4c22.5,0,40.8-7.4,55-22.3l14.5,15.5c-17.8,19.8-41.6,29.7-71.5,29.7c-26.1,0-47.4-8.3-63.8-25 + c-16.4-16.6-24.6-38.2-24.6-64.8s8.2-48.1,24.6-64.8C8588.5,926.8,8609.7,918.5,8635.6,918.5z M8573.5,996.8H8695 + c-0.9-17.1-6.7-30.7-17.4-40.7c-10.7-10-24.7-15-42-15c-16.9,0-30.9,5.1-42.2,15.2C8582.1,966.4,8575.5,979.9,8573.5,996.8z"/> +<path fill="#6D6E71" d="M8838,1064.6c4.5,0,8.3,1.7,11.5,5c3.1,3.4,4.7,7.5,4.7,12.5c0,4.9-1.6,9.1-4.7,12.5 + c-3.2,3.4-7,5.1-11.5,5.1c-4.7,0-8.7-1.7-11.8-5.1c-3.2-3.4-4.7-7.5-4.7-12.5c0-4.9,1.6-9.1,4.7-12.5 + C8829.3,1066.3,8833.3,1064.6,8838,1064.6z"/> +<path fill="#6D6E71" d="M8983.4,943.5c16.9-16.6,38.5-25,64.8-25c26.3,0,47.9,8.3,64.8,25c16.9,16.6,25.3,38.1,25.3,64.5 + c0,26.5-8.5,48.2-25.3,64.9c-16.9,16.8-38.5,25.1-64.8,25.1c-26.3,0-47.9-8.4-64.8-25.1c-16.9-16.8-25.3-38.4-25.3-64.9 + C8958.1,981.6,8966.5,960.1,8983.4,943.5z M9094.1,960.8c-11.9-12.3-27.2-18.4-45.9-18.4c-18.7,0-34,6.1-45.9,18.4 + c-11.9,12.3-17.9,28.1-17.9,47.4c0,19.6,6,35.5,17.9,47.7c11.9,12.3,27.2,18.4,45.9,18.4c18.7,0,34-6.1,45.9-18.4 + c11.9-12.3,17.9-28.2,17.9-47.7C9111.9,988.9,9106,973.1,9094.1,960.8z"/> +<path fill="#6D6E71" d="M9283.3,919.2v39.5c12.2-26.5,33.4-40,63.8-40.5v26.7c-18.4-0.2-33.3,4.9-44.5,15.3 + c-11.3,10.5-17.6,24.6-19.2,42.3v94.5H9257V919.2H9283.3z"/> +<path fill="#6D6E71" d="M9610,919.2v159.2c0,25.9-8.2,46.5-24.5,61.7c-16.3,15.3-38,22.9-64.9,22.9c-26.3-0.2-50.6-8.8-72.9-25.7 + l12.1-20.2c17.8,14.8,37.7,22.4,59.7,22.6c19.4,0,34.9-5.5,46.6-16.5c11.7-11,17.5-25.7,17.5-44.2v-27c-13,24.7-34.9,37.1-65.4,37.1 + c-23.9,0-43.3-8-58.4-24c-15.1-16-22.6-36.7-22.6-62.1c0-24.7,7.4-45,22.3-60.9c14.8-15.9,34.2-23.9,58-24.1 + c30.6,0,52.6,12.4,66.1,37.1v-36.1H9610z M9479.2,1049.2c11.4,11.8,25.9,17.7,43.7,17.7s32.3-5.9,43.7-17.7c11.3-11.8,17-26.8,17-45 + c0-18.4-5.7-33.6-17-45.4c-11.4-11.8-25.9-17.7-43.7-17.7s-32.3,5.9-43.7,17.7c-11.3,11.8-17.1,26.9-17.4,45.4 + C9462.1,1022.4,9467.9,1037.4,9479.2,1049.2z"/> +<path fill="#6D6E71" d="M9729.4,1138.1h-22.9l105.3-317.8h23.3L9729.4,1138.1z"/> +</svg> diff --git a/src/tomcat/webapps/ROOT/bg-button.png b/src/tomcat/webapps/ROOT/bg-button.png new file mode 100644 index 0000000000000000000000000000000000000000..b544bbfcdf91f6044ece15ffd1ca57575cebb8ee Binary files /dev/null and b/src/tomcat/webapps/ROOT/bg-button.png differ diff --git a/src/tomcat/webapps/ROOT/bg-middle.png b/src/tomcat/webapps/ROOT/bg-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..0c95a828d10281783d0cf82dba498f954320346e Binary files /dev/null and b/src/tomcat/webapps/ROOT/bg-middle.png differ diff --git a/src/tomcat/webapps/ROOT/bg-nav.png b/src/tomcat/webapps/ROOT/bg-nav.png new file mode 100644 index 0000000000000000000000000000000000000000..d44b094f910aadab229d1e33a7640a7ec24b9e8d Binary files /dev/null and b/src/tomcat/webapps/ROOT/bg-nav.png differ diff --git a/src/tomcat/webapps/ROOT/bg-upper.png b/src/tomcat/webapps/ROOT/bg-upper.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9ae7b18cfa6834f89beaf3ead4d2c7343f1476 Binary files /dev/null and b/src/tomcat/webapps/ROOT/bg-upper.png differ diff --git a/src/tomcat/webapps/ROOT/favicon.ico b/src/tomcat/webapps/ROOT/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c5bd2c63b38b326cf01f7f9fc61f7b21b5bc5ae Binary files /dev/null and b/src/tomcat/webapps/ROOT/favicon.ico differ diff --git a/src/tomcat/webapps/ROOT/index.jsp b/src/tomcat/webapps/ROOT/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c5d2293570b11135098dd6e3e244b6cfcbdd8cd7 --- /dev/null +++ b/src/tomcat/webapps/ROOT/index.jsp @@ -0,0 +1,223 @@ +<%-- +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--%> +<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> +<% +java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy"); +request.setAttribute("year", sdf.format(new java.util.Date())); +request.setAttribute("tomcatUrl", "http://tomcat.apache.org/"); +request.setAttribute("tomcatDocUrl", "/docs/"); +request.setAttribute("tomcatExamplesUrl", "/examples/"); +%> +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <title><%=request.getServletContext().getServerInfo() %></title> + <link href="favicon.ico" rel="icon" type="image/x-icon" /> + <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> + <link href="tomcat.css" rel="stylesheet" type="text/css" /> + </head> + + <body> + <div id="wrapper"> + <div id="navigation" class="curved container"> + <span id="nav-home"><a href="${tomcatUrl}">Home</a></span> + <span id="nav-hosts"><a href="${tomcatDocUrl}">Documentation</a></span> + <span id="nav-config"><a href="${tomcatDocUrl}config/">Configuration</a></span> + <span id="nav-examples"><a href="${tomcatExamplesUrl}">Examples</a></span> + <span id="nav-wiki"><a href="http://wiki.apache.org/tomcat/FrontPage">Wiki</a></span> + <span id="nav-lists"><a href="${tomcatUrl}lists.html">Mailing Lists</a></span> + <span id="nav-help"><a href="${tomcatUrl}findhelp.html">Find Help</a></span> + <br class="separator" /> + </div> + <div id="asf-box"> + <h1>${pageContext.servletContext.serverInfo}</h1> + </div> + <div id="upper" class="curved container"> + <div id="congrats" class="curved container"> + <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2> + </div> + <div id="notice"> + <img src="tomcat.png" alt="[tomcat logo]" /> + <div id="tasks"> + <h3>Recommended Reading:</h3> + <h4><a href="${tomcatDocUrl}security-howto.html">Security Considerations HOW-TO</a></h4> + <h4><a href="${tomcatDocUrl}manager-howto.html">Manager Application HOW-TO</a></h4> + <h4><a href="${tomcatDocUrl}cluster-howto.html">Clustering/Session Replication HOW-TO</a></h4> + </div> + </div> + <div id="actions"> + <div class="button"> + <a class="container shadow" href="/manager/status"><span>Server Status</span></a> + </div> + <div class="button"> + <a class="container shadow" href="/manager/html"><span>Manager App</span></a> + </div> + <div class="button"> + <a class="container shadow" href="/host-manager/html"><span>Host Manager</span></a> + </div> + </div> + <!-- + <br class="separator" /> + --> + <br class="separator" /> + </div> + <div id="middle" class="curved container"> + <h3>Developer Quick Start</h3> + <div class="col25"> + <div class="container"> + <p><a href="${tomcatDocUrl}setup.html">Tomcat Setup</a></p> + <p><a href="${tomcatDocUrl}appdev/">First Web Application</a></p> + </div> + </div> + <div class="col25"> + <div class="container"> + <p><a href="${tomcatDocUrl}realm-howto.html">Realms & AAA</a></p> + <p><a href="${tomcatDocUrl}jndi-datasource-examples-howto.html">JDBC DataSources</a></p> + </div> + </div> + <div class="col25"> + <div class="container"> + <p><a href="${tomcatExamplesUrl}">Examples</a></p> + </div> + </div> + <div class="col25"> + <div class="container"> + <p><a href="http://wiki.apache.org/tomcat/Specifications">Servlet Specifications</a></p> + <p><a href="http://wiki.apache.org/tomcat/TomcatVersions">Tomcat Versions</a></p> + </div> + </div> + <br class="separator" /> + </div> + <div id="lower"> + <div id="low-manage" class=""> + <div class="curved container"> + <h3>Managing Tomcat</h3> + <p>For security, access to the <a href="/manager/html">manager webapp</a> is restricted. + Users are defined in:</p> + <pre>$CATALINA_HOME/conf/tomcat-users.xml</pre> + <p>In Tomcat 9.0 access to the manager application is split between + different users. <a href="${tomcatDocUrl}manager-howto.html">Read more...</a></p> + <br /> + <h4><a href="${tomcatDocUrl}RELEASE-NOTES.txt">Release Notes</a></h4> + <h4><a href="${tomcatDocUrl}changelog.html">Changelog</a></h4> + <h4><a href="${tomcatUrl}migration.html">Migration Guide</a></h4> + <h4><a href="${tomcatUrl}security.html">Security Notices</a></h4> + </div> + </div> + <div id="low-docs" class=""> + <div class="curved container"> + <h3>Documentation</h3> + <h4><a href="${tomcatDocUrl}">Tomcat 9.0 Documentation</a></h4> + <h4><a href="${tomcatDocUrl}config/">Tomcat 9.0 Configuration</a></h4> + <h4><a href="http://wiki.apache.org/tomcat/FrontPage">Tomcat Wiki</a></h4> + <p>Find additional important configuration information in:</p> + <pre>$CATALINA_HOME/RUNNING.txt</pre> + <p>Developers may be interested in:</p> + <ul> + <li><a href="http://tomcat.apache.org/bugreport.html">Tomcat 9.0 Bug Database</a></li> + <li><a href="${tomcatDocUrl}api/index.html">Tomcat 9.0 JavaDocs</a></li> + <li><a href="http://svn.apache.org/repos/asf/tomcat/tc9.0.x/">Tomcat 9.0 SVN Repository</a></li> + </ul> + </div> + </div> + <div id="low-help" class=""> + <div class="curved container"> + <h3>Getting Help</h3> + <h4><a href="${tomcatUrl}faq/">FAQ</a> and <a href="${tomcatUrl}lists.html">Mailing Lists</a></h4> + <p>The following mailing lists are available:</p> + <ul> + <li id="list-announce"><strong><a href="${tomcatUrl}lists.html#tomcat-announce">tomcat-announce</a><br /> + Important announcements, releases, security vulnerability notifications. (Low volume).</strong> + </li> + <li><a href="${tomcatUrl}lists.html#tomcat-users">tomcat-users</a><br /> + User support and discussion + </li> + <li><a href="${tomcatUrl}lists.html#taglibs-user">taglibs-user</a><br /> + User support and discussion for <a href="${tomcatUrl}taglibs/">Apache Taglibs</a> + </li> + <li><a href="${tomcatUrl}lists.html#tomcat-dev">tomcat-dev</a><br /> + Development mailing list, including commit messages + </li> + </ul> + </div> + </div> + <br class="separator" /> + </div> + <div id="footer" class="curved container"> + <div class="col20"> + <div class="container"> + <h4>Other Downloads</h4> + <ul> + <li><a href="${tomcatUrl}download-connectors.cgi">Tomcat Connectors</a></li> + <li><a href="${tomcatUrl}download-native.cgi">Tomcat Native</a></li> + <li><a href="${tomcatUrl}taglibs/">Taglibs</a></li> + <li><a href="${tomcatDocUrl}deployer-howto.html">Deployer</a></li> + </ul> + </div> + </div> + <div class="col20"> + <div class="container"> + <h4>Other Documentation</h4> + <ul> + <li><a href="${tomcatUrl}connectors-doc/">Tomcat Connectors</a></li> + <li><a href="${tomcatUrl}connectors-doc/">mod_jk Documentation</a></li> + <li><a href="${tomcatUrl}native-doc/">Tomcat Native</a></li> + <li><a href="${tomcatDocUrl}deployer-howto.html">Deployer</a></li> + </ul> + </div> + </div> + <div class="col20"> + <div class="container"> + <h4>Get Involved</h4> + <ul> + <li><a href="${tomcatUrl}getinvolved.html">Overview</a></li> + <li><a href="${tomcatUrl}svn.html">SVN Repositories</a></li> + <li><a href="${tomcatUrl}lists.html">Mailing Lists</a></li> + <li><a href="http://wiki.apache.org/tomcat/FrontPage">Wiki</a></li> + </ul> + </div> + </div> + <div class="col20"> + <div class="container"> + <h4>Miscellaneous</h4> + <ul> + <li><a href="${tomcatUrl}contact.html">Contact</a></li> + <li><a href="${tomcatUrl}legal.html">Legal</a></li> + <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li> + <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li> + </ul> + </div> + </div> + <div class="col20"> + <div class="container"> + <h4>Apache Software Foundation</h4> + <ul> + <li><a href="${tomcatUrl}whoweare.html">Who We Are</a></li> + <li><a href="${tomcatUrl}heritage.html">Heritage</a></li> + <li><a href="http://www.apache.org">Apache Home</a></li> + <li><a href="${tomcatUrl}resources.html">Resources</a></li> + </ul> + </div> + </div> + <br class="separator" /> + </div> + <p class="copyright">Copyright ©1999-${year} Apache Software Foundation. All Rights Reserved</p> + </div> + </body> + +</html> diff --git a/src/tomcat/webapps/ROOT/tomcat-power.gif b/src/tomcat/webapps/ROOT/tomcat-power.gif new file mode 100644 index 0000000000000000000000000000000000000000..01c400b09a1cf2579519b5b2200cf80b4ee60a91 Binary files /dev/null and b/src/tomcat/webapps/ROOT/tomcat-power.gif differ diff --git a/src/tomcat/webapps/ROOT/tomcat.css b/src/tomcat/webapps/ROOT/tomcat.css new file mode 100644 index 0000000000000000000000000000000000000000..6995838773e24772ba84ee4a455afd0bf288aaf1 --- /dev/null +++ b/src/tomcat/webapps/ROOT/tomcat.css @@ -0,0 +1,351 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +body { + margin: 10px 20px; + text-align: center; + font-family: Arial, sans-serif; +} + +h1, h2, h3, h4, h5, h6, p, ul, ol { + margin: 0 0 0.5em; +} +h1 { + font-size: 18pt; + margin: 0.5em 0 0; +} +h2 { + font-size: 16pt; +} +h3 { + font-size: 13pt; +} +h4 { + font-size: 12pt; +} +h5 { + font-size: 11pt; +} +p { + font-size: 11pt +} + +ul { + margin: 0; + padding: 0 0 0 0.25em; + text-indent: 0; + list-style: none; +} +li { + margin: 0; + padding: 0 0 0.25em; + text-indent: 0; + font-size: 80%; +} + +pre { + text-indent: 0.25em; + width: 90%; + font-size: 90%; +} + +br.separator { + margin: 0; + padding: 0; + clear: both; +} + +a img { + border: 0 none; +} + +.container { + padding: 10px; + margin: 0 0 10px; +} + +.col20 { + float: left; + width: 20%; +} + +.col25 { + float: left; + width: 25%; +} + +#wrapper { + display: block; + margin: 0 auto; + text-align: left; + min-width: 720px; + max-width: 1000px; +} +.curved { + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + -khtml-border-radius: 10px; +} + +#navigation { + background: #eee url(bg-nav.png) repeat-x top left; + margin: 0 0 10px; + padding: 0; +} +#navigation span { + float: left; +} +#navigation span a { + display: block; + padding: 10px; + font-weight: bold; + text-shadow: 1px 1px 1px #fff; +} +#navigation span a:link, +#navigation span a:visited, +#navigation span a:hover, +#navigation span a:active { + color: #666; + text-decoration: none; +} +#navigation span#nav-help { + float: right; + margin-right: 0; +} + +#asf-box { + height: 40px; + background: #fff url(asf-logo-wide.svg) no-repeat top right;} +#asf-box h1 { + padding: 0; + margin: 0; +} + +#upper { + background: #fff url(bg-upper.png) repeat-x top left; +} + +#congrats { + text-align: center; + padding: 10px; + margin: 0 40px 20px; + background-color: #9c9; +} +#congrats h2 { + font-size: 14pt; + padding: 0; + margin: 0; + color: #fff; +} + +#notice { + float: left; + width: 560px; + color: #696; +} +#notice a:link, +#notice a:visited, +#notice a:hover, +#notice a:active { + color: #090; + text-decoration: none; +} +#notice img, +#notice #tasks { + float: left; +} +#tasks a:link, +#tasks a:visited, +#tasks a:hover, +#tasks a:active { + text-decoration: underline; +} +#notice img { + margin-right: 20px; +} + +#actions { + float: right; + width: 140px; +} + +#actions .button { + display: block; + padding: 0; + height: 36px; + background: url(bg-button.png) no-repeat top left; +} + +#actions .button a { + display: block; + padding: 0; +} + +#actions .button a:link, +#actions .button a:visited, +#actions .button a:hover, +#actions .button a:active { + color: #696; + text-decoration: none; +} + +#actions .button a span { + display: block; + padding: 6px 10px; + color: #666; + text-shadow: 1px 1px 1px #fff; + font-size: 10pt; + font-weight: bold; +} + +#middle { + background: #eef url(bg-middle.png) repeat-x top left; + margin: 20px 0; + padding: 1px 10px; +} +#middle h3 { + margin: 0 0 10px; + color: #033; +} +#middle p { + font-size: 10pt; +} +#middle a:link, +#middle a:visited, +#middle a:hover, +#middle a:active { + color: #366; + font-weight: bold; +} +#middle .col25 .container { + padding: 0 0 1px; +} + +#developers { + float: left; + width: 40%; +} +#security { + float: right; + width: 50%; +} + +#lower { + padding: 0; +} + +#lower a:link, +#lower a:visited, +#lower a:hover, +#lower a:active { + color: #600; +} + +#lower strong a:link, +#lower strong a:visited, +#lower strong a:hover, +#lower strong a:active { + color: #c00; +} + +#lower h3 { + color: #963; + font-size: 14pt; +} +#lower h4 { + font-size: 12pt; +} +#lower ul { + padding: 0; + margin: 0.5em 0; +} +#lower p, +#lower li { + font-size: 9pt; + color: #753; + margin: 0 0 0.1em; +} +#lower li { + padding: 3px 5px; +} +#lower li strong { + color: #a53; +} +#lower li#list-announce { + border: 1px solid #f90; + background-color: #ffe8c8; +} +#lower p { + font-size: 10.5pt; +} + +#low-manage, +#low-docs, +#low-help { + float: left; + width: 32%; +} +#low-docs { + margin: 0 0 0 2.2%; +} +#low-help { + float: right; +} + +#low-manage div, +#low-docs div, +#low-help div { + min-height: 280px; + border: 3px solid #ffdc75; + background-color: #fff1c8; + padding: 10px; +} + +#footer { + padding: 0; + margin: 20px 0; + color: #999; + background-color: #eee; +} +#footer h4 { + margin: 0 0 10px; + font-size: 10pt; +} +#footer p { + margin: 0 0 10px; + font-size: 10pt; +} +#footer ul { + margin: 6px 0 1px; + padding: 0; +} +#footer li { + margin: 0; + font-size: 9pt; +} + +#footer a:link, +#footer a:visited, +#footer a:hover, +#footer a:active { + color: #666; +} + +.copyright { + font-size: 10pt; + color: #666; +} \ No newline at end of file diff --git a/src/tomcat/webapps/ROOT/tomcat.gif b/src/tomcat/webapps/ROOT/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aa6f863e43e3924a35854c556a9c1b6d125cba Binary files /dev/null and b/src/tomcat/webapps/ROOT/tomcat.gif differ diff --git a/src/tomcat/webapps/ROOT/tomcat.png b/src/tomcat/webapps/ROOT/tomcat.png new file mode 100644 index 0000000000000000000000000000000000000000..209b07fd8a8d2429b1a0c9740dc184f803ba3c67 Binary files /dev/null and b/src/tomcat/webapps/ROOT/tomcat.png differ diff --git a/src/tomcat/webapps/ROOT/tomcat.svg b/src/tomcat/webapps/ROOT/tomcat.svg new file mode 100644 index 0000000000000000000000000000000000000000..8823f7986e3cdc3ba54a7a96ff3cdea843e2e9ef --- /dev/null +++ b/src/tomcat/webapps/ROOT/tomcat.svg @@ -0,0 +1,967 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Generator: Adobe Illustrator 11 Build 196, SVG Export Plug-In . SVG Version: 6.0.0 Build 78) --> +<svg:svg + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/" + xmlns:ns="http://ns.adobe.com/Variables/1.0/" + xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" + xmlns:x="adobe:ns:meta/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + i:viewOrigin="176.7139 486.707" + i:rulerOrigin="-156 -296" + i:pageBounds="156 496 456 296" + width="260.162" + height="184.413" + viewBox="0 0 260.162 184.413" + overflow="visible" + enable-background="new 0 0 260.162 184.413" + xml:space="preserve" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + sodipodi:docname="tomcat.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"><svg:defs + id="defs59"><inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 92.206497 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="260.16199 : 92.206497 : 1" + inkscape:persp3d-origin="130.08099 : 61.470998 : 1" + id="perspective63" /></svg:defs><sodipodi:namedview + inkscape:window-height="725" + inkscape:window-width="1051" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + guidetolerance="10.0" + gridtolerance="10.0" + objecttolerance="10.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + showgrid="false" + inkscape:zoom="2.1025362" + inkscape:cx="130.08099" + inkscape:cy="91.968689" + inkscape:window-x="35" + inkscape:window-y="192" + inkscape:current-layer="svg2" /> + <svg:metadata + id="metadata4"> + <ns:variableSets> + <ns:variableSet + varSetName="binding1" + locked="none"> + <ns:variables /> + <ns:sampleDataSets /> + </ns:variableSet> + </ns:variableSets> + <ns0:sfw> + <ns0:slices /> + <ns0:sliceSourceBounds + y="302.294" + x="176.714" + width="260.162" + height="184.413" + bottomLeftOrigin="true" /> + </ns0:sfw> +<xpacket /><x:xmpmeta + x:xmptk="XMP toolkit 3.0-29, framework 1.6"> + +<svg:metadata + id="metadata61"><rdf:RDF> + + <rdf:Description + rdf:about=""> + </rdf:Description> + + <rdf:Description + rdf:about=""> + </rdf:Description> + + <rdf:Description + rdf:about=""> + <xap:CreateDate>2006-05-09T08:17:21Z</xap:CreateDate> + <xap:ModifyDate>2006-05-09T08:37:38Z</xap:ModifyDate> + <xap:CreatorTool>Illustrator</xap:CreatorTool> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li + rdf:parseType="Resource"> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:width>256</xapGImg:width> + <xapGImg:height>184</xapGImg:height> + <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAuAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXhH/OYHnWfQ/wAurfRLSUxXXmK49GQqaN9VtwJJqH3cxqfYnFXhP5Y/ +85O+f/JU0enaw769okbBJLS8ZvrUKg0IhnarDj/I9R2HHFX2F+Xn5neT/P8ApP6R8u3glKAfW7KS +iXNuzdFljqaezCqnsTirK8VdirsVdirsVdirsVdirC/zM/Nvyd+XemC71255Xcqk2WmQUa5nI2+F +CRxUd3ag+nbFXx1+Zf8Azkn+YvneaW1tLh9C0NgwXTrB2V3Sm/rzji8m3UDitP2cVfV//OOfmabz +D+T3l+6uHMl1aRPYTsxqSbVzEhJ7kxKhxV6VirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd +irsVfHn/ADlxdSa7+bvlvyvGx4RW0EVARtNfXJVqf7BY+uRlKgT3JAt5r/zkD5ZGgfmfqSRR+nZ6 +gsd9agdOMq0f/ksj5h9nZvEwgnmNi2Z4cMiw/wAqebPMHlTXLfW9BvHstQtjVZEPwstQWjkXo6NT +4lOxzOan3v8Akl+cel/mX5a+tAJa69ZcU1fTlJojGvGWLluYpKbV6GqmtKlV6NirsVdirsVdirsV +eWfnr+eGl/lroywwBLzzPfox02wJqqL0+sT03EanoOrnYdyFXwh5i8x655j1i41jW7yS+1K6blNc +SmpPgABQKo6BVFB2xVnf5Q+SjrWh+d9Yli5w6XolylsadbqSNnTj8kiYf7IZg6zUeHKERzlIfL8U +3YoWCe4Pff8AnCfVTN5D1zTCamz1P11HcLcQIAPlWE5nNL6KxV2KuxV2KuxV2KuxV2KuxV2KuxV2 +KuxV2KuxV2KuxV2KvjD8wm/Sv/OX8UTGsdrqGnCMNUU+rW0Mp6f5ammY2sNYZ/1T9zZi+oe9m/8A +zkx+Xc/mPytFrunRepqehc3ljUVeS0cAyAU6mMqHA8OXfNB2PqhCfAeUvv8A2uZqcdix0fIedQ69 +m35OefrryN+YOla2kpjsjKttqqDo9nMwEoI78ftr/lKMVfaeqf8AOSH5KaaSs3meCZx0W1inuanf +YNDG69vHFWM3v/OYn5QW5YQ/pK8ArQwWqitPD1pIuvviqVT/APObH5cKR6GjaxIP2i8dqhB9qTvi +qmP+c2fIFd9C1Wnfa2/6q4qmFv8A85n/AJUSvxksdZtx/NJb25H/ACTuHOKp3bf85XfkpPBI7avN +BIisywS2lwGcqCeIZUdKmm1WGKvijzz5x1bzl5q1HzFqjlrm+lLrHWqxRDaOFP8AJjSij7+uKpNb +W1xdXMVtbRtNcTuscMKAszu54qqgbkkmgwE1uVfbHkL8uk8o/lTPoMiK+o3drPNqZHRrieIhlr4I +tEB9q5yWo1fi6gS/hBFfN2UMfDAjqwT/AJwdvyt/5usC20sVlOq77em0yMR2/wB2Cudc619ZYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxZKTJ/zmFc+oedNTmA5b/ZtG49fCgpmH2h/ +cS9zbh+sPqDrsc4t2r57/Nf/AJxkGo3c+teSTFb3ExMlxo0hEcTMdybd/spU/sN8PgQNs3+i7Xoc +OX5/rcLLpusWIaF/zif56vFWTVr6y0pG6xgtczL81QLH90mZWTtnFH6bk1x0sjz2Z1pf/OIvlOIL ++lNbvrthSv1dYrZSe+zC4ND88wp9uTP0xA9+/wCptGkHUsms/wDnGf8AKS3AEunT3dOpmupxXam/ +pNFmPPtjOeRA+H67bBpoPDv+ch/yt03yXrdjeaFbG30HUouCQ8pJBFcQ0DqXkZ2+NSrCrfzeGbns +vWHNAiX1BxdRi4TtySH8jfJdn5u/MOy07UIfrGl28ct3fw1IDRxrxUEqQaGV0By7X6g4sRkOfRhh +hxSp9N3X/OO/5P3FSdBETGnxRXN0nT/JEvH8M50dq6gfxfYHOOnh3JDqP/OKn5a3NTazajYt+yIp +0dfpEsbn/hsvj21lHMRP497A6SPmwzW/+cQr9A76H5himO/CG9haL5AyxGT/AIhmXj7cifqiR7t/ +1NUtIehZh+S3/OP8Xk+5GveYXivNfTkLSKIloLYGqlwzBecjL3p8P45i9odqeIOCH09fNtw6fh3P +N7DfIz2VwijkzRuFA6klTmpxmpD3uRLk+bf+cJrrj+Yet2tT+90hpeP7J9O5hWp9/wB5tneunfZm +KuxV2KuxV2KuxV2KuxVZLNFDG0srrHGu7O5CqB7k4qks3nzyNC5jm8xaZHIOqPeW6nf2L4qmFhrW +j6iK6ff294KVrbypLt1r8BPjirAvzb/Pnyf+WrW9rqKS6hq90vqRaba8eaxVp6krMQEUkEL1JPbq +cVYFof8Azmp5BupVj1fR9Q0wNsZo/SuY1/1qGN6fJDir2Xyf+Yfkrzjam48taxb6iqgGSKNisyA9 +PUhcLKn+yXFWRYq7FXYq7FXxRrBNj/zl/NVwC+rL8XtcWw+Hf/jJTMXXC8M/6pbMP1h9SZxLtnYq +7FWG+afzg/LnyvdNZ6vrUSXqGj2sKvcSofB1hV+B/wBamZmHs/NkFxjt8mqWaMeZRPk78zvI/nF5 +ItA1RLm5hHKS1dXhmC1pyEcoRmXputRkdRosuLeQ2TDLGXJCfm/5JXzj5D1HSo05X8a/WtNPcXMI +JUD/AFxVP9lk+z9R4WUE8jsWOaHFGnl3/OI/lpodN1zzFMlGuJUsLcsKELCPUlpXsWkQfNc2Xbmb +eMPj+r9LRpI8y+hc0DmuxV2KuxV2Kvl//nClHP5oas4B4Lok6luwLXdqQPpoc9AdK+08VdirsVdi +rsVdiqXeYPMOi+XtIudY1q7jsdNtF5z3EpooHQAd2ZjsqjcnYYq+VfPf/OV3nXzNqp0D8stPlto5 +mMcF0IfrGoT+8UIDrGD8mbvVcVSqz/5xn/Pjzs66h5t1RbUueX+5W7kurgA/yxx+sq/6pZaeGKsj +h/5wanMYM3nNUk7qmml1/wCCN0n6sVQt7/zhDr8B56Z5stppEIMZntZLfcb1qkk9KHFXzr5mtdUs +tfv9O1S5a7vtOuJbKaZndwWt3MZ4mSjcartUDFUsxVFabqeo6XfQ3+m3UtlfW7c4Lq3dopUbxV1I +IxV9Sfkr/wA5aNcT2+gfmG6K8hWO18wqAi1OwF2q0Vf+Mi0H8w6tir6lVlZQykMrCqsNwQe4xVvF +XYq+Kfzzro3/ADlLa6oxKJLdaReFiaApGsMLeG1ISMqzw4sco94LKBogvqPOEdw7FXkf55/mBrlj +Jp3kbykX/wAVeYSFE0Zo8FuzFOSt+wzlW+P9lQx2NDm27N0sZXlyfRFxs+Qj0jmUd5B/IHyP5bsI +31Oyh1zWnAa6vb1BMnqHciKKSqKAehI5e+Q1XamTIfSeGPlzTj08YjfcsJ/PDy5pXkHX/LH5geW7 +WPTGhvlt9Rt7RBFHKpBk+wgCjnGkiPQbg5m9m5jnhLFM3s1Z4iBEg+hOu4zn3NQOkaLpuj20ltp8 +IghlnnunRe8tzK0sh/4JzQdhtlmXLKZuXdXyYxiByR2VsnYqxjV/zO/L3SJWh1DzDYQzoaPD66PI +p/ykQsw+kZlY9Dmnyifu+9qOWI6pvoOvaRr+kwato9yt3p1zz9C4UMob03MbbMFOzoR0ynLiljkY +yFEM4yBFhV1WVYdLvJWJCxwSOxHWioTjhFzA8wsuRfPn/OEVoX83eZLzekOnxQnpSsswb/mVneOn +fYOKuxV2KuxV2KqF9e2lhZT315KsFpaxtNcTuaKkcYLMzHwAFcVfFHnPzR50/wCchPzJi8veXlaH +y7aO5sYnqsUUCkK97dU/bYdB2qFXcklV9U/lj+UnlH8u9IWz0a2WS+dQL7VpVBuLhh1q37KV+yg2 +Huakqs1xV2KuxV8v/nf/AM4patrnmG+80eSp4Xn1GR7m/wBIuW9ImdyWd4JSOH7xjUq9KGvxb0Cr +5/1j8mPzX0iRkvfKepgL9qSC3e5jG9P7yASJ1PjiqRjyb5vMvpDQ9QMtePpi1m5culKca1xVPtG/ +JT82dYdUsvKepUf7MlxA1rGe395cekn44q+zf+cffKv5m+VvJ50bzvPbzRwFf0RFHK01xbxU+KCV +6cCqmnDizU3FaUAVeo4q7FXx5/zmxpD2vnTy7rcdUN5YPbh12POzmL1qO4FyuKsl/Lz/AJyc8ra2 +sNj5mUaHqZAU3TGtnI3Qnn1ir1o/wj+bOY1XY8474/UO7r+1z8epB2Oz2iKWKaJJYnWSKQBkkQhl +ZTuCCNiDmnIINFygVGXTNOmvYb6W1hkvbbkLe6eNWljDgq3ByOS1UkGhwjJIDhs0ei0LtE5FLxD/ +AJyycP5F0ezQcp59WjaNdt+NvMp/GQZuuxI/vJH+j+lxNWfSPe9rgiEMEcQNRGoQE9+IpmmlKyS5 +QCpgSsllihieWVxHFGpeR2NFVVFSST0AGEAk0EEvn2fVfOv5269e6foN9Jof5e6fIYbm9QMst2af +ZIBUtyG4QkKqkFqmgzfiGLRQBkOLKfx+C4ZMspobRZzof/OOv5U6VCiyaUdSnUUa4vZZJGb5opSL +7kzBydrZ5HY8PuDbHTQDP9G0XStE02HTNJtks9Pt+Xo20Qoi83LtQe7MTmBkyynLikbJboxAFBJv +zO1Aaf8Al35lu60ZNNuljP8AlvEyJ/wzDL9FDizQH9IfYxymol59/wA4P6S0eg+adXI+G6ura0Vv +e2jeRgP+kkZ2zqX01irsVdirsVdir50/5zJ/MGbSfK1j5PspOFxrrGa/KmhFpAwon/PWWn0KR3xV +mf8Azjd+WEPkj8vrae5iA17XES91KQijorrWG333HpI24/mLYq9YxV2KuxV2KuxV2KuxV2KuxV2K +obUdT03TbR7zUbuGytI/7y4uJFijX5u5VRir5U/5yz/MX8tfNfl7S7DQtZh1LW9NvS5W2V3iFvJG +yyUnC+kfjVPsscVSv8i/yi/LTzn5Ij1XVLSafU4J5rW9C3EkaFlIdCFQrT926980XaOuy4cnDGqI +vk5eDDGQsvdvKXkby35StXtdBgmtrZ6Vge6uZ4wf5ljmkkRCe5UCuaPPqp5Tc9/gHLhjEeSN8x3+ +o6foGoX2m2hv9QtoJJbWyFazSKpKxjjv8R22yOCEZTAkaBZTJAsPHv8AlcP53/8Altpv+BuP+ac3 +H8n6X/VPti4vjZP5rzz8wfPP5i+bfNvluw1Dyq1rqWjzG+g0ROZmuRVZDVGHPjxgbcDpXNhpdNiw +wkYy9Mutj8dWnJOUiAQ9D/5XD+d//ltpv+BuP+ac1/8AJ+l/1T7Yt3jZP5rv+Vw/nf8A+W2m/wCB +uP8AmnH+T9L/AKp9sV8bJ/NYp+ZX5v8A5qXnli40LVfKbaCutAWkdyxlWRwWXnHGrheRdfhI8DmV +pNBgE+KMuLh9zXkzTIoirR/kbzf+bvlHy1Y+XtO/LedobYENM6zK0kjtyeRzxoOTH6BtkNTp9Plm +ZyyfaEwnOIoRej+RPO35o6xr62fmPyf+hdNMTub71C1HWnFaV/azX6rS4IQuE+KXds348kyaIZ7q +jaqthKdKSCS/pSBbp3jhr4uY1kbbwA38Rmux8PF6r4fJuldbPlv8+YvzstdPS483apafoO7nEEVh +pcjJbl6NIA0bKkjgenWsnKhpnTdnHTH+7HqHfz+f6nAz8f8AFyfQ3/OLHl06N+TWkyOnCfVpJ9Rm +Hj6r+nEfphiQ5t3GeuYq7FXYq7FXYq+MfzQhXzz/AM5YWmgz1lsLe7sbB4zvW3gRbi5TvSrNLir7 +OxV2KuxV2KuxV2KuxV2KuxV5j59/5yM/K7yb6kFxqQ1TU0qP0dpvG4cMO0kgIij36hn5e2KvAvMv +/OWP5p+arl9P8laWukxtXiYIzfXvHpUuy+mg+UdR/NkJ5IwFyIA80xiSaDF/+VT/AJo+b7sah5w1 +h1kavx3sz3k617KgYoo9uYp4ZptR7QYIbRuZ8uXzP7XMx6GcuezJYf8AnH3yrBptwjXFxd6g8LrB +NIwSNJSpCOEQA7NvRmOak+0eQzGwjCxfU11/FOT/ACfEDnZYH+S+sfmZZeajoHlC8htrq6ZnubC/ +K/VnMAPLkrAtyUdfT+Kg8BnSa7HhMOLINg6/CZA1F9k6KdbOmw/pxbZdTp/pH1IyNAW8U9UK9Pnn +I5eDi9F8PnzdlG63R2VsmndUUu5CooJZiaAAdSTiBaHhP5N8/On5r+bPzEkBbT7dv0do7EGhWgUM +tRswgjUsP+LM3vaH7nBDCOZ5/j3/AHOJh9UzJ7vmicx2KvEf+clQLS78i63cEjT9O1cC6O3H4mjl +FR/qwPm77G3GSPUj9f63E1XQvbQQQCDUHoc0jlN4pSXzN5z8q+V7ZLjX9Tg0+OSvpLK37x+PXhGv +J3pXfiMuw6bJlNQFsJ5BHmXzJ+dn5haf+Z/mby75e8qtLPbLN6EbyI0YluruRI0oh+KigChIHU50 +/ZmilhieL6i4GoyiZ2fbWh6Ra6Noun6PaClpp1tFaW4/4rgQRr+C5s3HR2KuxV2KuxV2KvjfymCP ++c0p/rdK/pTU+POlKfUp/S/4144q+yMVdirsVdirsVdirsVeQfmX/wA5Ofl55MaaxtZv0/rcdVNl +ZMDEj+E1x8SL4ELyYdxir5W/Mf8A5yD/ADJ88GSC6vjpmjyVC6VYFoYmQ1FJXr6kte/I8fADFXme +Kvpj8jdTtb3yJBFFGkdxYyyW9zwVU5MDzRzTqSjipPU1zhvaDHKOosk8Mht5d/6/i7rQSBh5h6Fm +ic12Kvnvz6l35B/Nqz8z2CEQyzLqMSqeIY143UVf8upr7Pnedl5RqdLwS5gcJ/R9n2uj1MPDyWPe ++wdL1Ky1TTbXUrGQTWd5Ek9vKOjJIoZT9xznMkDCRieYc2JsWisgyYZ+b1p5vvfIGqWPlSFZ9Tu0 +9F1LiN/q77TelXYuV+EAkddt6A5vZ8sccoMzsPv6NOYSMdnzl+Wn5m/mVoKR+RtEtNLsrmGWSsOp +q1vM87t8Su8ssS+p0UKaGgAGdDqtHhyfvJ2fd3fBwseWUfSHq36V/wCcqf8AqzaN/wAGn/ZRms4N +B/OP2/qci83c79K/85U/9WbRv+DT/sox4NB/OP2/qW83c8o/Mj8z/wAy/MAm8i6zaaZfXU0sY9HT +Ea4lSdGqqxvFLKvqbFSBXqQc2el0eHH+8jY2693xcfJllL0l9KflXb+bbXyJpVp5riWLV7aIQsqu +JGMSbRGUio9ThQNQnx70znNccZyk4+R+9zsIkIi2W5iNqB1xdH/RF2+sxQy6XFE8t4tyiyRelGpZ +i6uCpAAyzFxcQ4D6ixlVb8nzj/zjB5UtfNn5xal5tisltNE0Rpbu1tEUCOOa6ZktYgBt+7j5tt3U +Z3UIkRAJt1BO77PySHYq7FXYq7FXYq+M/wAyX/wb/wA5b2WsP+7s7q90+7Zz8NILlEt7htqV3EmK +vszFXYq7FXYq7FWGfmR+bnkn8vrD6xr16PrkilrXS4KPdTdacY6jitRTmxC++Kvjz80/+clPPvnk +TWVq50Py45KfULRj6kqntcTjiz1H7K8V8QeuKsQ/KyLyvP5wtbTzFbC4trn91bc2IjW4JBj9QAjk +G+zQ7VIrmB2mcowE4jUh93Vv0wiZgS5Po7zD5J8ta/pa6bf2UfoQrxtWiAjeDbb0io+Hp06eIzht +N2jmwz4oyu+d7373dZNPCYoh8/effyj17yuZLu3B1DRgSRdRr8cS9f3yD7P+sPh+XTOz7P7Wxajb +6Z936u90+fSyx78wnP8Azj5r4s/M11o8jUi1OHlED/v63qwA+cbP92YvtDp+PCJjnA/Ydv1NugyV +Ou99C5xDuWDeefKvnzV9WiufL+v/AKKskt1jkt+Ui8pQ7sX+AEbqyj6M3XZ2t02LGRlhxyvnQO23 +e4eow5JSuJoe8sD81/lL+ZF9pj3Go65Hq7WKPLBbMZGc7VZY+S9WC9O+bnSdsaQTEYQ4OLyAHxou +Jl0mWrJuvel/5Q/8rK80ySeXdA85S6P9Qh9W2spZ51RouXx+kEDD4CwqPfbvmz1pw4xxzhxX5Bxc +XFLYGnv35Y+RfzR0DXri881+af03p0lq8MVp6s0nGZpI2WSkiqNkRh9OaLW6rBkgBjjwm+4D7nMx +Y5g7m3p2axyGGfmF+U3k/wA82pGq23paii8bfVIAFuEpWgLU+NN/st9FDvmZpddkwnbePc1ZMMZ+ +95R/iv8AMz8lbm20/wAzMPMvk2Z/Ssr5XpcIBvxXmSwKr/ut6r2Vxm28HDrAZQ9OTr+P0uNxzxbH +cNSeb/zJ/Om9uNM8pk+XPJ0Lelf6g7D13DD7L8DyJZf91oafzNTEYMOjAlP1ZOn7P1qZyymhsHrH +5d/lN5R8i2gXS7f1tRdaXGqTgNcPXqAeiJ/kr9NTvmq1euyZjvtHucjHhEPezPMJuePedvy3/OXV +fNF/qGg+c/0ZpM7KbWx9a4X0wI1VhxRSoqwJ2zc6fWaaMAJQuXuDizxZCbB2eNfm7F+Z3lQQaDr3 +nKXV21SJmm0+GedgIQwCmVXC7OwIUd6HNtopYcvrhDhrrQcbKJR2JeieSv8AnHD8+9H0SJtG83Q+ +XlvlS5udPinuonSR0Hwy+nHxLqPhO5zYtD2r8mvJH5m+V/0x/jjzN/iL659W/R/76eb0PS9X1f75 +Vpz5p08MVel4q7FXYq7FXYq+Xv8AnNjya81joXnG3Sv1Vm0y/YCp4SEy25PgquJB82GKva/yY87J +5z/LXRNbaTneNALfUfEXVv8Au5SR25leY9mGKs2xV2KrZJI4o2kkYJGgLO7EBVUCpJJ6AYq+aPzm +/wCctrTTWn0L8vmjvL1ax3GvOA9vEehFsh2lYH9tvg8A1cVeMfl95AvPzCvLrzP5l1SW6iNwUueT +tJdTyqqsQ7tXgvFgPGmwp1zS9rdrflqjEXMj4OZpdL4m5Oz3O18seXrXSP0PDp0C6ZSjWhjVkb3c +NXk3ud842etzSyeIZHi73bDDAR4a2eaeb/yBsLlmvPK9x9QuQeX1OYs0JPX4JN3j/EfLN9ovaIj0 +5hfmP0j9XycLNoBzh8noHku+1y50OKLXrV7XWLT9xeB6FZGUCkyOvwsHG549DUds03aOLHHJxYiD +jluPLy8v1OXp5SMakPUE9IBBBFQdiDmCDTe841/8pLaHW7bzL5U42OqWkyzvYfZt5+JqyrT+6LrV +f5fl1zoNL21xQOLPvGQri6j39/3+9wMujo8UOY6PSB06U9s54uewnzt5H8z69qsV5pXme60W3jgW +F7WAyhWcO7GQ+nLGKkMB07Zt9BrsGGBjkxiZvnt5d7iZ8M5m4ypj/wDyqbz9/wBT/f8A/BXP/ZRm +d/K+k/1CPyj+pp/K5f55+15z518keZ/y91G01W01SZ2nLiPVrYyW8qTMDzQurFgXQnfl8Qrm90Pa +GLVxIrl/CXCz4JYiHv8A+Qeia/NDH5tufO155k0u+s3gGm3Tzt9XufUjZuQkmlUPHwZdh0NQaHfV +9qTgP3YgIyB57bhv04PO7eyZp3KYZ+afm/zN5Z0KGby5okmtanezC1gVAXSF3UlXkRPjYbdqDxYd +83Q6eGWR45cIG7TmmYjYMC8p/kVrGu6ovmj81b1tV1Njyi0YODBEOoWQp8FB/vuP4fEtXM7P2nGE +eDAKHf8Aj7y1QwEm5orzX+Rd9pepP5n/ACuvm0HWlq0mlhqWc46lFBqqV/kYFP8AVyODtMSHBnHF +Hv8Ax9/NM8BBuGxZB+VP5j+ZPMs9/ovmbQJ9J13R1Q3s3ErbPzNEoGPJWehIA5KQKhu2Ua7RwxgT +hK4yZYcplsRuHo2a1yHh35u+SvN1nNrXnD/lYl/omiIFli0yB7gBSEVFiiC3EacpHGwAG5zd6HPi +lw4/DEpd+3z5OJmhIXLi2eW/lJ+UXnn829Svtdl1ue0XTjGo127MtzM9ytDHHG5dXrGg5E8vh+Hx +zo4QERQFBwSSeb2z/oXX86P/AC8Gq/8AI2+/7Kskh6L+UP5dedPJv6W/xN5wu/Nf1/6v9U+tvO/1 +f0fV9Th68s3956i1pT7OKvRcVdirsVdirsVY/wCf/J9l5x8nar5bvKLFqMDRpKRX05R8UUlP8iRV +b6MVfLf/ADiz50vvJX5han+XXmGtsmoztDHE/SLU4Dw4jt++Qca9yEpir7ExVK/MnmbQvLOjXGs6 +5eR2Om2q8pZ5TT5KoG7M3RVUVJ6Yq+M/zS/PHzr+bWrnyv5Vt5rPy67fDZoaS3CqaerduDRU/wAi +vEd+RplWbNDFEymaiGUIGRoc0Nc/846uugI1vqXPX1BaRGFLVtv7tTTmtP5z18BnOw9pInLRj+77 ++vv/AB9rsD2eeHY+pV/Io6rofmDWPK2rwSWlzJEl3FBIKCsbem5UjZuYddxUHjke34xy4YZYGwDW +3n/YuhJjMxL2rOSdq7FXYq7FXYq7FXYq7FUt8w6Bp2v6Pc6VqCc7a5XiSPtIw3V0J6Mp3GZGl1M8 +GQTjzH2+TXlxicaLxryB5w1r8nPPM+i63yl8v3rKbrgCVKE0ju4V8R0ZR13HUDO3ywx67CJw59P1 +H8ebpgZYZ0X1xZXlpfWkN5ZyrPa3CLLBNGQyOjiqspHUEZzE4mJo8w54N7q2RS7FXYq73xVTuLi3 +treS4uJFht4VMk00hCoiKKszMdgAOpwxiSaHNBNPlfzv5j8wfnh+Yll5O8qBhoVtKTFKwIQqvwzX +047IgNEB33p9p6Z13Z2iGGNn6zz/AFOtz5eM+T7B8j+TdG8m+V7Hy7o8fCzso+Jc/blkO8ksh7s7 +bn7htTNi0J9irsVdirsVdirsVdirsVfLP/OXf5WXENxb/mXoKNHNCY4tbMNVdWQhbe7BG9RtGx/1 +PfFWefl3/wA5I+VdQ/KqTzN5mu0ttV0YLbavarT1Z7gqfSaCPbl9YCkgdFIb9la4q+cvNPm3z/8A +nr5uCUNnolo1YLRSxtrOIkgSSdPUmYd+p7cV6Yms1mPTw4pn3DqW3FhlkNB695O8l6J5U00Wemx/ +vHAN1duB6szDux8B2XoM4LXdoZNTK5cug7vx3u7w4I4xQT/MFvUJbGzluYbqSFGubfl6ExA5oHFG +AbrQjqMsjmkImIPplzDEwBIPUNahew2Nhc3s54wWsTzSt4JGpZj9wxw4zOYiP4iB81nLhBPc8w/J +Tzn5v8y3mqHV7oXFlaIhjHpojLJKxIAZQtQFQ9a50XbujwYYRMI8MifsH4DgaLNOZNmwHq+cy7F2 +KuxV2KuxV2KuxVjXnzyLpnm/SDZ3P7m7hq9leAVaJyO/ijftL/EDNj2d2jLTTsbxPMfjq4+o04yD +zeb/AJZ/mj5g/KrXZPKnmyKSTQS9QFq5t+Z/v7c/txP1ZR8x8VQet1Gmx6vGMmM+r8bF1UJyxS4Z +PqrTNT0/VLCDUNOuI7qyuVDwXETBkZT3BGczkxygeGQohzgQRYRWRZOxVSurq2tLaW6upUgtoVLz +TSMEREUVLMxoABhjEyNDcoJp8v8A5n/mrr/5n65D5E8hQTTadcy+kxQcZL1lNeTV+xbpTl8VNvia +nTOp7O7OGL1S+v7v2uvz5+LYcn0j+SX5N6V+Wvlv6uCl1r96FfV9RUGjMKlYoq7iKOu38x+I+A2z +jPR8VdirsVdirsVdirsVdirsVSDz3rvlfQ/KWp6h5oaMaGsDx3kUgDCZJFK+iqEjm0leIXvir81d +SfTpdTupdPhkt9MedzawyMJJI4WYmNGeihmCbV74q+q/y8tfLEHlOyPlsV06VefqGnqvJ0czH/fl +RQ+HQbUzzrtWeY5z4v1D5V5eTv8ATCAgOFkma5yHYq7FWIfm3qBsfy81mRftSxLbge08ixN/wrHN +r2Jj4tVHys/Z+txdZKsZSD/nH3TRb+S5rwj4767kYH/IjVYwP+CDZm+0mQnNGPQR+/8AAauz4+gn +zenZzrnuxV2KuxV2KuxV2KuxVjnnbyLovm3Tfqt+np3MYJtL1APUiY+Feqn9pe/zocz9B2jk00rj +vHqPx1aM+njkG/N4/ovmf8xfyX1w2rr9b0W4fkbVyxtLgDq8T0Jikp12r4gimdkPA12PiHP7R7/x +7nUETwyovpX8vvzc8m+eLZf0ZdCDUgKzaVcEJcKR1KitJF/ykr70O2aHVaDJhO4uPf8Ajk5ePNGX +vTXzl578seTtMOoa9eLboa+hAPimmYfsxRjdj+A7kZVp9LPMaiP1Mp5BEbvmXzJ54/Mb87vMcflj +y1ZyQ6SzhksENFCKf96L2YbcV60+yDQAM1Cep0eghgF85d/6nX5cxn7n1H+S35IaB+Wmkkxlb3zD +eIo1LVGHyJhgrukQbfxbqewGe0vSsVdirsVdirsVdirsVdirsVQup6np+l6fc6jqNwlrY2kbTXNx +KeKJGgqzMfYYq+HfzQ/MTzL+dvnmHSNFR4PLtm7fo+2eoUIKh7y5pX42BoB+yPhG5JajU6mGGBnM +7BnjxmZoPQ4Pyv8AK8fk1vK5i5W8g5yXVAJjcU2nr/MO3am3TOGl2xmOfxfs6V3ft73dDSQ4OH7X +kehaz5g/KfzbLpWqK0+jXLB5VQfDJGaqlxDU7MKfEv0HsR0uowYu0MAlA+ocvI9x/HmHXY5ywTo8 +n0Fp2o2OpWMN9YzLcWlwoeGZDUEH/Pcds4jNhljkYyFSDuYTEhY5KzTQoaPIqnwJAOCOOR3AKmQH +VyzQueKyKx8AQTiccgLIKiQPV5t/zkDctD5FijHS5voYm37BJJP1x5vPZwf4Qf6h+8OH2h/dj3p3 ++UNt9X/LnRkoQXjklNRQ/vJnf9TbZjdtyvVT+H3Bs0Y/dBmOalynYq7FXYq7FXYq7FXYq7FUHq+j +6ZrFhLYanbJdWkwo8Tjb2II3Vh2I3GXYNRPFLigaLCeMSFF4R50/JTXdCnOq+VpJby1ib1FjjJF5 +ARuCvGhenYr8Xt3zstB25jzenJ6Z/Yf1fF1OfRShvHcJFJ5F/M7zRY3PmTUI7m8eKMFHvZHa6mRe +0SvV2CjcdK/s1OZsu0NNimMVgHy5D39zQMGSQ4qfTP8AziV518hXnlX/AA3p1lBpPmi0XnqUIr6l +6F2+sq7lnfr8SV+A9AFIzYtD6BxV2KuxV2KuxV2KuxV2KuxV2KvjX/nI7847/wA+eYk/L/ye7XGj +QTiO4kgNRfXSnswNDBEeh6Egt0CnIZMkYRMpGgExiSaDJvy88h2PlDRRbJxl1G4o9/dAfbcDZVPX +gn7P3988/wC0+0Zamd8oDkP0+93um04xx82vOP5meVvKoMV7OZ7+lVsLejy+3PcKg/1j8q4dF2Tm +1G4HDDvP6O9c2qhj25l47r/mfzt+ak6aXovlxrmO3f1I47SF7meOuxLzAURT32UZ1/Z/ZcNNdEkn +n3fJ1OfUnJzDFvNXl7z35Lu/8P8AmCG60uQoLhbNpaxMsg+2nps0TVpQkHqKHcZseEXdbtFsbySH +Yqu9ST0/T5H068uFTx5UpWnjir2HyZ+T/wCfGr+U9O1/yreSS6VdKzWkEOo+iQI5HRlMcjxoPjjI +pXKMmmxT+qMT7wGcckhyJCOudA/5yq0IfvtM1G4VDuscNvqFadqwidj07HMXJ2Tpp84D4bfc2x1W +QdUvl/Oj8y9CmEPmHQ0iPQpc209pKT1/aNP+FzCyezunly4o/H9bbHX5Bzop1pv/ADkboslBqWkX +FsfG3dJx8/j9HNfl9mZfwTB94r9bkR7RHUMv0r82/wAvtSoserx28ndLoNb0/wBlIFT7mzWZuxdT +D+HiHlv9nP7HIhrMcutMst7i3uIlmt5Umib7MkbBlPyIqM1s8coGpAg+bkxkDuFTIJdirsVdirsV +dirH/PXm608q+XZ9Umo8391ZwH/dk7A8V+Qpyb2GZ/Z2iOoyiP8AD19zRqMwxxvq+cfL9n+Yf19/ +Omi29ytzYytfnU41CgPyLOyhqCTqeSqDt1FM7+WoxYyIGQBOwDoxjlIE0+1/yK/O7S/zJ0IpP6dp +5nsVA1LT1OzrsPrEAO5jYncdVOx/ZJyGt6jirsVdirsVdirsVdirsVfO/wDzlT+dh8vaa/kfQJ6a +7qUf+5S4jPxWtrINoxTpJMD8wm/7SnFWA/k3+W48v6eNZ1OL/c1ep8EbDe3hbfhQ9Hbq3h08a8V2 +52n4svCgfRHn5n9Q/HR3Gi03COI8yl/5qfm5LYTt5d8sP6mqM3pXd3GOZiY7elFStZa9T+z0+10v +7I7G4gMmUbdI/pP6mGr1demPzZX+UH/OJcl6I/MP5lNKZJj6sehB2EjV35XkoPKp68FNfFuq51wF +OqfT2j6Jo+i2Een6RZQafYxf3dtbRrFGPfigAqe5xVj35mflh5Y/MLy++k61CBKgLWGoIB69tKf2 +o2PY0HJejD6CFXwV+Z35WeaPy715tL1qHlbyFmsNRjB9C4jBoGU/st/Mh3X5UJVYdirsVfb3/OHX +mKPUfyrfSS9Z9EvpovTrUiK4/wBIRvYM7yD6MVe7YqsmhhniaKaNZYnFHjcBlI8CDtirDde/JX8q +Ne5HUvK1g0j15zQRC1lJPcyW/pOT9OKvMfMn/OF/5eXwZ9D1K+0aY/ZRit3AP9g/CT/krirzTVv+ +cTvzh8tSPdeVNVh1EDoLS4exuWp4rIVj/wCSpyGTHGYqQBHmmMiNwxq58/fnT5ImW382aVMYgeIO +oWzRch0pHcRhUfp1+LNVn7C02TcDhPl+rk5UNbkj1tlGgf8AOQHlS94x6rBNpUx6uR68P/BIOf8A +wmaPUezmWO+MiX2H9X2uZj7QifqFPRNK1vR9Wg9fTL2G9iHVoHV6V7NQ7H2OaTPpsmI1OJi5sMkZ +cjaNyhm7FXYqlGq+VNC1fULe91S2F69opW2hn+OFCxqzekfhLGg3avTbMzDrsuKBhA8N8yOfz/U0 +zwRlKzumyqqqFUAKBQKNgAO2YhJJttp84edta0nyl+Y0Gu+Qr/0NQtH9W4WAfuI5wfiRSDxdJBUO +lOPUd6D0PsqWc4R4w36d5Hm6HUiAn6H2P+TH5xaN+ZXlwXcIW11u0ATVdM5VMbnpJHXcxP8Asnt0 +PTNk470PFXYq7FXYq7FXYqwf84fzP078uvJtxrU/GXUJawaTZMf765YbVA34IPic+G3UjFXyR+U/ +lPUvNnmK589+ZXa65XDzRPKB/pF2Wq0h7cIz0AFK7D7NM5/tztLwo+HA+uXPyH6z+OjnaLT8R4jy +DOPzf89t5Y8v+hZScdX1HlHbEdY0A/eS/MVovufbNJ2J2f4+TikPRD7T3fr/AGubrM/BGhzKf/8A +OK/5HQWtjb/mF5ltxLqV3+90K2mBPoxHpdMD1kk6x+C/F1O3dukfTGKuxV2KpL5v8neXfN+hz6J5 +gs0vLCffi2zxuPsyROPiR17EfqxV8N/nR/zj/wCZfy5umvYeep+VpXpb6mq/FFyPwx3Kj7Ddg32W +7UO2KvKcVeu/84z/AJoQeRvPwi1KX0tC11Vs7+RjRIpA1YJ29kZipJ6KxPbFX3sCCKjcHocVbxV2 +KuxV2Kqc9vBcQvBcRrNDIOMkUihlYHsVNQcVeX+cP+cZ/wAovM3OQ6QNIvH/AOPrSmFsQf8AjDRo +D/yLrirw/wA0f84fef8AQZ21DyRrKal6dTHEWNhejwVH5GJvmXT5ZGURIURYSCRyYf8A8rL/ADW8 +jXo03zjpUslK8Y7+JreVlXasU6rxdf8AKo3zzT6rsHBk3j6D5cvl+qnLx62cee7P/LX5zeSdbKxS +XJ0y7bb0byiKT/kygmP5VIPtnO6rsLPi3iOOPlz+X6rc/HrYS57FnSsrKGUhlIqCNwRmmIINFywW +8CWLebfLnmTzCG0+PVV0jRm2n+rK0lzOpG6s7FFjXtRa17nembXRavBp/VwmeTz2A93P5uLmxTnt +dRSjR/yO8g6cVea2l1GVTUPdyEiv+pH6aEfMHL83tBqJ/TUfcP12whocY57sS80+XfMH5YeaLfz3 +5JdorSKStxbAExxBz8UUigjlbydP8n58Tm97H7WGccE/7wf7L9vf8/dhavS8BsfT9z6x/Kf81NB/ +MbyzHq2nEQXsVI9U0xmDSW03genJHpVHpuPAggb1wmbYq7FXYq7FVK6ure0tprq5lWG2gRpZ5nIV +ERByZmJ2AAFTir4W89eZtV/PD81xHas8Xlyw5RWXb0bJGHqTsDt6s7U/4Vei1zE12rjp8Rmfh5lt +w4jOVB7Zp2n2enWMFjZxiG1tkWKGMdAqig655xmyyyTM5G5F6CEREUOTxPS9Gb81/wA/YNJlLNo1 +tMUuKbUsrEky0I6es9QD25jPQ+zNL4OCMevM+8/inQ6nJxzJfdcUUUUSRRIscUahY41AVVVRQAAb +AAZntC/FXYq7FXYqo3dnaXtrLaXkKXFrOpjnglUOjowoVZWqCD74q+T/AM7f+cTri0a48wfl7E09 +pvJdeX6lpY+5NqTu6/8AFZ+Ifs16BV8xyRyRSNHIpSRCVdGBDBgaEEHoRiqLv9b1nUEjS/v7m7SF +VjhWeV5QiIOKqocmgUbADFU/8k/mp588l38N1oOrzwxREcrCR2ktJFH7MkDHgRTaoow7EYq/Qb8v +POFv5y8laR5mt4/RXUoBI8NeXpyqxjlQNtULIjCuKsixV2KuxV2KuxVB6rpGlavZSWGq2cF/ZS7S +W1zGssbfNHBGKvD/AD5/zh75B1r1Lny1PL5cvmqREtbizY/8YnYOlT/K9B/LirxDWPy7/Pr8pmea +GKW90OI8nuLOt5ZcQakvERzhHixVfnmJqdDhzj1xvz6/Ntx5pw5FNvKv/OQWi3fCDzDbNp0/Q3UI +aWAmnUqKyJv2+L55zWr9nJDfEeLyPP58vudhi7QB2kKepWGo6fqNst1YXMd1bP8AZmhcOp+lSc57 +LhnjPDMGJ83YRmJCwbROVMlk0MU8LwzIJIZVKSRsKqysKEEHqCMlCZiQRsQggEUXiepWHmf8m/OM +PnDyiS+jSH07i3erxhHYFrafuY2oOD9QadwCe77J7UGojwy2yD7fN0mq0xxmx9L7C/Lr8wvL/n3y +zBr+iyExSfBc2z/3tvOAC8Ug8RXY9CNxm5cRk+KuxV2Kvm7/AJzA/NOTTNHg8haVKRf6ugn1ZkJ5 +JacqJDt3mdTyH8op0bFUg/KjyOvlfy2n1iMDVr8LNfsaVXb4Ia/8Vg7/AOVXOB7Z1/j5aH0R5fpL +vNJg4I2eZZRr1/8Ao/Q9Rv8A/lktZp/+RUZf+Ga7SwE8sInkZAfa35ZVEnyYp/zg/o0Ump+atccV +mghtbKJu/Gd3ll/GBM9PecfWeKuxV2KuxV2KuxV2KvOfPf5Aflj521UatrGmtHqRFJ7m0kMDTdKG +Xjs7CmzUr+GKsb/6FD/Jv/lmvv8ApLb+mKu/6FD/ACb/AOWa+/6S2/pir0/yZ5Q0byf5as/LmirI +mmWPqfV1lcyOPWleZ6sevxyHFU7xV2KuxV2KuxV2KuxV2KvMfzC/5x1/LLzr6lzcaf8AovVn3/Se +ncYJGbrWSOhikr3LLy9xir5080f846/nH+XVzJqnlK6k1nT1NTLpwYXHFenrWR58/kvMZTmwQyx4 +ZgSDKEzE2DSH8r/85ABZRZea7IwSoeD3lup+FgaH1YT8Qp34/wDA5zes9nBzwn4H9B/X83Y4u0Ok +w9b0nWdK1e0W80y7iu7ZukkTBgD4Hup9jvnM59PkxS4ZgxLsYZIyFg2q31jaX9pNZ3kKz2s6lJoX +FVZT2ORxZZY5CUTUgmURIUeTxy2svzN/KLzbcaj5Eil1DS9RRkNuIZLqMqDVUnij35Rk/A+3z3YZ +3Wg7YxZYXOQhMc7NfK/wHS59JKMthYZVB/zlL+eWlMZNc8owTWiEmRzaXlsaClaS83jp/sTmxx6r +FM1GUZe4guPLHIcwQ9C8jf8AOYH5ea7NFaa9bzeW7uUhRLMwns+RNADOgVl+bxhR3OXsHulvcW9z +BHcW0qTW8yh4Zo2Do6MKqysKggjoRir849U/MZtX/M6688azZnUTNdNcxWTSekFVPhtk5cZPhhVV +FKb0yjU4pZMZjE8JPVnjkIyBItnP/Qyn/fuf9Pv/AF4zm/8AQx/tn+x/487D+Uv6P2/sQWuf85A/ +pXRNQ0z9A+j9etprb1vrfLh60ZTlx9Fa05VpXLcHs74eSM+O+Eg/T3f5zGev4okcPPz/AGPU/wDn +B7UUbTvNmmkgPFNaXCjuRIsqH7vTH350zrn1DirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV +dirsVdirsVdirBPzB/JP8uvPivJremKmpFaJqtofQul2oKuopJTsJFYYq+afOP8AzjN+afkK7fWP +JF7LrNjGeX+iVjvVUb0ktqlZh/qcq/yjK8uKGSPDIAjzZRkYmwl/lf8AP1opf0f5vsmgnjb05LyB +CCrA0PqwH4lI78f+BzmtZ7OA74T8D+g/r+bsMPaHSfzet6TrOlavZreaZdR3ds3SSJgwB8D3B9jv +nMZ9PkxS4ZgxLsoZIyFg2jMpZsJ87flR5Z8zxSTLCthqxBKX0Kgcm/4uQUEg9/te+bjQds5cBAke +KHcf0H8BxM+kjPlsWPfkJ+aPmL8t/PS+QfNEjHQbycWyo7FktbiZh6U8LH/dMpYcxsN+WxBr3OHN +HLATibiXSzgYmjzfWP8AyrzyB/1LOlf9INt/zRlrF3/KvPIH/Us6V/0g23/NGKu/5V55A/6lnSv+ +kG2/5oxVHaV5Z8uaRJJJpOlWenySgLK9rbxQMyg1AYxqtRiqZYq7FXYq7FXYq7FXYq7FXYq7FXYq +7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwT8xvyU/L/AM/xFtbsBHqQXjFq1pSG6XsKuARIB2EisB2x +V856t/ziZ+bHl/VpT5M1qO4sZhtcpcPYT0B2SVFJBp4hj8hleTFCYqQEh5i2UZGPI0of9C+f85Nf +9XeT/uLS/wDNWUfkNP8A6nD/AEo/Uz8ef84/N3/Qvn/OTX/V3k/7i0v/ADVj+Q0/+pw/0o/Uvjz/ +AJx+aX3n/OK/576ldpcalLBdTgKguLi/MzqoNQAzVagqTTMjHijAVECI8tmEpEmybf/Z</xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + + <rdf:Description + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + </rdf:Description> + +<cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></svg:metadata></x:xmpmeta> + <xpacket /> + </svg:metadata> + <svg:switch + id="switch6"> + <svg:foreignObject + requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" + x="0" + y="0" + width="1" + height="1" + id="foreignObject8"> + <i:pgfRef + xlink:href="#adobe_illustrator_pgf"> + </i:pgfRef> + </svg:foreignObject> + <svg:g + i:extraneous="self" + id="g10"> + <svg:g + id="colors" + i:layer="yes" + i:dimmedPercent="3" + i:rgbTrio="#4F00FFFF4F00"> + <svg:path + i:knockout="Off" + fill="#F8DC75" + d="M237.682,33.617c-0.019-5.071,0.402-24.5-2.5-30.4 c-7.869,2.99-19.189,11.68-22.431,21.588c-15.532-2.32-35.042-2.045-50.381,0.608C159.808,14.753,147.946,7.596,138.243,3 c-4.093,6.907-3.906,19.92-3.445,31.279c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,22.2,74.399,52.799,92.399 c31.481-17.988,50.972-49.057,50.101-93.12C237.656,33.603,237.67,33.609,237.682,33.617z M216.485,25.421 c0.114,0.021,0.229,0.042,0.344,0.064C216.715,25.463,216.601,25.441,216.485,25.421z M214.527,25.083 c0.275,0.044,0.554,0.094,0.83,0.141C215.081,25.177,214.805,25.129,214.527,25.083z" + id="path13" /> + <svg:path + i:knockout="Off" + fill="#D2A41F" + d="M91.013,133.328c46.474,4.115,90.927,22.883,141.085,49.085h25.598l0.361,0.191 c0.516-2.575-1.888-6.025-4.752-9.229c-4.941-5.528-11.623-6.145-19.707-5.951c-5.738-6.83-41.004-43.861-41.004-43.861 l-4.808,3.395c-38.75-21.75-49.155-62.513-49.155-62.513c-33.792,8.148-69.78,28.334-90.391,49.761l-3.118,3.292 c-1.489,1.597-2.928,3.174-4.312,4.723C18.967,146.661,3,170.87,3,175.213v2.25h23.816l-0.505-0.668 c-2.449-12.943,4.443-23.341,10.279-30.385c4.179-5.044,11.1-9.801,21.968-12.457L91.013,133.328z" + id="path15" /> + </svg:g> + <svg:g + id="tomcat" + i:layer="yes" + i:dimmedPercent="3" + i:rgbTrio="#4F00FFFF4F00"> + <svg:path + i:knockout="Off" + d="M240.682,32.617c-0.019-5.071-1.598-26.5-4.5-32.4c-7.869,2.99-22.189,12.68-25.431,22.588 c-15.532-2.32-33.042-2.045-48.381,0.608C159.808,12.753,146.946,4.596,137.243,0c-4.093,6.907-5.906,22.92-5.445,34.279 c-0.018,0.013-0.037,0.024-0.054,0.037c1.8,47.7,25.2,77.399,55.799,95.399c31.481-17.988,53.972-53.057,53.101-97.12 C240.656,32.603,240.67,32.609,240.682,32.617z M214.485,23.421c0.114,0.021,0.229,0.042,0.344,0.064 C214.715,23.463,214.601,23.441,214.485,23.421z M212.527,23.083c0.275,0.044,0.554,0.094,0.83,0.141 C213.081,23.177,212.805,23.129,212.527,23.083z M235.784,36.059c0.81,39.69-19.44,71.279-47.79,87.48 c-48.118-23.977-57.183-84.71-48.977-117.289c2.283,12.454,6.424,20.266,15.394,24.098c19.533-5.591,46.423-6.033,66.231-0.57 c8.255-6.001,11.456-15.169,13.204-23.18C236.029,15.921,235.777,36.055,235.784,36.059z" + id="path18" /> + <svg:g + id="g20"> + <svg:rect + x="133.209" + y="90.51" + i:knockout="Off" + width="26.245" + height="3.239" + id="rect22" /> + <svg:rect + x="133.209" + y="82.732" + i:knockout="Off" + width="26.245" + height="3.24" + id="rect24" /> + <svg:rect + x="213.35" + y="90.51" + i:knockout="Off" + width="26.244" + height="3.239" + id="rect26" /> + <svg:rect + x="213.35" + y="82.732" + i:knockout="Off" + width="26.244" + height="3.24" + id="rect28" /> + <svg:g + id="g30"> + <svg:path + i:knockout="Off" + d="M204.1,63.524h-27.188h-3.021h-12.561v-2.917h13.31c1.639-7.018,1.963-13.725-0.014-17.125 c-0.844-1.446-2.01-2.121-3.674-2.121c-7.609,0-10.753,8.046-10.884,8.389l0.002-0.003l-2.73-1.024 c0.156-0.42,3.965-10.278,13.612-10.278c2.692,0,4.834,1.235,6.191,3.57c2.41,4.141,2.127,11.305,0.494,18.592l23.354,0 c3.103-9.116,9.581-13.414,20.405-13.414v2.916c-11.732,0-15.019,4.973-17.366,10.498l12.743,0l-0.029,2.901L204.1,63.524z" + id="path32" /> + <svg:path + i:knockout="Off" + d="M206.017,77.925l0.019-0.003c-3.459-5.101-4.555-9.456-3.108-14.413l-2.971,0.015 c-1.035,3.3-0.62,8.273,1.929,12.54H172.21c1.806-3.616,3.479-8.025,4.702-12.54h-3.021 c-1.348,4.786-3.241,9.524-5.372,13.277l-0.689,1.213l16.652,10.482l-9.375,6.178l1.605,2.436l10.479-6.908l11.312,7.382 l1.554-2.468l-10.488-6.488c0,0,15.682-10.187,16.461-10.684C206.024,77.937,206.021,77.931,206.017,77.925z M187.156,86.733 l-12.317-7.755l24.071,0.006L187.156,86.733z" + id="path34" /> + </svg:g> + </svg:g> + <svg:polygon + i:knockout="Off" + points="114.745,73.635 122.087,95.391 99.788,80.434 " + id="polygon36" /> + <svg:polygon + i:knockout="Off" + points="93.261,83.153 101.147,96.75 84.559,88.32 " + id="polygon38" /> + <svg:polygon + i:knockout="Off" + points="75.313,93.759 79.12,107.356 67.699,99.47 " + id="polygon40" /> + <svg:polygon + i:knockout="Off" + points="196.871,130.199 189.801,141.077 202.31,135.366 " + id="polygon42" /> + <svg:polygon + i:knockout="Off" + points="208.021,142.709 196.6,151.411 212.372,147.332 " + id="polygon44" /> + <svg:polygon + i:knockout="Off" + points="180.282,24.686 188.713,43.178 194.151,24.414 " + id="polygon46" /> + <svg:polygon + i:knockout="Off" + points="137.588,51.608 150.913,58.678 138.947,59.494 " + id="polygon48" /> + <svg:polygon + i:knockout="Off" + points="140.851,66.021 149.009,69.284 142.211,71.188 " + id="polygon50" /> + <svg:polygon + i:knockout="Off" + points="236.031,56.775 225.153,61.398 234.127,62.757 " + id="polygon52" /> + <svg:polygon + i:knockout="Off" + points="231.68,70.1 223.25,72.548 230.048,74.995 " + id="polygon54" /> + <svg:path + i:knockout="Off" + d="M256.305,173.375c-4.941-5.528-14.623-8.145-22.707-7.951c-5.738-6.83-39.004-41.861-39.004-41.861 l-2.306,2.903l40.162,43.238l1.743-0.149c10.912-0.935,17.115,4.983,18.757,6.819c1.204,1.347,1.931,2.575,2.326,3.539h-22.075 c-50.624-26.416-95.078-45.044-142.297-49.112c0.104-6.571,1.273-14.01,3.518-22.299l-4.343-1.177 c-2.308,8.521-3.523,16.236-3.661,23.133c-4.92-0.326-9.872-0.495-14.868-0.495c-4.237,0-8.095,0.394-11.614,1.077 c-4.59-4.587-8.5-8.959-11.823-13.108c21.936-22.85,58.15-43.498,89.533-51.092l-1.015-4.396 c-33.792,8.148-70.78,30.334-91.391,51.761c-9.565-12.91-13.36-23.504-14.487-31.532c-1.424-10.14,0.997-19.441,6.999-26.899 C47.15,44.099,60.502,43.277,74.23,45.586c-0.268,2.167,0.017,4.24,0.885,5.522c3.631,5.363,23.144,7.246,34.791,2.049 c-8.595-12.045-26.006-17.926-30.83-15.569c-1.598,0.781-2.804,2.214-3.63,3.886c-4.745-0.849-9.458-1.48-12.903-1.455 c-12.107,0.088-21.363,4.319-28.296,12.932c-6.802,8.451-9.551,18.944-7.95,30.347c1.516,10.8,6.863,22.286,15.825,34.198 c-1.489,1.597-2.928,3.174-4.312,4.723C15.967,146.661,0,172.87,0,177.213v2.25h28.816l-0.505-2.668 c-1.627-8.601,1.623-19.351,8.279-27.385c4.179-5.044,11.1-10.801,21.968-13.457c9.663,9.431,21.975,19.446,35.679,29.109 h21.414v-2.25c0-2.539-1.259-4.762-3.545-6.257c-3.383-2.212-8.605-2.517-13.402-0.881c-4.573-5.093-7.137-11.896-7.691-20.347 c46.474,4.115,90.927,22.883,141.085,49.085h27.598l0.361-1.809C260.572,180.029,259.169,176.579,256.305,173.375z M33.125,146.539c-6.816,8.227-10.429,19.094-9.601,28.424H5.372c3.647-7.894,18.176-30.712,39.644-53.76 c2.958,3.656,6.253,7.35,9.872,11.073C44.347,135.444,37.437,141.336,33.125,146.539z" + id="path56" /> + </svg:g> + </svg:g> + </svg:switch> + <i:pgf + id="adobe_illustrator_pgf"> + + eJzdffle8sqy6H0B3gFUFGQwEyEBB2YHUEFwwJlJRJlkWGuv88d59lvVSUgICWmQ75x1716/7aed +Tnd1dXXN1fF6iuVQsjmot0J8mHG7vN70qFWbDEYxN2l1n3e70/FkhE2+G7+bZcMMdEqeS29qx7vW +aNwZ9GPkEXmYw7d951e565vTrN/t80NbpTPptqB1Mug1apPw+K+2X5sLXs7UJvAwciAfMKKbZWJ8 +1J28hOepwbTf7PTbqcF/YPyo6OYZzi3AU0GKwuOzzk1rbO4TjrK8jB3DnAy/CLwYluBNQYInDL6V +GTSmvVZ/UhwNGq3xOD3oDkbjmDv9T63vvqy14UnNXW11u4O/3alurfHtgtVG3nKdbgsW1qtN3FFc +ZfKcfyOv3o7hHXgdf8fm6Nt5D1rKrckEoIKBESXpy2reOB9Aqv7ne7pptTsEw4CIF78ycqXVG3YB +KWRRPCCFl0XtX7UHwEOehqJsmJdlGfAmhiMy9BMlPiwwjAC/RMgj5Q193a2/Oq2/Y+6rQb+lLC45 +mpQ7/9XCqRg3xzBK68202xrd9jsTWASHTbKy4stBs9VVm8i7uW6NLJT8x+o/lQ6V2qjdmsBODbrT +CaEUSZvhator1P5pjfQJroetfmVwR+ALiUJYFMWIWxQY5Rc2HHFLouyOMoA6ScEgC8tUp2TJtKwy +No6E42gTRHHvi7Az16NOu9OPsYLoDnHYint2Ouo09S2Lcm5J+UHWEZYM/5e1/ysAw9onk1Zf2eZs +v5ke9BDJY6Re2Ng+7Hp30FaezX4nT2C66VCBlfz9BvtRHHX6CIPrijyR3ordKTw6HQ2mw/P+x8Dl +U05lEScd9a/78MunOzWajj/dlcGgC6dtroP6SBkFH44mxt5L54C+9uPrA601drrW7Xbao9rws9Ow +Gt7i+Wweu3eXTgjbNGrpY5A/Z/8ufbPcIKi0gnL+0WxwizeWz/BPrz7odsY9fWBDi/67E0XARnVb +/eZ4Nozypw5YofOX1rh8sEzrA1idYWtJa7b/V6s7GBrQOGup9Zvu+9poaDcsQvfR6TcBK+VpZ9LS +N3rQGyIDd5c/a0NsXuipnBA4PcbzEQotPzgrvyArT5ARTv7ptsaug3x/8Hef/OGOuXxPgJLatDt5 +8bsPrmq9ljvoOih3gEm3tC6M+9rFqDzwG367cWn8MO/SuCLjfvgH/riAX76g6W+34L50P70w7ia0 +Pty4kIE9NF0HxRoA54673AcwLfxLAIQV6eA5rrFY6wI7axEginWXnbhBkMauhdZiY/bGt+XTYmoG +gjbTKvgtwHBGpC6skHRYZyNZRnmkHBsc5v+ozTCQqdFmcBVWTV6CclJzed8OtL9hr/GvTgOxURv9 +o/z9cFm4ArlI/vBtN9W+QC3lCQzedvv+0+v2oUMIf/SBgvxAQt436+d/1bpTtYPsPjiHOeceT/4Z +qk8PkqNRzQqCXmtSawLgvweAXQ+Av2qjTq3eRT1o/G8A4n8dhv9JLMT1Po3PTrc5avXVPiayNXQE +mTXq1KcTBDRIHgUX1xIb15Dn4ZH4H95Y6iXNQ4zvOIPp2+2P3xpg5wx6cZvOBpi5/9lt0NawuB3k +QewvuuUBHY7/rYvDNQRpyHFNKoC1A7leEYQ44areIeYk++9DlXEVi8TQHTS+W03n9fXB6vv3rU2D +/k9SwQq84N98WCiRNL/28cff/2sScNztNP6/EH9kIeXBdNRoEa/Tv3JN8yD/4wjizFN2cNOqdf81 +pP6PpcBzXM3MAfjvWs1/rFbzd6c5+XRcEScyYVbk2H/ZilTgF1f12eq0P53VbVYSwgLL/9uWpUG/ +uK76YALqYaH1MVEciM4rdB+kBoN/z9IWF/AvEbYgm/4fl7WbEzgbAt7ggMAWRsVd8pxl3TM/BnFA +uwu1fntaa7fcxcFwOjSRLnmhOGqNW6O/Wu5K6z8Td7bZmdTqnW5norJoMRLhI7MJZHdtNKkPaqOm +u4HBAjfrHmmKnWPP9qilrdexb31GGRFO4CT7rpwOgGNPAwCOfesLQnyx2zzp4vPJqNYfD2uwr41/ +YLpO0z3u/Fdrtk0a2mX3sDZsjeBhb9olfjdNWjMax8RO19PJcDpx39TGk9ao81+ko1sPtajgRebe +uWyNPx3eYOb2X6Mldwd61SYtWHmL2EhLO3/3QaUfAHBtdAOrx/3pstXsTHuGCV8MJ9+KPNX4CqCC +kOHEbbB/TEdCIxfAvIr4qIb55rATNkFb63bGpqZebfytolnUMDasNXWzJHnuTk4ngxn2tP1nDAeM +cX/MQB6RfqG/Wo0JkEy91q31G4t7PfcKYKzb6bfcEzhrdD3Hk9HgWzv7rE3nRrczBJJE581/4Dy0 +AW0Obwy1Uz/4qzUaooN0xl4ANY3BqNlqLm6D++BqMJl7vCrvcRhOp5YDne8djJqjcVhx4JgV74Vu +tX5/MJmtXdnlhU4aHsbjeQ662HHabzh0AXkHJ6ZJdQSML/9nGNYlpdXo0GEwbE4dOoydRmgM5tmY +qQOSzvIOgz6QyEShw6VzqT112iasyaonMOJ5lsQzNj1H5p7RiHXHueNnufNDZd+X7zp0AjY038/A +lc1dP2vN1qi1fLwuiyezNlnaCXA3Ia6bpX16eGzHRkZu1a/fagPj/2v5YPUOnsF5CWYGvPVXq2s/ +yEd/Eh5P6+MlC8Muze5w9DGY8RcrKlO69UDbUbUDS3S3e9/hXm30PR58fIQVdZe6+0jX+yl6TwZD +6r5d0LhnCLDpDPyh1TRDTdHdADVF7xnUFH3noF7ce+xLNJx6bbSMuLHfyBA9dOg6BGHQ6X8MnGYe +GVZi3YUsRO0T5iK2C262PlCKGsxZa2ZMOn8N6hNMZHLsqIiij0532RHDjmMMdjr0mZMfVr0ao2Z4 +Ahq5ppFZnSDsM240+ssOo9Jn2G38Y9BrFvGmdKt1W+G/KPt9LiE77DUYtbWxlvZRx7Fi8NhlOBh3 +lhMZ9oL9Hn4ORv+lcraoXb/BqIO5YA4DdkfhmYJUx3Sx5X01WTkcTJYcG+ypMztrOgNadFAPsEe9 +M+nVhmYRadebrKI2Vl6i6DpYTuGzfnXVW7qsY7M17rT7TugeDkdhYkItoxbs9AlMbNxaxhtJt7/p +uhndQksGc2Qi0Enfs2iUDwuWjAm6dTCJcE4cROSIU3eDOGClsLVsmnWeSQNWdOqqC4OozNl1NeJI +ZG27GZBkxaewS1NJC1nCFqGTs7Y/nnTVXsNh035G7KbOOOtnPyB0wZPZtfLxL/RF2m+N5lyCS6dX ++muGgiHlyGoGEL/dFjGVdJM4PnPZYAJRUuvsRpuKyryyO504WW3icNZHoA6Oxi0cbWS/YOw5/u4M +gVv2v504HCoEcNzbluu7GNQxvcywOt0TA52yxbL72mS8zvlP1D4FtKIxexGz2IiPa6kHRX3rdFRr +ooAgbyk+FTtDZPaO4jc4uFP8ASk7f4AKumrfV3RrybZP2c4HoHRLo/WfVq3/G6P1T+ORwRGWuGFY +o9eqP9D9Be5On7gcUCpbuWwWqc/3ZEg3d69B/1Z2Cq6hmMm9pYmN1TG6Lq3IU+uueT0NEKHrE8BI +14aKA7TTWmKyaOOcItbg6FQ+p716v9bpLpGD2juYtwz/5pZKV61zDojqvlXHd5yhIQncmcHffSWR +J9/pNw0kTvuamdI5zkols3mZpMcn64O/dFtu+atp3arV4V2+0/NvlaY1fc+5iOOEmFtf1r17yzZ3 +VPtndWzOv7UaMuffXQWX+ObKqDS9tAIm8U16RF4O+oPG52jQa1mh09r5s+xdM1KFpRuCI9gjVaCa +2xK1y4+i8gJIHudDXhl1epfoUXDuCvydsich9tRSA37GDQEl50sNc51vEiUGQajMwnN2Jrh5efct +BzeM9sI1UdtzgHhA39+D0XdhpqKu9l7KyU1k++bNuqBWlrphtNdS6MAoLPcdzfW9cTBR5jqvAIMR +Q8voWQG4019iAWtds716q3meThdHxILUpOjSU16e1hGNg/7kBo1EZ3hmqh+FCFW0m4ohNkelHi0Z +C54rmtKVIdNmKbLNL17W/rNED6UaodO31Ulp3lf01JTJb079OmqdqtKp6JyrD6Hqt2WH0ILD6xVj +LM1R4Us2RoN6baLUjc3MDuihrmqmdppNDtkc3hrW+pp7XJOx5btTJGGFmCcLHjv1cWHQqC3OAA/J +wVGsCJWm9GcAXqOju/4NM2b7jYEerxX0B6TUQufSM00eHpHyHKRdOBANi+daheLik2L7Y7HxoWZO +LcDpu53GDKz4ojmgF77M12Lgjik1Griz2jMX2UljC5oYyXL6/FyKZGDcJlbteAPHYmgnMfY/bGXy +F42PnL/EJRM/qVefcHL9fhy955lmvBXz9smf8fPx4CP3Xpju5TyBJ8bUFji5qx8wXHcSSd5UcpVE +bPgii49i79HlPQy95wZkMJgvPk6Wp7e+ZL/eHqvvHP/0kvn77PZodFzrn3bvvuqp98tSMhnssy/x +E/ZOymw3p9lM+uz5hQwVOD4aeoUxv1MKnHxOeAKIy0sBygqAHNWTweHVRSIvj4+ls8P7cG7wKNy5 +vNnR8yOTecxVK7mj5FHDCp7jof9wCBOchdLcztF7JjxN3Cajz29VsTpki7nd0kNXna+R3M18DP1s +snIxmeptLq/Smn/wT2Cci2kmfP15OBoJmQ7DiVvDxN1eeUfpzjLFWs4/2a1lgy9XBykxyG2p47wP +EqNRfFwBeIPnDBv6iunIiqdu0i2XdyzlJnfc6+B7Vyy19gMRT9p/LRyWYpXA0Y34OXphxodhviBz +geNTz64w5saXAM2dFD4YS6eC9BP/gj/9fqa5W83MT/o8erl8LpFJgcbmp4V3o6+R2Plr2HLS152r +gu2kYid/6rWa1OUdjQ49vtGY9Y6s1jqWiuyzsMXF9q0mHe8FL0M2k0Y+fbW9apZM6vIurFXwPwcO +uXbJctKt3KuwfTvsFqwmZXKpfMJqUpcXphW3d/oj/5E1goXqK5P7uCpbT3rqOdxlL94qlpOennEV +Mime/UUEc4/HlXcyKbufrGfnd/V+9Dw9LuCk8cU99VX5py7rh0lDQX1SmEUhpQKTUtda3NszTRqJ +9N6GdpO+jV4++xWbSRM1MZrbYV1e07QqKZ2839hNerbD++LP1pMeel7G25+tG9OkwGGUaUtp//HP +Tq9gNWkg3o0d20wa+dw/eUxcW08qVKtMTmaugMas1rqVa0d3bnrctdWkTO7lJWczqbjt/e5fpk2T +wizatDXmNPh+Zz3pKZPca/miVUv0TraDJ+qk1ZDPhN6TK+Ho2aWcVTb7/J2bW+vjIVOIhlic9HBh +0rPWQLyphTiYlAmZV1p4eqyZJiWzqGuNfjdzr3aTZpjL/RfZetLzn1jia3R1YzlpOb7Hw6m0Xqu4 +nW+VecZm0qcQU37zb1lPmj9rXT09+n36pC6vYdq7vX7bdtLyZ+m9bjfpKXOXHx5aTw== + + + WuC9Lu9tLnF4ZLnWu+HFlu2kd2+nWxO7Sa+Z+5N8Rp8U1mKY9vI4+/ZaenmxnPTl+vvcdtKvaqSZ +s5n0Gbgl8zLuhqzXevU17F3LEm856dt5qG876chbDnj0SVGKGc/qLZPt9C4sJ5WuQluexEsoC5Py +YfOhmb5F39RJ67zfdGhcXv9jobZPpuX2jn1n82stMO/7sSROemyaFIb9+tGYvnhgnnQ82D1SJ52c +BGBf5tfqea49+ZVJU1X2fJ4VBkfj22MPTppY5EnnIW2lh6xpUsBY/GxLVKY9YfMhEysMDoUrRdLw +O7F0fn7SndGoVu/jpCnzSkfJ1kCj3hTQmFmUR75iqqQ5iZXCJgRvDVrvFUWmtmpv4jxIZ7e7r4OY +1VMikSNn1RLbu7N7+5M5e/dObZ8C683s2jyFHdgNpL0qt2RaX62o6bkosW8a3ONvyfy0/7n1YPs0 +WjyPPetPF3Zf4vZv3m3flj5rr3u2T5Pc7mPD6qmqwxQC/RPO9u1C/fojbvv0eqtRP7N5Kp3tnh3e +jjWMfez9yKa3bwMdTT39YLdi5qf1i3Lf9uldJvA90p8uYOzeWz/w2L59/5yJHdk+ffe+RnesnqoY ++5oUh2e2b3/fcamS7dPed+741e4poKoUj8wwtvj8ghOOH2yfNvr1csHu6a5n9/x53x5ju9nkZb1l ++/YFd7LF2j1Nergdf8wWY5EzJnu0r6065oubznSgUhqfqE/T4UPT08r76X7S+FQI3iBDKSnGXDq0 +nwbdcjJ8fUm3Pyvo1EseHctnO0hZ9z7VWj5pxGzMvvFD4u7jtpysVLz3hEUlK5dNIVsbPXkDqcH4 +Sm8Du7I2etwjfC7GSp4rwsw8+/k46wlmbu49wbvXsif41qx4fE/+Kf5WBBL8TntC+bfIolFYbSdL +fFkCqNMBsE4H3+JOVP5AS3yf82h25YuUe5s81xLxIbuVuQhsR7Sl7faSg8wrkOm2vMXtHRWPM639 +rJecOzRnnjQsWvdzKT3R2pKX9yT9jmPpp6pjPzDD6js333o/l9e257730DNwHFHcpl0L2GLRG/8L +xYg7fT7+RtHPe925rFGsRdxGod6gGHHvvB5ua/22e7n0x4V0cHnRisKf+9vJ6GOXV2xkPwjHj0OF +Tpgx101Wkv0ccxER9hWyQfcHWMsRThe84lZVuMw+Nn4+DjpHdb/4KBbOVLs5ujuaCeB0cvBz60cO +s7glft/JU3c5eGhLv9AAt5WrhY1eBVvwmFz+sGgCz3I3hKvMuxVwhFvq4FXfqMA73RFpgDstbT8a +dH478KSzOWKxxV31ZjlwQGPK1l7l72jAy2ZvczPcZZLl4PcODFCqHnS2Y8G5CQKHZhqLGUBh9yKv +mY9KhkeQBVzaob5SNnjLhvRJR1M+zVBMCjr//LREO15z0kBsMMnipEOCFoabJj7Tn8Kbui+gah4P +M9lGsSJqbsX2NNuoth6UNo2P5zPnzSPQlHLTbjReui6ib5GbPb3B38AI/5bPAergdy59EiuTbTdY +FuPA8XF2D6At7yOMYbLq46GvOVZdNfMORmWlbW83ebt9hFoBs5Usdz2jXFa6OVAHvWr8BI6LuwOY +BYWZOPGxp+qLO82MojYDZKmDz1bGq/wAOriHwYqiam3BfLMtIcvIoJMhN7+MjMGrQJbhNfzAmWPv +P8WYQbTOgfezEnDkVC4Fr86fWYFnAdy+LXC4FhW8MQ14hEIJVaojXkh2y53q42m7b7tg+HGjLFfx +3VgsF4yrwvLlulbZjb2tNUlF5ckLu3Fa7CERt/EgbStcR7wgauyddCyf3hbBctr1kh/c3glzjoCc +z4YqaZyvKELnpwzsCxhId5T7S0F8A3Y/9ZVjWDnyleATj6jB7fpmvosK04Rd9Xq1H8K+eiCJy2Au +AhF7H43rsE3xEC0CXXSn7fT55zcI1LVxFYWoJz/++oDoCORSj/IF+i3nULgSAi042o0VR5udympw +aMYyM3xNr8fRsgjNqY4RVSJb4+Q0v4sz31jufvb5emLaq8jwQC6a9oqwd5fXlsHPjXjnoRhR/VF7 +yCCCzmx3/zXL78Tzhbm92t6z3KtWMbyr7osFxk5ipcvNYCwToNzJXZfKD615w2sWHQX3Jvm6Okgu +LwIVpgXKASSwWatWIFnISic8MU4gDQJHugpBWIFyXi6WgJcOPy3F2K6uihhPL3FeamC6vBbnt7xE +I6lzCyLf+fSSfbE8vzkrxcpi43Xd6omMqAbW5sZzeZURT3zZPBUpGYTMpWzNI2G5CmOenTqiw5jO +nU+yVv3mUG2giNrWJbcci3he5mhCXzq8PTmdLX2ojy1VdvcuTyvPX02GTT23M+Gb26Ae7iczw1C3 +I50nqbLSSiYtV2PnRnwYL5dxLu8cITrrWd/SZHW9zeVdOuJ0M5rgTIp9yx6qEY/q+/o5sKJa7HyK +3v0LM082SXYa82JuXz63N70v8s6m90Wmsm5W2RdppMhSJ5UGjVCCVFXtOrXhtM1TXWt1eZeqXTRM +St3u07uB7eYAT17nGN4tCJmlqHR5nY/hiK3t7J39BpUmHQaQSafBroLK+hilmKOWvbJhfmsSgzN7 +n2BnckxlXNKpsWe6GutAY7pqb6lscKmHT7PSaYUMl8HosN79yQmVNbn0aJowdkLFPuiM5zPdeP4t +xqpbu5vB2PGYjvXMrKlFDV3RYYAcTsv9lSxHW5BWtpGtzQYEqTpcCSQlwmsNFBVfoQDpbUR19uct +bDulun1moVQv8Y/NLOxyfD70dKMNe+hLRl89Ye5lXE+lP6Nnw0w+/5PSgjVk0q9zprlXyxJkuLz0 +RjjJFrIg55dx34EBuLwWODmzwcnX+Yp7pQHnMqd5auBNHNSSleSey8u9TLzUJGBlZpuWu2hk0/iU +bHdjEtijBc5FsxuYg3C7qgfIaN3M8eQTX2ZixSDWJ75PbhZ7XUUu2nD58+UuNKOmREvOq7vQiAZr +YyAiAokT7TcIJAxu5k9WtY97eyP8hL1YMGcoXWiWnt4LkxNtTe8LvxPz7ZC9Aj7m7ESjON0wYtgs +m/XxFnbf8XT3LlZ3odlgbN6JtjbG5B9m8bys46/qXVC40Fy0QPG/caGpUR4FKDsn2sp4iphAAilG +QfNzvpI5igezgcI561qmOqgpJ9eGIOJJrDixCyLmkc6zlB5FZ/89UOD2SttkoOR52hnmTT4um2NB +ZTKTUwkjvkxTeZqDhj+WSxX+5DbmM+0V6JbWrnT/LuECdhjzbwpjFnJ4HcI+ufXyixHedRgAgPSx +9/NgC9JcJNERKPNpowXJZO8jUAvi1tYba61Pz+2fxypiZUtZ1j5vC1MfyWc7btLQdT72ULY9uusE +3k6LPTb7Mj416fxrBHPSALdg1o+s+RitzEXCPqDWLubtdEtZiTAe0YTWHE4voo0/uatc0u2+E9r8 +PmcPPM25I7Sx4M2jXd+8hwRWuPwQ0x5h3ES/brj9msb8C4FxC4pw0UpfMiJtlM48noHGLGIfrz9L +Ylen5T6toHN5KUQd7n7lN+GmmY08B+MqLNPrwDJxPDgvjrFCpxEtnBqob/p1Xcflndd20sARYpTH +giJ95OGWGCmEJ//2bIy/HRjcjJJpIyPAAFZXeHAtNioPwugQIaTkTrd4XjZhqyBIgUX/prpIrLBb +gaVgrk1w9fXNPIomwlj0TK4lX+4GxFzZEI0FFnmN0S9AMiHnA8eOfBPR5hjlmQsbu+hNF8SibeAY +xZL9hilnf6WIRxoenI9W2jU7fzLAvWn75eFuo1kEAKHJ8WCVRUB3crLPz2YHqi3aXN5l5A7bvREj +BuULUMeiH3HN9Vkn8Gj1lSvwvjsr7+HaNLZW7p21WCYV3DiiTbThN7EGZGEBIpZdXqtMZmAuBUqc +0IhlktO7Ce8hws3ScRh6sfz8s5JYdjl4IhBG4ddiWeEw9xsSywBSyEos28Qslh++2tblatlzth4S +WN+mxPLzD3KYTfgRCbJsxbKuw6wqlq3yuezEMkpkLcePTiy/jZaI5ZiPnlvSiGUA7snJWG9Nbg8s +rSS7wOrDg0Vm/9JsRf1sl+O2PPlttHG5/7BZuf82WkHu2/mr5rdb3KgljnlDNLa9YTw7Xx9usrMj +ZEY7NA4/Jb7vfPZpMl2tvH5c6qGaJF4/l3cxMv9Q3azXD/OUdL+fDcGumEqKKoSZ9VhERqhSSY1k +kXr43lq+k2pkhNqtCIDSOpUNbkXAmE1oGGGcmAP/zoqMJYtSzn6VXiLTkG59bFKvl2baL0tRQtwd +OKrXKuXMPL3OZz/18OboZFhMTCdYnJf7qtjSdYpUrPMafEiWgw+D5E2/nk+FpMH1Ap5md2iZb8vi +xm1PqF96c3mxejrrCSX5V0/oQs6qhdMXctUT/Pyq4I8wtuWw1DpN6q3xBonDZPm795Ft3J80cC1Z +rMisZmrl40LOPzpD9+rOXi7zHdrCKmpB1ZSUAuviWaWYDYz5XV3Sikdf9fNsPZRYLLa9OrnR92pJ +v+IBM1f3at+zFCtS9BtN38Mhq34u72LPGEsz81bu1XLExX7NA7q1bOW+KGce8lRrwQuyIlQjnoZk +Qz+7StnROBYYG+4hsS/kFR4+C7P7CewKeQ+3fLaFvBizMGwJG6YAL3AY7904Aidub/+I02c98m5f +Z/xEV6PdcyggV28GY3KDSoUCvN1C67PpXATdMgEH1qtlfftV6YECd0z26umUYmNd3rnCf3vwSmsX +Ru8fHRhojLoeG6ux4ytN6vIa1o/3Da0zqeAvKpOqroXCQyKW89ZUGJRYktgflhOHnckDjn2bDew3 +w8lr9uQe2qZbJhVrSTgmNx052vu6OWCvwVsZTcXdnl0aRkbX6hwyh/cpyygX6hnnbT9DJNEYMLWv +Gl1wp9AAZ2clFXcXsOxcqGILHHKYhYKt3yTwZywMroy5sn4Fk6u4R12XQ1fDu6gTrkYq8xHe4u6A +LkccmB5dyXJghXxLGuKjrUyZVwjtq74tAtoOCCT5lsuqvqkSkp0QiLOoKFyIBv7igJgSy5ZU2C1B +oBVHqwb7dhwtq9wISmGp0nG0atCSMa/ugX/Nru6gUSq57OLtMOJGEsu03c8+Vx3sXCofZTVkmYq3 +DsZWj8lYZ9pjIIXWs+NYCQ1HeANRUQSJMvJOA5RTloS9V8geY/YRiOX2sNXpVXZfO791bmB3fnO/ +Ob0WOSR1jio9nDqMUue3qHMUKUq3csSvZ3Xq1PtgLTyFzj7mWo62It5lsXTHCh7QtxM2FTzNU72C +Z3nNCH3NqWNRhjqUGk2gKpSkUist9TbLvL5Tytt6qEs5qXXL+XNgX1tsWcA4x5NpzIu5fVmUPr/e +F+dLgFbdFzqVdaV9obsJaJVqZXPYCj0kv7mcCauVnSuZXKsdQ0rl1YzK2W3zVoeG7k4gClSqOgwi +0zH6uCoq9Zqm5TWJKxvmk+MfKzGo172aBeH6hvnk2CwG7Whsptpb00H7bCWTY3anyg== + + + wu6fUTK4oKJdvHOv77ZHU8OYhfm8tvE8OTGL+bUxRjK1N4IxOtaj62N2xDDGU7kop5dYjvYgrWwj +2wK1GBCkAsngUZwBRcVXKEDSbbblZ3/ewrYJUGKQaSFlxto/ZrKwna65GX7YX3PzMm6bkxhcXmcj +fEkRNOU2uSjLZH/MVudKwJki71/ny1NNV1U/YTxUc2jvhXOq3+JeJj77GxbsfUpLarRXYS5OudZY +tLyOB8jCulF48vlyBrH6ck1aiOXtQBZycUnJMoU8cy0e8SUIdDjitgi01GDPraozV0TgnO7h8qrV +mezF2M4Iv/i1C22+sp7NL5gf69X1Utw/ttLphhGdXWgu+urMnRhrvuJgreonwJhDSRZ9JTR93oVT +2TF1FcbyGw6xEnoThV0uLwL1+xxUFSQbF9oKt50Y9+9iungVwpJct1m2rVOe1oN9EBFLQilreaj8 +9/k1k5mNGRFaES1Lk51EfRXCyW10b+Gum5XuEzVV5tpehbBaLU9+zTxmK4x5Hd2vlJXQs6sQDBHe +Ncuzac6ai648+5cpzKq9j0DRJIFSpoDmrSNWK2bSWSYuF3u2GjreBV17o6rGpzu4WFMaNitda90S +gHCvFLYy1FjZlomWf51XvFApvJHbgBFtiSnt7juhjTZ25aIqX/5tPZGijZNiY+p7ih0rvReM7LVp +bKWbEVzOhb44In2Zr6U0V2ZZLPT9avlsv4zANHePaOr4dEE3k/u2NxB8tRwvTHYMNyla3wxGjr7e +XB/Rtn4dxjugvrfHdkSr+vWRla4zu90US1QXfFhWx4IqfQTFpCFErHGY9eqMaS9ypo6MYLVrYbqm +wmNTKbwYa1mzuJffzK1NpHh5wb9pnWlPU77sfAWU7fpUzq+XLzuWKlBXeoc3R2M2gWNT2NgQ5XHO +08eqb6c6TMtUApRijiUmoK8cH9sEjkmBqpPPwbVCxOO0Olxz18z+5PRK30Ogqv/Y++E2mUWQts3d +mcsioDo51eGiR3Gte+HSK30UwbF4+W5Aa/E5rW9Td0Mpld4L3sO1acz5ywj0lgwZj13re0mOYnkS +WHYXNGiFmxTLYCjSaxfLqeieQizPqjgpxXJt640yZ84olpdVCm9GLAPaIpu5S40ULy8Ry6abJ53K +l9cUywseElK+vCGxXNu63NDNkwRZTmIZ7f3VKj8BbSuLZWqPYnFZPhcpZF0ill1GK4pKLL+NVq/7 +tF7LfC3watmKVnWfCzwZetZpvlpEL/djPmGjch8g/N6hlfsUt35jzfcKdZ8UlvjbiD6J16buU/X1 +kfp+2spP6rrPvaM71vnsr5DpOuf1q49NXr85ywJLWTfo9eNSD82p453DK6aSYuG3zXUFhsiI/YUF +NmRRH9O6Falvn6tu+va5+pjarUhzXUE6HF3h7NOVLK9834X9Jq96XQHF2Qfq/+11BarcV8SWzhuO +xRKfvBkkaqluNN87DDCZV4tjMftQ9eInqX03O1GsmC5jxXTB5fWEpNCb5Yeq9ytJcc0PVZs+U+3y +/pEPVZs+U004/+Y/VG3q5/L+kQ9Vmz5TvXwta3+o2nYtG/1Qtekz1XgTxR/4ULXVl743/6FqE3Au +7x/5UHVg/jPVsJY/8aFqE3DEB7v5D1WbPlOt1b5t+EPVps9UY5baH/hQtWlS/Dr2H/hQNcJg+Ez1 +zKuw2Q9Vz0sfowd+kx+qXjVz2KGM0uZD1RaRRINm88sPVdsBZ7aSaD9UTVtAPqar4V3vQ9Wm8Rbv +6nQ0uWg+VL1SDS/dh6qdSUVZC/WHqqlLluc/U22fb0lLfJYfqnbOt/zth6otEGj7pe8Vk8eXIxDv +7KK6LJP2gAysvrFjVWFHjcAF14nTLQEOZu+y8uwNR3lsyrMp/HYLX5Te4P15enE27dcZnDJLlxdn +r+KDtSnPXgdjm7ky11Sc/ZuoqFqevYGsG4rybAqQyL78rjybojjbDmNrOq1sirO1L0pv8nKFxeJs +my8ZrVKeTZ2j+KvybAqPmm2Uh748m6I4Wz+Va5dnU3A527XQl2dTf7X8V+XZFptoLs6212FWGNGx +dtFKiq1Ynm2gWrvi7CX7QluevcK+/KI82xKL87GGjeyLo/a74l2dVuXZv/8CO015NoWyoX+Vae3y +bIribGM04beV7vbF2evdaj5Xnk2BSrv85BXKsymKs1eOii6WZ1OUGlvl9a1Ynk1RnO1wLxxNeTZF +cfZ81s1a5dlrY2zFCkrH4myn80JRdkwhpV2UQK1YfWkCaZZtu3559iJIFnnjvy7Ppqys/2V5tnNx +tjHXGtfaMicOUq/U6uad2bezre7oNn49m75Wfdm3s6m+J05dNm7HmEw1VrTgrfjtbKdM+818O1uX +yNZfz157N+a+nU19k96vvp1tpcEuq6OmUmkWlmv7bfRPuotcHAvRSRU1sffX8Out9u1sy7s6qRFI +p8jQ36vwuVAZR319CahDBj9//s9VjNvc1LrhinEKL9wGKsYXa0X/RMW4PcY2WTG+gRsOKSrGaW84 +/F3FuDHn6s9VjNN80eD3FeMuh4SjzVSML2YQ/YmK8VmFnWWx8aYqxvVK4SjlQVunYnzdb9itVjG+ +HGObqhjH/OT1a6doK8bNsdc/UzFuWVm/8Ypx+rsIflMxPl+V9qcqxpfljm6uYnyluwfXrhi3/VrW +RivGN1OX5FQxvkJd0i8qxhdy4P9IxfgGaIyiYtxFL31/UTE+R2N/rGJ8lW/Wr18xbvPN+g1XjJMb +QTna6Oq6FeMu7+I3zzdfMb6hGiuHinEDJdOXpq1cMa74+uxUnk1VjCvaBb8ptNmUpq1e97pOxbi1 +72LTFeObo7HFWPbi3YMrlqatWDHuWsl0Wbdi3Hxn15+pGLe/qXWTFeOz6qc96vvX1qgY/81dN/QV +4y6KD17/XtnQvlpOUdLyi4pxu+/ybLZifDmNLVaMr1rfPXc7kOVHHzZXMY7f4LbKl95sxbjyjdTf +524trxg3c5g/UzHucvZEbKBifMZh2C3ar5KuUTG+5t1QK1aML/GQbLBiHLTxWc34H6kYJ2LZ/gsg +m6wY178AssK3gleuGKeIjGygYtzCSvoDFeNk923LiTdVMW6oeqZ1WK9RMb7eDYerVoyvZImvXTFu +cUfEH6gYJxVDd5v8NtKc10+tGHd5rT9xv9mKcVjLrGb8z1WMW0ZGNl4xrkdGqN2Ka1SMk7w+20/c +b6pifHb20+Hon6sYd8i031DF+Er3j61dMW5z/9jyivFFPC2pGMfacPwG95+qDtdrw+Hs/7HqcL0f +YuxPVYfr/VzeP1cdvnwtm6oO1/u5vH+uOlwvtl380vfmqsP12nC9amDz1eE6cHNfYd5wdThdZf1v +q8NNlfV/qDrcsbJ+I9Xhepk26Px/rDpcrw3X5MufqA5XRUK3PQWM/bHqcF0xVK2kP1IdbpcDv9nq +cJMO84eqw80+pT9THb65L+Utqw5fo15sjerwpV8v3Vh1uF4bvkZOL3V1uL5cy69mbKg63CKj+w9U +h1tmdG+8OlwPYzvUWfyqOtzKStpYdbiGO6s6iz9QHa4jw+VIT+tXhy/U8P6R6nC6/LHfVocbswj+ +XHX4YtXzn6gOX5ajuLnqcKcI72aqw/XacIds219Vh9thbLPV4XptOE3m8LrV4TbZgxuuDtdlvVrN +8Ueqw3VEm+5V2Gh1uJ6M5PL+uepw27VstDpcrw0309gmq8PtdZhNVodbSbHNV4cv2ZcNVofrteGb +3Re7T3f/Yl9W+HT3Eovv19Xh+mZb6Pwbqw7XNxtj4n+qOtypinMz1eFzttgfqw6nuleB+SgIz0tR +afAbqAs3xpENCRIur5Yi0WvZf8A39fC6+gdAz23PfvtsU4W8lLdq6NLeUsOD9X1TfQH4nXtFz1Wn ++MA6kFLq4cd8K/ZKpZwLGFuxlNMOY7T3XThjbPHm3xXu7Jpbmq0JvxJIJJL4RpWO5Py9dFtmZZ/X +Z4unFYtI56xXE1Br3OJmF+giX2Cnrfek0PlxpQu5O7jSOZ3fwlK31/RPfJmRnaZ/brLTf/0V5uxC +GZoN56er9l3L6Wh7EziAt2AU/8bpCON5V/gyi6PT8dzW6bg8D9Z+N/ZWOjQOVtL5eldSLqust0gJ ++90nwGcC0eXdxM0Jnwvp7fMItPkO7xIELknctkWgrQ6DxetOyWHUCMRZsHjdyZ5QcWchIS0yRsft +JbVv/I48pKlsoPPB9i6sdn+NrMCLjX/172KzXzQALrFwsNcrfdbzvX+LMccP/tH5LbF6ekPfSL0g +Gd+/zxsnIFmkelvd1EqBJ0c/03zKnlLLY5eihcXrv/w86sw7Olfsxp9UJhkb79Iwv2aWt7UPlj+5 +DZhvgFlnm2IlLSrqlFNHK95jJftjtsaN0/nVE7xtMXbk3wjGPFq92C8TqfMUSWR0X/xEoH6T222I +8eWtfBtr4skUNVoe5XFS8rF0nSYd0LV6gcZwScIClsZaHNy1b5zGuBB1kY/L61RTTCdzl0vcue8j +n73HzO6W9S+KwNJ17fQaIrxrfWm39kZzwYOLshSbSvDakrj+FWasW9/EbRFK1fr8EV73Vg1StR7c +HI2tKn2tZK9uv5AR69Q0tkLyeLmPPNnGj4iOHqoybmdBp+9+uW97HdLqYWyEcF9nmY66pWFEuzIP +MuLSa3VcXooRLWtT95ORI7simFtLD8n6sVAQkxTizUVzNgDuHA3x2TruF+ssgAHQ3j1DVZu6nywu +3j24VvnY3WB5berc7juWYu+vaT6Z/MmEOjZTm4rl15qz9LfyBavWnWtTaWksvpAgYXYiLctAsPlm +vQXfNDtCKArlZoFxwpO1ezoAj/u2yaJs9jlNYxRa+Rws13K30lVZSyuKKb9dSx01A/N3o3fcIYyr +3fdg/33ku5Xuy1peiK1V1/76kga7FCVLi8/5S+freB+svl+JdetrXZplhSyrexStXKSUH8PEEe3C +H1Y0tsKVEbWt0xM7sXyvi2UHbkkplp9/lovlFeRLbeuBxqtpJZZt7iGB3ac9dzRimdS91jfgc0G0 +2Yrlxd13/Hg3taavHz1Lnny/MbGM5dcgljdwi6ZStb5ULK9EY5eOFzzYiOVl36zfnFhe8Chi2DVo +K5YBxlsa08wklu3X8uAslqkrV3Ur6W3kqFgtfPPcuX6d27TcfxttWO7HfLQXSnjnIolLyuv7v7xq +cd4Sf1jBEaKOaIs7kxuEourZWUxi/brz2aepYLfw+r15lnn96oaPECy3xOm8fh/psIONiH4YmysX +lpU0fzpduDCfgeuiuNOg+mu34sI9ilY5Sb9wK1Yt8y3Xvn2YlK7TS2S6z50fUKvXWi2PjdiyTC1a +48KF+bNfpfHzr2JN6kIL8y0LQthebL2M2w7Xg6nLWPZdiHnr9TZ2YDsfRcTcdr7ZjTqqxxHxWKhk +6weNXrLfCA2Ske700iQDyFSpbktkEoff18+5/d1rjbk0kruZj6GfTebvHwuzfQYrSQ== + + + r7xXT5G5+/uV3l3vrNRqqTgpXKe6kodNX92XWrnD7HMY1nfvy/lLXDLxk3r1YWWKYg7MWk8aORyx +mIhXSlOsjz6TQp7dafY+de+ZP1zFTCNWa2Yb79niaMSNk5799qh0EPLGdvn7y0gyIgbGn+cHg2nN +5d07a0ny/snTzuOW53zi9yRzNwdb1VcxtlO+3854v/vlwl7rcxgSy4Wft+h3s9BOfL9ffeZbZVm+ +ej77uSuzw/xH+bPU6d6eHlxO795O/b63t3TA/1WNfF33ioH4h8s7DDwmJiNv2bc3GvE7nq1Ba3Dg +ZXY+4/7HQuMuIAcufcc/O71CjHu/OUoyh4dbo9FJrOjZfzm99HCp624g3hASTI45OWZylfscc7o9 +uGJOr68+R6POSWg0/TwGbjneC17Vw3xBjiXL2+09UkIO63vOhqKF3S8pepLOp7rRUoAUb8NKKxWA +odUMWFy4YJHnoOyky2t55YK/05U9ga5Qwul5nXRjXG2vlDgMnQlKQfte6ufGGsddVih/3u78jBJ9 +8crl9dxf5QMOKJq+h3f2d70PxR0p3k15i+XTi7338vmRIO9eirCqlCdZOaifYIF8JXB0ELpH4KKJ ++MtrN3Ph852Qr2NXS0z2Lvo2Grcvthmu9LydjL4kWpnz3slDIjZ8OTR58oFHXv5kg9I4LBcvSp3Z +6TXQOciFYlo/FC6vdixeLnXxznDdyWH6U7yuwl6NX5OwF/dz4zx5rcY2433/JTf1BD+/HvC+i7vX +rCd4ef/g8YVqW3jLxQX+iHtCSb7oCR3svuI2HXtC/dKzJ9AIy4iOSPKm8ryXrTPxKBk7es8zTXLz +Bfkt3notfgL3vffBqrYP8Tbgs4+XTGs0CiZ7g8IYVnX/g23NXDrl2Up8bSe76U7tgGWY8ftupn79 +dpWUgsNBIHv3cAadH7ZgvsA7ov+ceztrBhn2ddub6l2/SLl0clpLDMdsXfvi57HYCGYbje39RPzi +G459Pj8hRhPDTSfbidF2c5QKSd0rht3zt5Plxt40WdqX7pKDQbiAiuqOWM3384nYdfor+x5qTxKH +J4I3kyrcNXAtUZc39/52PUxWMo8ckHvwKPPBVPFaD5kla8U/3xOHomeEx8I/a+sd+hOFcqrb3wvh +YLe4k5HU90/Mmyold8SUMAk85XyDdzbzEXq6Jpz/XQCiak5wnGrm4+U+muomujyOSOJBnvTnU2Ma +uwzwT0gHeQI8kFfoIpe9vJNynuBNLvfmf8qLk+FrEfbqJAiAeHynk7dhHVb1ICBPvpgGEvGCB+/V +3d/O5PNnUXh7Ozw3jm9P25zMCBc+zqVboaeUEOn7CQloe/rgTX+Gzptn22FvVN9nPPvv51sAfI8N +ZILeac53dn4eu0pNnzLn54ldvS3e5qrfqbPb/o8yHzethmCRzS29i/gofj0lbz7ao8zHwc5btrH9 +fUKmgrUAAP5c9uc5ltv3BwPiduyhnG0ED0Nzi7ziYNJUn7iOdBhT35c3B0AHzyO8iyBNeFvmI3Uv +5TKRRw4IqVrIZTk/6DAGdHDbb98JPnXwpfzJtqMDgDa9bVhQ/vF0YAD+KPdzRnYNtuSplBhNc3tA +DNU7hvdsSZnw9WeGbCLoYx+9+E6y5Km2YRnRi8zF+3gX5N3RC8MFW92UmLj/IfKVYQfVLrCmh0ny +mg2V1c1pDktkf9UuqXorcfdxew8Mda+QKlVPGYIMQmMfsIM3vXLu+azQSl6nU9VM/txzt/CgzVyQ +033kCwXfxWrhNpF7be1UM+fdwFXmYzA6VhgXHy/vptqPpbv4x7SYRsJ9hrOPh1PRrggLm3U68k25 +99PDoa+We/fHMhhuu1ZhfNr/zgY6jxNxO339tgCS2JzAvpzswMjnfTwvd2Qtzy9HL/nsQaYd8tWT +khgN5zLVShDQFn1iuEk8KRe97Yf4RapxnzsZnxZz73fVJChTFQGPVCpZDu1cpi+P+mmVWzQK41Sp +dH2bavSnr+q+SP32M5+tlx5QF8yHxRPx4TSdvREmKgnkq9108z54n/kojd+QCd/msuxoJxOs/eAK +HkOZg9rhbqzd37sFuCK+TGt8Iqi48wgyUYJAt+S5wiT3FryLoRpbMpoNVr4prnAPxBmXcP+KtDOD +fLGYe+WZc+nPaF710CJHAz6dq6AElMXbI7wVMHm7G38nnfAukXt85yLV9VYq6XZ77AG4LyUET8o2 +Iu/+6F23cKqfl+hd6akCP3q13OHp0ylhZqQtdtWOd2KdV+kDHrCwFvVAAgCZVmfwdOo9ff7K1ivZ +iD4YcLTUrfhQG96R7UbiLGdaD35+9ud76ps78mhC5GwPr35pprrhmwBYQS9+QmPZXaB5IZvztU5e +koPP633VAtMfNL+esrVaRD6Wz7mBgtnLs7vvxOi0B/qD/7WUCd80OPJ0XudPI59+gbW0PytvoFsn +jyx02ZjBLQ5MagtY6+1OIj7oVVPXk9o43op5+4oFdj4efOTeC9M9PUtAb5vd1nj80yNX1YDiGN2L +7Q44ARTjn7vEwWQ/E5AjwiH8dniROBgPT+DB5UVmWitew4Ojk5y8c9NMv1xsnxEFK3oX2rrMvV/u +RlWn4zAJVtL8Mb0GkLlptvF4RITjDUixwxGezw7uwTnoAjxPfBd44ivkyEXjjYeQqV82sC9+iEdf +9fNsPZQ4V7I7duIfZweV5DUzvERCO1dE+bTH12HPfyrkphhyKxdwgYc0UWjhnAs+YKg/DaJsHIbe +cwP99i5JHhx8JMuT4TSZf/RLsBYkP0PrTf/7OVvf3X87O3rm7xV1+PrH30hdT/d8yMzOMh+vW99n +2zenYeDyz/d4MdBPznfx5QO0DBh1qGmJUCAcXCZ44PKysOXHMJjMAQNsbwMf37uA/f3ZBUWm6kve +dIf72cb3jwwaUDKEU3WIiILDEHwE9p/YIlRCrhc68t8HOgQtZLnECsTPI4XVbFv29DWMBS/ZrVw2 +44+aepqdFWyl4wOQmE9QjbY+U6FYZkdhlLMfYBS2PDDAzVaydNX6grMvtKeNeRLA+wKkQeZi/2kH +hmgNDVpfIwVSG9EvC29PN4fBx8xzLhMUAwb5eXJzeJ/z7b50svVyfpoNFMJKpXDKm8mn3vncc3On +TXYf21hgAPEJKMHXHrmbazzHW7f+TqrxszVSucXO1jjnL3ZigePo3Vn6/Tu1n2m9Tx9zb5PPbiKW +89ZmD7ZcXmApL8cKD3kU28+gj+UN2gxYP2I0l+kGFUGIBzslTvKTo9xb98CTiGXjxaQcz4e03Q0O +QPdoT3PJXiyo3X7Uvp73Wq9iNhivwQvtJMb+h61M/uLxPc3e9sY5z345pD/AL0tefLRhzyPRlBhk +H3DEi9Q3W2tkcs+X7Wzg8/URT+A78TilO1/iAehM99PoiD/rpAqPgwc4i7FnEOSfO8Ajr4RE7Opb +Tl0Xhx1QaWK78tfI8+TyqqSksLAPJtXtDUPK0dUV7MdGixmNjg6wyzZoLh95llC8PphisOxGBvr1 +WFWQcjdbOX+1OAEau06HjomCiRufRMM9hBYKo8O9ON8ooHuzjnzdeAfw2fYkfpLbicRhsNkkl34R +X8H2jzi9dHkNyuTifEXDDVx2OFHuvkrvnGRtVwq7r6z1kbuwWqvFzNuOKx3sm1ZK/DBWawXb3pva +ySxdaYl2pWBX8udPPaPF0GyXTLhlcw+n7MztlIpx9YMO2mw1NCC+iDwj/EB7UM+bpB2efXgeb3u8 +X9lG9Z1LdS8OemAWHkfQ45jCjwsUcu+xgZDzyaI/GwoMhrqNddAJxvAsPsqJ+5J3y/Ld1w+s5AJG +ko/GOunMJ+G1KPJ9yDyD8Y/g6DHdvLu/VC3e42wQDTcZTIlTwGKd2cl8fJT4mR3rz4TD58E4c/Lh +gS4Hr7psdnnl67v2de71eaAIodgV030Tpzf8Pdj7500Ypxgh3hC8bxF08OHTa/K6cPaIqn0p984l +IwqNHcZ7Nwx3dj3NnE6irVQkE7rTnwLG4o3rS5BExQFIIrkGnLgxVuAhasD0nTXc9mcECeSnPUhP +I5CzM5BA5zcDlRmXbYEKxLu3V6uDhLtf3O3ZAKXcI3lli6f52wqvwIZ6207ExqEBbvxZNnA1qIBh +cwUWX7LYK7dz6cZNGv0+j3jkuHTnKBWwnPSmx71qzuLMOHMR2N9OCfdcCk1PJlke98tAVAfTufUl +eCLF/FOQKhcPZNq5Sf3PhnNnNAA7JQWpuWSmYYlyBanntQcyKdiVxmljrPVOT45/aHd6YVKuXTJE +RgxoxS8bF3S0Lq7PFqkwaeJ+v0ZAgmMWfCVP0T+mPce7Sp8VoEr78Wcr8rICCXSh70s7kF4JSGhZ +2AGFmDABpT/FOzhfaEGC86IDdVKZXC0Hak2QXN6VgNJBwrinn5YdWZz9ZQxpTXZEfH3V4UrUbzpy +6oGc5J4tJ8XjiDT2ctFWVNq5jajaHMiX2rJzDgfO4pRjnpI6LF7IKh/j7jcsJn3Qd9+O5LoWrOcE +bwS6ACm2ucNne/RA66Mlqo90OLQmm4Hd/xMCBUjqc6qTlI0UW0JUR5z1sMVne0rV1rJkWDs+XXz7 +oT0AQGP00LbGtsMyuZR4bQuryzveyrUZm2EHnvWPK8A6O654e7bNgV31uL63bY8rruX0LLVMLFf7 +NsM23myHBQR9GbgAcpiFYV/smMuLDdWW+9YnrCAc6XFkI0fgT24LBQt0vNpsXXVgqSkFC4G4znDI +rebKBAkuVWXPLSZozaLHX9n6wQfGNkqvROlW3kD/fOr7MjQBdf/5PtvYFncUV/j1q3hMwhHogVfM +WX6XuInU3y4+vtEPc8MGvqN7DJtP9k4fTo7qSeb4oqc5Z6Gtuu9ppD+fUt6Z77+L8ZwfLb7kF4l3 +BTO7NL8QrL8bRhfNceajUsJgzuN++uPos4iGu+KwP6yL8X7q23fzEW/tiUXcqyd84wIMlrO+4myC +P6VZXOgZzDrf9uyrGaL/Z2YbfQEXzDJKqIfkTighsVz1VQkVsPnvSS7BXNwCHsKP6p97mXsllKV4 +/LEtefotkKgRWuJq3OgcgxhcsnJ3GwC6ewkYbRowOQ5Pu8fVbH1wFkoWm/GmIVjF+/vbYMfd7mTO +u7e3JscnCQShlcTEo5pDNzhGk8urhE8OQ/et1Hfha6T4B+eCObXk7e7hMWz33fViQOm+q9u2JCKF +33ycj0lxZ+mhQiL5armv7fTkSwmu5E9+BD3yg9vZSXde3zit7TEOW7LvnwWw9mHNzD5Sss/vM8TF +Lr62f8haovf8Yc04PYnHPo2F1PfeaU4z631eY6ArffyilmvNXmPzVZT775feLkasRMXi67xe9IHG +RiLG6bbk72QW0ObnZzHTBw8cvvxohp2JEj0ddRp+DdZ7KfHA+MPan7tg7+d8ecaLzulLOHK1XYUY +mrvBfG6fO+a0bXyU0Oru5N738i9wAo+2SWQE3ZgZA0sBGkqA/f3QS1Yus3l9c1xezQ== + + + /+uVsVMcWj1fydIVaJkY6tHRMYsgyXgOCkrwCO24+QfFRLx3nDYEfV74bBdsZOKA04JCxEFV1UJG +4ihRTudvQA/xn5MoHjpBJQw4PGldUl9JqfH4kDl4KEWVcNosGAXblPlIxJ+TF4Qnm4GKYrToKNmv +196V84K35xzujVvtrG/rrp3JeT8u5gNKF+J9zz9IDobDekqYpkqmiJTCYT5zJ+Pnu8Dx9uE2vnMG +mA/siNssc39wWf5GHfVkB/Sj/SfVEfJ+fgyc6mRsiFx2vZWSIZQzH4QBi6/16v8A7SqHmTPbEvqg +B7MY0d3Z9s1RHInhEihmb0LcEYpD15wHqmVuzYIs1/qkuJa5aTc+Kbt3gRbfee27uBjb8l9IJVk6 +BS7YqpDAuPoOCcaNIoVUKB6PEe89MArvNF0YTK4RzKF2Srhp+nN6U8HARA45jMLCSGvvK1lJ336Q +ZcyOoV8JtxWfLp6zb8PmF9DiVkQbjASC2Ex2J/R5z3Ah3yRZDHUraswf/yxdle8wMuJvXish++/W +C4xTYGup7vd5WQvjA51PfOHLxfi++kDc/vGUT4c7hyL63bcQqYVovHF7Q4QWSfZAWQm41aJFC6I1 +1u6nSing0lupwmMpqbJWRbqeMBhFD6NQ68/kx2Gq+yzHCAx6nGYWf+metnOJduJZOQJkG9lU/dMU +0VHjNPL4hHwyQOmH9/wnfhKjQ+IdVN+VO57sXn+3BCCxTy6vOTfk+DTvI9GLROzB10lxX2E1Jq70 +C4Z7Sngk3SjHzCGTdGtag+mTLVX3eKgWsvVws4VWUqe9rTiWQDiO1SDN6O5UTZBIpTygMBwntFCP +b5cczePdcqwTOK4OFE1BCfoQl+xD7eeC8Omzo9c7hhAX0cf0AI/gzZxWE/Vk/8QzyJw/idtKyi1/ +6BOSkebpbeLno91XL/h6mISVQodOMBZAPWqQrNzv7GffxWHD0M/iTntxB4DK/aAH/gsTaUZqoHP2 +A0OQmon31MzWvc26iQQQTxktEUqVj2QtO3u5zHfw9Oj+I51guO3vj6z/tdYGPaMyzj62Jruq0Nv7 +8CYOI18dZMcvChcAZCW1lL5sH/NdSMpQEiQJxyditUI/9fl+iXZlJ/n8nq2XqjPZpgV97t+PK6nu +Vj9HojyyeOpvYDgGtbCHDHkQPbwX3zDtpYMh8lI2WPk4MMCFn6AA6v0Za7qlwj7k5Hvi8CwdxsHi +amhY3d9YshxMgLLRqUxIsgtqzJdaduT4v49dAsMKbiHKiu6Dm2m3NboeddqdvjvoirsOkucse9tv +DnKjVqvS+s8kM2hMe63+xB1zHyTL6fNzCfhrY9BsQXfvXDyn8aFnOuppV7QxX8sg/aPYe3R5SehT +zeES42PMMPWBrGuPF6LEx7X+affuq556vywlk8E++xI/Ye+kzHZzms2kz55ftCjq0FyxBKLIGZQV +AAHdPji8ukjk5fGxdHZ4H84NHgVgrNnR8yOTecxVK7mj5FHDCh6NISo6z9dKkfOZwFseORfqB6ks +d5YgQfPEx23lKnkmvl9RRc5Re1dVBEWT7/a30KR4UyLit6+5GvD8pytDogS2SZXn1H3qe1eaaCcE +j+VXp6bwx5kQ1APgbLDdPlaYkS9br3QOM/n84d68CVMAtb8XxByeoprIo6RHvEQTsWtfCznJKVE0 +NTWz9pT6zpwxKg9nMi8khIRhp/RTCxihvK9EX0h8ngTkhffQi/IlF9x4NVyvpRLqOVN6WyzPHhzo +gRwlf6ReOdxGsRp8ieTejpM1+4w5e6PncXAJyziVVaEU8vWUPKrKxVRWRYh8+ePyJkaNMFGkJ9lm +7LhnYbj00UwMn748+2LpVrl4OxtnlohmCAKWrYwjlzd2WSudKOaBvtP3l8NzAvycDXSHcfeTH2Nb +z7eX8zWeZ+zyBZTP4uOBIeqO6QioVPWOMDmvWwWB+CIbktfQqkp1Wyk20bseltQw3selrKf7YZxw +V8lHNybtFB7A0mC+CWtE5OfwEz6RgYRZmSJIxZNbEA3j4JzhkhxlznOPW9qfhwB3/uHDuKDGjxfU +ndeQJky07M3rglgiGYGouIeeMOVd+diaoOkWJGW20Mrkdv2lVOSuNNEyygw+EYwEHqN0vP/J+c4f +bmabc6mmuoYS6J5gdmD3MTdAswwq9Rk6QpqZ4XlDFfBmMauNPDg6U3TDxWS5C80weQ7PJeeh7UOU +Lu1oPj5ye8e+M2OXe/kj0w7kaxa2y2G2cfyyDasPPphAArFaehx2zGL+ZVwvgfWSDYPpIbfErdxb +CbpIrOZveX45er5KH+WSjXYDU+Su0vxR5ZjYuEoCByba6VYMWct9kFhBhgQ7dvBzBiRXJCSSydQu +Lm4T8ZPpZE4rP79Pd46OYwoTBu39OxEvT4qpkPQVSHXD7f1ksfFRQLjK5FNkzcfsY/MCY7Avx5ge +gihq+NKd8SFL6iTmy2FN18KkNPPg+9p2UnSmzE3760nF41vhKskcTscqHzt4BEpW0unZg+3xYeA2 +PlI6oXZE3lET4zBZbhZZVlMAX/NZ4xFXbKDgI1ZonKksDNtaA6EBp3LBelET8UwJduoJROvlOtXL +qZuMVsDgIvui/4kZna3UWWX7Ffc0jSkfQWK0n2DKSLo3S7W7RLfLQ7J/tv8zy+vSH1zMvvU10JBa +64FmXPlBsVVNxCs3Y+Xp3AUcqyfMcIUK+t0+QUQNt+OtyvsNCNtaz1yaUrmYTGdyXy9YUT7seDHF +xN3D0Yib7Hr8h1eCJ3Swd4cp9BnPTkY6nGXUn+CDC0/wZ3iND04wwb7pCV4+nHn2f7ZHsC+XLyYX +J70RtroJhqkzqxphq5tgcF5WNsJWN8HURJCVjLDVTTDtoodVjLDVTTDislnRCFvdBMOSjFWNsNVN +MCUpfzUjbHUTzOVdNMK0mljiifZXR6TqoZ87zDVZs0Kv2AbG4rezTMszDOIZaiTuKue1XFYqtZRy +39zsURv3PEw+5KoU3UrcbS5ZnmyVcZObWPNxrBTKGzKq2qXXWXrdrVVaHGoXmL71Vpm8ZANjfnfG +wpZngiUcM8Eau0ZbbHnWG36is7Q0E+yOIhNMS2jzTHzj5ZlgzPlzMKxFkpalCk7rxR/TSkHuO2e9 +2a50a+v45HTpSm/nPnW5NOuNyR5eZx1W2tqKHNiuVNt9ZRmpg0untMiz3TNjcdjJaSATDouPxGhQ +5JlS/aA+uCfSjhTkaPJOed7bAuMk86Vkus1y2fb53fgTO59e92Wwqy4i4bieJ2d61+VV3gbl9gvs +pdhuLlnqjWcxpQZ7+tpmQOa8jlDNO8/6b8/HimoL6ucNBu5bWAHYIlFivZgJU+7ec8kn1gPyI/WK +7lq9sH2+NsY+2sy1S7TRZhJrNiVOhUNrRZtfLpcHwNHe/2XGCgVIJPBgCMlerRnsXxLqrwZBVm48 +L6+2dXpuymExpM44pUYZP1JtMPvSy/PyDGlAq+TldW9WT3UgsnJZvgdGnH6dFApr2VwWFl6BPbYC +yeWlShb8ZQ6P8ZpCI1Cx4mTt/MVFkDBM+/vEorvBcna0/OwvMKQ12ZHp7L+8U1C/He2/2uaqkQJp +Mu062WpW59wqVw3k/m+z1Shy1VAik1yamC/4RzKyydGb7f5qRFW3T9SiSP/dlECZJ6kW8fasS1R2 +qU/vZkq1Wsvq+dPvS9M1HdOybaFtLMv/ah6YBjWnmD/ZDfvxG8wCT16WXLrmcU2Y8pXNa+ktT5dH +dvxjMWwSTbysDReoPitrsR8W7Zd31SF06x0ky4+eSYp7v/wislmpNrlKH7wSp/l83cmLfrOBegH6 +8rsNfn2zAWDM+W6DX99soAbpl99t8OubDVxeirsNAr+92YAU4TvdbfDrmw3UhLbldxv8+mYDl5fi +boNf32wANOZ8t8GvbzZweSnuNvj1zQbouXK82yDw25sNMC7meLfBr282wFJMx7sNAr+92QB23/lu +g1/fbABrcbrbAAxgh/sFHC81QHt/tQsVVptUuc9gVh6/eKPBBu8zUEvKrW402OB9Bvq1OAs3GgQ2 +d58BXryl3mhgIVoNlZsF081B0jDIjVPfmb3PmTC6RWob5fZ9/g7AkL4HWVHdJnC5lExV9Au9zF8K +EM+cN47u9J7Yj/jopGQ5+L1DHEuGywO2qsJl9rHpbRNXMuxVXxV0IPck5YqfWUq47+ygs1XcnaVN +vM2c5kRg9vQwgybU78d6W1LknzvJSJNrq36B0vM2iWjgqVRiGiUmt783muphDxQE7yAIvv2pXmC3 +qgyWPxmWofMgljn/+jnjMqGngDGW0mxfZAPj7G7685kPJpnjaZQQl8ur31iAQraRhR0ZAPqDUzWO +fFS8IUEYY1TiOBuaRSXUT3ZwwZEHyed7vp93ti/aB8qUKvGr3e/qLBSSnt3Nu6uFQuDgoslBrihY +JIHPJ4Z9ufxMRfziyJgRQfJFMOuWI/EJvK/sKdPKPuwBEvQ06fte7r0w4MFw2/pMdfKJseoO1Or9 +UUDf4+5Xoe00DIpKqJ3zfUivWP5fx5i4d7hvOGiRA7meaX1dHDKRev4ED1Ioze0cvWfC0/EDSJ/K +VHvABJOV7G5HzWzeO+NzvnxSVyH2E7HsAXDQVP1E0S0vSbRBi2Tc1xOVG6mMmaEldX+1AIia4Y4R +R/2GgMF/H7viQEbnLPuW7TeNuWQurxdayq3JdIgdIm+pVrvTL9T+aY1crFv5j4H/WDfnjspuLhLB +fxg3D/8v1F2+xqA7GI397kLf5X07SI4mmU5j0hn0a6N/3DFsergs3J5n3DH3rGvc7QNImDfoDE/8 +mLz2BtC9uRh3Ev7/8LdrfwpzZ+D3axcTZjg+4mbCLCcL8E+EkSWY+tvFqIDBC//AHxfwyxc0/e0W +3JfupxfG3cSxblwCK4R5GcAWInyYkeDtntIWjUKTFGZFRnRjQ1SGhQnRaDgiwUwCy4Yl8prEhwWZ +4dxpl8AIAI0IDyUAxM3LXDjKiCym74UlkHxuXpLDgihIbkFkw5gCBC/xUT4s8xzMIQphjmOjbj4i +hAWOg8lEeCREeTfPywCaQF7jZFguvMaL4QjHRsjgcoQX3TwnhMWIDFBH5TDLsvAaQC1HRAXGKBPF +11gmLIk8QBAVwxLDYCc2zETgF5wtKokiaYmwLC6fA0AkjrzHwioFVmljYd2kJRpRWxgYkrREohHS +wsusSN7jw1wEloC4EWVWgLXwAGaUcwOCw7LMwS+48IgIA0RkpQXekyPhKC/xSi+JgUHZCKBHgl8Y +QIYgSWRT+EhUIDsHC5ZwC8jOMazSxghKJwkXjNsr46YubHja9QETQn+YXMGxBLvWI22wgIjSJsJa +sUXgcBBsEQSlJSLwSgP8z91wKZ0krRMfdSsDCbOBRPfidA0AggGiBsTBS6zyROQEAgduiCiSpoiE +hAQtUVmQlRYetxGIjYmyCiCw3wIBZLEXjiSpI0UlZaS56RCO/Vvrw0pOoXb4wiyMzA== + + + IPBw1sNSVMLjx8Ay4fBxoFlGOaQlwDEflWRcBeCdY4AKeUEGJCBa4HiJER7pmwHqwpPCSHBSgKp5 +IBegdDwgAg/HgQFUzdoKpC0aZZR+oN5ESFtEwSTPiGExipvEc2FJ4pAykT/g8YWJGFw/0iXP424J +XAQQF4XXWJhbJCQjKQTCs3Bco4h3eJ8nYEELJ/HaYQfCBrA4EagPVyHKYZ6JwuBwklgBtrvqQtqO +EMKOIow8TAa/8BKLrUDRPJwVNxx2RAgH/Tl8EoFfkUphRs7NCZEwnGGBkIyMZMVxeKwFmCfKAb9D +YIBvhCWYi8DAsTATxwHIwK2gJRoWETwOliUzEraIsE+AKGA2wEMAoQilIMEpbbhYOHiiRHYJUCVE +ZDcL7AQISybwwiRzLSpXSLv0Njie5GQADAycDQ4OmKmN4QSln8wqsDLALqMRmBMQIUUA8xwTBUaJ +x59H/gHUzOGGMQJH4OJkgKLhQvgJqQMWYbGMRFCj8KIIo5x2DqkCuQ3wpGiEENQicRacaL6QUoQf +iEIi+kKhtYThZNBr1CZUwlDrSiUMiSB0t1eQeVGNBQq6zIuqMk/WZF5ElXkozRSZx2kyT9RlXkST +eTyReYwm83hN5kU1mcfrMo/VZJ64IPMiZpnHW8g8XpN5vCrzJE6Tebwm80RN5gGlqTJPVmUesBmT +zIOWBZkHbSaZhy3zMg9bFmQeYy/zhAWZJ1rIPEGTeZIq81hGk3lRTeYJusyLajJPUGVeVJN5gibz +zBuuyDxWE0K8LvNYTebxmsxjNZnHazKPVWUer8s8VpN5vCbzWE3m8ZrMM083k3mSrAkhXpN50KTK +PF6VedCiSjNek2aMJvP4mcxb7EVGktSRiMwzT4dwIHELMuKMCYtAKeRI8ApDR/TLEYmwYCaCHB4o +CTghS/YxCoyHsHxRIrsv4mmRCOETKQBDANkCBxeEqCInkZNGeZacLAGJFV8DkmR5RCD8AhySMEMg +OlwdSC+ZQTICBHKIUiAaEJ4CvofgImkRlVKAo4AaUwQXIIiEJHG/kGgiynuyQtx4bkVCLNBL5nBX +NNkrgFgBquHIsiMRWSRwskyUSGNAU1RAARVl8OiwbgVxiE0CCse7F1CZduKvU3K2EYG8DP/KcHh6 +5NzKHApWra1gbOPIlhQMby62zN77mDXCsQ3LUZCehglmbQVjG6yPFwTDeJZNszfxPAE9inxkBgqS +kKjqBDPoDE36svQ3rdq0Vw1TzGAxzGGAz9CmL01/16pt9u4HbgfsuETYAHBYVuIJa4jgaRH1poJC +fUwkMtfGAwELeAIt20D3kGUydQQYRASp2dgGS5WRunhU6YncRtUZGR7IA4kTUFSwirAXBGQ/ArIR +hANoH4hRAJYbxbMCSiacF2xRtSzQhsKiGNUb4DXUcfA8651gX4Fjw2t8FMSOzJOWqERAEhXJogii +qBTR2mSi2oFKysC5I2/KyIyUNo5lUO+UUF7gaHjM4QVBANYuskaw1AZlNaAyCoZOEdT0WMJBQNuV +CVok5ABkwShj8DUQpiIyOgHPLbK+CAhTCTkPoJOXREXOwmAGpKM0jhJJqTaR/cLtZ/Dko/rECgo3 +4ySJJfsQAWUayBKMYxaPu9aCImzWBlwQeQiOBaQYlWW9DWQTTITyiVdsDpwO6JHVQUgrVpQEG2Ak +D2xTCVCWOA3QOTolupxiovCgFER5lKPA2qISCKqe0oaESJoiZAxg5qh5ALeXJNRCo7AIGeUbil8B +dWHoIQqMYWbEGlgZojxP5lFgqjzqOmAnSBLuN/RiCC9EWxwsFTJ6RJYUoSICTnAs2GdgOpLephyt +KIeUgnZTBAWKonQocImipFDB3IlMW59INLhA8qmWTZTQHEgunqwZ9CeOaNDA9QRiXcvAEQhUAop5 +BVeirFC0iDJc5MnuE9JWDrLEsaoNilZVgfAK2DhJkb6oguC7qABGFH4eYSKyijGOVfuBbCNNomrb +oZohs4Sjo56IG4jTMqgN4NaDwBNV8ECdB4YqabIJNxctzDuVBiReaSPDkhY8FKQFjaYFOklrigmA +LEWJwQ1oifJEakTQRANyB8qAHZIi2sZzgtrEaaudf1W1Mm5dstvndz/cu5ZJRK0Ph4pVhKiAcGii +HApGMKlQj5VUHQtW0HVxUcQpSm+wfjng5Ni28G4XQLCfkxMRUlRv0XCLAP5gLmAOIOUVNUqG0wHD +ossCSJNsBuEqXYtXHaYCWgazQVaEG2jvOFUE7UtBUa4icNpgWCBB0CZEhf3wUVzB4qvLp0IHGyIB +2WOEiaJURnKKsGhBC7hvcIi7hAswHE6vyZfu4qsOM0mCIkN5kEwysapwBKJO88hIQVTgqBJaNsjE +gXEC5ZAm05sOExGjAfmliLiAXcc1RZQTh2IRrG6ewI/ePpRT0I8YUV2Ldx3mQncZw0pEFBDeDHNx +ILPwBHBwGkEq4LCg0ooiylt4xrEcWejCq05TgeYqEi0BmJhEDhs6TDhUldHW59RhkVsSLhuBbZTJ +qsyvLp9J0WKRXDkZLVFclMAAGxNR7YU5QQ1EaJEfS0TX4HhFu+5avOswF4NMl0eGDxKDEYkvDHkC +4V3o5kEGDOPCwY2KaIKybDjKsjJpM7+7fC5V8KG4n3Nzwepwq2zcXBxrdnNxrIWbS1LdXGC8L7q5 +ZDRaoIlRLCvQQBn0I6C1CFsDz4jbDu0oBjUAaGPRVIA2dF2xqGihBSSJskpVHDrIOFSyZYJpURkL +IOTRT4WePEmUOGKBy+iDRGUClKYosbeiRNxBi4xuCvQIRlVvInE7RfQmlFUo/1nF18QSrzlxcxG5 +xqMfh7jQ0JeG+pQiHBUnEqpmcIyEKJxiOHthiZhbyAtZ0c0BouDoKwoFx0RY8hpOi2tDJicR4cYR +7xu6xMhxBV7LEZNZVjGM/jD8BRBEOBF6z2CkCApgVlaYUxQ9hRFeUxRgEjTUOaI/otNMa2kQlspw +6GDRezEKmnliVgLj5UBTg8MkkwWjcgrT8cAtRBRnuMXoSOOQIEgngB+1EHS+SRySmIiCNYLmKScg +USP5yKjqwUpA1spIh3iMiJwiXEIhSPTTRKNq2EB1jQqKaxTQBBhTXaOi5hrlFlyj7IJrFOYBjosi +JIKyBNaLvh5CKKCHMKiHKO5GpBiM4PACKuEcg5qbdkRBhSDvCSIwaWQGQjQCK4ZHgog8F6hRBnMD +34OHircJoBPRaObQlGAjCmcGUgYwQUkDBRNb0KJnRLKfwLii2AtMBOLcIr1ERlGcJVDHoQU1LZkl +DJUokQ0iNVEnBgg4Hl7n0HkUVZkzUfU5UMBFDq0HHmMVMiHfqKS4YdHyAWQAMmFfRRZ1woga2MGR +0Y0gYDhJIjhBB5PMysQw4XmwylAYK6cPNlpGjxi2sCKgXiAqJfH3gdmGDjTSiZFYluxcFIQPaYmi +3sfxsuo0gxYRthIxGVUIDJvIatHhSxyR8DqPh59DhiKyioEDFEe8wgxhqVGVj+PSgLMD61HCeBLL +oH8ZGST6LOAXYLKc+l6EHAwZNw5sKw4dh1FB8dezHJIOMk+Dnz1NfNBmP3tkwc8uWPjZuQU/u6h5 +1XnNzy7qPvWZn33WFtV96hHNzz7Xtuhn51H9jxBWSyw2JHJRwBYOYzLYMvOzEwPY7GfnzH52IAST +n52Z+dmB04DOAfwAqJwHBgK0gfChps6rMoSLomcN0QAnV0RhAu/JnGKdzNoKxjYeScDUJoaBAGA0 +9DAyRKRhZAnIEpQTVbrA+WAjxE7mkBGAugRtOABuGViRsEkCacHzzEWRVyBeAFCGJxYBgioJguIj +YDmF4cObPEGLwn70yAKrRBbSxrBX1Bz24qSFsBenh71ELezF6WEv0SLsFV0Ie0UWwl68Oeyl2DeE +wnlZIFSIZlhPDdDwircRaE5ws6CskOOD+8FEyYFCZiMpwWMiQ4AwgbEz6GuYtRWgDf2caCkAaxcx +ukDeRCUHcSZE8HDAoMSYAP01wiiEg5FscoCA3eHZQk4gS0TWgcxB1zOHngMGhS0GDnji58eRMPSA +yFdpGTkB8E0SH4oi3zGv1zHaaRX58RZr7VZlVOt0WyNXe1z7q+Wu9fuDSW3SGsITd3vUGk8Go5Z7 +/Dn4G1vgFa2715u9zrn+L1T7Dxc= + + </i:pgf> + <svg:text + xml:space="preserve" + style="font-size:13.03699398px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Nimbus Sans L;-inkscape-font-specification:Nimbus Sans L" + x="246.20877" + y="10.629581" + id="text2436" + sodipodi:linespacing="125%" + transform="scale(0.9830254,1.0172677)"><svg:tspan + sodipodi:role="line" + id="tspan2438" + x="246.20877" + y="10.629581">TM</svg:tspan></svg:text> +</svg:svg> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/model/BeerExpert.class b/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/model/BeerExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..06657650e946f81627a7c4eb363d7a834f7e4315 Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/model/BeerExpert.class differ diff --git a/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/web/BeerSelect.class b/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/web/BeerSelect.class new file mode 100644 index 0000000000000000000000000000000000000000..765fd65509a9d926d96e31ab3a7e77b0bc02af7a Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/WEB-INF/classes/com/example/web/BeerSelect.class differ diff --git a/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.class b/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..06657650e946f81627a7c4eb363d7a834f7e4315 Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.class differ diff --git a/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.java b/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.java new file mode 100644 index 0000000000000000000000000000000000000000..6a46ddf2d7f9f2f5eec794b8386739af27faea7b --- /dev/null +++ b/src/tomcat/webapps/Trawl-Site/bin/com/example/model/BeerExpert.java @@ -0,0 +1,22 @@ +package com.example.model; +import java.util.*; +public class BeerExpert { + +public List getBrands(String color) { + List brands = new ArrayList(); + if (color.equals("amber")) { + brands.add("Jack Amber"); + brands.add("Red Moose"); + } + else { + brands.add("Jail Pale Ale"); + brands.add("Gout Stout"); + } + return brands; + } +} + +// public static void main(String[]args){ +// String color = "amber"; +// System.out.println(brand.get(0)); +// } \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.class b/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.class new file mode 100644 index 0000000000000000000000000000000000000000..765fd65509a9d926d96e31ab3a7e77b0bc02af7a Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.class differ diff --git a/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.java b/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.java new file mode 100644 index 0000000000000000000000000000000000000000..3f17b9704a4a0d3a4f7961c1c35a0061f5fb9a4d --- /dev/null +++ b/src/tomcat/webapps/Trawl-Site/bin/com/example/web/BeerSelect.java @@ -0,0 +1,22 @@ +package com.example.web; + +import javax.servlet.*; +import javax.servlet.http.*; +import java.io.*; +import java.util.*; +//import com.example.model.BeerExpert; // notice this +import com.example.model.*; // notice this + + +public class BeerSelect extends HttpServlet { + public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { + String c = request.getParameter("color"); + + BeerExpert be = new BeerExpert(); + List result = be.getBrands(c); + + request.setAttribute("styles", result); + RequestDispatcher view = request.getRequestDispatcher("result.jsp"); + view.forward(request, response); + } +} \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl-Site/index.html b/src/tomcat/webapps/Trawl-Site/index.html new file mode 100644 index 0000000000000000000000000000000000000000..64631c56320e00c00551ac2b760943f929ce7013 --- /dev/null +++ b/src/tomcat/webapps/Trawl-Site/index.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="keywords" content="css image, css image effects, css filter, preview, css image filter"> + <meta name="description" content="Preview Images under CSS Filters"> + <title>TrawlExpert</title> + <link rel="stylesheet" type="text/css" href="style.css"> + <script src="script.js"></script> + + <!--Fonts--> + <!--Open Sans Rg-400/Semi-600/Bd-700--> + <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,600,700" rel="stylesheet"> + + <!--Plugins--> + <link href="color-picker.css" rel="stylesheet"> + <script src="color-picker.js"></script> +</head> + +<body> + <section> + <header> + <a href="form.html" >Beer Selection Page</a> + </header> + <span id="infoLinks"> + <a href="about.html">About</a> | + <!--<a href="https://github.com/Ar1sD/CSS-Filter-Preview-Generator" target="_blank">Github</a>--> + </span> + + <form method="POST" action="SelectBeer.do"> + Select beer characteristics:<p> + Color: + <select name="color" size="1"> + <option>light</option> + <option>amber</option> + <option>brown</option> + <option>dark</option> + </select> + <br> + <br> + + <input type="SUBMIT"> + </form> + + </section> + <footer> + Some Footer + </footer> +</body> +</html> + +<!--TODO Add mouse wheel scroll to input boxes--> +<!--TODO Convert inline event handlers to external--> + +<!--Resources--> +<!--Color Wheel | https://github.com/tovic/color-picker--> +<!--Colour Wheel Image | https://commons.wikimedia.org/wiki/File:Blended_colour_wheel.svg--> +<!--Default Image | unsplash.com/?photo=tvPvROBv0F4--> diff --git a/src/tomcat/webapps/Trawl-Site/result.jsp b/src/tomcat/webapps/Trawl-Site/result.jsp new file mode 100644 index 0000000000000000000000000000000000000000..f3e19c7b43e10a536669b438a57eecb7acab22c7 --- /dev/null +++ b/src/tomcat/webapps/Trawl-Site/result.jsp @@ -0,0 +1,15 @@ +<%@ page import="java.util.*" %> +<html> +<body> +<h1 align="center">Beer Recommendations JSP</h1> +<p> + +<% + List styles = (List)request.getAttribute("styles"); + Iterator it = styles.iterator(); + while (it.hasNext()) { + out.print("<br>TRY: " + it.next()); + } +%> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl-Site/src/com/example/model/BeerExpert.class b/src/tomcat/webapps/Trawl-Site/src/com/example/model/BeerExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..06657650e946f81627a7c4eb363d7a834f7e4315 Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/src/com/example/model/BeerExpert.class differ diff --git a/src/tomcat/webapps/Trawl-Site/src/com/example/web/BeerSelect.class b/src/tomcat/webapps/Trawl-Site/src/com/example/web/BeerSelect.class new file mode 100644 index 0000000000000000000000000000000000000000..765fd65509a9d926d96e31ab3a7e77b0bc02af7a Binary files /dev/null and b/src/tomcat/webapps/Trawl-Site/src/com/example/web/BeerSelect.class differ diff --git a/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/model/TrawlExpert.class b/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/model/TrawlExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..fd2ca5f7c13acd34bcc00d3c13dabca2700ec50b Binary files /dev/null and b/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/model/TrawlExpert.class differ diff --git a/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/web/Director.class b/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/web/Director.class new file mode 100644 index 0000000000000000000000000000000000000000..cec1b7f628df0a3e53cbefd58fcc6e6d29603faa Binary files /dev/null and b/src/tomcat/webapps/Trawl/WEB-INF/classes/com/example/web/Director.class differ diff --git a/src/tomcat/webapps/Trawl/WEB-INF/web.xml b/src/tomcat/webapps/Trawl/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c0e13219f2a069b4cee7c7bd9d22bd501ac1fb7 --- /dev/null +++ b/src/tomcat/webapps/Trawl/WEB-INF/web.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<web-app xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" + version="2.4"> + + <servlet> + <servlet-name>Trawl</servlet-name> + <servlet-class> + com.example.web.Director + </servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>Trawl</servlet-name> + <url-pattern>/callServlet.do</url-pattern> + </servlet-mapping> +</web-app> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.class b/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..fd2ca5f7c13acd34bcc00d3c13dabca2700ec50b Binary files /dev/null and b/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.class differ diff --git a/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.java b/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.java new file mode 100644 index 0000000000000000000000000000000000000000..1a9337aca686cafb15bb67bd3845772c00bb83c7 --- /dev/null +++ b/src/tomcat/webapps/Trawl/bin/com/example/model/TrawlExpert.java @@ -0,0 +1,23 @@ +package com.example.model; +import java.util.*; +public class TrawlExpert { + +public List getBrands(String phylum) { + List brands = new ArrayList(); + if (phylum.equals("Arthropoda")) { + brands.add("Some arthropoda data"); + brands.add("Some more Arthropoda data"); + } + else { + brands.add("This aint arthropoda"); + brands.add("Under construction"); + } + return brands; + } +} + +// For Testing on Java's Console +// public static void main(String[]args){ +// String color = "amber"; +// System.out.println(brand.get(0)); +// } \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/bin/com/example/web/Director.class b/src/tomcat/webapps/Trawl/bin/com/example/web/Director.class new file mode 100644 index 0000000000000000000000000000000000000000..cec1b7f628df0a3e53cbefd58fcc6e6d29603faa Binary files /dev/null and b/src/tomcat/webapps/Trawl/bin/com/example/web/Director.class differ diff --git a/src/tomcat/webapps/Trawl/bin/com/example/web/Director.java b/src/tomcat/webapps/Trawl/bin/com/example/web/Director.java new file mode 100644 index 0000000000000000000000000000000000000000..e9474b8af604cc4c31828dd7a093249bfe9b99a8 --- /dev/null +++ b/src/tomcat/webapps/Trawl/bin/com/example/web/Director.java @@ -0,0 +1,22 @@ +package com.example.web; + +import javax.servlet.*; +import javax.servlet.http.*; +import java.io.*; +import java.util.*; +//import com.example.model.TrawlExpert; // notice this +import com.example.model.*; // notice this + + +public class Director extends HttpServlet { + public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { + String c = request.getParameter("phylum"); + + TrawlExpert t = new TrawlExpert(); + List result = t.getBrands(c); + + request.setAttribute("styles", result); + RequestDispatcher view = request.getRequestDispatcher("result.jsp"); + view.forward(request, response); + } +} \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/handles.html b/src/tomcat/webapps/Trawl/handles.html new file mode 100644 index 0000000000000000000000000000000000000000..9b1e515ca31f8f426c9e863ad86f577f5e2a2684 --- /dev/null +++ b/src/tomcat/webapps/Trawl/handles.html @@ -0,0 +1,38 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> + <!--<link rel="stylesheet" href="/resources/demos/style.css">--> + <script src="https://code.jquery.com/jquery-1.12.4.js"></script> + <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> + <script> + $( function() { + $( "#slider-range" ).slider({ + range: true, + min: 0, + max: 500, + values: [ 75, 300 ], + slide: function( event, ui ) { + $( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] ); + } + }); + $( "#amount" ).val( "$" + $( "#slider-range" ).slider( "values", 0 ) + + " - $" + $( "#slider-range" ).slider( "values", 1 ) ); + } ); + </script> +</head> +<body> + +<p> + <label for="amount">Price range:</label> + <input type="text" id="amount" readonly style="border:0; color:#f6931f; font-weight:bold;"> +</p> + +<div id="slider-range"></div> + + +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/index.html b/src/tomcat/webapps/Trawl/index.html new file mode 100644 index 0000000000000000000000000000000000000000..c3cac77bb3bc87e0edf2a777cc9a70a7cf1612ef --- /dev/null +++ b/src/tomcat/webapps/Trawl/index.html @@ -0,0 +1,121 @@ +<!-- + +Double Handle Slider Modified from: http://jqueryui.com/slider/#range + +--> + +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="keywords" content="insert, some, keywords"> <!--TODO--> + <meta name="description" content="insert a description"> <!--TODO--> + <title>TrawlTool</title> + <link rel="stylesheet" type="text/css" href="style.css"> + + + <!--JQuery--> + <script src="https://code.jquery.com/jquery-1.12.4.js"></script> + <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> + <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> + + <!-- MUST load JQuery Library before loading this--> + <script src="script.js"></script> + <!--Fonts--> + <!--Open Sans Rg-400/Semi-600/Bd-700--> + <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet"> + + <!--Plugins--> +</head> + +<body> + <header> + <a href="index.html" >TrawlTool</a> + </header> + + <span id="menu-bar"> + <a href="index.html">Non functional Menu Item 1</a> | + <a href="index.html" target="_blank">Item 2</a> + </span> + + <section id="options"> + <section id="nameDropdownIn"> + <form method="POST" action="callServlet.do"> <!--.do extension is not necessary. This field is the servlet's url in web.xml--> + Phylum: + <select name="phylum" size="1"> + <option>Arthropoda</option> + <option>Chordata</option> + <option>Mollusca</option> + </select> + <input type="SUBMIT"> + </form> + + <form> + Class: + <select name="phylum" size="1"> + </select> + <!--<input type="SUBMIT">--> + </form> + + <form> + Order: + <select name="phylum" size="1"> + </select> + <!--<input type="SUBMIT">--> + </form> + + <form> + Family: + <select name="phylum" size="1"> + </select> + <!--<input type="SUBMIT">--> + </form> + + <form> + Genus: + <select name="phylum" size="1"> + </select> + <!--<input type="SUBMIT">--> + </form> + + <form> + Scientific Name: + <select name="phylum" size="1"> + + </select> + <!--<input type="SUBMIT">--> + </form> + </section> + + <section id="yearIn"> + Year Range: + <span id="fromtoYear">InnerHtml</span> + <form> + <!--<input type="number" id="fromYear" class="yearN" value="2000" min="1960" max="2016" oninput="brightN()">--> + <div id="slider-range"></div> + </form> + </section> + + <section id="outputIn"> + <form> + <!--TODO: Set Default button entered--> + <input type="radio" name="gender" value="male"> Map + <input type="radio" name="gender" value="female"> Histogram + <input type="submit"> + </form> + <form> + <input type="submit" value="Individual Records"> <!--To records.html--> + </form> + </section> + </section> + + <section id="outputWrapper"> + <section id="outputDetails">Stuff like population count, entries found, etc. go here</section> + <section id="outputBox">Map, Histogram Box</section> + </section> + <footer> + Footer + </footer> +</body> +</html> diff --git a/src/tomcat/webapps/Trawl/jquery-3.3.1.slim.min.js b/src/tomcat/webapps/Trawl/jquery-3.3.1.slim.min.js new file mode 100644 index 0000000000000000000000000000000000000000..5924f050a64ee52c715d67a155b2984a60e49c63 --- /dev/null +++ b/src/tomcat/webapps/Trawl/jquery-3.3.1.slim.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,u=n.push,s=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,d=f.toString,p=d.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},v=function e(t){return null!=t&&t===t.window},y={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in y)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function b(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var x="3.3.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",w=function(e,t){return new w.fn.init(e,t)},C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:x,constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},u=1,s=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[u]||{},u++),"object"==typeof a||g(a)||(a={}),u===s&&(a=this,u--);u<s;u++)if(null!=(e=arguments[u]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+(x+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&d.call(n)===p)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(T(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(T(Object(e))?w.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:s.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,u=!n;o<a;o++)(r=!t(e[o],o))!==u&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,u=[];if(T(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&u.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&u.push(i);return a.apply([],u)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function T(e){var t=!!e&&"length"in e&&e.length,n=b(e);return!g(e)&&!v(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,u,s,l,c,f,d,p,h,g,v,y,m,b,x="sizzle"+1*new Date,w=e.document,C=0,T=0,E=ae(),N=ae(),k=ae(),A=function(e,t){return e===t&&(f=!0),0},D={}.hasOwnProperty,S=[],L=S.pop,j=S.push,q=S.push,O=S.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},H="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",I="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",B="\\["+I+"*("+R+")(?:"+I+"*([*^$|!~]?=)"+I+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+I+"*\\]",M=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+B+")*)|.*)\\)|)",W=new RegExp(I+"+","g"),$=new RegExp("^"+I+"+|((?:^|[^\\\\])(?:\\\\.)*)"+I+"+$","g"),F=new RegExp("^"+I+"*,"+I+"*"),z=new RegExp("^"+I+"*([>+~]|"+I+")"+I+"*"),_=new RegExp("="+I+"*([^\\]'\"]*?)"+I+"*\\]","g"),U=new RegExp(M),V=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+I+"*(even|odd|(([+-]|)(\\d*)n|)"+I+"*(?:([+-]|)"+I+"*(\\d+)|))"+I+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+I+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+I+"*((?:-\\d)?\\d*)"+I+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,G=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+I+"?|("+I+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){d()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{q.apply(S=O.call(w.childNodes),w.childNodes),S[w.childNodes.length].nodeType}catch(e){q={apply:S.length?function(e,t){j.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,u,l,c,f,h,y,m=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!i&&((t?t.ownerDocument||t:w)!==p&&d(t),t=t||p,g)){if(11!==C&&(f=K.exec(e)))if(o=f[1]){if(9===C){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&b(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return q.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return q.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!k[e+" "]&&(!v||!v.test(e))){if(1!==C)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=x),u=(h=a(e)).length;while(u--)h[u]="#"+c+" "+ye(h[u]);y=h.join(","),m=J.test(e)&&ge(t.parentNode)||t}if(y)try{return q.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===x&&t.removeAttribute("id")}}}return s(e.replace($,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ue(e){return e[x]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function de(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ue(function(t){return t=+t,ue(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},d=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==p&&9===a.nodeType&&a.documentElement?(p=a,h=p.documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=G.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=x,!p.getElementsByName||!p.getElementsByName(x).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=G.test(p.querySelectorAll))&&(se(function(e){h.appendChild(e).innerHTML="<a id='"+x+"'></a><select id='"+x+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+I+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+I+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+x+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+x+"+*").length||v.push(".#.+[+~]")}),se(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+I+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=G.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",M)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=G.test(h.compareDocumentPosition),b=t||G.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===w&&b(w,e)?-1:t===p||t.ownerDocument===w&&b(w,t)?1:c?P(c,e)-P(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===p?-1:t===p?1:i?-1:o?1:c?P(c,e)-P(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)u.unshift(n);while(a[r]===u[r])r++;return r?ce(a[r],u[r]):a[r]===w?-1:u[r]===w?1:0},p):p},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&d(e),t=t.replace(_,"='$1']"),n.matchesSelector&&g&&!k[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,p,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==p&&d(e),b(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==p&&d(e);var i=r.attrHandle[t.toLowerCase()],o=i&&D.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(A),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:ue,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+I+")"+e+"("+I+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(W," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),u="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,s){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=u&&t.nodeName.toLowerCase(),m=!s&&!u,b=!1;if(v){if(o){while(g){d=t;while(d=d[g])if(u?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){b=(p=(l=(c=(f=(d=v)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1])&&l[2],d=p&&v.childNodes[p];while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if(1===d.nodeType&&++b&&d===t){c[e]=[C,p,b];break}}else if(m&&(b=p=(l=(c=(f=(d=t)[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]||[])[0]===C&&l[1]),!1===b)while(d=++p&&d&&d[g]||(b=p=0)||h.pop())if((u?d.nodeName.toLowerCase()===y:1===d.nodeType)&&++b&&(m&&((c=(f=d[x]||(d[x]={}))[d.uniqueID]||(f[d.uniqueID]={}))[e]=[C,b]),d===t))break;return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[x]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ue(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=P(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ue(function(e){var t=[],n=[],r=u(e.replace($,"$1"));return r[x]?ue(function(e,t,n,i){var o,a=r(e,null,i,[]),u=e.length;while(u--)(o=a[u])&&(e[u]=!(t[u]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ue(function(e){return function(t){return oe(e,t).length>0}}),contains:ue(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:ue(function(e){return V.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=de(t);function ve(){}ve.prototype=r.filters=r.pseudos,r.setFilters=new ve,a=oe.tokenize=function(e,t){var n,i,o,a,u,s,l,c=N[e+" "];if(c)return t?0:c.slice(0);u=e,s=[],l=r.preFilter;while(u){n&&!(i=F.exec(u))||(i&&(u=u.slice(i[0].length)||u),s.push(o=[])),n=!1,(i=z.exec(u))&&(n=i.shift(),o.push({value:n,type:i[0].replace($," ")}),u=u.slice(n.length));for(a in r.filter)!(i=X[a].exec(u))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),u=u.slice(n.length));if(!n)break}return t?u.length:u?oe.error(e):N(e,s).slice(0)};function ye(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,u=T++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,s){var l,c,f,d=[C,u];if(s){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[x]||(t[x]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===C&&l[1]===u)return d[2]=l[2];if(c[o]=d,d[2]=e(t,n,s))return!0}return!1}}function be(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xe(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],u=0,s=e.length,l=null!=t;u<s;u++)(o=e[u])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(u)));return a}function Ce(e,t,n,r,i,o){return r&&!r[x]&&(r=Ce(r)),i&&!i[x]&&(i=Ce(i,o)),ue(function(o,a,u,s){var l,c,f,d=[],p=[],h=a.length,g=o||xe(t||"*",u.nodeType?[u]:u,[]),v=!e||!o&&t?g:we(g,d,e,u,s),y=n?i||(o?e:h||r)?[]:a:v;if(n&&n(v,y,u,s),r){l=we(y,p),r(l,[],u,s),c=l.length;while(c--)(f=l[c])&&(y[p[c]]=!(v[p[c]]=f))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(f=y[c])&&l.push(v[c]=f);i(null,y=[],l,s)}c=y.length;while(c--)(f=y[c])&&(l=i?P(o,f):d[c])>-1&&(o[l]=!(a[l]=f))}}else y=we(y===a?y.splice(h,y.length):y),i?i(null,a,y,s):q.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],u=a||r.relative[" "],s=a?1:0,c=me(function(e){return e===t},u,!0),f=me(function(e){return P(t,e)>-1},u,!0),d=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];s<o;s++)if(n=r.relative[e[s].type])d=[me(be(d),n)];else{if((n=r.filter[e[s].type].apply(null,e[s].matches))[x]){for(i=++s;i<o;i++)if(r.relative[e[i].type])break;return Ce(s>1&&be(d),s>1&&ye(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),n,s<i&&Te(e.slice(s,i)),i<o&&Te(e=e.slice(i)),i<o&&ye(e))}d.push(n)}return be(d)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,u,s,c){var f,h,v,y=0,m="0",b=o&&[],x=[],w=l,T=o||i&&r.find.TAG("*",c),E=C+=null==w?1:Math.random()||.1,N=T.length;for(c&&(l=a===p||a||c);m!==N&&null!=(f=T[m]);m++){if(i&&f){h=0,a||f.ownerDocument===p||(d(f),u=!g);while(v=e[h++])if(v(f,a||p,u)){s.push(f);break}c&&(C=E)}n&&((f=!v&&f)&&y--,o&&b.push(f))}if(y+=m,n&&m!==y){h=0;while(v=t[h++])v(b,x,a,u);if(o){if(y>0)while(m--)b[m]||x[m]||(x[m]=L.call(s));x=we(x)}q.apply(s,x),c&&!o&&x.length>0&&y+t.length>1&&oe.uniqueSort(s)}return c&&(C=E,l=w),b};return n?ue(o):o}return u=oe.compile=function(e,t){var n,r=[],i=[],o=k[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Te(t[n]))[x]?r.push(o):i.push(o);(o=k(e,Ee(i,r))).selector=e}return o},s=oe.select=function(e,t,n,i){var o,s,l,c,f,d="function"==typeof e&&e,p=!i&&a(e=d.selector||e);if(n=n||[],1===p.length){if((s=p[0]=p[0].slice(0)).length>2&&"ID"===(l=s[0]).type&&9===t.nodeType&&g&&r.relative[s[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;d&&(t=t.parentNode),e=e.slice(s.shift().value.length)}o=X.needsContext.test(e)?0:s.length;while(o--){if(l=s[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),J.test(s[0].type)&&ge(t.parentNode)||t))){if(s.splice(o,1),!(e=i.length&&ye(s)))return q.apply(n,i),n;break}}}return(d||u(e,p))(i,t,!g,n,!t||J.test(e)&&ge(t.parentNode)||t),n},n.sortStable=x.split("").sort(A).join("")===x,n.detectDuplicates=!!f,d(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||le(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var N=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},k=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=w.expr.match.needsContext;function D(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var S=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return s.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&A.test(e)?w(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:q.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),S.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,j=w(r);var O=/^(?:parents|prev(?:Until|All))/,P={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!A.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(w(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function H(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return N(e,"parentNode")},parentsUntil:function(e,t,n){return N(e,"parentNode",n)},next:function(e){return H(e,"nextSibling")},prev:function(e){return H(e,"previousSibling")},nextAll:function(e){return N(e,"nextSibling")},prevAll:function(e){return N(e,"previousSibling")},nextUntil:function(e,t,n){return N(e,"nextSibling",n)},prevUntil:function(e,t,n){return N(e,"previousSibling",n)},siblings:function(e){return k((e.parentNode||{}).firstChild,e)},children:function(e){return k(e.firstChild)},contents:function(e){return D(e,"iframe")?e.contentDocument:(D(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(P[e]||w.uniqueSort(i),O.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(I)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],u=-1,s=function(){for(i=i||e.once,r=t=!0;a.length;u=-1){n=a.shift();while(++u<o.length)!1===o[u].apply(n[0],n[1])&&e.stopOnFalse&&(u=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(u=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==b(r)&&t(r)})}(arguments),n&&!t&&s()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=u&&u--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||s()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function B(e){return e}function M(e){throw e}function W(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var u=this,s=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(u,s))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,B,i),a(o,n,M,i)):(o++,l.call(e,a(o,n,B,i),a(o,n,M,i),a(o,n,B,n.notifyWith))):(r!==B&&(u=void 0,s=[e]),(i||n.resolveWith)(u,s))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==M&&(u=void 0,s=[e]),n.rejectWith(u,s))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:B,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:B)),n[2][3].add(a(0,e,g(r)?r:M))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],u=t[5];i[t[1]]=a.add,u&&a.add(function(){r=u},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),u=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&(W(e,a.done(u(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)W(i[n],u(n),a.reject);return a.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&$.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function z(){r.removeEventListener("DOMContentLoaded",z),e.removeEventListener("load",z),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",z),e.addEventListener("load",z));var _=function(e,t,n,r,i,o,a){var u=0,s=e.length,l=null==n;if("object"===b(n)){i=!0;for(u in n)_(e,t,u,n[u],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;u<s;u++)t(e[u],n,a?r:r.call(e[u],u,t(e[u],n)));return i?e:l?t.call(e):s?t(e[0],n):o},U=/^-ms-/,V=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function Q(e){return e.replace(U,"ms-").replace(V,X)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=w.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[Q(t)]=n;else for(r in t)i[Q(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][Q(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(Q):(t=Q(t))in r?[t]:t.match(I)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var K=new G,J=new G,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}J.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return J.hasData(e)||K.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return K.access(e,t,n)},_removeData:function(e,t){K.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=J.get(o),1===o.nodeType&&!K.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=Q(r.slice(5)),ne(o,r,i[r]));K.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){J.set(this,e)}):_(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=J.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){J.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:w.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,u=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=K.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(u));return u(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function se(e,t,n,r){var i,o,a=20,u=r?function(){return r.cur()}:function(){return w.css(e,t,"")},s=u(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+s)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){s/=2,l=l||c[3],c=+s||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=u()/s||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+s||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=K.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",K.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var de=/^(?:checkbox|radio)$/i,pe=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?w.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)K.set(e[n],"globalEval",!t||K.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function be(e,t,n,r,i){for(var o,a,u,s,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p<h;p++)if((o=e[p])||0===o)if("object"===b(o))w.merge(d,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),u=(pe.exec(o)||["",""])[1].toLowerCase(),s=ge[u]||ge._default,a.innerHTML=s[1]+w.htmlPrefilter(o)+s[2],c=s[0];while(c--)a=a.lastChild;w.merge(d,a.childNodes),(a=f.firstChild).textContent=""}else d.push(t.createTextNode(o));f.textContent="",p=0;while(o=d[p++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=r.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ne(){return!1}function ke(){try{return r.activeElement}catch(e){}}function Ae(e,t,n,r,i,o){var a,u;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)Ae(e,u,n,r,t[u],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ne;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.get(e);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(xe,i),n.guid||(n.guid=w.guid++),(s=v.events)||(s=v.events={}),(a=v.handle)||(a=v.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;while(l--)p=g=(u=Te.exec(t[l])||[])[1],h=(u[2]||"").split(".").sort(),p&&(f=w.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=w.event.special[p]||{},c=w.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=s[p])||((d=s[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),w.event.global[p]=!0)}},remove:function(e,t,n,r,i){var o,a,u,s,l,c,f,d,p,h,g,v=K.hasData(e)&&K.get(e);if(v&&(s=v.events)){l=(t=(t||"").match(I)||[""]).length;while(l--)if(u=Te.exec(t[l])||[],p=g=u[1],h=(u[2]||"").split(".").sort(),p){f=w.event.special[p]||{},d=s[p=(r?f.delegateType:f.bindType)||p]||[],u=u[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;while(o--)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||u&&!u.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||w.removeEvent(e,p,v.handle),delete s[p])}else for(p in s)w.event.remove(e,p+t[l],n,r,!0);w.isEmptyObject(s)&&K.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,u,s=new Array(arguments.length),l=(K.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(s[0]=t,n=1;n<arguments.length;n++)s[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){u=w.event.handlers.call(this,t,l),n=0;while((o=u[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,s))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,u=[],s=t.delegateCount,l=e.target;if(s&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<s;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&u.push({elem:l,handlers:o})}return l=this,s<t.length&&u.push({elem:l,handlers:t.slice(s)}),u},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ke()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===ke()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&D(this,"input"))return this.click(),!1},_default:function(e){return D(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:Ne,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:Ne,isPropagationStopped:Ne,isImmediatePropagationStopped:Ne,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ne),this.each(function(){w.event.remove(this,e,n,t)})}});var De=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Se=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return D(e,"table")&&D(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function He(e,t){var n,r,i,o,a,u,s,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}J.hasData(e)&&(u=J.access(e),s=w.extend({},u),J.set(t,s))}}function Ie(e,t){var n=t.nodeName.toLowerCase();"input"===n&&de.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,u,s,l,c,f=0,d=e.length,p=d-1,v=t[0],y=g(v);if(y||d>1&&"string"==typeof v&&!h.checkClone&&Le.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),Re(o,t,n,r)});if(d&&(i=be(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(u=w.map(ve(i,"script"),Oe)).length;f<d;f++)l=i,f!==p&&(l=w.clone(l,!0,!0),s&&w.merge(u,ve(l,"script"))),n.call(e[f],l,f);if(s)for(c=u[u.length-1].ownerDocument,w.map(u,Pe),f=0;f<s;f++)l=u[f],he.test(l.type||"")&&!K.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(je,""),c,l))}return e}function Be(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ve(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(De,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,u=e.cloneNode(!0),s=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ve(u),r=0,i=(o=ve(e)).length;r<i;r++)Ie(o[r],a[r]);if(t)if(n)for(o=o||ve(e),a=a||ve(u),r=0,i=o.length;r<i;r++)He(o[r],a[r]);else He(e,u);return(a=ve(u,"script")).length>0&&ye(a,!s&&ve(e,"script")),u},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return _(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Se.test(e)&&!ge[(pe.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ve(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),u.apply(r,n.get());return this.pushStack(r)}});var Me=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),We=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},$e=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",xe.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,s=12===n(t.marginLeft),c.style.right="60%",u=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",xe.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,u,s,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),u},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),s},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,u=e.style;return(n=n||We(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&Me.test(a)&&$e.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var _e=/^(none|table(?!-c[ea]).+)/,Ue=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Xe={letterSpacing:"0",fontWeight:"400"},Qe=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Ge(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Ye)return e}function Ke(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Ge(e)||e),t}function Je(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,u=0,s=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(s+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(s-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(s-=w.css(e,"border"+oe[a]+"Width",!0,i))):(s+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?s+=w.css(e,"border"+oe[a]+"Width",!0,i):u+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(s+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-s-u-.5))),s}function et(e,t,n){var r=We(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(Me.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,u=Q(t),s=Ue.test(t),l=e.style;if(s||(t=Ke(u)),a=w.cssHooks[t]||w.cssHooks[u],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[u]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(s?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,u=Q(t);return Ue.test(t)||(t=Ke(u)),(a=w.cssHooks[t]||w.cssHooks[u])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Xe&&(i=Xe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!_e.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):ue(e,Ve,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=We(e),a="border-box"===w.css(e,"boxSizing",!1,o),u=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),u&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Je(e,n,u)}}}),w.cssHooks.marginLeft=ze(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Je)}),w.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=We(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}}),w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var tt,nt=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return _(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?tt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&D(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),tt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=nt[t]||w.find.attr;nt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=nt[a],nt[a]=i,i=null!=n(e,t,r)?a:null,nt[a]=o),i}});var rt=/^(?:input|select|textarea|button)$/i,it=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return _(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):rt.test(e.nodeName)||it.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function ot(e){return(e.match(I)||[]).join(" ")}function at(e){return e.getAttribute&&e.getAttribute("class")||""}function ut(e){return Array.isArray(e)?e:"string"==typeof e?e.match(I)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,at(this)))});if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},removeClass:function(e){var t,n,r,i,o,a,u,s=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,at(this)))});if(!arguments.length)return this.attr("class","");if((t=ut(e)).length)while(n=this[s++])if(i=at(n),r=1===n.nodeType&&" "+ot(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(u=ot(r))&&n.setAttribute("class",u)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,at(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=ut(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=at(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+ot(at(n))+" ").indexOf(t)>-1)return!0;return!1}});var st=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(st,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:ot(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,u=a?null:[],s=a?o+1:i.length;for(r=o<0?s:a?o:0;r<s;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!D(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;u.push(t)}return u},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var lt=/^(?:focusinfocus|focusoutblur)$/,ct=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,u,s,l,c,d,p,h,y=[i||r],m=f.call(t,"type")?t.type:t,b=f.call(t,"namespace")?t.namespace.split("."):[];if(u=h=s=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(b=m.split(".")).shift(),b.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=b.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),p=w.event.special[m]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!v(i)){for(l=p.delegateType||m,lt.test(l+m)||(u=u.parentNode);u;u=u.parentNode)y.push(u),s=u;s===(i.ownerDocument||r)&&y.push(s.defaultView||s.parentWindow||e)}a=0;while((u=y[a++])&&!t.isPropagationStopped())h=u,t.type=a>1?l:p.bindType||m,(d=(K.get(u,"events")||{})[t.type]&&K.get(u,"handle"))&&d.apply(u,n),(d=c&&u[c])&&d.apply&&Y(u)&&(t.result=d.apply(u,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(y.pop(),n)||!Y(i)||c&&g(i[m])&&!v(i)&&((s=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,ct),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,ct),w.event.triggered=void 0,s&&(i[c]=s)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var ft=/\[\]$/,dt=/\r?\n/g,pt=/^(?:submit|button|image|reset|file)$/i,ht=/^(?:input|select|textarea|keygen)/i;function gt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||ft.test(e)?r(e,i):gt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==b(t))r(e,t);else for(i in t)gt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)gt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&ht.test(this.nodeName)&&!pt.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(dt,"\r\n")}}):{name:t.name,value:n.replace(dt,"\r\n")}}).get()}}),w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=S.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=be([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.offset={setOffset:function(e,t,n){var r,i,o,a,u,s,l,c=w.css(e,"position"),f=w(e),d={};"static"===c&&(e.style.position="relative"),u=f.offset(),o=w.css(e,"top"),s=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+s).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(s)||0),g(t)&&(t=t.call(e,n,w.extend({},u))),null!=t.top&&(d.top=t.top-u.top+a),null!=t.left&&(d.left=t.left-u.left+i),"using"in t?t.using.call(e,d):f.css(d)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||xe})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return _(this,function(e,r,i){var o;if(v(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),Me.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),u=n||(!0===i||!0===o?"margin":"border");return _(this,function(t,n,i){var o;return v(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,u):w.style(t,n,i,u)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=D,w.isFunction=g,w.isWindow=v,w.camelCase=Q,w.type=b,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var vt=e.jQuery,yt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=yt),t&&e.jQuery===w&&(e.jQuery=vt),w},t||(e.jQuery=e.$=w),w}); \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/records.html b/src/tomcat/webapps/Trawl/records.html new file mode 100644 index 0000000000000000000000000000000000000000..7408ef399cb7fa4309233ee16b47d85b5e508793 --- /dev/null +++ b/src/tomcat/webapps/Trawl/records.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="keywords" content="insert, some, keywords"> <!--TODO--> + <meta name="description" content="Individual Records"> <!--TODO--> + <title>Record Entries</title> + <link rel="stylesheet" type="text/css" href="style-records.css"> + <!--<script src="script-records.js"></script>--> +</head> +<body> + <header> + <a href="records.html" >TrawlTool - Records of Results</a> + </header> + + <section id="recordsTable"> + Records A <br> + Records B <br> + Etc. <br> + id="recordsTable" <br> + </section> + +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/result.jsp b/src/tomcat/webapps/Trawl/result.jsp new file mode 100644 index 0000000000000000000000000000000000000000..b6db2621143bd3b60e23259b47e01c318ba5356e --- /dev/null +++ b/src/tomcat/webapps/Trawl/result.jsp @@ -0,0 +1,15 @@ +<%@ page import="java.util.*" %> +<html> +<body> +<h1 align="center">Trawl Results</h1> +<p> + +<% + List styles = (List)request.getAttribute("styles"); + Iterator it = styles.iterator(); + while (it.hasNext()) { + out.print("<br>TRY: " + it.next()); + } +%> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/script.js b/src/tomcat/webapps/Trawl/script.js new file mode 100644 index 0000000000000000000000000000000000000000..6aa5f6cfa23a3b1008042fae3c760e18e863f67b --- /dev/null +++ b/src/tomcat/webapps/Trawl/script.js @@ -0,0 +1,13 @@ +// For Range Slider +$( function() { + $( "#slider-range" ).slider({ + range: true, + min: 1960, + max: 2016, + values: [ 1960, 2016 ], + slide: function( event, ui ) { + $( "#fromtoYear" ).html(ui.values[ 0 ] + " - " + ui.values[ 1 ] ) + } + }); + $( "#fromtoYear" ).html($( "#slider-range" ).slider( "values", 0 ) + " - " + $( "#slider-range" ).slider( "values", 1 )) +} ); \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/src/com/example/model/BeerExpert.class b/src/tomcat/webapps/Trawl/src/com/example/model/BeerExpert.class new file mode 100644 index 0000000000000000000000000000000000000000..06657650e946f81627a7c4eb363d7a834f7e4315 Binary files /dev/null and b/src/tomcat/webapps/Trawl/src/com/example/model/BeerExpert.class differ diff --git a/src/tomcat/webapps/Trawl/src/com/example/web/BeerSelect.class b/src/tomcat/webapps/Trawl/src/com/example/web/BeerSelect.class new file mode 100644 index 0000000000000000000000000000000000000000..765fd65509a9d926d96e31ab3a7e77b0bc02af7a Binary files /dev/null and b/src/tomcat/webapps/Trawl/src/com/example/web/BeerSelect.class differ diff --git a/src/tomcat/webapps/Trawl/style-records.css b/src/tomcat/webapps/Trawl/style-records.css new file mode 100644 index 0000000000000000000000000000000000000000..c3ee7b95423d2af720c4e62672e72dbf07f39d11 --- /dev/null +++ b/src/tomcat/webapps/Trawl/style-records.css @@ -0,0 +1,23 @@ +* { + padding: 0; + margin: 0; + font-family: 'Open Sans', sans-serif; + font-weight: 400; + text-decoration: none; + +} + +header{ + font-size: 28px; + font-weight: 600; +} + +a{ + color: #00243c; + font-weight: 600; +} + +a:hover{ + font-weight: 700; + color: #004878; +} \ No newline at end of file diff --git a/src/tomcat/webapps/Trawl/style.css b/src/tomcat/webapps/Trawl/style.css new file mode 100644 index 0000000000000000000000000000000000000000..86f4e88d5816a3e42c066cd9c4eab0bca5aa1f82 --- /dev/null +++ b/src/tomcat/webapps/Trawl/style.css @@ -0,0 +1,68 @@ +* { + padding: 0; + margin: 0; + font-family: 'Open Sans', sans-serif; + font-weight: 400; + text-decoration: none; + +} + +header{ + font-size: 28px; + font-weight: 600; + } + +body{ + font-size: 16px; + color: #00365a; +} + +a{ + color: #00243c; + font-weight: 600; +} + +a:hover{ + font-weight: 700; + color: #004878; +} + +#options{ + border: 1px solid; +} + +#nameDropdownIn{ + border: 1px solid olivedrab; +} + +#yearIn{ + border: 1px solid sandybrown; +} + +.yearN{ + +} + +#outputIn{ + border: 1px solid blueviolet; +} + +#outputWrapper{ + border: 1px solid grey; +} + +#outputDetails{ + border: 1px solid saddlebrown; +} + +#outputBox{ + border: 1px solid darkred; +} + +/*300/400/600/700*/ +/*font-family: 'Open Sans', sans-serif;*/ + +/*Font colors*/ +/*http://www.color-hex.com/color/005b96*/ +/*#id*/ +/*.class*/ \ No newline at end of file diff --git a/src/tomcat/webapps/docs/BUILDING.txt b/src/tomcat/webapps/docs/BUILDING.txt new file mode 100644 index 0000000000000000000000000000000000000000..63e7ca3a819cf379fa8a02cdfecb0ddd8a516a69 --- /dev/null +++ b/src/tomcat/webapps/docs/BUILDING.txt @@ -0,0 +1,561 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + ==================================================== + Building The Apache Tomcat 9.0 Servlet/JSP Container + ==================================================== + +This subproject contains the source code for Tomcat 9.0, a container that +implements the Servlet 4.0, JSP 2.3, EL 3.0, WebSocket 1.1 and JASPIC 1.1 +specifications from the Java Community Process <http://www.jcp.org/>. + +Note: If you just need to run Apache Tomcat, it is not necessary to build +it. You may simply download a binary distribution. It is cross-platform. +Read RUNNING.txt for the instruction on how to run it. + +In order to build a binary distribution version of Apache Tomcat from a +source distribution, do the following: + + +(1) Download and Install a Java Development Kit + + 1. If the JDK is already installed, skip to (2). + + 2. Download a version 8 of Java Development Kit (JDK) release (use the + latest update available for your chosen version) from one of: + + http://www.oracle.com/technetwork/java/javase/downloads/index.html + http://openjdk.java.net/install/index.html + or another JDK vendor. + + Note regarding later versions of Java: + + As documented elsewhere, one of components in Apache Tomcat includes + a private copy of the Apache Commons DBCP library. + + The JDBC interfaces implemented by DBCP frequently change in non-backwards + compatible ways between versions of the Java SE specification. Therefore, + it is likely that DBCP will only compile with the specific version of Java + listed above and that compilation will fail if a later version of Java is + used. + + See Apache Commons DBCP project web site for more details on + available versions of the library and its requirements, + + http://commons.apache.org/dbcp/ + + 3. Install the JDK according to the instructions included with the release. + + 4. Set an environment variable JAVA_HOME to the pathname of the directory + into which you installed the JDK release. + + +(2) Install Apache Ant version 1.9.5 or later on your computer. + + 1. If Apache Ant version 1.9.5 or later is already installed on your + computer, skip to (3). + + 2. Download a binary distribution of Ant from: + + http://ant.apache.org/bindownload.cgi + + 3. Unpack the binary distribution into a convenient location so that the + Ant release resides in its own directory (conventionally named + "apache-ant-[version]"). + + For the purposes of the remainder of this document, the symbolic name + "${ant.home}" is used to refer to the full pathname of the release + directory. + + 4. Create an ANT_HOME environment variable to point the directory + ${ant.home}. + + 5. Modify the PATH environment variable to include the directory + ${ant.home}/bin in its list. This makes the "ant" command line script + available, which will be used to actually perform the build. + + +(3) Building Tomcat 9.0 + +(3.1) Checkout or obtain the source code for Tomcat 9.0 + +Checkout the source using SVN, selecting a tag for released version or +trunk for the current development code, or download and unpack a source +package. + + * Tomcat SVN repository URL: + + http://svn.apache.org/repos/asf/tomcat/tc9.0.x/trunk/ + + * Source packages can be downloaded from: + + http://tomcat.apache.org/download-90.cgi + +The location where the source has been placed will be further referred as +${tomcat.source}. + +The Tomcat local build process does not modify line-endings. The svn repository +is configured so that all files will be checked out with the line-ending +appropriate for the current platform. When using a source package you should +ensure that you use the source package that has the appropriate line-ending +for your platform: + + zip -> CRLF + tar.gz -> LF + +Note that the release build process does modify line-endings to ensure that +each release package has the appropriate line-endings. + +(3.2) Building + + 1. The build is controlled by creating a ${tomcat.source}/build.properties + file. + + It is recommended to always create the file, because of unfortunate + default value of base.path property. You may start with the following + content for the file: + + # ----- Default Base Path for Dependent Packages ----- + # Replace this path with the directory path where dependencies binaries + # should be downloaded + base.path=/home/me/some-place-to-download-to + + 2. Configure base.path property by adding it to the + ${tomcat.source}/build.properties file. + + The base.path property specifies the place where Tomcat dependencies + required by the build are downloaded. It is recommended to place this + directory outside of the source tree, so that you do not waste your + time re-downloading the libraries. + +* NOTE: The default value of the base.path property configures the build script + to download the libraries required to build Tomcat to the + ${user.home}/tomcat-build-libs directory. + +* NOTE: Users accessing the Internet through a proxy must use the properties + file to indicate to Ant the proxy configuration. + + The following properties should be added to the ${tomcat.source}/build.properties + file. + + proxy.use=true + proxy.host=proxy.domain + proxy.port=8080 + proxy.user=username + proxy.password=password + + See Apache Ant documentation for the <setproxy> task for details. + + 3. Go to the sources directory and run Ant: + + cd ${tomcat.source} + ant + + This will execute the "deploy" target in build.xml. + + Once the build has completed successfully, a usable Tomcat installation + will have been produced in the ${tomcat.source}/output/build directory, + and can be started and stopped with the usual scripts. + + Note that the build includes Tomcat documentation, which can be found + in the output/build/webapps/docs directory. + + The path of the output directory can be controlled by specifying the + "tomcat.output" property in the build.properties file. + +* NOTE: Do not run the build as the root user. Building and running Tomcat + does not require root privileges. + + +(4) Updating sources and rebuilding + +It is recommended that you regularly update the downloaded Tomcat 9.0 +sources using your SVN client. + +For a quick rebuild of only modified code you can use: + + cd ${tomcat.source} + ant + + +(5) Special builds + +There are several targets in Tomcat build files that are useful to be +called separately. They build components that you may want to build +quickly, or ones that are included in the full release and are not built +during the default "deploy" build. + +(5.1) Building documentation + +The documentation web application is built during the default "deploy" +build. + +It can be built quickly by using the following commands: + + cd ${tomcat.source} + ant build-docs + +The output of this command will be found in the following directory: + + output/build/webapps/docs + + +The API documentation (Javadoc) is built during a "release" build. It is +easy to build it separately by using the following commands: + + cd ${tomcat.source} + ant javadoc + +The output of this command will be found in the following directories: + + output/dist/webapps/docs/api + output/dist/webapps/docs/elapi + output/dist/webapps/docs/jspapi + output/dist/webapps/docs/servletapi + + +(5.2) Building the extras (commons-logging, webservices etc.) + +These components are documented on the "Additional Components" +(extras.html) page of documentation. They are built during a "release" +build. + +You can build them by using the following commands: + + cd ${tomcat.source} + ant extras + +(5.3) Building the embedded packages + +These are built during a "release" build. + +You can build them by using the following commands: + + cd ${tomcat.source} + ant embed + + +(6) Building a full release (as provided via the ASF download pages) + + A full release includes the Windows installer which requires a Windows + environment to be available to create it. If not building in a Windows + environment, the build scripts assume that Wine is available. If this is not + the case, the skip.installer property may be set to skip the creation of the + Windows installer. + + 1. Configure GPG, if needed + + If the released artifacts have to be cryptographically signed with a + PGP signature, like the official ASF releases are, the following + property can be added to the build.properties file: + + # Location of GPG executable (used only for releases) + gpg.exec=/path/to/gpg + + You do not need it if you do not plan to sign the release. + + If "gpg.exec" property does not point to an existing file, it will be + ignored and this feature will be disabled. + + You will be prompted for the GPG passphrase when the release build + starts, unless "gpg.passphrase" property is set. + + 2. If building the Windows installer + + If running the build in a UAC enabled environment, building the Windows + installer requires elevated privileges. The simplest way to do this is to + open the command prompt used for the build with the "Run as administrator" + option. + + 3. Configure the code signing service + + ASF committers performing official releases will need to configure the code + signing service so that the Windows installer is signed during the build + process. The following properties need to be added to the build.properties + file: + + # Location of GPG executable (used only for releases) + # Code signing of Windows installer + do.codesigning=true + codesigning.user=request-via-pmc + codesigning.pwd=request-via-pmc + codesigning.partnercode=request-via-pmc + codesigning.service=Microsoft Windows Signing + + Release managers will be provided with the necessary credentials by the PMC. + + 4. Build the release: + + cd ${tomcat.source} + ant release + + +(7) Tests + +(7.1) Running Tomcat tests + +Tomcat includes a number of junit tests. The tests are not run when a +release is built. There is separate command to run them. + +To run the testsuite use the following command: + + cd ${tomcat.source} + ant test + +It is advisable to redirect output of the above command to a file for later +inspection. + +The JUnit reports generated by the tests will be written to the following +directory: + + output/build/logs + +By default the testsuite is run three times to test 3 different +implementations of Tomcat connectors: NIO, NIO2 and APR. (If you are not +familiar with Tomcat connectors, see config/http.html in documentation for +details). + +The 3 runs are enabled and disabled individually by the following +properties, which all are "true" by default: + + execute.test.nio=true + execute.test.nio2=true + execute.test.apr=true + +The APR connector can be tested only if Tomcat-Native library binaries are +found by the testsuite. The "test.apr.loc" property specifies the directory +where the library binaries are located. + +By default the "test.apr.loc" property specifies the following location: + + output/build/bin/native/ + +If you are on Windows and want to test the APR connector you can put the +tcnative-1.dll file into ${tomcat.source}/bin/native/ and it will be copied +into the above directory when the build runs. + +The unit tests include tests of the clustering functionality which require +multicast to be enabled. There is a simple application provided in the Tomcat +test source (org.apache.catalina.tribes.TesterMulticast) that can be used to +check if a machine supports multicast. Notes on enabling multicast for different +operating systems are provided in the Javadoc for that class. + + +(7.2) Running a single test + +It is possible to run a single JUnit test class by adding the "test.entry" +property to the build.properties file. The property specifies the name of +the test class. + +For example: + + test.entry=org.apache.catalina.util.TestServerInfo + +It is possible to further limit such run to a number of selected test +methods by adding "test.entry.methods" property. The property specifies a +comma-separated list of test case methods. + +For example: + + test.entry=org.apache.el.lang.TestELArithmetic + test.entry.methods=testMultiply01,testMultiply02 + + +(7.3) Running a set of tests + +It is possible to run a set of JUnit test classes by adding the "test.name" +property to the build.properties file. The property specifies an Ant +includes pattern for the fileset of test class files to run. + +The default value is "**/Test*.java", so all test classes are being +executed (with few exceptions - see build.xml for several exclude patterns). + +You can include multiple patterns by concatenating them with a comma (",") +as the separator. + +For example: + + test.name=**/TestSsl.java,**/TestWebSocketFrameClientSSL.java + +You can exclude specific JUnit test classes by adding the "test.exclude" +property to the build.properties file. The property specifies an Ant +excludes pattern for the fileset of test class files to exclude form the run. +The default value is empty, so no classes are excluded. The syntax is the same +as for the property "test.name". + + +(7.4) Other configuration options + + 1. It is possible to configure the directory where JUnit reports are + written to. It is configured by "test.reports" property. The default + value is + + output/build/logs + + 2. It is possible to enable generation of access log file when the tests + are run. This is off by default and can be enabled by the following + property: + + test.accesslog=true + + The "access_log.<date>" file will be written to the same directory as + JUnit reports, + + output/build/logs + + 3. The testsuite respects logging configuration as configured by + ${tomcat.source}/conf/logging.properties + + The log files will be written to the temporary directory used by the + tests, + + output/test-tmp/logs + + 4. It is possible to configure formatter used by JUnit reports. + Configuration properties are "junit.formatter.type", + "junit.formatter.extension" and "junit.formatter.usefile". + + For example the following property disables generation of separate report + files: + + junit.formatter.usefile=false + + 5. It is possible to speed up testing by letting JUnit to run several + tests in parallel. + + This is configured by setting "test.threads" property. The recommended + value is one thread per core. + + 6. Optional support is provided for the Cobertura code coverage tool. + +NOTE: Cobertura is licensed under GPL v2 with parts of it being under + Apache License v1.1. See http://cobertura.sf.net for details. Using it + during Tomcat build is optional and is off by default. + + Cobertura can be enabled using the following properties: + + test.cobertura=true + test.threads=1 + + Using Cobertura currently requires setting test.threads configuration + property to the value of 1. Setting that property to a different value + will disable code coverage. + + The report files by default are written to + + output/coverage + + 7. The performance tests are written to run reasonably powerful machines (such + as a developer may use day to day) assuming no other resource hungry + processes are running. + + These assumptions are not always true (e.g. on CI systems running in a + virtual machine) so the performance tests may be disabled by using the + following property: + + test.excludePerformance=true + + 8. Some tests include checks that the access log valve entries are as expected. + These checks include timings. On slower / loaded systems these checks will + often fail. The checks may be relaxed by using the following property: + + test.relaxTiming=true + + 9. It is known that some platforms (e.g. OSX El Capitan) require IPv4 to + be the default for the multicast tests to work. This is configured by + the following property: + + java.net.preferIPv4Stack=true + + 10. It is possible to control whether the output of the tests is displayed + on the console or not. By default it is displayed and can be disabled + by the following property: + + test.verbose=true + +(8) Source code checks + +(8.1) Checkstyle + +NOTE: Checkstyle is licensed under LGPL. Using Checkstyle during Tomcat + build is optional and is off by default. + + See http://checkstyle.sourceforge.net/ for more information. + +Tomcat comes with a Checkstyle configuration that tests its source code +for certain conventions, like presence of the license header. + +To enable Checkstyle, add the following property to build.properties file: + + execute.validate=true + +Once Checkstyle is enabled, the check will be performed automatically +during the build. The check is run before compilation of the source code. + +To speed-up repeated runs of this check, a cache is configured. The cache +is located in the following directory: + + output/res/checkstyle + +It is possible to run the check separately by calling the "validate" +target. The command is: + + cd ${tomcat.source} + ant -Dexecute.validate=true validate + + +(8.2) FindBugs + +NOTE: FindBugs is licensed under LGPL. Using Findbugs during Tomcat build is + optional and is off by default. + + See http://findbugs.sourceforge.net/ for more information. + +To enable FindBugs, add the following property to build.properties file: + + execute.findbugs=true + +To compile Tomcat classes and generate a FindBugs report, call the +"findbugs" target. For example: + + cd ${tomcat.source} + ant -Dexecute.findbugs=true findbugs + +The report file by default is written to + + output/findbugs + + +(8.3) End-of-line conventions check + +You usually would not need to run this check. You can skip this section. + +Apache Tomcat project has convention that all of its textual source files, +stored in Subversion repository, are marked with Subversion property +"svn:eol-style" with value of "native". This convention makes the editing +of source code on different platforms easier. + +This test is used by developers to check that the source code adheres to +this convention. It verifies that the ends of lines in textual files are +appropriate for the operating system where it is run. The idea is to run +this check regularly on two different platforms and notify developers when +an inconsistency is detected. + +The command to run this test is: + + cd ${tomcat.source} + ant validate-eoln diff --git a/src/tomcat/webapps/docs/RELEASE-NOTES.txt b/src/tomcat/webapps/docs/RELEASE-NOTES.txt new file mode 100644 index 0000000000000000000000000000000000000000..52013a7e6997eaa16d3086daa602b1a60cfcf655 --- /dev/null +++ b/src/tomcat/webapps/docs/RELEASE-NOTES.txt @@ -0,0 +1,173 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + + Apache Tomcat Version 9.0.6 + Release Notes + + +========= +CONTENTS: +========= + +* Dependency Changes +* API Stability +* Bundled APIs +* Web application reloading and static fields in shared libraries +* Security manager URLs +* Symlinking static resources +* Viewing the Tomcat Change Log +* Cryptographic software notice +* When all else fails + + +=================== +Dependency Changes: +=================== +Tomcat 9.0 is designed to run on Java SE 8 and later. + + +============== +API Stability: +============== + +The public interfaces for the following classes are fixed and will not be +changed at all during the remaining lifetime of the 9.x series: +- All classes in the javax namespace + +The public interfaces for the following classes may be added to in order to +resolve bugs and/or add new features. No existing interface method will be +removed or changed although it may be deprecated. +- org.apache.catalina.* (excluding sub-packages) + +Note: As Tomcat 9 matures, the above list will be added to. The list is not + considered complete at this time. + +The remaining classes are considered part of the Tomcat internals and may change +without notice between point releases. + + +============= +Bundled APIs: +============= +A standard installation of Tomcat 9.0 makes all of the following APIs available +for use by web applications (by placing them in "lib"): +* annotations-api.jar (Annotations package) +* catalina.jar (Tomcat Catalina implementation) +* catalina-ant.jar (Tomcat Catalina Ant tasks) +* catalina-ha.jar (High availability package) +* catalina-storeconfig.jar (Generation of XML configuration from current state) +* catalina-tribes.jar (Group communication) +* ecj-4.6.3.jar (Eclipse JDT Java compiler) +* el-api.jar (EL 3.0 API) +* jasper.jar (Jasper 2 Compiler and Runtime) +* jasper-el.jar (Jasper 2 EL implementation) +* jsp-api.jar (JSP 2.3 API) +* servlet-api.jar (Servlet 4.0 API) +* tomcat-api.jar (Interfaces shared by Catalina and Jasper) +* tomcat-coyote.jar (Tomcat connectors and utility classes) +* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP) +* tomcat-jdbc.jar (Tomcat's database connection pooling solution) +* tomcat-jni.jar (Interface to the native component of the APR/native connector) +* tomcat-util.jar (Various utilities) +* tomcat-websocket.jar (WebSocket 1.1 implementation) +* websocket-api.jar (WebSocket 1.1 API) + +You can make additional APIs available to all of your web applications by +putting unpacked classes into a "classes" directory (not created by default), +or by placing them in JAR files in the "lib" directory. + +To override the XML parser implementation or interfaces, use the appropriate +feature for your JVM. For Java <= 8 use the endorsed standards override +feature. The default configuration defines JARs located in "endorsed" as endorsed. +For Java 9+ use the upgradeable modules feature. + + +================================================================ +Web application reloading and static fields in shared libraries: +================================================================ +Some shared libraries (many are part of the JDK) keep references to objects +instantiated by the web application. To avoid class loading related problems +(ClassCastExceptions, messages indicating that the classloader +is stopped, etc.), the shared libraries state should be reinitialized. + +Something which might help is to avoid putting classes which would be +referenced by a shared static field in the web application classloader, +and putting them in the shared classloader instead (JARs should be put in the +"lib" folder, and classes should be put in the "classes" folder). + + +====================== +Security manager URLs: +====================== +In order to grant security permissions to JARs located inside the +web application repository, use URLs of of the following format +in your policy file: + +file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar + + +============================ +Symlinking static resources: +============================ +By default, Unix symlinks will not work when used in a web application to link +resources located outside the web application root directory. + +This behavior is optional, and the "allowLinking" flag may be used to disable +the check. + + +============================== +Viewing the Tomcat Change Log: +============================== +The full change log is available from http://tomcat.apache.org and is also +included in the documentation web application. + + +============================= +Cryptographic software notice +============================= +This distribution includes cryptographic software. The country in +which you currently reside may have restrictions on the import, +possession, use, and/or re-export to another country, of +encryption software. BEFORE using any encryption software, please +check your country's laws, regulations and policies concerning the +import, possession, or use, and re-export of encryption software, to +see if this is permitted. See <http://www.wassenaar.org/> for more +information. + +The U.S. Government Department of Commerce, Bureau of Industry and +Security (BIS), has classified this software as Export Commodity +Control Number (ECCN) 5D002.C.1, which includes information security +software using or performing cryptographic functions with asymmetric +algorithms. The form and manner of this Apache Software Foundation +distribution makes it eligible for export under the License Exception +ENC Technology Software Unrestricted (TSU) exception (see the BIS +Export Administration Regulations, Section 740.13) for both object +code and source code. + +The following provides more details on the included cryptographic +software: + - Tomcat includes code designed to work with JSSE + - Tomcat includes code designed to work with OpenSSL + + +==================== +When all else fails: +==================== +See the FAQ +http://tomcat.apache.org/faq/ diff --git a/src/tomcat/webapps/docs/RUNNING.txt b/src/tomcat/webapps/docs/RUNNING.txt new file mode 100644 index 0000000000000000000000000000000000000000..654d7af57063d4687aa088fe68a4aa5cac6fb277 --- /dev/null +++ b/src/tomcat/webapps/docs/RUNNING.txt @@ -0,0 +1,476 @@ +================================================================================ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================ + + =================================================== + Running The Apache Tomcat 9.0 Servlet/JSP Container + =================================================== + +Apache Tomcat 9.0 requires a Java Standard Edition Runtime +Environment (JRE) version 8 or later. + +============================= +Running With JRE 8 Or Later +============================= + +(1) Download and Install a Java SE Runtime Environment (JRE) + +(1.1) Download a Java SE Runtime Environment (JRE), + release version 8 or later, from + http://www.oracle.com/technetwork/java/javase/downloads/index.html + +(1.2) Install the JRE according to the instructions included with the + release. + + You may also use a full Java Development Kit (JDK) rather than just + a JRE. + + +(2) Download and Install Apache Tomcat + +(2.1) Download a binary distribution of Tomcat from: + + http://tomcat.apache.org/ + +(2.2) Unpack the binary distribution so that it resides in its own + directory (conventionally named "apache-tomcat-[version]"). + + For the purposes of the remainder of this document, the name + "CATALINA_HOME" is used to refer to the full pathname of that + directory. + +NOTE: As an alternative to downloading a binary distribution, you can +create your own from the Tomcat source code, as described in +"BUILDING.txt". You can either + + a) Do the full "release" build and find the created distribution in the + "output/release" directory and then proceed with unpacking as above, or + + b) Do a simple build and use the "output/build" directory as + "CATALINA_HOME". Be warned that there are some differences between the + contents of the "output/build" directory and a full "release" + distribution. + + +(3) Configure Environment Variables + +Tomcat is a Java application and does not use environment variables directly. +Environment variables are used by the Tomcat startup scripts. The scripts use +the environment variables to prepare the command that starts Tomcat. + +(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional) + +The CATALINA_HOME environment variable should be set to the location of the +root directory of the "binary" distribution of Tomcat. + +The Tomcat startup scripts have some logic to set this variable +automatically if it is absent, based on the location of the startup script +in *nix and on the current directory in Windows. That logic might not work +in all circumstances, so setting the variable explicitly is recommended. + +The CATALINA_BASE environment variable specifies location of the root +directory of the "active configuration" of Tomcat. It is optional. It +defaults to be equal to CATALINA_HOME. + +Using distinct values for the CATALINA_HOME and CATALINA_BASE variables is +recommended to simplify further upgrades and maintenance. It is documented +in the "Multiple Tomcat Instances" section below. + + +(3.2) Set JRE_HOME or JAVA_HOME (required) + +These variables are used to specify location of a Java Runtime +Environment or of a Java Development Kit that is used to start Tomcat. + +The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME +variable is used to specify location of a JDK. + +Using JAVA_HOME provides access to certain additional startup options that +are not allowed when JRE_HOME is used. + +If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used. + +The recommended place to specify these variables is a "setenv" script. See +below. + + +(3.3) Other variables (optional) + +Other environment variables exist, besides the four described above. +See the comments at the top of catalina.bat or catalina.sh scripts for +the list and a description of each of them. + +One frequently used variable is CATALINA_OPTS. It allows specification of +additional options for the java command that starts Tomcat. + +See the Java documentation for the options that affect the Java Runtime +Environment. + +See the "System Properties" page in the Tomcat Configuration Reference for +the system properties that are specific to Tomcat. + +A similar variable is JAVA_OPTS. It is used less frequently. It allows +specification of options that are used both to start and to stop Tomcat as well +as for other commands. + +Note: Do not use JAVA_OPTS to specify memory limits. You do not need much +memory for a small process that is used to stop Tomcat. Those settings +belong to CATALINA_OPTS. + +Another frequently used variable is CATALINA_PID (on *nix only). It +specifies the location of the file where process id of the forked Tomcat +java process will be written. This setting is optional. It will enable the +following features: + + * better protection against duplicate start attempts and + * allows forceful termination of Tomcat process when it does not react to + the standard shutdown command. + + +(3.4) Using the "setenv" script (optional, recommended) + +Apart from CATALINA_HOME and CATALINA_BASE, all environment variables can +be specified in the "setenv" script. The script is placed either into +CATALINA_BASE/bin or into CATALINA_HOME/bin directory and is named +setenv.bat (on Windows) or setenv.sh (on *nix). The file has to be +readable. + +By default the setenv script file is absent. If the script file is present +both in CATALINA_BASE and in CATALINA_HOME, the one in CATALINA_BASE is +preferred. + +For example, to configure the JRE_HOME and CATALINA_PID variables you can +create the following script file: + +On Windows, %CATALINA_BASE%\bin\setenv.bat: + + set "JRE_HOME=%ProgramFiles%\Java\jre8" + exit /b 0 + +On *nix, $CATALINA_BASE/bin/setenv.sh: + + JRE_HOME=/usr/java/latest + CATALINA_PID="$CATALINA_BASE/tomcat.pid" + + +The CATALINA_HOME and CATALINA_BASE variables cannot be configured in the +setenv script, because they are used to locate that file. + +All the environment variables described here and the "setenv" script are +used only if you use the standard scripts to launch Tomcat. For example, if +you have installed Tomcat as a service on Windows, the service wrapper +launches Java directly and does not use the script files. + + +(4) Start Up Tomcat + +(4.1) Tomcat can be started by executing one of the following commands: + + On Windows: + + %CATALINA_HOME%\bin\startup.bat + + or + + %CATALINA_HOME%\bin\catalina.bat start + + On *nix: + + $CATALINA_HOME/bin/startup.sh + + or + + $CATALINA_HOME/bin/catalina.sh start + +(4.2) After startup, the default web applications included with Tomcat will be + available by visiting: + + http://localhost:8080/ + +(4.3) Further information about configuring and running Tomcat can be found in + the documentation included here, as well as on the Tomcat web site: + + http://tomcat.apache.org/ + + +(5) Shut Down Tomcat + +(5.1) Tomcat can be shut down by executing one of the following commands: + + On Windows: + + %CATALINA_HOME%\bin\shutdown.bat + + or + + %CATALINA_HOME%\bin\catalina.bat stop + + On *nix: + + $CATALINA_HOME/bin/shutdown.sh + + or + + $CATALINA_HOME/bin/catalina.sh stop + +================================================== +Advanced Configuration - Multiple Tomcat Instances +================================================== + +In many circumstances, it is desirable to have a single copy of a Tomcat +binary distribution shared among multiple users on the same server. To make +this possible, you can set the CATALINA_BASE environment variable to the +directory that contains the files for your 'personal' Tomcat instance. + +When running with a separate CATALINA_HOME and CATALINA_BASE, the files +and directories are split as following: + +In CATALINA_BASE: + + * bin - Only the following files: + + * setenv.sh (*nix) or setenv.bat (Windows), + * tomcat-juli.jar + + The setenv scripts were described above. The tomcat-juli library + is documented in the Logging chapter in the User Guide. + + * conf - Server configuration files (including server.xml) + + * lib - Libraries and classes, as explained below + + * logs - Log and output files + + * webapps - Automatically loaded web applications + + * work - Temporary working directories for web applications + + * temp - Directory used by the JVM for temporary files (java.io.tmpdir) + + +In CATALINA_HOME: + + * bin - Startup and shutdown scripts + + The following files will be used only if they are absent in + CATALINA_BASE/bin: + + setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar + + * lib - Libraries and classes, as explained below + + * endorsed - Libraries that override standard "Endorsed Standards" + libraries provided by JRE. See Classloading documentation + in the User Guide for details. + This is only supported for Java <= 8. + By default this "endorsed" directory is absent. + +In the default configuration the JAR libraries and classes both in +CATALINA_BASE/lib and in CATALINA_HOME/lib will be added to the common +classpath, but the ones in CATALINA_BASE will be added first and thus will +be searched first. + +The idea is that you may leave the standard Tomcat libraries in +CATALINA_HOME/lib and add other ones such as database drivers into +CATALINA_BASE/lib. + +In general it is advised to never share libraries between web applications, +but put them into WEB-INF/lib directories inside the applications. See +Classloading documentation in the User Guide for details. + + +It might be useful to note that the values of CATALINA_HOME and +CATALINA_BASE can be referenced in the XML configuration files processed +by Tomcat as ${catalina.home} and ${catalina.base} respectively. + +For example, the standard manager web application can be kept in +CATALINA_HOME/webapps/manager and loaded into CATALINA_BASE by using +the following trick: + + * Copy the CATALINA_HOME/webapps/manager/META-INF/context.xml + file as CATALINA_BASE/conf/Catalina/localhost/manager.xml + + * Add docBase attribute as shown below. + +The file will look like the following: + + <?xml version="1.0" encoding="UTF-8"?> + <Context docBase="${catalina.home}/webapps/manager" + antiResourceLocking="false" privileged="true" > + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.0\.0\.1" /> + </Context> + +See Deployer chapter in User Guide and Context and Host chapters in the +Configuration Reference for more information on contexts and web +application deployment. + + +================ +Troubleshooting +================ + +There are only really 2 things likely to go wrong during the stand-alone +Tomcat install: + +(1) The most common hiccup is when another web server (or any process for that + matter) has laid claim to port 8080. This is the default HTTP port that + Tomcat attempts to bind to at startup. To change this, open the file: + + $CATALINA_HOME/conf/server.xml + + and search for '8080'. Change it to a port that isn't in use, and is + greater than 1024, as ports less than or equal to 1024 require superuser + access to bind under UNIX. + + Restart Tomcat and you're in business. Be sure that you replace the "8080" + in the URL you're using to access Tomcat. For example, if you change the + port to 1977, you would request the URL http://localhost:1977/ in your + browser. + +(2) The 'localhost' machine isn't found. This could happen if you're behind a + proxy. If that's the case, make sure the proxy configuration for your + browser knows that you shouldn't be going through the proxy to access the + "localhost". + + In Firefox, this is under Tools/Preferences -> Advanced/Network -> + Connection -> Settings..., and in Internet Explorer it is Tools -> + Internet Options -> Connections -> LAN Settings. + + +==================== +Optional Components +==================== + +The following optional components may be included with the Apache Tomcat binary +distribution. If they are not included, you can install them separately. + + 1. Apache Tomcat Native library + + 2. Apache Commons Daemon service launcher + +Both of them are implemented in C language and as such have to be compiled +into binary code. The binary code will be specific for a platform and CPU +architecture and it must match the Java Runtime Environment executables +that will be used to launch Tomcat. + +The Windows-specific binary distributions of Apache Tomcat include binary +files for these components. On other platforms you would have to look for +binary versions elsewhere or compile them yourself. + +If you are new to Tomcat, do not bother with these components to start with. +If you do use them, do not forget to read their documentation. + + +Apache Tomcat Native library +----------------------------- + +It is a library that allows to use the "Apr" variant of HTTP and AJP +protocol connectors in Apache Tomcat. It is built around OpenSSL and Apache +Portable Runtime (APR) libraries. Those are the same libraries as used by +Apache HTTPD Server project. + +This feature was especially important in the old days when Java performance +was poor. It is less important nowadays, but it is still used and respected +by many. See Tomcat documentation for more details. + +For further reading: + + - Apache Tomcat documentation + + * Documentation for APR/Native library in the Tomcat User's Guide + + http://tomcat.apache.org/tomcat-9.0-doc/apr.html + + * Documentation for the HTTP and AJP protocol connectors in the Tomcat + Configuration Reference + + http://tomcat.apache.org/tomcat-9.0-doc/config/http.html + + http://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html + + - Apache Tomcat Native project home + + http://tomcat.apache.org/native-doc/ + + - Other projects + + * OpenSSL + + http://openssl.org/ + + * Apache Portable Runtime + + http://apr.apache.org/ + + * Apache HTTP Server + + http://httpd.apache.org/ + +To disable Apache Tomcat Native library: + + - To disable Apache Tomcat Native library when it is installed, or + - To remove the warning that is logged during Tomcat startup when the + library is not installed: + + Edit the "conf/server.xml" file and remove "AprLifecycleListener" from + it. + +The binary file of Apache Tomcat Native library is usually named + + - "tcnative-1.dll" on Windows + - "libtcnative-1.so" on *nix systems + + +Apache Commons Daemon +---------------------- + +Apache Commons Daemon project provides wrappers that can be used to +install Apache Tomcat as a service on Windows or as a daemon on *nix +systems. + +The Windows-specific implementation of Apache Commons Daemon is called +"procrun". The *nix-specific one is called "jsvc". + +For further reading: + + - Apache Commons Daemon project + + http://commons.apache.org/daemon/ + + - Apache Tomcat documentation + + * Installing Apache Tomcat + + http://tomcat.apache.org/tomcat-9.0-doc/setup.html + + * Windows service HOW-TO + + http://tomcat.apache.org/tomcat-9.0-doc/windows-service-howto.html + +The binary files of Apache Commons Daemon in Apache Tomcat distributions +for Windows are named: + + - "tomcat9.exe" + - "tomcat9w.exe" + +These files are renamed copies of "prunsrv.exe" and "prunmgr.exe" from +Apache Commons Daemon distribution. The file names have a meaning: they are +used as the service name to register the service in Windows, as well as the +key name to store distinct configuration for this installation of +"procrun". If you would like to install several instances of Tomcat 9.0 +in parallel, you have to further rename those files, using the same naming +scheme. diff --git a/src/tomcat/webapps/docs/WEB-INF/web.xml b/src/tomcat/webapps/docs/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d9fd36cde5ca9ef05b240d15ec7e2584ca8ee01 --- /dev/null +++ b/src/tomcat/webapps/docs/WEB-INF/web.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" + metadata-complete="true"> + + <display-name>Tomcat Documentation</display-name> + <description> + Tomcat Documentation. + </description> +</web-app> diff --git a/src/tomcat/webapps/docs/aio.html b/src/tomcat/webapps/docs/aio.html new file mode 100644 index 0000000000000000000000000000000000000000..e7390fd7c166324ab2ce01f0966bf2f2a6ff59fb --- /dev/null +++ b/src/tomcat/webapps/docs/aio.html @@ -0,0 +1,97 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Advanced IO and Tomcat</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/aio"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Advanced IO and Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Asynchronous_writes">Asynchronous writes</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p> + <b>IMPORTANT NOTE: Usage of these features requires using the + HTTP connectors. The AJP connectors do not support them.</b> + </p> + + </div><h3 id="Asynchronous_writes">Asynchronous writes</h3><div class="text"> + + <p> + When using HTTP connectors (based on APR or NIO/NIO2), + Tomcat supports using sendfile to send large static files. + These writes, as soon as the system load increases, will be performed + asynchronously in the most efficient way. Instead of sending a large response using + blocking writes, it is possible to write content to a static file, and write it + using a sendfile code. A caching valve could take advantage of this to cache the + response data in a file rather than store it in memory. Sendfile support is + available if the request attribute <code>org.apache.tomcat.sendfile.support</code> + is set to <code>Boolean.TRUE</code>. + </p> + + <p> + Any servlet can instruct Tomcat to perform a sendfile call by setting the appropriate + request attributes. It is also necessary to correctly set the content length + for the response. When using sendfile, it is best to ensure that neither the + request or response have been wrapped, since as the response body will be sent later + by the connector itself, it cannot be filtered. Other than setting the 3 needed + request attributes, the servlet should not send any response data, but it may use + any method which will result in modifying the response header (like setting cookies). + </p> + + <ul> + <li><code>org.apache.tomcat.sendfile.filename</code>: Canonical filename of the file which will be sent as + a String</li> + <li><code>org.apache.tomcat.sendfile.start</code>: Start offset as a Long</li> + <li><code>org.apache.tomcat.sendfile.end</code>: End offset as a Long</li> + </ul> + <p> + In addition to setting these parameters it is necessary to set the content-length header. + Tomcat will not do that for you, since you may have already written data to the output stream. + </p> + + <p> + Note that the use of sendfile will disable any compression that Tomcat may + otherwise have performed on the response. + </p> + + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/api/index.html b/src/tomcat/webapps/docs/api/index.html new file mode 100644 index 0000000000000000000000000000000000000000..8cb853ff5c7a6847db169bf659762858870b7a4f --- /dev/null +++ b/src/tomcat/webapps/docs/api/index.html @@ -0,0 +1,34 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8" /> + <title>API docs</title> +</head> + +<body> + +Tomcat's internal javadoc is not installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +<a href="http://tomcat.apache.org/tomcat-9.0-doc/"> +documentation bundle</a>. + +</body> +</html> diff --git a/src/tomcat/webapps/docs/appdev/build.xml.txt b/src/tomcat/webapps/docs/appdev/build.xml.txt new file mode 100644 index 0000000000000000000000000000000000000000..51d8350e8b0c425f03868972c8222cb9819ec467 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/build.xml.txt @@ -0,0 +1,508 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- + General purpose build script for web applications and web services, + including enhanced support for deploying directly to a Tomcat + based server. + + This build script assumes that the source code of your web application + is organized into the following subdirectories underneath the source + code directory from which you execute the build script: + + docs Static documentation files to be copied to + the "docs" subdirectory of your distribution. + + src Java source code (and associated resource files) + to be compiled to the "WEB-INF/classes" + subdirectory of your web application. + + web Static HTML, JSP, and other content (such as + image files), including the WEB-INF subdirectory + and its configuration file contents. +--> + + +<!-- A "project" describes a set of targets that may be requested + when Ant is executed. The "default" attribute defines the + target which is executed if no specific target is requested, + and the "basedir" attribute defines the current working directory + from which Ant executes the requested task. This is normally + set to the current working directory. +--> + +<project name="My Project" default="compile" basedir="."> + + + +<!-- ===================== Property Definitions =========================== --> + + +<!-- + + Each of the following properties are used in the build script. + Values for these properties are set by the first place they are + defined, from the following list: + + * Definitions on the "ant" command line (ant -Dfoo=bar compile). + + * Definitions from a "build.properties" file in the top level + source directory of this application. + + * Definitions from a "build.properties" file in the developer's + home directory. + + * Default definitions in this build.xml file. + + You will note below that property values can be composed based on the + contents of previously defined properties. This is a powerful technique + that helps you minimize the number of changes required when your development + environment is modified. Note that property composition is allowed within + "build.properties" files as well as in the "build.xml" script. + +--> + + <property file="build.properties"/> + <property file="${user.home}/build.properties"/> + + +<!-- ==================== File and Directory Names ======================== --> + + +<!-- + + These properties generally define file and directory names (or paths) that + affect where the build process stores its outputs. + + app.name Base name of this application, used to + construct filenames and directories. + Defaults to "myapp". + + app.path Context path to which this application should be + deployed (defaults to "/" plus the value of the + "app.name" property). + + app.version Version number of this iteration of the application. + + build.home The directory into which the "prepare" and + "compile" targets will generate their output. + Defaults to "build". + + catalina.home The directory in which you have installed + a binary distribution of Tomcat. This will + be used by the "deploy" target. + + dist.home The name of the base directory in which + distribution files are created. + Defaults to "dist". + + manager.password The login password of a user that is assigned the + "manager-script" role (so that he or she can execute + commands via the "/manager" web application) + + manager.url The URL of the "/manager" web application on the + Tomcat installation to which we will deploy web + applications and web services. + + manager.username The login username of a user that is assigned the + "manager-script" role (so that he or she can execute + commands via the "/manager" web application) + +--> + + <property name="app.name" value="myapp"/> + <property name="app.path" value="/${app.name}"/> + <property name="app.version" value="0.1-dev"/> + <property name="build.home" value="${basedir}/build"/> + <property name="catalina.home" value="../../../.."/> <!-- UPDATE THIS! --> + <property name="dist.home" value="${basedir}/dist"/> + <property name="docs.home" value="${basedir}/docs"/> + <property name="manager.url" value="http://localhost:8080/manager/text"/> + <property name="src.home" value="${basedir}/src"/> + <property name="web.home" value="${basedir}/web"/> + + +<!-- ==================== External Dependencies =========================== --> + + +<!-- + + Use property values to define the locations of external JAR files on which + your application will depend. In general, these values will be used for + two purposes: + * Inclusion on the classpath that is passed to the Javac compiler + * Being copied into the "/WEB-INF/lib" directory during execution + of the "deploy" target. + + Because we will automatically include all of the Java classes that Tomcat + exposes to web applications, we will not need to explicitly list any of those + dependencies. You only need to worry about external dependencies for JAR + files that you are going to include inside your "/WEB-INF/lib" directory. + +--> + +<!-- Dummy external dependency --> +<!-- + <property name="foo.jar" + value="/path/to/foo.jar"/> +--> + + +<!-- ==================== Compilation Classpath =========================== --> + +<!-- + + Rather than relying on the CLASSPATH environment variable, Ant includes + features that makes it easy to dynamically construct the classpath you + need for each compilation. The example below constructs the compile + classpath to include the servlet.jar file, as well as the other components + that Tomcat makes available to web applications automatically, plus anything + that you explicitly added. + +--> + + <path id="compile.classpath"> + + <!-- Include all JAR files that will be included in /WEB-INF/lib --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> +<!-- + <pathelement location="${foo.jar}"/> +--> + + <!-- Include all elements that Tomcat exposes to applications --> + <fileset dir="${catalina.home}/bin"> + <include name="*.jar"/> + </fileset> + <pathelement location="${catalina.home}/lib"/> + <fileset dir="${catalina.home}/lib"> + <include name="*.jar"/> + </fileset> + + </path> + + + +<!-- ================== Custom Ant Task Definitions ======================= --> + + +<!-- + + These properties define custom tasks for the Ant build tool that interact + with the "/manager" web application installed with Tomcat. Before they + can be successfully utilized, you must perform the following steps: + + - Copy the file "lib/catalina-ant.jar" from your Tomcat + installation into the "lib" directory of your Ant installation. + + - Create a "build.properties" file in your application's top-level + source directory (or your user login home directory) that defines + appropriate values for the "manager.password", "manager.url", and + "manager.username" properties described above. + + For more information about the Manager web application, and the functionality + of these tasks, see <http://localhost:8080/tomcat-docs/manager-howto.html>. + +--> + + <taskdef resource="org/apache/catalina/ant/catalina.tasks" + classpathref="compile.classpath"/> + + +<!-- ==================== Compilation Control Options ==================== --> + +<!-- + + These properties control option settings on the Javac compiler when it + is invoked using the <javac> task. + + compile.debug Should compilation include the debug option? + + compile.deprecation Should compilation include the deprecation option? + +--> + + <property name="compile.debug" value="true"/> + <property name="compile.deprecation" value="false"/> + + + +<!-- ==================== All Target ====================================== --> + +<!-- + + The "all" target is a shortcut for running the "clean" target followed + by the "compile" target, to force a complete recompile. + +--> + + <target name="all" depends="clean,compile" + description="Clean build and dist directories, then compile"/> + + + +<!-- ==================== Clean Target ==================================== --> + +<!-- + + The "clean" target deletes any previous "build" and "dist" directory, + so that you can be ensured the application can be built from scratch. + +--> + + <target name="clean" + description="Delete old build and dist directories"> + <delete dir="${build.home}"/> + <delete dir="${dist.home}"/> + </target> + + + +<!-- ==================== Compile Target ================================== --> + +<!-- + + The "compile" target transforms source files (from your "src" directory) + into object files in the appropriate location in the build directory. + This example assumes that you will be including your classes in an + unpacked directory hierarchy under "/WEB-INF/classes". + +--> + + <target name="compile" depends="prepare" + description="Compile Java sources"> + + <!-- Compile Java classes as necessary --> + <mkdir dir="${build.home}/WEB-INF/classes"/> + <javac srcdir="${src.home}" + destdir="${build.home}/WEB-INF/classes" + debug="${compile.debug}" + deprecation="${compile.deprecation}"> + <classpath refid="compile.classpath"/> + </javac> + + <!-- Copy application resources --> + <copy todir="${build.home}/WEB-INF/classes"> + <fileset dir="${src.home}" excludes="**/*.java"/> + </copy> + + </target> + + + +<!-- ==================== Dist Target ===================================== --> + + +<!-- + + The "dist" target creates a binary distribution of your application + in a directory structure ready to be archived in a tar.gz or zip file. + Note that this target depends on two others: + + * "compile" so that the entire web application (including external + dependencies) will have been assembled + + * "javadoc" so that the application Javadocs will have been created + +--> + + <target name="dist" depends="compile,javadoc" + description="Create binary distribution"> + + <!-- Copy documentation subdirectories --> + <mkdir dir="${dist.home}/docs"/> + <copy todir="${dist.home}/docs"> + <fileset dir="${docs.home}"/> + </copy> + + <!-- Create application JAR file --> + <jar jarfile="${dist.home}/${app.name}-${app.version}.war" + basedir="${build.home}"/> + + <!-- Copy additional files to ${dist.home} as necessary --> + + </target> + + + +<!-- ==================== Install Target ================================== --> + +<!-- + + The "install" target tells the specified Tomcat installation to dynamically + install this web application and make it available for execution. It does + *not* cause the existence of this web application to be remembered across + Tomcat restarts; if you restart the server, you will need to re-install all + this web application. + + If you have already installed this application, and simply want Tomcat to + recognize that you have updated Java classes (or the web.xml file), use the + "reload" target instead. + + NOTE: This target will only succeed if it is run from the same server that + Tomcat is running on. + + NOTE: This is the logical opposite of the "remove" target. + +--> + + <target name="install" depends="compile" + description="Install application to servlet container"> + + <deploy url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}" + localWar="file://${build.home}"/> + + </target> + + +<!-- ==================== Javadoc Target ================================== --> + +<!-- + + The "javadoc" target creates Javadoc API documentation for the Java + classes included in your application. Normally, this is only required + when preparing a distribution release, but is available as a separate + target in case the developer wants to create Javadocs independently. + +--> + + <target name="javadoc" depends="compile" + description="Create Javadoc API documentation"> + + <mkdir dir="${dist.home}/docs/api"/> + <javadoc sourcepath="${src.home}" + destdir="${dist.home}/docs/api" + packagenames="*"> + <classpath refid="compile.classpath"/> + </javadoc> + + </target> + + + +<!-- ====================== List Target =================================== --> + +<!-- + + The "list" target asks the specified Tomcat installation to list the + currently running web applications, either loaded at startup time or + installed dynamically. It is useful to determine whether or not the + application you are currently developing has been installed. + +--> + + <target name="list" + description="List installed applications on servlet container"> + + <list url="${manager.url}" + username="${manager.username}" + password="${manager.password}"/> + + </target> + + +<!-- ==================== Prepare Target ================================== --> + +<!-- + + The "prepare" target is used to create the "build" destination directory, + and copy the static contents of your web application to it. If you need + to copy static files from external dependencies, you can customize the + contents of this task. + + Normally, this task is executed indirectly when needed. + +--> + + <target name="prepare"> + + <!-- Create build directories as needed --> + <mkdir dir="${build.home}"/> + <mkdir dir="${build.home}/WEB-INF"/> + <mkdir dir="${build.home}/WEB-INF/classes"/> + + + <!-- Copy static content of this web application --> + <copy todir="${build.home}"> + <fileset dir="${web.home}"/> + </copy> + + <!-- Copy external dependencies as required --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> + <mkdir dir="${build.home}/WEB-INF/lib"/> +<!-- + <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/> +--> + + <!-- Copy static files from external dependencies as needed --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> + + </target> + + +<!-- ==================== Reload Target =================================== --> + +<!-- + + The "reload" signals the specified application Tomcat to shut itself down + and reload. This can be useful when the web application context is not + reloadable and you have updated classes or property files in the + /WEB-INF/classes directory or when you have added or updated jar files in the + /WEB-INF/lib directory. + + NOTE: The /WEB-INF/web.xml web application configuration file is not reread + on a reload. If you have made changes to your web.xml file you must stop + then start the web application. + +--> + + <target name="reload" depends="compile" + description="Reload application on servlet container"> + + <reload url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}"/> + + </target> + + +<!-- ==================== Remove Target =================================== --> + +<!-- + + The "remove" target tells the specified Tomcat installation to dynamically + remove this web application from service. + + NOTE: This is the logical opposite of the "install" target. + +--> + + <target name="remove" + description="Remove application on servlet container"> + + <undeploy url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}"/> + + </target> + + +</project> diff --git a/src/tomcat/webapps/docs/appdev/deployment.html b/src/tomcat/webapps/docs/appdev/deployment.html new file mode 100644 index 0000000000000000000000000000000000000000..7a6503747fc433a763f9cba0f0d672fbc4efb619 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/deployment.html @@ -0,0 +1,244 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Deployment</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/deployment"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Deployment</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Background">Background</a></li><li><a href="#Standard_Directory_Layout">Standard Directory Layout</a></li><li><a href="#Shared_Library_Files">Shared Library Files</a></li><li><a href="#Web_Application_Deployment_Descriptor">Web Application Deployment Descriptor</a></li><li><a href="#Tomcat_Context_Descriptor">Tomcat Context Descriptor</a></li><li><a href="#Deployment_With_Tomcat">Deployment With Tomcat</a></li></ul> +</div><h3 id="Background">Background</h3><div class="text"> + +<p>Before describing how to organize your source code directories, +it is useful to examine the runtime organization of a web application. +Prior to the Servlet API Specification, version 2.2, there was little +consistency between server platforms. However, servers that conform +to the 2.2 (or later) specification are required to accept a +<em>Web Application Archive</em> in a standard format, which is discussed +further below.</p> + +<p>A web application is defined as a hierarchy of directories and files +in a standard layout. Such a hierarchy can be accessed in its "unpacked" +form, where each directory and file exists in the filesystem separately, +or in a "packed" form known as a Web ARchive, or WAR file. The former format +is more useful during development, while the latter is used when you +distribute your application to be installed.</p> + +<p>The top-level directory of your web application hierarchy is also the +<em>document root</em> of your application. Here, you will place the HTML +files and JSP pages that comprise your application's user interface. When the +system administrator deploys your application into a particular server, he +or she assigns a <em>context path</em> to your application (a later section +of this manual describes deployment on Tomcat). Thus, if the +system administrator assigns your application to the context path +<code>/catalog</code>, then a request URI referring to +<code>/catalog/index.html</code> will retrieve the <code>index.html</code> +file from your document root.</p> + +</div><h3 id="Standard_Directory_Layout">Standard Directory Layout</h3><div class="text"> + +<p>To facilitate creation of a Web Application Archive file in the required +format, it is convenient to arrange the "executable" files of your web +application (that is, the files that Tomcat actually uses when executing +your app) in the same organization as required by the WAR format itself. +To do this, you will end up with the following contents in your +application's "document root" directory:</p> +<ul> +<li><strong>*.html, *.jsp, etc.</strong> - The HTML and JSP pages, along + with other files that must be visible to the client browser (such as + JavaScript, stylesheet files, and images) for your application. + In larger applications you may choose to divide these files into + a subdirectory hierarchy, but for smaller apps, it is generally + much simpler to maintain only a single directory for these files. + <br><br></li> +<li><strong>/WEB-INF/web.xml</strong> - The <em>Web Application Deployment + Descriptor</em> for your application. This is an XML file describing + the servlets and other components that make up your application, + along with any initialization parameters and container-managed + security constraints that you want the server to enforce for you. + This file is discussed in more detail in the following subsection. + <br><br></li> +<li><strong>/WEB-INF/classes/</strong> - This directory contains any Java + class files (and associated resources) required for your application, + including both servlet and non-servlet classes, that are not combined + into JAR files. If your classes are organized into Java packages, + you must reflect this in the directory hierarchy under + <code>/WEB-INF/classes/</code>. For example, a Java class named + <code>com.mycompany.mypackage.MyServlet</code> + would need to be stored in a file named + <code>/WEB-INF/classes/com/mycompany/mypackage/MyServlet.class</code>. + <br><br></li> +<li><strong>/WEB-INF/lib/</strong> - This directory contains JAR files that + contain Java class files (and associated resources) required for your + application, such as third party class libraries or JDBC drivers.</li> +</ul> + +<p>When you install an application into Tomcat (or any other 2.2 or later +Servlet container), the classes in the <code>WEB-INF/classes/</code> +directory, as well as all classes in JAR files found in the +<code>WEB-INF/lib/</code> directory, are made visible to other classes +within your particular web application. Thus, if +you include all of the required library classes in one of these places (be +sure to check licenses for redistribution rights for any third party libraries +you utilize), you will simplify the installation of your web application -- +no adjustment to the system class path (or installation of global library +files in your server) will be necessary.</p> + +<p>Much of this information was extracted from Chapter 9 of the Servlet +API Specification, version 2.3, which you should consult for more details.</p> + +</div><h3 id="Shared_Library_Files">Shared Library Files</h3><div class="text"> + +<p>Like most servlet containers, Tomcat also supports mechanisms to install +library JAR files (or unpacked classes) once, and make them visible to all +installed web applications (without having to be included inside the web +application itself). The details of how Tomcat locates and shares such +classes are described in the +<a href="../class-loader-howto.html">Class Loader HOW-TO</a> documentation. +The location commonly used within a Tomcat installation for shared code is +<strong>$CATALINA_HOME/lib</strong>. JAR files placed here are visible both to +web applications and internal Tomcat code. This is a good place to put JDBC +drivers that are required for both your application or internal Tomcat use +(such as for a JDBCRealm).</p> + +<p>Out of the box, a standard Tomcat installation includes a variety +of pre-installed shared library files, including:</p> +<ul> +<li>The <em>Servlet 4.0</em> and <em>JSP 2.3</em> APIs that are fundamental + to writing servlets and JavaServer Pages.<br><br></li> +</ul> + +</div><h3 id="Web_Application_Deployment_Descriptor">Web Application Deployment Descriptor</h3><div class="text"> + +<p>As mentioned above, the <code>/WEB-INF/web.xml</code> file contains the +Web Application Deployment Descriptor for your application. As the filename +extension implies, this file is an XML document, and defines everything about +your application that a server needs to know (except the <em>context path</em>, +which is assigned by the system administrator when the application is +deployed).</p> + +<p>The complete syntax and semantics for the deployment descriptor is defined +in Chapter 13 of the Servlet API Specification, version 2.3. Over time, it +is expected that development tools will be provided that create and edit the +deployment descriptor for you. In the meantime, to provide a starting point, +a <a href="web.xml.txt" target="_blank">basic web.xml file</a> +is provided. This file includes comments that describe the purpose of each +included element.</p> + +<p><strong>NOTE</strong> - The Servlet Specification includes a Document +Type Descriptor (DTD) for the web application deployment descriptor, and +Tomcat enforces the rules defined here when processing your application's +<code>/WEB-INF/web.xml</code> file. In particular, you <strong>must</strong> +enter your descriptor elements (such as <code><filter></code>, +<code><servlet></code>, and <code><servlet-mapping></code> in +the order defined by the DTD (see Section 13.3).</p> + +</div><h3 id="Tomcat_Context_Descriptor">Tomcat Context Descriptor</h3><div class="text"> + +<p>A /META-INF/context.xml file can be used to define Tomcat specific +configuration options, such as an access log, data sources, session manager +configuration and more. This XML file must contain one Context element, which +will be considered as if it was the child of the Host element corresponding +to the Host to which the web application is being deployed. The +<a href="../config/context.html">Tomcat configuration documentation</a> contains +information on the Context element.</p> + +</div><h3 id="Deployment_With_Tomcat">Deployment With Tomcat</h3><div class="text"> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +<p>In order to be executed, a web application must be deployed on +a servlet container. This is true even during development. +We will describe using Tomcat to provide the execution environment. +A web application can be deployed in Tomcat by one of the following +approaches:</p> +<ul> +<li><em>Copy unpacked directory hierarchy into a subdirectory in directory + <code>$CATALINA_BASE/webapps/</code></em>. Tomcat will assign a + context path to your application based on the subdirectory name you + choose. We will use this technique in the <code>build.xml</code> + file that we construct, because it is the quickest and easiest approach + during development. Be sure to restart Tomcat after installing or + updating your application. + <br><br></li> +<li><em>Copy the web application archive file into directory + <code>$CATALINA_BASE/webapps/</code></em>. When Tomcat is started, it will + automatically expand the web application archive file into its unpacked + form, and execute the application that way. This approach would typically + be used to install an additional application, provided by a third party + vendor or by your internal development staff, into an existing + Tomcat installation. <strong>NOTE</strong> - If you use this approach, + and wish to update your application later, you must both replace the + web application archive file <strong>AND</strong> delete the expanded + directory that Tomcat created, and then restart Tomcat, in order to reflect + your changes. + <br><br></li> +<li><em>Use the Tomcat "Manager" web application to deploy and undeploy + web applications</em>. Tomcat includes a web application, deployed + by default on context path <code>/manager</code>, that allows you to + deploy and undeploy applications on a running Tomcat server without + restarting it. See <a href="../manager-howto.html">Manager App HOW-TO</a> + for more information on using the Manager web application.<br><br></li> +<li><em>Use "Manager" Ant Tasks In Your Build Script</em>. Tomcat + includes a set of custom task definitions for the <code>Ant</code> + build tool that allow you to automate the execution of commands to the + "Manager" web application. These tasks are used in the Tomcat deployer. + <br><br></li> +<li><em>Use the Tomcat Deployer</em>. Tomcat includes a packaged tool + bundling the Ant tasks, and can be used to automatically precompile JSPs + which are part of the web application before deployment to the server. + <br><br></li> +</ul> + +<p>Deploying your app on other servlet containers will be specific to each +container, but all containers compatible with the Servlet API Specification +(version 2.2 or later) are required to accept a web application archive file. +Note that other containers are <strong>NOT</strong> required to accept an +unpacked directory structure (as Tomcat does), or to provide mechanisms for +shared library files, but these features are commonly available.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/index.html b/src/tomcat/webapps/docs/appdev/index.html new file mode 100644 index 0000000000000000000000000000000000000000..6c471040d09becf3ce93cc99bffe81d952812c98 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/index.html @@ -0,0 +1,87 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Table of Contents</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/index"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Table of Contents</h2><h3 id="Preface">Preface</h3><div class="text"> + +<p>This manual includes contributions from many members of the Tomcat Project +developer community. The following authors have provided significant content: +</p> +<ul> +<li>Craig R. McClanahan + (<a href="mailto:craigmcc@apache.org">craigmcc@apache.org</a>)</li> +</ul> + +</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> + +<p>The information presented is divided into the following sections:</p> +<ul> +<li><a href="introduction.html"><strong>Introduction</strong></a> - + Briefly describes the information covered here, with + links and references to other sources of information.</li> +<li><a href="installation.html"><strong>Installation</strong></a> - + Covers acquiring and installing the required software + components to use Tomcat for web application development.</li> +<li><a href="deployment.html"><strong>Deployment Organization</strong></a> - + Discusses the standard directory layout for a web application + (defined in the Servlet API Specification), the Web Application + Deployment Descriptor, and options for integration with Tomcat + in your development environment.</li> +<li><a href="source.html"><strong>Source Organization</strong></a> - + Describes a useful approach to organizing the source code + directories for your project, and introduces the + <code>build.xml</code> used by Ant to manage compilation.</li> +<li><a href="processes.html"><strong>Development Processes</strong></a> - + Provides brief descriptions of typical development processes + utilizing the recommended deployment and source organizations.</li> +<li><a href="sample/" target="_blank"><strong>Example Application</strong></a> - + This directory contains a very simple, but functionally complete, + "Hello, World" application built according to the principles + described in this manual. You can use this application to + practice using the described techniques.</li> +</ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/installation.html b/src/tomcat/webapps/docs/appdev/installation.html new file mode 100644 index 0000000000000000000000000000000000000000..eb0cecb6ac89421709e7097bec8b3c760ad6a9eb --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/installation.html @@ -0,0 +1,115 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Installation</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/installation"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Installation</h2><h3 id="Installation">Installation</h3><div class="text"> + +<p>In order to use Tomcat for developing web applications, you must first +install it (and the software it depends on). The required steps are outlined +in the following subsections.</p> + +<div class="subsection"><h4 id="JDK">JDK</h4><div class="text"> + +<p>Tomcat 9.0 was designed to run on Java SE 8 or later. +</p> + +<p>Compatible JDKs for many platforms (or links to where they can be found) +are available at +<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a>.</p> + +</div></div> + +<div class="subsection"><h4 id="Tomcat">Tomcat</h4><div class="text"> + +<p>Binary downloads of the <strong>Tomcat</strong> server are available from +<a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a>. +This manual assumes you are using the most recent release +of Tomcat 9. Detailed instructions for downloading and installing +Tomcat are available <a href="../setup.html">here</a>.</p> + +<p>In the remainder of this manual, example shell scripts assume that you have +set an environment variable <code>CATALINA_HOME</code> that contains the +pathname to the directory in which Tomcat has been installed. Optionally, if +Tomcat has been configured for multiple instances, each instance will have its +own <code>CATALINA_BASE</code> configured.</p> + +</div></div> + + +<div class="subsection"><h4 id="Ant">Ant</h4><div class="text"> + +<p>Binary downloads of the <strong>Ant</strong> build tool are available from +<a href="http://ant.apache.org/">http://ant.apache.org/</a>. +This manual assumes you are using Ant 1.8 or later. The instructions may +also be compatible with other versions, but this has not been tested.</p> + +<p>Download and install Ant. +Then, add the <code>bin</code> directory of the Ant distribution to your +<code>PATH</code> environment variable, following the standard practices for +your operating system platform. Once you have done this, you will be able to +execute the <code>ant</code> shell command directly.</p> + +</div></div> + + +<div class="subsection"><h4 id="CVS">CVS</h4><div class="text"> + +<p>Besides the required tools described above, you are strongly encouraged +to download and install a <em>source code control</em> system, such as the +<strong>Concurrent Version System</strong> (CVS), to maintain historical +versions of the source files that make up your web application. Besides +the server, you will also need appropriate client +tools to check out source code files, and check in modified versions.</p> + +<p>Detailed instructions for installing and using source code control +applications is beyond the scope of this manual. However, CVS server and +client tools for many platforms (along with documentation) can be downloaded +from <a href="http://www.cvshome.org/">http://www.cvshome.org/</a>.</p> + +</div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/introduction.html b/src/tomcat/webapps/docs/appdev/introduction.html new file mode 100644 index 0000000000000000000000000000000000000000..1a50b30d463551804605b5faa92cc175b9dc9ef7 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/introduction.html @@ -0,0 +1,100 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Introduction</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/introduction"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Introduction</h2><h3 id="Overview">Overview</h3><div class="text"> + +<p>Congratulations! You've decided to (or been told to) learn how to +build web applications using servlets and JSP pages, and picked the +Tomcat server to use for your learning and development. But now what +do you do?</p> + +<p>This manual is a primer covering the basic steps of using Tomcat to +set up a development environment, organize your source code, and then +build and test your application. It does not discuss architectures or +recommended coding practices for web application development, +or provide in depth instructions on operating the development +tools that are discussed. References to sources of additional information +are included in the following subsections.</p> + +<p>The discussion in this manual is aimed at developers who will be using +a text editor along with command line tools to develop and debug their +applications. As such, the recommendations are fairly generic – but you +should easily be able to apply them in either a Windows-based or Unix-based +development environment. If you are utilizing an Integrated Development +Environment (IDE) tool, you will need to adapt the advice given here to +the details of your particular environment.</p> + +</div><h3 id="Links">Links</h3><div class="text"> + +<p>The following links provide access to selected sources of online +information, documentation, and software that is useful in developing +web applications with Tomcat.</p> +<ul> +<li><p><a href="http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html">http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html</a> - + <i>JavaServer Pages (JSP) Specification, Version 2.3</i>. Describes + the programming environment provided by standard implementations + of the JavaServer Pages (JSP) technology. In conjunction with + the Servlet API Specification (see below), this document describes + what a portable API page is allowed to contain. Specific + information on scripting (Chapter 9), tag extensions (Chapter 7), + and packaging JSP pages (Appendix A) is useful. The Javadoc + API Documentation is included in the specification, and with the + Tomcat download.</p></li> +<li><p><a href="https://jcp.org/aboutJava/communityprocess/final/jsr369/index.html">https://jcp.org/aboutJava/communityprocess/final/jsr369/index.html</a> - + <i>Servlet API Specification, Version 4.0</i>. Describes the + programming environment that must be provided by all servlet + containers conforming to this specification. In particular, you + will need this document to understand the web application + directory structure and deployment file (Chapter 10), methods of + mapping request URIs to servlets (Chapter 12), container managed + security (Chapter 13), and the syntax of the <code>web.xml</code> + Web Application Deployment Descriptor (Chapter 14). The Javadoc + API Documentation is included in the specification, and with the + Tomcat download.</p></li> +</ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/processes.html b/src/tomcat/webapps/docs/appdev/processes.html new file mode 100644 index 0000000000000000000000000000000000000000..3d4b44c196867e16a208ddf97373c7194945b019 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/processes.html @@ -0,0 +1,315 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Development Processes</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/processes"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Development Processes</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Development_Processes">Development Processes</a><ol><li><a href="#One-Time_Setup_of_Ant_and_Tomcat_for_Development">One-Time Setup of Ant and Tomcat for Development</a></li><li><a href="#Create_Project_Source_Code_Directory">Create Project Source Code Directory</a></li><li><a href="#Edit_Source_Code_and_Pages">Edit Source Code and Pages</a></li><li><a href="#Build_the_Web_Application">Build the Web Application</a></li><li><a href="#Test_Your_Web_Application">Test Your Web Application</a></li><li><a href="#Creating_a_Release">Creating a Release</a></li></ol></li></ul> +</div><h3 id="Development_Processes">Development Processes</h3><div class="text"> + +<p>Although application development can take many forms, this manual proposes +a fairly generic process for creating web applications using Tomcat. The +following sections highlight the commands and tasks that you, as the developer +of the code, will perform. The same basic approach works when you have +multiple programmers involved, as long as you have an appropriate source code +control system and internal team rules about who is working on what parts +of the application at any given time.</p> + +<p>The task descriptions below assume that you will be using CVS for source +code control, and that you have already configured access to the appropriate +CVS repository. Instructions for doing this are beyond the scope of this +manual. If you are using a different source code control environment, you +will need to figure out the corresponding commands for your system.</p> + + +<div class="subsection"><h4 id="One-Time_Setup_of_Ant_and_Tomcat_for_Development">One-Time Setup of Ant and Tomcat for Development</h4><div class="text"> + +<p>In order to take advantage of the special Ant tasks that interact with the +<em>Manager</em> web application, you need to perform the following tasks +once (no matter how many web applications you plan to develop).</p> +<ul> +<li><p><em>Configure the Ant custom tasks</em>. The implementation code for the + Ant custom tasks is in a JAR file named + <code>$CATALINA_HOME/lib/catalina-ant.jar</code>, which must be + copied in to the <code>lib</code> directory of your Ant installation. + </p></li> +<li><p><em>Define one or more Tomcat users</em>. The <em>Manager</em> web + application runs under a security constraint that requires a user to be + logged in, and have the security role <code>manager-script</code> assigned + to him or her. How such users are defined depends on which Realm you have + configured in Tomcat's <code>conf/server.xml</code> file -- see the + <a href="../realm-howto.html">Realm Configuration HOW-TO</a> for more + information. You may define any number of users (with any username + and password that you like) with the <code>manager-script</code> role. + </p></li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="Create_Project_Source_Code_Directory">Create Project Source Code Directory</h4><div class="text"> + +<p>The first step is to create a new project source directory, and customize +the <code>build.xml</code> and <code>build.properties</code> files you will +be using. The directory structure is described in <a href="source.html">the +previous section</a>, or you can use the +<a href="sample/">sample application</a> as a starting point.</p> + +<p>Create your project source directory, and define it within your CVS +repository. This might be done by a series of commands like this, where +<code>{project}</code> is the name under which your project should be +stored in the CVS repository, and {username} is your login username:</p> +<div class="codeBox"><pre><code>cd {my home directory} +mkdir myapp <-- Assumed "project source directory" +cd myapp +mkdir docs +mkdir src +mkdir web +mkdir web/WEB-INF +cvs import -m "Initial Project Creation" {project} \ + {username} start</code></pre></div> + +<p>Now, to verify that it was created correctly in CVS, we will perform a +checkout of the new project:</p> +<div class="codeBox"><pre><code>cd .. +mv myapp myapp.bu +cvs checkout {project}</code></pre></div> + +<p>Next, you will need to create and check in an initial version of the +<code>build.xml</code> script to be used for development. For getting +started quickly and easily, base your <code>build.xml</code> on the +<a href="build.xml.txt">basic build.xml file</a>, included with this manual, +or code it from scratch.</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp +emacs build.xml <-- if you want a real editor :-) +cvs add build.xml +cvs commit</code></pre></div> + +<p>Until you perform the CVS commit, your changes are local to your own +development directory. Committing makes those changes visible to other +developers on your team that are sharing the same CVS repository.</p> + +<p>The next step is to customize the Ant <em>properties</em> that are +named in the <code>build.xml</code> script. This is done by creating a +file named <code>build.properties</code> in your project's top-level +directory. The supported properties are listed in the comments inside +the sample <code>build.xml</code> script. At a minimum, you will generally +need to define the <code>catalina.home</code> property defining where +Tomcat is installed, and the manager application username and password. +You might end up with something like this:</p> +<div class="codeBox"><pre><code># Context path to install this application on +app.path=/hello + +# Tomcat installation directory +catalina.home=/usr/local/apache-tomcat-<version-major-minor/> + +# Manager webapp username and password +manager.username=myusername +manager.password=mypassword</code></pre></div> + +<p>In general, you will <strong>not</strong> want to check the +<code>build.properties</code> file in to the CVS repository, because it +is unique to each developer's environment.</p> + +<p>Now, create the initial version of the web application deployment +descriptor. You can base <code>web.xml</code> on the +<a href="web.xml.txt">basic web.xml file</a>, or code it from scratch.</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp/web/WEB-INF +emacs web.xml +cvs add web.xml +cvs commit</code></pre></div> + +Note that this is only an example web.xml file. The full definition +of the deployment descriptor file is in the +<a href="http://wiki.apache.org/tomcat/Specifications">Servlet Specification.</a> + +</div></div> + + +<div class="subsection"><h4 id="Edit_Source_Code_and_Pages">Edit Source Code and Pages</h4><div class="text"> + +<p>The edit/build/test tasks will generally be your most common activities +during development and maintenance. The following general principles apply. +As described in <a href="source.html">Source Organization</a>, newly created +source files should be located in the appropriate subdirectory, under your +project source directory.</p> + +<p>Whenever you wish to refresh your development directory to reflect the +work performed by other developers, you will ask CVS to do it for you:</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp +cvs update -dP</code></pre></div> + +<p>To create a new file, go to the appropriate directory, create the file, +and register it with CVS. When you are satisfied with it's contents (after +building and testing is successful), commit the new file to the repository. +For example, to create a new JSP page:</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp/web <-- Ultimate destination is document root +emacs mypage.jsp +cvs add mypage.jsp +... build and test the application ... +cvs commit</code></pre></div> + +<p>Java source code that is defined in packages must be organized in a +directory hierarchy (under the <strong>src/</strong> subdirectory) that +matches the package names. For example, a Java class named +<code>com.mycompany.mypackage.MyClass.java</code> should be stored in file +<code>src/com/mycompany/mypackage/MyClass.java</code>. +Whenever you create a new subdirectory, don't forget to +register it with CVS.</p> + +<p>To edit an existing source file, you will generally just start editing +and testing, then commit the changed file when everything works. Although +CVS can be configured to required you to "check out" or "lock" a file you +are going to be modifying, this is generally not used.</p> + +</div></div> + + +<div class="subsection"><h4 id="Build_the_Web_Application">Build the Web Application</h4><div class="text"> + +<p>When you are ready to compile the application, issue the following +commands (generally, you will want a shell window open that is set to +the project source directory, so that only the last command is needed):</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp <-- Normally leave a window open here +ant</code></pre></div> + +<p>The Ant tool will be execute the default "compile" target in your +<code>build.xml</code> file, which will compile any new or updated Java +code. If this is the first time you compile after a "build clean", +it will cause everything to be recompiled.</p> + +<p>To force the recompilation of your entire application, do this instead:</p> +<div class="codeBox"><pre><code>cd {my home directory} +cd myapp +ant all</code></pre></div> + +<p>This is a very good habit immediately before checking in changes, to +make sure that you have not introduced any subtle problems that Javac's +conditional checking did not catch.</p> + +</div></div> + + +<div class="subsection"><h4 id="Test_Your_Web_Application">Test Your Web Application</h4><div class="text"> + +<p>To test your application, you will want to install it under Tomcat. The +quickest way to do that is to use the custom Ant tasks that are included in +the sample <code>build.xml</code> script. Using these commands might follow +a pattern like this:</p> +<ul> +<li><p><em>Start Tomcat if needed</em>. If Tomcat is not already running, + you will need to start it in the usual way. + </p></li> +<li><p><em>Compile your application</em>. Use the <code>ant compile</code> + command (or just <code>ant</code>, since this is the default). Make + sure that there are no compilation errors. + </p></li> +<li><p><em>Install the application</em>. Use the <code>ant install</code> + command. This tells Tomcat to immediately start running your app on + the context path defined in the <code>app.path</code> build property. + Tomcat does <strong>NOT</strong> have to be restarted for this to + take effect. + </p></li> +<li><p><em>Test the application</em>. Using your browser or other testing + tools, test the functionality of your application. + </p></li> +<li><p><em>Modify and rebuild as needed</em>. As you discover that changes + are required, make those changes in the original <strong>source</strong> + files, not in the output build directory, and re-issue the + <code>ant compile</code> command. This ensures that your changes will + be available to be saved (via <code>cvs commit</code>) later on -- + the output build directory is deleted and recreated as necessary. + </p></li> +<li><p><em>Reload the application</em>. Tomcat will recognize changes in + JSP pages automatically, but it will continue to use the old versions + of any servlet or JavaBean classes until the application is reloaded. + You can trigger this by executing the <code>ant reload</code> command. + </p></li> +<li><p><em>Remove the application when you are done</em>. When you are through + working on this application, you can remove it from live execution by + running the <code>ant remove</code> command. + </p></li> +</ul> + +<p>Do not forget to commit your changes to the source code repository when +you have completed your testing!</p> + +</div></div> + + +<div class="subsection"><h4 id="Creating_a_Release">Creating a Release</h4><div class="text"> + +<p>When you are through adding new functionality, and you've tested everything +(you DO test, don't you :-), it is time to create the distributable version +of your web application that can be deployed on the production server. The +following general steps are required:</p> +<ul> +<li><p>Issue the command <code>ant all</code> from the project source + directory, to rebuild everything from scratch one last time. + </p></li> +<li><p>Use the <code>cvs tag</code> command to create an identifier for + all of the source files utilized to create this release. This allows + you to reliably reconstruct a release (from sources) at a later + time. + </p></li> +<li><p>Issue the command <code>ant dist</code> to create a distributable + web application archive (WAR) file, as well as a JAR file containing + the corresponding source code. + </p></li> +<li><p>Package the contents of the <code>dist</code> directory using the + <strong>tar</strong> or <strong>zip</strong> utility, according to + the standard release procedures used by your organization. + </p></li> +</ul> + +</div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/sample/build.xml b/src/tomcat/webapps/docs/appdev/sample/build.xml new file mode 100644 index 0000000000000000000000000000000000000000..51d8350e8b0c425f03868972c8222cb9819ec467 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/build.xml @@ -0,0 +1,508 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- + General purpose build script for web applications and web services, + including enhanced support for deploying directly to a Tomcat + based server. + + This build script assumes that the source code of your web application + is organized into the following subdirectories underneath the source + code directory from which you execute the build script: + + docs Static documentation files to be copied to + the "docs" subdirectory of your distribution. + + src Java source code (and associated resource files) + to be compiled to the "WEB-INF/classes" + subdirectory of your web application. + + web Static HTML, JSP, and other content (such as + image files), including the WEB-INF subdirectory + and its configuration file contents. +--> + + +<!-- A "project" describes a set of targets that may be requested + when Ant is executed. The "default" attribute defines the + target which is executed if no specific target is requested, + and the "basedir" attribute defines the current working directory + from which Ant executes the requested task. This is normally + set to the current working directory. +--> + +<project name="My Project" default="compile" basedir="."> + + + +<!-- ===================== Property Definitions =========================== --> + + +<!-- + + Each of the following properties are used in the build script. + Values for these properties are set by the first place they are + defined, from the following list: + + * Definitions on the "ant" command line (ant -Dfoo=bar compile). + + * Definitions from a "build.properties" file in the top level + source directory of this application. + + * Definitions from a "build.properties" file in the developer's + home directory. + + * Default definitions in this build.xml file. + + You will note below that property values can be composed based on the + contents of previously defined properties. This is a powerful technique + that helps you minimize the number of changes required when your development + environment is modified. Note that property composition is allowed within + "build.properties" files as well as in the "build.xml" script. + +--> + + <property file="build.properties"/> + <property file="${user.home}/build.properties"/> + + +<!-- ==================== File and Directory Names ======================== --> + + +<!-- + + These properties generally define file and directory names (or paths) that + affect where the build process stores its outputs. + + app.name Base name of this application, used to + construct filenames and directories. + Defaults to "myapp". + + app.path Context path to which this application should be + deployed (defaults to "/" plus the value of the + "app.name" property). + + app.version Version number of this iteration of the application. + + build.home The directory into which the "prepare" and + "compile" targets will generate their output. + Defaults to "build". + + catalina.home The directory in which you have installed + a binary distribution of Tomcat. This will + be used by the "deploy" target. + + dist.home The name of the base directory in which + distribution files are created. + Defaults to "dist". + + manager.password The login password of a user that is assigned the + "manager-script" role (so that he or she can execute + commands via the "/manager" web application) + + manager.url The URL of the "/manager" web application on the + Tomcat installation to which we will deploy web + applications and web services. + + manager.username The login username of a user that is assigned the + "manager-script" role (so that he or she can execute + commands via the "/manager" web application) + +--> + + <property name="app.name" value="myapp"/> + <property name="app.path" value="/${app.name}"/> + <property name="app.version" value="0.1-dev"/> + <property name="build.home" value="${basedir}/build"/> + <property name="catalina.home" value="../../../.."/> <!-- UPDATE THIS! --> + <property name="dist.home" value="${basedir}/dist"/> + <property name="docs.home" value="${basedir}/docs"/> + <property name="manager.url" value="http://localhost:8080/manager/text"/> + <property name="src.home" value="${basedir}/src"/> + <property name="web.home" value="${basedir}/web"/> + + +<!-- ==================== External Dependencies =========================== --> + + +<!-- + + Use property values to define the locations of external JAR files on which + your application will depend. In general, these values will be used for + two purposes: + * Inclusion on the classpath that is passed to the Javac compiler + * Being copied into the "/WEB-INF/lib" directory during execution + of the "deploy" target. + + Because we will automatically include all of the Java classes that Tomcat + exposes to web applications, we will not need to explicitly list any of those + dependencies. You only need to worry about external dependencies for JAR + files that you are going to include inside your "/WEB-INF/lib" directory. + +--> + +<!-- Dummy external dependency --> +<!-- + <property name="foo.jar" + value="/path/to/foo.jar"/> +--> + + +<!-- ==================== Compilation Classpath =========================== --> + +<!-- + + Rather than relying on the CLASSPATH environment variable, Ant includes + features that makes it easy to dynamically construct the classpath you + need for each compilation. The example below constructs the compile + classpath to include the servlet.jar file, as well as the other components + that Tomcat makes available to web applications automatically, plus anything + that you explicitly added. + +--> + + <path id="compile.classpath"> + + <!-- Include all JAR files that will be included in /WEB-INF/lib --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> +<!-- + <pathelement location="${foo.jar}"/> +--> + + <!-- Include all elements that Tomcat exposes to applications --> + <fileset dir="${catalina.home}/bin"> + <include name="*.jar"/> + </fileset> + <pathelement location="${catalina.home}/lib"/> + <fileset dir="${catalina.home}/lib"> + <include name="*.jar"/> + </fileset> + + </path> + + + +<!-- ================== Custom Ant Task Definitions ======================= --> + + +<!-- + + These properties define custom tasks for the Ant build tool that interact + with the "/manager" web application installed with Tomcat. Before they + can be successfully utilized, you must perform the following steps: + + - Copy the file "lib/catalina-ant.jar" from your Tomcat + installation into the "lib" directory of your Ant installation. + + - Create a "build.properties" file in your application's top-level + source directory (or your user login home directory) that defines + appropriate values for the "manager.password", "manager.url", and + "manager.username" properties described above. + + For more information about the Manager web application, and the functionality + of these tasks, see <http://localhost:8080/tomcat-docs/manager-howto.html>. + +--> + + <taskdef resource="org/apache/catalina/ant/catalina.tasks" + classpathref="compile.classpath"/> + + +<!-- ==================== Compilation Control Options ==================== --> + +<!-- + + These properties control option settings on the Javac compiler when it + is invoked using the <javac> task. + + compile.debug Should compilation include the debug option? + + compile.deprecation Should compilation include the deprecation option? + +--> + + <property name="compile.debug" value="true"/> + <property name="compile.deprecation" value="false"/> + + + +<!-- ==================== All Target ====================================== --> + +<!-- + + The "all" target is a shortcut for running the "clean" target followed + by the "compile" target, to force a complete recompile. + +--> + + <target name="all" depends="clean,compile" + description="Clean build and dist directories, then compile"/> + + + +<!-- ==================== Clean Target ==================================== --> + +<!-- + + The "clean" target deletes any previous "build" and "dist" directory, + so that you can be ensured the application can be built from scratch. + +--> + + <target name="clean" + description="Delete old build and dist directories"> + <delete dir="${build.home}"/> + <delete dir="${dist.home}"/> + </target> + + + +<!-- ==================== Compile Target ================================== --> + +<!-- + + The "compile" target transforms source files (from your "src" directory) + into object files in the appropriate location in the build directory. + This example assumes that you will be including your classes in an + unpacked directory hierarchy under "/WEB-INF/classes". + +--> + + <target name="compile" depends="prepare" + description="Compile Java sources"> + + <!-- Compile Java classes as necessary --> + <mkdir dir="${build.home}/WEB-INF/classes"/> + <javac srcdir="${src.home}" + destdir="${build.home}/WEB-INF/classes" + debug="${compile.debug}" + deprecation="${compile.deprecation}"> + <classpath refid="compile.classpath"/> + </javac> + + <!-- Copy application resources --> + <copy todir="${build.home}/WEB-INF/classes"> + <fileset dir="${src.home}" excludes="**/*.java"/> + </copy> + + </target> + + + +<!-- ==================== Dist Target ===================================== --> + + +<!-- + + The "dist" target creates a binary distribution of your application + in a directory structure ready to be archived in a tar.gz or zip file. + Note that this target depends on two others: + + * "compile" so that the entire web application (including external + dependencies) will have been assembled + + * "javadoc" so that the application Javadocs will have been created + +--> + + <target name="dist" depends="compile,javadoc" + description="Create binary distribution"> + + <!-- Copy documentation subdirectories --> + <mkdir dir="${dist.home}/docs"/> + <copy todir="${dist.home}/docs"> + <fileset dir="${docs.home}"/> + </copy> + + <!-- Create application JAR file --> + <jar jarfile="${dist.home}/${app.name}-${app.version}.war" + basedir="${build.home}"/> + + <!-- Copy additional files to ${dist.home} as necessary --> + + </target> + + + +<!-- ==================== Install Target ================================== --> + +<!-- + + The "install" target tells the specified Tomcat installation to dynamically + install this web application and make it available for execution. It does + *not* cause the existence of this web application to be remembered across + Tomcat restarts; if you restart the server, you will need to re-install all + this web application. + + If you have already installed this application, and simply want Tomcat to + recognize that you have updated Java classes (or the web.xml file), use the + "reload" target instead. + + NOTE: This target will only succeed if it is run from the same server that + Tomcat is running on. + + NOTE: This is the logical opposite of the "remove" target. + +--> + + <target name="install" depends="compile" + description="Install application to servlet container"> + + <deploy url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}" + localWar="file://${build.home}"/> + + </target> + + +<!-- ==================== Javadoc Target ================================== --> + +<!-- + + The "javadoc" target creates Javadoc API documentation for the Java + classes included in your application. Normally, this is only required + when preparing a distribution release, but is available as a separate + target in case the developer wants to create Javadocs independently. + +--> + + <target name="javadoc" depends="compile" + description="Create Javadoc API documentation"> + + <mkdir dir="${dist.home}/docs/api"/> + <javadoc sourcepath="${src.home}" + destdir="${dist.home}/docs/api" + packagenames="*"> + <classpath refid="compile.classpath"/> + </javadoc> + + </target> + + + +<!-- ====================== List Target =================================== --> + +<!-- + + The "list" target asks the specified Tomcat installation to list the + currently running web applications, either loaded at startup time or + installed dynamically. It is useful to determine whether or not the + application you are currently developing has been installed. + +--> + + <target name="list" + description="List installed applications on servlet container"> + + <list url="${manager.url}" + username="${manager.username}" + password="${manager.password}"/> + + </target> + + +<!-- ==================== Prepare Target ================================== --> + +<!-- + + The "prepare" target is used to create the "build" destination directory, + and copy the static contents of your web application to it. If you need + to copy static files from external dependencies, you can customize the + contents of this task. + + Normally, this task is executed indirectly when needed. + +--> + + <target name="prepare"> + + <!-- Create build directories as needed --> + <mkdir dir="${build.home}"/> + <mkdir dir="${build.home}/WEB-INF"/> + <mkdir dir="${build.home}/WEB-INF/classes"/> + + + <!-- Copy static content of this web application --> + <copy todir="${build.home}"> + <fileset dir="${web.home}"/> + </copy> + + <!-- Copy external dependencies as required --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> + <mkdir dir="${build.home}/WEB-INF/lib"/> +<!-- + <copy todir="${build.home}/WEB-INF/lib" file="${foo.jar}"/> +--> + + <!-- Copy static files from external dependencies as needed --> + <!-- *** CUSTOMIZE HERE AS REQUIRED BY YOUR APPLICATION *** --> + + </target> + + +<!-- ==================== Reload Target =================================== --> + +<!-- + + The "reload" signals the specified application Tomcat to shut itself down + and reload. This can be useful when the web application context is not + reloadable and you have updated classes or property files in the + /WEB-INF/classes directory or when you have added or updated jar files in the + /WEB-INF/lib directory. + + NOTE: The /WEB-INF/web.xml web application configuration file is not reread + on a reload. If you have made changes to your web.xml file you must stop + then start the web application. + +--> + + <target name="reload" depends="compile" + description="Reload application on servlet container"> + + <reload url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}"/> + + </target> + + +<!-- ==================== Remove Target =================================== --> + +<!-- + + The "remove" target tells the specified Tomcat installation to dynamically + remove this web application from service. + + NOTE: This is the logical opposite of the "install" target. + +--> + + <target name="remove" + description="Remove application on servlet container"> + + <undeploy url="${manager.url}" + username="${manager.username}" + password="${manager.password}" + path="${app.path}"/> + + </target> + + +</project> diff --git a/src/tomcat/webapps/docs/appdev/sample/docs/README.txt b/src/tomcat/webapps/docs/appdev/sample/docs/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..f146b0e0702f656aa856446a24cd919bc0834886 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/docs/README.txt @@ -0,0 +1,17 @@ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +This is a dummy README file for the sample +web application. diff --git a/src/tomcat/webapps/docs/appdev/sample/index.html b/src/tomcat/webapps/docs/appdev/sample/index.html new file mode 100644 index 0000000000000000000000000000000000000000..589bd71d067cf40e526749098a3159fbfba9dd91 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/index.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<meta charset="UTF-8" /> +<meta name="author" content="Ben Souther" /> +<title>Sample Application</title> +</head> +<body> +<h2>Sample Application</h2> + <p> + The example app has been packaged as a war file and can be downloaded + <a href="sample.war">here</a> (Note: make sure your browser doesn't + change file extension or append a new one). + </p> + <p> + The easiest way to run this application is simply to move the war file + to your <b>CATALINA_BASE/webapps</b> directory. A default Tomcat install + will automatically expand and deploy the application for you. You can + view it with the following URL (assuming that you're running tomcat on + port 8080 which is the default): + <br /> + <a href="http://localhost:8080/sample">http://localhost:8080/sample</a> + </p> + <p> + If you just want to browse the contents, you can unpack the war file + with the <b>jar</b> command. + </p> + <pre> + jar -xvf sample.war + </pre> + <p> + Note: <b>CATALINA_BASE</b> is usually the directory in which you + unpacked the Tomcat distribution. For more information on + <b>CATALINA_HOME</b>, <b>CATALINA_BASE</b> and the difference between + them see <b>RUNNING.txt</b> in the directory you unpacked your Tomcat + distribution. + </p> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/sample/sample.war b/src/tomcat/webapps/docs/appdev/sample/sample.war new file mode 100644 index 0000000000000000000000000000000000000000..0a127e6bd1f6991c32f591e577b42a50210c60f7 Binary files /dev/null and b/src/tomcat/webapps/docs/appdev/sample/sample.war differ diff --git a/src/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java b/src/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java new file mode 100644 index 0000000000000000000000000000000000000000..6984ffe4ef975bcf41adcac1eba00abd832677d8 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/src/mypackage/Hello.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package mypackage; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * Simple servlet to validate that the Hello, World example can + * execute servlets. In the web application deployment descriptor, + * this servlet must be mapped to correspond to the link in the + * "index.html" file. + * + * @author Craig R. McClanahan <Craig.McClanahan@eng.sun.com> + */ + +public final class Hello extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * Respond to a GET request for the content produced by + * this servlet. + * + * @param request The servlet request we are processing + * @param response The servlet response we are producing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException { + + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + try (PrintWriter writer = response.getWriter()) { + + writer.println("<!DOCTYPE html><html>"); + writer.println("<head>"); + writer.println("<meta charset=\"UTF-8\" />"); + writer.println("<title>Sample Application Servlet Page</title>"); + writer.println("</head>"); + writer.println("<body>"); + + + writer.println("<div style=\"float: left; padding: 10px;\">"); + writer.println("<img src=\"images/tomcat.gif\" alt=\"\" />"); + writer.println("</div>"); + writer.println("<h1>Sample Application Servlet</h1>"); + writer.println("<p>"); + writer.println("This is the output of a servlet that is part of"); + writer.println("the Hello, World application."); + writer.println("</p>"); + + writer.println("</body>"); + writer.println("</html>"); + } + } + + +} diff --git a/src/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml b/src/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..8502f9930a28313c41865287da4be72095c6b4d5 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/web/WEB-INF/web.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0"> + + <display-name>Hello, World Application</display-name> + <description> + This is a simple web application with a source code organization + based on the recommendations of the Application Developer's Guide. + </description> + + <servlet> + <servlet-name>HelloServlet</servlet-name> + <servlet-class>mypackage.Hello</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>HelloServlet</servlet-name> + <url-pattern>/hello</url-pattern> + </servlet-mapping> + +</web-app> diff --git a/src/tomcat/webapps/docs/appdev/sample/web/hello.jsp b/src/tomcat/webapps/docs/appdev/sample/web/hello.jsp new file mode 100644 index 0000000000000000000000000000000000000000..bd5680addd413321371463626b9a660ea169194b --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/web/hello.jsp @@ -0,0 +1,37 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> +<!DOCTYPE html> +<html> +<head> +<meta charset="UTF-8" /> +<title>Sample Application JSP Page</title> +</head> +<body> + +<div style="float: left; padding: 10px;"> +<img src="images/tomcat.gif" alt="" /> +</div> +<h1>Sample Application JSP Page</h1> +This is the output of a JSP page that is part of the Hello, World +application. + + +<%= new String("Hello!") %> + +</body> +</html> diff --git a/src/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif b/src/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aa6f863e43e3924a35854c556a9c1b6d125cba Binary files /dev/null and b/src/tomcat/webapps/docs/appdev/sample/web/images/tomcat.gif differ diff --git a/src/tomcat/webapps/docs/appdev/sample/web/index.html b/src/tomcat/webapps/docs/appdev/sample/web/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1c6938a66806f114ef676192de7fc51191827876 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/sample/web/index.html @@ -0,0 +1,39 @@ +<!DOCTYPE html><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<meta charset="UTF-8" /> +<title>Sample "Hello, World" Application</title> +</head> +<body> + +<div style="float: left; padding: 10px;"> +<img src="images/tomcat.gif" alt="" /> +</div> +<h1>Sample "Hello, World" Application</h1> +<p>This is the home page for a sample application used to illustrate the +source directory organization of a web application utilizing the principles +outlined in the Application Developer's Guide. + +<p>To prove that they work, you can execute either of the following links:</p> +<ul> +<li>To a <a href="hello.jsp">JSP page</a>.</li> +<li>To a <a href="hello">servlet</a>.</li> +</ul> + +</body> +</html> diff --git a/src/tomcat/webapps/docs/appdev/source.html b/src/tomcat/webapps/docs/appdev/source.html new file mode 100644 index 0000000000000000000000000000000000000000..bb0583895c7a7649545132a2dacd405abaff6eaa --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/source.html @@ -0,0 +1,321 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Application Developer's Guide (9.0.6) - Source Organization</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/appdev/source"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Application Developer's Guide</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">App Dev Guide Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="introduction.html">Introduction</a></li><li><a href="installation.html">Installation</a></li><li><a href="deployment.html">Deployment</a></li><li><a href="source.html">Source Code</a></li><li><a href="processes.html">Processes</a></li><li><a href="sample/">Example App</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Source Organization</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Directory_Structure">Directory Structure</a><ol><li><a href="#External_Dependencies">External Dependencies</a></li></ol></li><li><a href="#Source_Code_Control">Source Code Control</a></li><li><a href="#BUILD.XML_Configuration_File">BUILD.XML Configuration File</a></li></ul> +</div><h3 id="Directory_Structure">Directory Structure</h3><div class="text"> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +<p>A key recommendation of this manual is to separate the directory +hierarchy containing your source code (described in this section) from +the directory hierarchy containing your deployable application +(described in the preceding section). Maintaining this separation has +the following advantages:</p> +<ul> +<li><p>The contents of the source directories can be more easily administered, + moved, and backed up if the "executable" version of the application + is not intermixed. + </p></li> +<li><p>Source code control is easier to manage on directories that contain + only source files. + </p></li> +<li><p>The files that make up an installable distribution of your + application are much easier to select when the deployment + hierarchy is separate.</p></li> +</ul> + +<p>As we will see, the <code>ant</code> development tool makes the creation +and processing of such directory hierarchies nearly painless.</p> + +<p>The actual directory and file hierarchy used to contain the source code +of an application can be pretty much anything you like. However, the +following organization has proven to be quite generally applicable, and is +expected by the example <code>build.xml</code> configuration file that +is discussed below. All of these components exist under a top level +<em>project source directory</em> for your application:</p> +<ul> +<li><strong>docs/</strong> - Documentation for your application, in whatever + format your development team is using.<br><br></li> +<li><strong>src/</strong> - Java source files that generate the servlets, + beans, and other Java classes that are unique to your application. + If your source code is organized in packages (<strong>highly</strong> + recommended), the package hierarchy should be reflected as a directory + structure underneath this directory.<br><br></li> +<li><strong>web/</strong> - The static content of your web site (HTML pages, + JSP pages, JavaScript files, CSS stylesheet files, and images) that will + be accessible to application clients. This directory will be the + <em>document root</em> of your web application, and any subdirectory + structure found here will be reflected in the request URIs required to + access those files.<br><br></li> +<li><strong>web/WEB-INF/</strong> - The special configuration files required + for your application, including the web application deployment descriptor + (<code>web.xml</code>, defined in the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet Specification</a>), + tag library descriptors for custom tag libraries + you have created, and other resource files you wish to include within + your web application. Even though this directory appears to be a + subdirectory of your <em>document root</em>, the Servlet Specification + prohibits serving the contents of this directory (or any file it contains) + directly to a client request. Therefore, this is a good place to store + configuration information that is sensitive (such as database connection + usernames and passwords), but is required for your application to + operate successfully.</li> +</ul> + +<p>During the development process, two additional directories will be +created on a temporary basis:</p> +<ul> +<li><strong>build/</strong> - When you execute a default build + (<code>ant</code>), this directory will contain an exact image + of the files in the web application archive for this application. + Tomcat allows you to deploy an application in an unpacked + directory like this, either by copying it to the + <code>$CATALINA_BASE/webapps</code> directory, or by <em>installing</em> + it via the "Manager" web application. The latter approach is very + useful during development, and will be illustrated below. + <br><br></li> +<li><strong>dist/</strong> - When you execute the <code>ant dist</code> + target, this directory will be created. It will create an exact image + of the binary distribution for your web application, including an license + information, documentation, and README files that you have prepared.</li> +</ul> + +<p>Note that these two directories should <strong>NOT</strong> be archived in +your source code control system, because they are deleted and recreated (from +scratch) as needed during development. For that reason, you should not edit +any source files in these directories if you want to maintain a permanent +record of the changes, because the changes will be lost the next time that a +build is performed.</p> + + <div class="subsection"><h4 id="External_Dependencies">External Dependencies</h4><div class="text"> + + <p>What do you do if your application requires JAR files (or other + resources) from external projects or packages? A common example is that + you need to include a JDBC driver in your web application, in order to + operate.</p> + + <p>Different developers take different approaches to this problem. + Some will encourage checking a copy of the JAR files you depend on into + the source code control archives for every application that requires those + JAR files. However, this can cause significant management issues when you + use the same JAR in many applications - particular when faced with a need + to upgrade to a different version of that JAR file.</p> + + <p>Therefore, this manual recommends that you <strong>NOT</strong> store + a copy of the packages you depend on inside the source control archives + of your applications. Instead, the external dependencies should be + integrated as part of the process of <strong>building</strong> your + application. In that way, you can always pick up the appropriate version + of the JAR files from wherever your development system administrator has + installed them, without having to worry about updating your application + every time the version of the dependent JAR file is changed.</p> + + <p>In the example Ant <code>build.xml</code> file, we will demonstrate + how to define <em>build properties</em> that let you configure the locations + of the files to be copied, without having to modify <code>build.xml</code> + when these files change. The build properties used by a particular + developer can be customized on a per-application basis, or defaulted to + "standard" build properties stored in the developer's home directory.</p> + + <p>In many cases, your development system administrator will have already + installed the required JAR files into the <code>lib</code> directory of Tomcat. + If this has been done, you need + to take no actions at all - the example <code>build.xml</code> file + automatically constructs a compile classpath that includes these files.</p> + + </div></div> + +</div><h3 id="Source_Code_Control">Source Code Control</h3><div class="text"> + +<p>As mentioned earlier, it is highly recommended that you place all of the +source files that comprise your application under the management of a +source code control system like the Concurrent Version System (CVS). If you +elect to do this, every directory and file in the source hierarchy should be +registered and saved -- but none of the generated files. If you register +binary format files (such as images or JAR libraries), be sure to indicate +this to your source code control system.</p> + +<p>We recommended (in the previous section) that you should not store the +contents of the <code>build/</code> and <code>dist/</code> directories +created by your development process in the source code control system. An +easy way to tell CVS to ignore these directories is to create a file named +<code>.cvsignore</code> (note the leading period) in your top-level source +directory, with the following contents:</p> +<div class="codeBox"><pre><code>build +dist +build.properties</code></pre></div> + +<p>The reason for mentioning <code>build.properties</code> here will be +explained in the <a href="processes.html">Processes</a> section.</p> + +<p>Detailed instructions for your source code control environment are beyond +the scope of this manual. However, the following steps are followed when +using a command-line CVS client:</p> +<ul> +<li>To refresh the state of your source code to that stored in the + the source repository, go to your project source directory, and + execute <code>cvs update -dP</code>. + <br><br></li> +<li>When you create a new subdirectory in the source code hierarchy, register + it in CVS with a command like <code>cvs add {subdirname}</code>. + <br><br></li> +<li>When you first create a new source code file, navigate to the directory + that contains it, and register the new file with a command like + <code>cvs add {filename}</code>. + <br><br></li> +<li>If you no longer need a particular source code file, navigate to the + containing directory and remove the file. Then, deregister it in CVS + with a command like <code>cvs remove {filename}</code>. + <br><br></li> +<li>While you are creating, modifying, and deleting source files, changes + are not yet reflected in the server repository. To save your changes in + their current state, go to the project source directory + and execute <code>cvs commit</code>. You will be asked to write a brief + description of the changes you have just completed, which will be stored + with the new version of any updated source file.</li> +</ul> + +<p>CVS, like other source code control systems, has many additional features +(such as the ability to tag the files that made up a particular release, and +support for multiple development branches that can later be merged). See the +links and references in the <a href="introduction.html">Introduction</a> for +more information.</p> + +</div><h3 id="BUILD.XML_Configuration_File">BUILD.XML Configuration File</h3><div class="text"> + +<p>We will be using the <strong>ant</strong> tool to manage the compilation of +our Java source code files, and creation of the deployment hierarchy. Ant +operates under the control of a build file, normally called +<code>build.xml</code>, that defines the processing steps required. This +file is stored in the top-level directory of your source code hierarchy, and +should be checked in to your source code control system.</p> + +<p>Like a Makefile, the <code>build.xml</code> file provides several +"targets" that support optional development activities (such as creating +the associated Javadoc documentation, erasing the deployment home directory +so you can build your project from scratch, or creating the web application +archive file so you can distribute your application. A well-constructed +<code>build.xml</code> file will contain internal documentation describing +the targets that are designed for use by the developer, versus those targets +used internally. To ask Ant to display the project documentation, change to +the directory containing the <code>build.xml</code> file and type:</p> +<div class="codeBox"><pre><code>ant -projecthelp</code></pre></div> + +<p>To give you a head start, a <a href="build.xml.txt">basic build.xml file</a> +is provided that you can customize and install in the project source directory +for your application. This file includes comments that describe the various +targets that can be executed. Briefly, the following targets are generally +provided:</p> +<ul> +<li><strong>clean</strong> - This target deletes any existing + <code>build</code> and <code>dist</code> directories, so that they + can be reconstructed from scratch. This allows you to guarantee that + you have not made source code modifications that will result in + problems at runtime due to not recompiling all affected classes. + <br><br></li> +<li><strong>compile</strong> - This target is used to compile any source code + that has been changed since the last time compilation took place. The + resulting class files are created in the <code>WEB-INF/classes</code> + subdirectory of your <code>build</code> directory, exactly where the + structure of a web application requires them to be. Because + this command is executed so often during development, it is normally + made the "default" target so that a simple <code>ant</code> command will + execute it. + <br><br></li> +<li><strong>all</strong> - This target is a short cut for running the + <code>clean</code> target, followed by the <code>compile</code> target. + Thus, it guarantees that you will recompile the entire application, to + ensure that you have not unknowingly introduced any incompatible changes. + <br><br></li> +<li><strong>javadoc</strong> - This target creates Javadoc API documentation + for the Java classes in this web application. The example + <code>build.xml</code> file assumes you want to include the API + documentation with your app distribution, so it generates the docs + in a subdirectory of the <code>dist</code> directory. Because you normally + do not need to generate the Javadocs on every compilation, this target is + usually a dependency of the <code>dist</code> target, but not of the + <code>compile</code> target. + <br><br></li> +<li><strong>dist</strong> - This target creates a distribution directory for + your application, including any required documentation, the Javadocs for + your Java classes, and a web application archive (WAR) file that will be + delivered to system administrators who wish to install your application. + Because this target also depends on the <code>deploy</code> target, the + web application archive will have also picked up any external dependencies + that were included at deployment time.</li> +</ul> + +<p>For interactive development and testing of your web application using +Tomcat, the following additional targets are defined:</p> +<ul> +<li><strong>install</strong> - Tell the currently running Tomcat to make + the application you are developing immediately available for execution + and testing. This action does not require Tomcat to be restarted, but + it is also not remembered after Tomcat is restarted the next time. + <br><br></li> +<li><strong>reload</strong> - Once the application is installed, you can + continue to make changes and recompile using the <code>compile</code> + target. Tomcat will automatically recognize changes made to JSP pages, + but not to servlet or JavaBean classes - this command will tell Tomcat + to restart the currently installed application so that such changes are + recognized. + <br><br></li> +<li><strong>remove</strong> - When you have completed your development and + testing activities, you can optionally tell Tomcat to remove this + application from service. + </li> +</ul> + +<p>Using the development and testing targets requires some additional +one-time setup that is described on the next page.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/appdev/web.xml.txt b/src/tomcat/webapps/docs/appdev/web.xml.txt new file mode 100644 index 0000000000000000000000000000000000000000..b560a73cf25074405580a35e1738e82f19160fc3 --- /dev/null +++ b/src/tomcat/webapps/docs/appdev/web.xml.txt @@ -0,0 +1,166 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!DOCTYPE web-app + PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" + "http://java.sun.com/dtd/web-app_2_3.dtd"> + +<web-app> + + + <!-- General description of your web application --> + + <display-name>My Web Application</display-name> + <description> + This is version X.X of an application to perform + a wild and wonderful task, based on servlets and + JSP pages. It was written by Dave Developer + (dave@mycompany.com), who should be contacted for + more information. + </description> + + + <!-- Context initialization parameters that define shared + String constants used within your application, which + can be customized by the system administrator who is + installing your application. The values actually + assigned to these parameters can be retrieved in a + servlet or JSP page by calling: + + String value = + getServletContext().getInitParameter("name"); + + where "name" matches the <param-name> element of + one of these initialization parameters. + + You can define any number of context initialization + parameters, including zero. + --> + + <context-param> + <param-name>webmaster</param-name> + <param-value>myaddress@mycompany.com</param-value> + <description> + The EMAIL address of the administrator to whom questions + and comments about this application should be addressed. + </description> + </context-param> + + + <!-- Servlet definitions for the servlets that make up + your web application, including initialization + parameters. With Tomcat, you can also send requests + to servlets not listed here with a request like this: + + http://localhost:8080/{context-path}/servlet/{classname} + + but this usage is not guaranteed to be portable. It also + makes relative references to images and other resources + required by your servlet more complicated, so defining + all of your servlets (and defining a mapping to them with + a servlet-mapping element) is recommended. + + Servlet initialization parameters can be retrieved in a + servlet or JSP page by calling: + + String value = + getServletConfig().getInitParameter("name"); + + where "name" matches the <param-name> element of + one of these initialization parameters. + + You can define any number of servlets, including zero. + --> + + <servlet> + <servlet-name>controller</servlet-name> + <description> + This servlet plays the "controller" role in the MVC architecture + used in this application. It is generally mapped to the ".do" + filename extension with a servlet-mapping element, and all form + submits in the app will be submitted to a request URI like + "saveCustomer.do", which will therefore be mapped to this servlet. + + The initialization parameter names for this servlet are the + "servlet path" that will be received by this servlet (after the + filename extension is removed). The corresponding value is the + name of the action class that will be used to process this request. + </description> + <servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class> + <init-param> + <param-name>listOrders</param-name> + <param-value>com.mycompany.myactions.ListOrdersAction</param-value> + </init-param> + <init-param> + <param-name>saveCustomer</param-name> + <param-value>com.mycompany.myactions.SaveCustomerAction</param-value> + </init-param> + <!-- Load this servlet at server startup time --> + <load-on-startup>5</load-on-startup> + </servlet> + + <servlet> + <servlet-name>graph</servlet-name> + <description> + This servlet produces GIF images that are dynamically generated + graphs, based on the input parameters included on the request. + It is generally mapped to a specific request URI like "/graph". + </description> + </servlet> + + + <!-- Define mappings that are used by the servlet container to + translate a particular request URI (context-relative) to a + particular servlet. The examples below correspond to the + servlet descriptions above. Thus, a request URI like: + + http://localhost:8080/{contextpath}/graph + + will be mapped to the "graph" servlet, while a request like: + + http://localhost:8080/{contextpath}/saveCustomer.do + + will be mapped to the "controller" servlet. + + You may define any number of servlet mappings, including zero. + It is also legal to define more than one mapping for the same + servlet, if you wish to. + --> + + <servlet-mapping> + <servlet-name>controller</servlet-name> + <url-pattern>*.do</url-pattern> + </servlet-mapping> + + <servlet-mapping> + <servlet-name>graph</servlet-name> + <url-pattern>/graph</url-pattern> + </servlet-mapping> + + + <!-- Define the default session timeout for your application, + in minutes. From a servlet or JSP page, you can modify + the timeout for a particular session dynamically by using + HttpSession.getMaxInactiveInterval(). --> + + <session-config> + <session-timeout>30</session-timeout> <!-- 30 minutes --> + </session-config> + + +</web-app> diff --git a/src/tomcat/webapps/docs/apr.html b/src/tomcat/webapps/docs/apr.html new file mode 100644 index 0000000000000000000000000000000000000000..4e5070db848613dbad893684400303f980e1e853 --- /dev/null +++ b/src/tomcat/webapps/docs/apr.html @@ -0,0 +1,173 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Apache Portable Runtime (APR) based Native library for Tomcat</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/apr"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Portable Runtime (APR) based Native library for Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a><ol><li><a href="#Windows">Windows</a></li><li><a href="#Linux">Linux</a></li></ol></li><li><a href="#APR_Components">APR Components</a></li><li><a href="#APR_Lifecycle_Listener_Configuration">APR Lifecycle Listener Configuration</a></li><li><a href="#APR_Connectors_Configuration">APR Connectors Configuration</a><ol><li><a href="#HTTP/HTTPS">HTTP/HTTPS</a></li><li><a href="#AJP">AJP</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p> + Tomcat can use the <a href="http://apr.apache.org/">Apache Portable Runtime</a> to + provide superior scalability, performance, and better integration with native server + technologies. The Apache Portable Runtime is a highly portable library that is at + the heart of Apache HTTP Server 2.x. APR has many uses, including access to advanced IO + functionality (such as sendfile, epoll and OpenSSL), OS level functionality (random number + generation, system status, etc), and native process handling (shared memory, NT + pipes and Unix sockets). + </p> + + <p> + These features allows making Tomcat a general purpose webserver, will enable much better + integration with other native web technologies, and overall make Java much more viable as + a full fledged webserver platform rather than simply a backend focused technology. + </p> + + </div><h3 id="Installation">Installation</h3><div class="text"> + + <p> + APR support requires three main native components to be installed: + </p> + <ul> + <li>APR library</li> + <li>JNI wrappers for APR used by Tomcat (libtcnative)</li> + <li>OpenSSL libraries</li> + </ul> + + <div class="subsection"><h4 id="Windows">Windows</h4><div class="text"> + + <p> + Windows binaries are provided for tcnative-1, which is a statically compiled .dll which includes + OpenSSL and APR. It can be downloaded from <a href="http://tomcat.apache.org/download-native.cgi">here</a> + as 32bit or AMD x86-64 binaries. + In security conscious production environments, it is recommended to use separate shared dlls + for OpenSSL, APR, and libtcnative-1, and update them as needed according to security bulletins. + Windows OpenSSL binaries are linked from the <a href="http://www.openssl.org">Official OpenSSL + website</a> (see related/binaries). + </p> + + </div></div> + + <div class="subsection"><h4 id="Linux">Linux</h4><div class="text"> + + <p> + Most Linux distributions will ship packages for APR and OpenSSL. The JNI wrapper (libtcnative) will + then have to be compiled. It depends on APR, OpenSSL, and the Java headers. + </p> + + <p> + Requirements: + </p> + <ul> + <li>APR 1.2+ development headers (libapr1-dev package)</li> + <li>OpenSSL 1.0.2+ development headers (libssl-dev package)</li> + <li>JNI headers from Java compatible JDK 1.4+</li> + <li>GNU development environment (gcc, make)</li> + </ul> + + <p> + The wrapper library sources are located in the Tomcat binary bundle, in the + <code>bin/tomcat-native.tar.gz</code> archive. + Once the build environment is installed and the source archive is extracted, the wrapper library + can be compiled using (from the folder containing the configure script): + </p> + <div class="codeBox"><pre><code>./configure && make && make install</code></pre></div> + + </div></div> + + </div><h3 id="APR_Components">APR Components</h3><div class="text"> + + <p> + Once the libraries are properly installed and available to Java (if loading fails, the library path + will be displayed), the Tomcat connectors will automatically use APR. Configuration of the connectors + is similar to the regular connectors, but have a few extra attributes which are used to configure + APR components. Note that the defaults should be well tuned for most use cases, and additional + tweaking shouldn't be required. + </p> + + <p> + When APR is enabled, the following features are also enabled in Tomcat: + </p> + <ul> + <li>Secure session ID generation by default on all platforms (platforms other than Linux required + random number generation using a configured entropy)</li> + <li>OS level statistics on memory usage and CPU usage by the Tomcat process are displayed by + the status servlet</li> + </ul> + + </div><h3 id="APR_Lifecycle_Listener_Configuration">APR Lifecycle Listener Configuration</h3><div class="text"> + <p>See <a href="config/listeners.html#APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">the + listener configuration</a>.</p> + </div><h3 id="APR_Connectors_Configuration">APR Connectors Configuration</h3><div class="text"> + + <div class="subsection"><h4 id="HTTP/HTTPS">HTTP/HTTPS</h4><div class="text"> + + <p>For HTTP configuration, see the <a href="config/http.html">HTTP</a> + connector configuration documentation.</p> + + <p>For HTTPS configuration, see the + <a href="config/http.html#SSL_Support">HTTPS</a> connector configuration + documentation.</p> + + <p>An example SSL Connector declaration is:</p> + <div class="codeBox"><pre><code><Connector port="443" maxHttpHeaderSize="8192" + maxThreads="150" + enableLookups="false" disableUploadTimeout="true" + acceptCount="100" scheme="https" secure="true" + SSLEnabled="true" + SSLCertificateFile="${catalina.base}/conf/localhost.crt" + SSLCertificateKeyFile="${catalina.base}/conf/localhost.key" /></code></pre></div> + + + </div></div> + + <div class="subsection"><h4 id="AJP">AJP</h4><div class="text"> + + <p>For AJP configuration, see the <a href="config/ajp.html">AJP</a> + connector configuration documentation.</p> + + </div></div> + + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/architecture/index.html b/src/tomcat/webapps/docs/architecture/index.html new file mode 100644 index 0000000000000000000000000000000000000000..3a5ca1e272dffccdda34cbff6105860acaa0a024 --- /dev/null +++ b/src/tomcat/webapps/docs/architecture/index.html @@ -0,0 +1,77 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Architecture (9.0.6) - Table of Contents</title><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/architecture/index"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Architecture</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Table of Contents</h2><h3 id="Preface">Preface</h3><div class="text"> + +<p>This section of the Tomcat documentation attempts to explain +the architecture and design of the Tomcat server. It includes significant +contributions from several tomcat developers: +</p> +<ul> +<li>Yoav Shapira + (<a href="mailto:yoavs@apache.org">yoavs@apache.org</a>)</li> +<li>Jeanfrancois Arcand + (<a href="mailto:jfarcand@apache.org">jfarcand@apache.org</a>)</li> +<li>Filip Hanik + (<a href="mailto:fhanik@apache.org">fhanik@apache.org</a>)</li> +</ul> + +</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> + +<p>The information presented is divided into the following sections:</p> +<ul> +<li><a href="overview.html"><strong>Overview</strong></a> - + An overview of the Tomcat server architecture with key terms + and concepts.</li> +<li><a href="startup.html"><strong>Server Startup</strong></a> - + A detailed description, with sequence diagrams, of how the Tomcat + server starts up.</li> +<li><a href="requestProcess.html"><strong>Request Process Flow</strong></a> - + A detailed description of how Tomcat handles a request.</li> +</ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/architecture/overview.html b/src/tomcat/webapps/docs/architecture/overview.html new file mode 100644 index 0000000000000000000000000000000000000000..e86a196ec0e4405efe933d842b1d189b285b2af2 --- /dev/null +++ b/src/tomcat/webapps/docs/architecture/overview.html @@ -0,0 +1,146 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Architecture (9.0.6) - Architecture Overview</title><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/architecture/overview"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Architecture</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Architecture Overview</h2><h3 id="Overview">Overview</h3><div class="text"> +<p> +This page provides an overview of the Tomcat server architecture. +</p> +</div><h3 id="Terms">Terms</h3><div class="text"> + +<div class="subsection"><h4 id="Server">Server</h4><div class="text"> +<p> +In the Tomcat world, a +<a href="../config/server.html">Server</a> represents the whole container. +Tomcat provides a default implementation of the +<a href="../api/org/apache/catalina/Server.html">Server interface</a> +which is rarely customized by users. +</p> +</div></div> + +<div class="subsection"><h4 id="Service">Service</h4><div class="text"> +<p> +A <a href="../config/service.html">Service</a> is an intermediate component +which lives inside a Server and ties one or more Connectors to exactly one +Engine. The Service element is rarely customized by users, as the default +implementation is simple and sufficient: +<a href="../api/org/apache/catalina/Service.html">Service interface</a>. +</p> +</div></div> + +<div class="subsection"><h4 id="Engine">Engine</h4><div class="text"> +<p> +An +<a href="../config/engine.html">Engine</a> represents request processing +pipeline for a specific Service. As a Service may have multiple Connectors, +the Engine receives and processes all requests from these connectors, handing +the response back to the appropriate connector for transmission to the client. +The <a href="../api/org/apache/catalina/Engine.html">Engine interface</a> +may be implemented to supply custom Engines, though this is uncommon. +</p> +<p> +Note that the Engine may be used for Tomcat server clustering via the +jvmRoute parameter. Read the Clustering documentation for more information. +</p> +</div></div> + +<div class="subsection"><h4 id="Host">Host</h4><div class="text"> +<p> +A <a href="../config/host.html">Host</a> is an association of a network name, +e.g. www.yourcompany.com, to the Tomcat server. An Engine may contain +multiple hosts, and the Host element also supports network aliases such as +yourcompany.com and abc.yourcompany.com. Users rarely create custom +<a href="../api/org/apache/catalina/Host.html">Hosts</a> +because the +<a href="../api/org/apache/catalina/core/StandardHost.html">StandardHost +implementation</a> provides significant additional functionality. +</p> +</div></div> + +<div class="subsection"><h4 id="Connector">Connector</h4><div class="text"> +<p> +A Connector handles communications with the client. There are multiple +connectors available with Tomcat. These include the +<a href="../config/http.html">HTTP connector</a> which is used for +most HTTP traffic, especially when running Tomcat as a standalone server, +and the <a href="../config/ajp.html">AJP connector</a> which implements +the AJP protocol used when connecting Tomcat to a web server such as +Apache HTTPD server. Creating a customized connector is a significant +effort. +</p> +</div></div> + +<div class="subsection"><h4 id="Context">Context</h4><div class="text"> +<p> +A +<a href="../config/context.html">Context</a> +represents a web application. A Host may contain multiple +contexts, each with a unique path. The +<a href="../api/org/apache/catalina/Context.html">Context +interface</a> may be implemented to create custom Contexts, but +this is rarely the case because the +<a href="../api/org/apache/catalina/core/StandardContext.html"> +StandardContext</a> provides significant additional functionality. +</p> +</div></div> +</div><h3 id="Comments">Comments</h3><div class="text"> +<p> +Tomcat is designed to be a fast and efficient implementation of the +Servlet Specification. Tomcat came about as the reference implementation +of this specification, and has remained rigorous in adhering to the +specification. At the same time, significant attention has been paid +to Tomcat's performance and it is now on par with other servlet containers, +including commercial ones. +</p> +<p> +In recent releases of Tomcat, mostly starting with Tomcat 5, +we have begun efforts to make more aspects of Tomcat manageable via +JMX. In addition, the Manager and Admin webapps have been greatly +enhanced and improved. Manageability is a primary area of concern +for us as the product matures and the specification becomes more +stable. +</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/architecture/requestProcess.html b/src/tomcat/webapps/docs/architecture/requestProcess.html new file mode 100644 index 0000000000000000000000000000000000000000..29cd78a342a8f6a0f5d43d25ad2a1f55c538f900 --- /dev/null +++ b/src/tomcat/webapps/docs/architecture/requestProcess.html @@ -0,0 +1,85 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Architecture (9.0.6) - Request Process Flow</title><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/architecture/requestProcess"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Architecture</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Request Process Flow</h2><h3 id="Request_Process_Flow">Request Process Flow</h3><div class="text"> + +<p> +This page describes the process used by Tomcat to handle +an incoming request. This process is largely defined by +the Servlet Specification, which outlines the order +of events that must take place. +</p> + +<div class="subsection"><h4 id="description">description</h4><div class="text"> +<p> +TODO +</p> +</div></div> + +<div class="subsection"><h4 id="diagrams">diagrams</h4><div class="text"> +<p> +A UML sequence diagram of the request process is available +<a href="requestProcess/request-process.png">here.</a> +</p> +<p> +A UML sequence diagram of the authentication process is available +<a href="requestProcess/authentication-process.png">here.</a> +</p> + +</div></div> + +<div class="subsection"><h4 id="comments">comments</h4><div class="text"> +<p> +The Servlet Specification provides many opportunities for +listening in (using Listeners) or modifying (using Filters) +the request handling process even before the request arrives +at the servlet that will handle it. +</p> + +</div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png b/src/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png new file mode 100644 index 0000000000000000000000000000000000000000..e23c33359c42abc6303b216e24275cae80305430 Binary files /dev/null and b/src/tomcat/webapps/docs/architecture/requestProcess/authentication-process.png differ diff --git a/src/tomcat/webapps/docs/architecture/requestProcess/request-process.png b/src/tomcat/webapps/docs/architecture/requestProcess/request-process.png new file mode 100644 index 0000000000000000000000000000000000000000..33ae3c3766459f39c8bb19c035234afa44be1dbd Binary files /dev/null and b/src/tomcat/webapps/docs/architecture/requestProcess/request-process.png differ diff --git a/src/tomcat/webapps/docs/architecture/startup.html b/src/tomcat/webapps/docs/architecture/startup.html new file mode 100644 index 0000000000000000000000000000000000000000..6e7a1cc7bec5c1cf566e7dc68e266664e2553ffd --- /dev/null +++ b/src/tomcat/webapps/docs/architecture/startup.html @@ -0,0 +1,84 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Architecture (9.0.6) - Startup</title><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/architecture/startup"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Architecture</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Architecture Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Contents</h2><ul><li><a href="index.html">Contents</a></li><li><a href="overview.html">Overview</a></li><li><a href="startup.html">Server Startup</a></li><li><a href="requestProcess.html">Request Process</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Startup</h2><h3 id="Server_Startup">Server Startup</h3><div class="text"> + +<p> +This page describes how the Tomcat server starts up. There are several +different ways to start tomcat, including: +</p> +<ul> + <li>From the command line.</li> + <li>From a Java program as an embedded server.</li> + <li>Automatically as a Windows service.</li> +</ul> + +<div class="subsection"><h4 id="description">description</h4><div class="text"> +<p> +A text description of the startup procedure is available +<a href="startup/serverStartup.txt">here.</a> +</p> +</div></div> + +<div class="subsection"><h4 id="diagram">diagram</h4><div class="text"> +<p> +A UML sequence diagram of the startup procedure is available +<a href="startup/serverStartup.pdf">here.</a> +</p> +</div></div> + +<div class="subsection"><h4 id="comments">comments</h4><div class="text"> +<p> +The startup process can be customized in many ways, both +by modifying Tomcat code and by implementing your own +LifecycleListeners which are then registered in the server.xml +configuration file. +</p> + +</div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/architecture/startup/serverStartup.pdf b/src/tomcat/webapps/docs/architecture/startup/serverStartup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..34aa59808b3a7bdf36d07278bdbfe8d9750b68c0 Binary files /dev/null and b/src/tomcat/webapps/docs/architecture/startup/serverStartup.pdf differ diff --git a/src/tomcat/webapps/docs/architecture/startup/serverStartup.txt b/src/tomcat/webapps/docs/architecture/startup/serverStartup.txt new file mode 100644 index 0000000000000000000000000000000000000000..716c8d08ebc8ea3a1726897ad10f7f8bf7a456e2 --- /dev/null +++ b/src/tomcat/webapps/docs/architecture/startup/serverStartup.txt @@ -0,0 +1,139 @@ + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Tomcat Startup Sequence + +Sequence 1. Start from Command Line +Class: org.apache.catalina.startup.Bootstrap +What it does: + a) Set up classloaders + commonLoader (common)-> System Loader + sharedLoader (shared)-> commonLoader -> System Loader + catalinaLoader(server) -> commonLoader -> System Loader + (by default the commonLoader is used for the + sharedLoader and the serverLoader) + b) Load startup class (reflection) + org.apache.catalina.startup.Catalina + setParentClassloader -> sharedLoader + Thread.contextClassloader -> catalinaLoader + c) Bootstrap.daemon.init() complete + +Sequence 2. Process command line argument (start, stop) +Class: org.apache.catalina.startup.Bootstrap (assume command->start) +What it does: + a) Catalina.setAwait(true); + b) Catalina.load() + b1) initDirs() -> set properties like + catalina.home + catalina.base == catalina.home (most cases) + b2) initNaming + setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, + org.apache.naming.java.javaURLContextFactory ->default) + b3) createStartDigester() + Configures a digester for the main server.xml elements like + org.apache.catalina.core.StandardServer (can change of course :) + org.apache.catalina.deploy.NamingResources + Stores naming resources in the J2EE JNDI tree + org.apache.catalina.LifecycleListener + implements events for start/stop of major components + org.apache.catalina.core.StandardService + The single entry for a set of connectors, + so that a container can listen to multiple connectors + ie, single entry + org.apache.catalina.Connector + Connectors to listen for incoming requests only + It also adds the following rulesets to the digester + NamingRuleSet + EngineRuleSet + HostRuleSet + ContextRuleSet + b4) Load the server.xml and parse it using the digester + Parsing the server.xml using the digester is an automatic + XML-object mapping tool, that will create the objects defined in server.xml + Startup of the actual container has not started yet. + b5) Assigns System.out and System.err to the SystemLogHandler class + b6) Calls initialize on all components, this makes each object register itself with the + JMX agent. + During the process call the Connectors also initialize the adapters. + The adapters are the components that do the request pre-processing. + Typical adapters are HTTP1.1 (default if no protocol is specified, + org.apache.coyote.http11.Http11NioProtocol) + AJP1.3 for mod_jk etc. + + c) Catalina.start() + c1) Starts the NamingContext and binds all JNDI references into it + c2) Starts the services under <Server> which are: + StandardService -> starts Engine (ContainerBase -> Realm,Cluster etc) + c3) StandardHost (started by the service) + Configures a ErrorReportValvem to do proper HTML output for different HTTP + errors codes + Starts the Valves in the pipeline (at least the ErrorReportValve) + Configures the StandardHostValve, + this valves ties the Webapp Class loader to the thread context + it also finds the session for the request + and invokes the context pipeline + Starts the HostConfig component + This component deploys all the webapps + (webapps & conf/Catalina/localhost/*.xml) + HostConfig will create a Digester for your context, this digester + will then invoke ContextConfig.start() + The ContextConfig.start() will process the default web.xml (conf/web.xml) + and then process the applications web.xml (WEB-INF/web.xml) + + c4) During the lifetime of the container (StandardEngine) there is a background thread that + keeps checking if the context has changed. If a context changes (timestamp of war file, + context xml file, web.xml) then a reload is issued (stop/remove/deploy/start) + + d) Tomcat receives a request on an HTTP port + d1) The request is received by a separate thread which is waiting in the ThreadPoolExecutor + class. It is waiting for a request in a regular ServerSocket.accept() method. + When a request is received, this thread wakes up. + d2) The ThreadPoolExecutor assigns the a TaskThread to handle the request. + It also supplies a JMX object name to the catalina container (not used I believe) + d3) The processor to handle the request in this case is Coyote Http11Processor, + and the process method is invoked. + This same processor is also continuing to check the input stream of the socket + until the keep alive point is reached or the connection is disconnected. + d4) The HTTP request is parsed using an internal buffer class (Http11InputBuffer) + The buffer class parses the request line, the headers, etc and store the result in a + Coyote request (not an HTTP request) This request contains all the HTTP info, such + as servername, port, scheme, etc. + d5) The processor contains a reference to an Adapter, in this case it is the + CoyoteAdapter. Once the request has been parsed, the Http11Processor + invokes service() on the adapter. In the service method, the Request contains a + CoyoteRequest and CoyoteResponse (null for the first time) + The CoyoteRequest(Response) implements HttpRequest(Response) and HttpServletRequest(Response) + The adapter parses and associates everything with the request, cookies, the context through a + Mapper, etc + d6) When the parsing is finished, the CoyoteAdapter invokes its container (StandardEngine) + and invokes the invoke(request,response) method. + This initiates the HTTP request into the Catalina container starting at the engine level + d7) The StandardEngine.invoke() simply invokes the container pipeline.invoke() + d8) By default the engine only has one valve the StandardEngineValve, this valve simply + invokes the invoke() method on the Host pipeline (StandardHost.getPipeLine()) + d9) the StandardHost has two valves by default, the StandardHostValve and the ErrorReportValve + d10) The standard host valve associates the correct class loader with the current thread + It also retrieves the Manager and the session associated with the request (if there is one) + If there is a session access() is called to keep the session alive + d11) After that the StandardHostValve invokes the pipeline on the context associated + with the request. + d12) The first valve that gets invoked by the Context pipeline is the FormAuthenticator + valve. Then the StandardContextValve gets invoke. + The StandardContextValve invokes any context listeners associated with the context. + Next it invokes the pipeline on the Wrapper component (StandardWrapperValve) + d13) During the invocation of the StandardWrapperValve, the JSP wrapper (Jasper) gets invoked + This results in the actual compilation of the JSP. + And then invokes the actual servlet. + e) Invocation of the servlet class diff --git a/src/tomcat/webapps/docs/balancer-howto.html b/src/tomcat/webapps/docs/balancer-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..7498bb1fa7265b5b48d424bfa04b7851e8b485b4 --- /dev/null +++ b/src/tomcat/webapps/docs/balancer-howto.html @@ -0,0 +1,61 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Load Balancer HOW-TO</title><meta name="author" content="Yoav Shapira"><meta name="author" content="Remy Maucherat"><meta name="author" content="Andy Oliver"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/balancer-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Load Balancer HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Using_the_JK_1.2.x_native_connector">Using the JK 1.2.x native connector</a></li><li><a href="#Using_Apache_HTTP_Server_2.x_with_mod_proxy">Using Apache HTTP Server 2.x with mod_proxy</a></li></ul> +</div><h3 id="Using_the_JK_1.2.x_native_connector">Using the JK 1.2.x native connector</h3><div class="text"> + +Please refer to the JK 1.2.x documentation. + +</div><h3 id="Using_Apache_HTTP_Server_2.x_with_mod_proxy">Using Apache HTTP Server 2.x with mod_proxy</h3><div class="text"> + +Please refer to the mod_proxy documentation for Apache HTTP Server 2.2. This supports either +HTTP or AJP load balancing. This new version of mod_proxy is also usable with +Apache HTTP Server 2.0, but mod_proxy will have to be compiled separately using the code +from Apache HTTP Server 2.2. + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/building.html b/src/tomcat/webapps/docs/building.html new file mode 100644 index 0000000000000000000000000000000000000000..9277198a3d9ef15d4aac82df4b2f467ee82d1b6a --- /dev/null +++ b/src/tomcat/webapps/docs/building.html @@ -0,0 +1,278 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Building Tomcat</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/building"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Building Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Download_a_Java_Development_Kit_(JDK)_version_8">Download a Java Development Kit (JDK) version 8</a></li><li><a href="#Install_Apache_Ant_1.9.5_or_later">Install Apache Ant 1.9.5 or later</a></li><li><a href="#Checkout_or_obtain_the_Tomcat_source_code">Checkout or obtain the Tomcat source code</a></li><li><a href="#Configure_download_area">Configure download area</a></li><li><a href="#Building_Tomcat">Building Tomcat</a></li><li><a href="#Building_with_Eclipse">Building with Eclipse</a></li><li><a href="#Building_with_other_IDEs">Building with other IDEs</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p> +Building Apache Tomcat from source is very easy, and is the first step to +contributing to Tomcat. The complete and comprehensive instructions are +provided in the file <a href="BUILDING.txt">BUILDING.txt</a>. +The following is a quick step by step guide. +</p> + +</div><h3 id="Download_a_Java_Development_Kit_(JDK)_version_8">Download a Java Development Kit (JDK) version 8</h3><div class="text"> + +<p> +Building Apache Tomcat requires a JDK (version 8) to be installed. You can download one from<br> +<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a><br> +<a href="http://openjdk.java.net/install/index.html">http://openjdk.java.net/install/index.html</a><br> +or another JDK vendor. +</p> + +<p> +<b>IMPORTANT</b>: Set an environment variable JAVA_HOME to the pathname of the +directory into which you installed the JDK release. +</p> + +</div><h3 id="Install_Apache_Ant_1.9.5_or_later">Install Apache Ant 1.9.5 or later</h3><div class="text"> + +<p> +Download a binary distribution of Ant 1.9.5 or later from +<a href="http://ant.apache.org/bindownload.cgi">here</a>. +</p> + +<p> +Unpack the binary distribution into a convenient location so that the +Ant release resides in its own directory (conventionally named +<code>apache-ant-1.9.x</code>). For the remainder of this guide, +the symbolic name <code>${ant.home}</code> is used to refer to the full pathname of + the Ant installation directory. +</p> + +<p> +<b>IMPORTANT</b>: Create an ANT_HOME environment variable to point the directory <code>${ant.home}</code>, +and modify the PATH environment variable to include directory +<code>${ant.home}/bin</code> in its list. This makes the <code>ant</code> command line script +available, which will be used to actually perform the build. +</p> + +</div><h3 id="Checkout_or_obtain_the_Tomcat_source_code">Checkout or obtain the Tomcat source code</h3><div class="text"> + + <p> + Tomcat SVN repository URL: + <a href="http://svn.apache.org/repos/asf/tomcat/trunk/">http://svn.apache.org/repos/asf/tomcat/trunk/</a> + </p> + <p> + Tomcat source packages: + <a href="http://tomcat.apache.org/download-90.cgi">http://tomcat.apache.org/download-90.cgi</a>. + </p> + + <p> + Checkout the source using SVN, selecting a tag for released version or + trunk for the current development code, or download and unpack a + source package. For the remainder of this guide, the symbolic name + <code>${tomcat.source}</code> is used to refer to the + location where the source has been placed. + </p> + +</div><h3 id="Configure_download_area">Configure download area</h3><div class="text"> + +<p> + Building Tomcat involves downloading a number of libraries that it depends on. + It is strongly recommended to configure download area for those libraries. +</p> + +<p> + By default the build is configured to download the dependencies into the + <code>${user.home}/tomcat-build-libs</code> directory. You can change this + (see below) but it must be an absolute path. +</p> + +<p> + The build is controlled by creating a + <code>${tomcat.source}/build.properties</code> file. It can be used to + redefine any property that is present in <code>build.properties.default</code> + and <code>build.xml</code> files. The <code>build.properties</code> file + does not exist by default. You have to create it. +</p> + +<p> + The download area is defined by property <code>base.path</code>. For example: +</p> + +<div class="codeBox"><pre><code># ----- Default Base Path for Dependent Packages ----- +# Replace this path with the directory path where +# dependencies binaries should be downloaded. +base.path=/home/me/some-place-to-download-to</code></pre></div> + +<p> + Different versions of Tomcat are allowed to share the same download area. +</p> + +<p> + Another example: +</p> + +<div class="codeBox"><pre><code>base.path=${user.dir}/../libraries-tomcat9.0</code></pre></div> + +<p> + Users who access the Internet through a proxy must use the properties + file to indicate to Ant the proxy configuration: +</p> + +<div class="codeBox"><pre><code># ----- Proxy setup ----- +proxy.host=proxy.domain +proxy.port=8080 +proxy.use=on</code></pre></div> + +</div><h3 id="Building_Tomcat">Building Tomcat</h3><div class="text"> + +<p> +Use the following commands to build Tomcat: +</p> + +<p> +<code>cd ${tomcat.source}</code><br> +<code>ant</code> +</p> + +<p> +Once the build has completed successfully, a usable Tomcat installation will have been +produced in the <code>${tomcat.source}/output/build</code> directory, and can be started +and stopped with the usual scripts. +</p> +</div><h3 id="Building_with_Eclipse">Building with Eclipse</h3><div class="text"> + +<p> +<b>IMPORTANT:</b> This is not a supported means of building Tomcat; this information is +provided without warranty :-). +The only supported means of building Tomcat is with the Ant build described above. +However, some developers like to work on Java code with a Java IDE, +and the following steps have been used by some developers. +</p> + +<p> +<b>NOTE:</b> This will not let you build everything under Eclipse; +the build process requires use of Ant for the many stages that aren't +simple Java compilations. +However, it will allow you to view and edit the Java code, +get warnings, reformat code, perform refactorings, run Tomcat +under the IDE, and so on. +</p> + +<p> +<b>WARNING:</b> Do not forget to create and configure + <code>${tomcat.source}/build.properties</code> file as described above + before running any Ant targets. +</p> + +<p> +Sample Eclipse project files and launch targets are provided in the +<code>res/ide-support/eclipse</code> directory of the source tree. +The instructions below will automatically copy these into the required locations. +</p> +<p> +An Ant target is provided as a convenience to download all binary dependencies, and to create +the Eclipse project and classpath files in the root of the source tree. +</p> + +<p> +<code>cd ${tomcat.source}</code><br> +<code>ant ide-eclipse</code> +</p> + +<p> +Start Eclipse and create a new Workspace. +</p> + +<p> +Open the <em>Preferences</em> dialog and then select <em>Java->Build Path->Classpath +Variables</em> to add two new <em>Classpath Variables</em>: +</p> + + +<table class="defaultTable"> + <tr><td>TOMCAT_LIBS_BASE</td><td>The same location as the <code>base.path</code> + setting in <code>build.properties</code>, where the binary dependencies have been downloaded</td></tr> + <tr><td>ANT_HOME</td><td>the base path of Ant 1.9.5 or later</td></tr> +</table> + + +<p> +Use <em>File->Import</em> and choose <em>Existing Projects into Workspace</em>. +From there choose the root directory of the Tomcat source tree (<code>${tomcat.source}</code>) +and import the Tomcat project located there. +</p> + +<p> +<code>start-tomcat</code> and <code>stop-tomcat</code> launch configurations are provided in +<code>res/ide-support/eclipse</code> and will be available in the <em>Run->Run Configurations</em> +dialog. Use these to start and stop Tomcat from Eclipse. +If you want to configure these yourself (or are using a different IDE) +then use <code>org.apache.catalina.startup.Bootstrap</code> as the main class, +<code>start</code>/<code>stop</code> etc. as program arguments, and specify <code>-Dcatalina.home=...</code> +(with the name of your build directory) as VM arguments. +</p> + +<p> +Tweaking a few formatting preferences will make it much easier to keep consistent with Tomcat +coding conventions (and have your contributions accepted): +</p> + +<table class="defaultTable"> + <tr><td>Java -> Code Style -> Formatter -> Edit...</td> + <td>Tab policy: Spaces only<br>Tab and Indentation size: 4</td></tr> + <tr><td>General -> Editors -> Text Editors</td> + <td>Displayed tab width: 2<br>Insert spaces for tabs<br>Show whitespace characters (optional)</td></tr> + <tr><td>XML -> XML Files -> Editor</td><td>Indent using spaces<br>Indentation size: 2</td></tr> + <tr><td>Ant -> Editor -> Formatter</td><td>Tab size: 2<br>Use tab character instead of spaces: unchecked</td></tr> +</table> + +<p> +The recommended configuration of Compiler Warnings is documented in +<code>res/ide-support/eclipse/java-compiler-errors-warnings.txt</code> file. +</p> + +</div><h3 id="Building_with_other_IDEs">Building with other IDEs</h3><div class="text"> +<p> +The same general approach should work for most IDEs; it has been reported +to work in IntelliJ IDEA, for example. +</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/cgi-howto.html b/src/tomcat/webapps/docs/cgi-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..4a850928c52711ef5110a65c73d187b20cc8706f --- /dev/null +++ b/src/tomcat/webapps/docs/cgi-howto.html @@ -0,0 +1,154 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - CGI How To</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/cgi-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>CGI How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#Configuration">Configuration</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>The CGI (Common Gateway Interface) defines a way for a web server to +interact with external content-generating programs, which are often +referred to as CGI programs or CGI scripts. +</p> + +<p>Within Tomcat, CGI support can be added when you are using Tomcat as your +HTTP server and require CGI support. Typically this is done +during development when you don't want to run a web server like +Apache httpd. +Tomcat's CGI support is largely compatible with Apache httpd's, +but there are some limitations (e.g., only one cgi-bin directory). +</p> + +<p>CGI support is implemented using the servlet class +<code>org.apache.catalina.servlets.CGIServlet</code>. Traditionally, +this servlet is mapped to the URL pattern "/cgi-bin/*".</p> + +<p>By default CGI support is disabled in Tomcat.</p> +</div><h3 id="Installation">Installation</h3><div class="text"> + +<p><strong>CAUTION</strong> - CGI scripts are used to execute programs +external to the Tomcat JVM. If you are using the Java SecurityManager this +will bypass your security policy configuration in <code>catalina.policy.</code></p> + +<p>To enable CGI support:</p> + +<ol> +<li><p>There are commented-out sample servlet and servlet-mapping elements for +CGI servlet in the default <code>$CATALINA_BASE/conf/web.xml</code> file. +To enable CGI support in your web application, copy that servlet and +servlet-mapping declarations into <code>WEB-INF/web.xml</code> file of your +web application.</p> + +<p>Uncommenting the servlet and servlet-mapping in +<code>$CATALINA_BASE/conf/web.xml</code> file enables CGI for all installed +web applications at once.</p> +</li> + +<li><p>Set <code>privileged="true"</code> on the Context element for your +web application.</p> + +<p>Only Contexts which are marked as privileged are allowed to use the +CGI servlet. Note that modifying the global <code>$CATALINA_BASE/conf/context.xml</code> +file affects all web applications. See +<a href="config/context.html">Context documentation</a> for details.</p> +</li> +</ol> + +</div><h3 id="Configuration">Configuration</h3><div class="text"> + +<p>There are several servlet init parameters which can be used to +configure the behaviour of the CGI servlet.</p> +<ul> +<li><strong>cgiPathPrefix</strong> - The CGI search path will start at +the web application root directory + File.separator + this prefix. +By default there is no value, which results in the web application root +directory being used as the search path. The recommended value is +<code>WEB-INF/cgi</code></li> +<li><strong>enableCmdLineArguments</strong> - Are command line parameters +generated from the query string as per section 4.4 of 3875 RFC? The default is +<code>false</code>.</li> +<li><strong>environment-variable-</strong> - An environment to be set for the +execution environment of the CGI script. The name of variable is taken from the +parameter name. To configure an environment variable named FOO, configure a +parameter named environment-variable-FOO. The parameter value is used as the +environment variable value. The default is no environment variables.</li> +<li><strong>executable</strong> - The name of the executable to be used to +run the script. You may explicitly set this parameter to be an empty string +if your script is itself executable (e.g. an exe file). Default is +<code>perl</code>.</li> +<li><strong>executable-arg-1</strong>, <strong>executable-arg-2</strong>, +and so on - additional arguments for the executable. These precede the +CGI script name. By default there are no additional arguments.</li> +<li><strong>envHttpHeaders</strong> - A regular expression used to select the +HTTP headers passed to the CGI process as environment variables. Note that +headers are converted to upper case before matching and that the entire header +name must match the pattern. Default is +<code>ACCEPT[-0-9A-Z]*|CACHE-CONTROL|COOKIE|HOST|IF-[-0-9A-Z]*|REFERER|USER-AGENT</code> +</li> +<li><strong>parameterEncoding</strong> - Name of the parameter encoding +to be used with the CGI servlet. Default is +<code>System.getProperty("file.encoding","UTF-8")</code>. That is the system +default encoding, or UTF-8 if that system property is not available.</li> +<li><strong>passShellEnvironment</strong> - Should the shell environment +variables from Tomcat process (if any) be passed to the CGI script? Default is +<code>false</code>.</li> +<li><strong>stderrTimeout</strong> - The time (in milliseconds) to wait for +the reading of stderr to complete before terminating the CGI process. Default +is <code>2000</code>.</li> +</ul> + +<p>The CGI script executed depends on the configuration of the CGI Servlet and +how the request is mapped to the CGI Servlet. The CGI search path starts at the +web application root directory + File.separator + cgiPathPrefix. The +<strong>pathInfo</strong> is then searched unless it is <code>null</code> - in +which case the <strong>servletPath</strong> is searched.</p> + +<p>The search starts with the first path segment and expands one path segment +at a time until no path segments are left (resulting in a 404) or a script is +found. Any remaining path segments are passed to the script in the +<strong>PATH_INFO</strong> environment variable.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/changelog.html b/src/tomcat/webapps/docs/changelog.html new file mode 100644 index 0000000000000000000000000000000000000000..075569bf6380120b3f370a14b327883a2627a72b --- /dev/null +++ b/src/tomcat/webapps/docs/changelog.html @@ -0,0 +1,5114 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Changelog</title></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Changelog</h2><h3 id="Tomcat_9.0.6_(markt)">Tomcat 9.0.6 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.6_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=43866">43866</a>: Add additional attributes to the Manager to provide + control over which listeners are called when an attribute is added to + the session when it has already been added under the same name. This is + to aid clustering scenarios where <code>setAttribute()</code> is often + called to signal that the attribute value has been mutated and needs to + be replicated but it may not be required, or even desired, for the + associated listeners to be triggered. The default behaviour has not been + changed. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Minor optimization when calling class transformers. (rjung) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Pass errors triggered by invalid requests or unavailable services to the + application provided error handling and/or the container provided error + handling (<code>ErrorReportValve</code>) as appropriate. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=41007">41007</a>: Add the ability to specify static HTML responses for + specific error codes and/or exception types with the + <code>ErrorReportValve</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Prevent Tomcat from applying gzip compression to content that is already + compressed with brotli compression. Based on a patch provided by burka. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62090">62090</a>: Null container names are not allowed. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62104">62104</a>: Fix programmatic login regression as the + NonLoginAuthenticator has to be set for it to work (if no login method + is specified). (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62117">62117</a>: Improve error message in <code>catalina.sh</code> when + calling <code>kill -0 <pid></code> fails. Based on a suggestion + from Mark Morschhaeuser. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62118">62118</a>: Correctly create a JNDI <code>ServiceRef</code> using + the specified interface rather than the concrete type. Based on a + suggestion by Ángel Álvarez Páscua. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix for <code>RequestDumperFilter</code> log attribute. Patch provided + by Kirill Romanov via Github. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62123">62123</a>: Avoid <code>ConcurrentModificationException</code> + when attempting to clean up application triggered RMI memory leaks on + web application stop. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When a deployment descriptor is deployed that includes a + <code>path</code> attribute, log a warning that the <code>path</code> + attribute will be ignored. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When a deployment descriptor is deployed that references an external + <code>docBase</code> and, as a result, a <code>docBase</code> under the + <code>appBase</code> will be ignored, log a warning. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60276">60276</a> that meant that + compression was applied to all MIME types. Patch provided by Stefan + Knoblich. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.6_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add async HTTP/2 parser for NIO2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add minor HPACK fixes, based on fixes by Stuart Douglas. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61751">61751</a>: Follow up fix so that OpenSSL engine returns + underflow when unwrapping if no bytes were produced and the input is + empty. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Minor OpenSSL engine cleanups. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + NIO SSL handshake should throw an exception on overflow status, like + NIO2 SSL. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.6_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=47467">47467</a>: When deploying a web application via the manager + application and a path is not explicitly specified, derive it from the + provided deployment descriptor or, if that is not present, the WAR or + DIR. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48672">48672</a>: Add documentation for the Host Manager web + application. Patch provided by Marek Czernek. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for specifying the application version when deploying an + application via the Manager application HTML interface. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Work-around a known, non-specification compliant behaviour in some + versions of IE that can allow XSS when the Manager application generates + a plain text response. Based on a suggestion from Muthukumar Marikani. + (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.5_(markt)"><span style="float: right;">2018-02-11</span> Tomcat 9.0.5 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Prevent a stack trace being written to standard out when running on Java + 10 due to changes in the <code>LogManager</code> implementation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid duplicate load attempts if one has been made already. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid NPE in ThreadLocalLeakPreventionListener if there is no Engine. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62000">62000</a>: When a JNDI reference cannot be resolved, ensure that + the root cause exception is reported rather than swallowed. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62036">62036</a>: When caching an authenticated user Principal in the + session when the web application is configured with the + <code>NonLoginAuthenticator</code>, cache the internal Principal object + rather than the user facing Principal object as Tomcat requires the + internal object to correctly process later authorization checks. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Refactor error handling to enable errors that occur before processing is + passed to the application to be handled by the application provided + error handling and/or the container provided error handling + (<code>ErrorReportValve</code>) as appropriate. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Pass 404 errors triggered by a missing ROOT web application to the + container error handling to generate the response body. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Pass 400 errors triggered by invalid request targets to the container + error handling to generate the response body. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Provide a correct <code>Allow</code> header when responding to an HTTP + <code>TRACE</code> request for a JSP with a 405 status code. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When using Tomcat embedded, only perform Authenticator configuration + once during web application start. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62067">62067</a>: Correctly apply security constraints mapped to the + context root using a URL pattern of <code>""</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Process all <code>ServletSecurity</code> annotations at web application + start rather than at servlet load time to ensure constraints are applied + consistently. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61751">61751</a>: Fix truncated request input streams when using NIO2 + with TLS. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62023">62023</a>: Log error reporting multiple SSLHostConfig elements + when using the APR Connector instead of crashing Tomcat. (csutherl) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62032">62032</a>: Fix NullPointerException when certificateFile is not + defined on an SSLHostConfig and unify the behavior when a + certificateFile is defined but the file does not exist for both + JKS and PEM file types. (csutherl) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the <code>toString()</code> method behaves consistently for + <code>ByteChunk</code> and <code>CharChunk</code> and that + <code>null</code> is returned when <code>toString()</code> is called + both on newly created objects and immediately after a call to + <code>recycle()</code>. This should not impact typical Tomcat users. It + may impact users who use these classes directly in their own code. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the <code>toString()</code>, <code>toBytes()</code> and + <code>toChars()</code> methods of <code>MessageBytes</code> behave + consistently and do not throw a <code>NullPointerException</code> both + on newly created objects and immediately after a call to + <code>recycle()</code>. This should not impact typical Tomcat users. It + may impact users who use these classes directly in their own code. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When processing an HTTP 1.0 request in the HTTP connector and no host + information is provided in the request, obtain the server port from the + local port rather than the connector configuration since the configured + value maybe zero. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Enable strict validation of the provided host name and port for all + connectors. Requests with invalid host names and/or ports will be + rejected with a 400 response. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update the host validation to permit host names and components of domain + names (excluding top-level domains) to start with a number and to ensure + that top-level domains are fully alphabetic. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62053">62053</a>: Fix NPE when writing push headers with HTTP/2 NIO2. + Patch submitted by Holger Sunke. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Include an HTTP <code>Allow</code> header when a JSP generates a + 405 response due to a request with an unsupported method. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for the HTTP <code>OPTION</code> method to JSPs. The + JSP specification explicitly states that the behaviour for this + method is undefined for JSPs so this is a Tomcat specific + behaviour. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62024">62024</a>: When closing a connection with an abnormal close, + close the socket immediately rather than waiting for a close message + from the client that may never arrive. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Webapps">Webapps</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62049">62049</a>: Fix missing class from manager 404 JSP error page. + (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Enhance the JMX support for jdbc-pool in order to expose + <code>PooledConnection</code> and <code>JdbcInterceptors</code>. + (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add MBean for <code>PooledConnection</code>. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62011">62011</a>: Add MBean for <code>StatementCache</code>. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Expose the cache size for each connection via JMX in + <code>StatementCache</code>. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add MBean for <code>ResetAbandonedTimer</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.5_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the list with the public interfaces in the RELEASE-NOTES. + (violetagg) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the NSIS Installer used to build the Windows installer to version + 3.03. (kkolinko) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.4_(markt)"><span style="float: right;">2018-01-22</span> Tomcat 9.0.4 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.4_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the previous fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61916">61916</a> that meant + that any call to <code>addHeader()</code> would have been replaced with + a call to <code>setHeader()</code> for all requests mapped to the + <code>AddDefaultCharsetFilter</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61999">61999</a>: maxSavePostSize set to 0 should disable saving POST + data during authentication. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.4_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix NIO2 HTTP/2 sendfile. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61993">61993</a>: Improve handling for <code>ByteChunk</code> and + <code>CharChunk</code> instances that grow close to the maximum size + allowed by the JRE. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.4_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=43925">43925</a>: Add a new system property + (<code>org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE</code>) to + control the size of the buffer used by Jasper when buffering tag bodies. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.4_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=62006">62006</a>: Document the new <code>JvmOptions9</code> command line + parameter for <code>tomcat9.exe</code>. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.3_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.3 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57619">57619</a>: Implement a small optimisation to how JAR URLs are + processed to reduce the storage of duplicate String objects in memory. + Patch provided by Dmitri Blinov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add some missing NPEs to ServletContext. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update the Java EE 8 XML schema to the released versions. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Minor HTTP/2 push fixes. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61916">61916</a>: Extend the <code>AddDefaultCharsetFilter</code> to add + a character set when the content type is set via + <code>setHeader()</code> or <code>addHeader()</code> as well as when it + is set via <code>setContentType()</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When using WebDAV to copy a file resource to a destination that requires + a collection to be overwritten, ensure that the operation succeeds + rather than fails (with a 500 response). This enables Tomcat to pass two + additional tests from the Litmus WebDAV test suite. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Modify the Default and WebDAV Servlets so that a 405 status code is + returned for <code>PUT</code> and <code>DELETE</code> requests when + disabled via the <code>readonly</code> initialisation parameter. + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Align the contents of the <code>Allow</code> header with the response + code for the Default and WebDAV Servlets. For any given resource a + method that returns a 405 status code will not be listed in the + <code>Allow</code> header and a method listed in the <code>Allow</code> + header will not return a 405 status code. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60276">60276</a>: Implement GZIP compression support for responses + served over HTTP/2. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not call onDataAvailable without any data to read. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly handle EOF when <code>ServletInputStream.isReady()</code> is + called. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Log errors on non-container threads at + <code>DEBUG</code> rather than <code>INFO</code>. The exception will be + made available to the application via the asynchronous error handling + mechanism. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61914">61914</a>: Possible NPE with Java 9 when creating a SSL engine. + Patch submitted by Evgenij Ryazanov. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61918">61918</a>: Fix connectionLimitLatch counting when closing an + already closed socket. Based on a patch by Ryan Fong. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for the OpenSSL ARIA ciphers to the OpenSSL to JSSE + cipher mapping. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61932">61932</a>: Allow a call to <code>AsyncContext.dispatch()</code> + to terminate non-blocking I/O. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61948">61948</a>: Improve the handling of malformed ClientHello messages + in the code that extracts the SNI information from a TLS handshake for + the JSSE based NIO and NIO2 connectors. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix NIO2 handshaking with a full input buffer. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Return a simple, plain text error message if a client attempts to make a + plain text HTTP connection to a TLS enabled NIO or NIO2 Connector. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61854">61854</a>: When using sets and/or maps in EL expressions, ensure + that Jasper correctly parses the expression. Patch provided by Ricardo + Martin Camarero. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the handling of methods with varargs in EL expressions. In + particular, the calling of a varargs method with no parameters now works + correctly. Based on a patch by Nitkalya (Ing) Wiriyanuparb. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61945">61945</a>: Fix prototype mode used to compile tags. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61223">61223</a>: Add the mbeans-descriptors.dtd file to the custom + MBean documentation so users have a reference to use when constructing + mbeans-descriptors.xml files for custom components. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61565">61565</a>: Add the ability to trigger a reloading of TLS host + configuration (certificate and key files, server.xml is not re-parsed) + via the Manager web application. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61566">61566</a>: Expose the currently in use certificate chain and list + of trusted certificates for all virtual hosts configured using the JSSE + style (keystore) TLS configuration via the Manager web application. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Partial fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>. Ensure that multiple threads do not + attempt to complete the <code>AsyncContext</code> if an I/O error occurs + in the stock ticker example Servlet. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Prevent <code>ConcurrentModificationException</code> + when running the asynchronous stock ticker in the examples web + application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61886">61886</a>: Prevent <code>NullPointerException</code> and other + errors if the stock ticker example is running when the examples web + application is stopped. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61910">61910</a>: Clarify the meaning of the <code>allowLinking</code> + option in the documentation web application. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add OCSP configuration information to the SSL How-To. Patch provided by + Marek Czernek. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61312">61312</a>: Prevent <code>NullPointerException</code>n when using + the statement cache of connection that has been closed. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.3_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add an additional system property for the system property replacement. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add missing SHA-512 hash for release artifacts to the build script. + (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Pool 2 to 2.4.3. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons DBCP 2 to 8a71764 (2017-10-18) to + pick up some bug fixes and enhancements. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons FileUpload to 6c00d57 (2017-11-23) + to pick up some code clean-up. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Codec to r1817136 to pick up some + code clean-up. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + The native source bundles (for Commons Daemon and Tomcat Native) are no + longer copied to the bin directory for the deploy target. They are now + only copied to the bin directory for the release target. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.2_(markt)"><span style="float: right;">2017-11-30</span> Tomcat 9.0.2 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix possible <code>SecurityException</code> when using TLS related + request attributes. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61597">61597</a>: Extend the <code>StandardJarScanner</code> to scan + JARs on the module path when running on Java 9 and class path scanning + is enabled. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61601">61601</a>: Add support for multi-release JARs in JAR scanning and + web application class loading. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61681">61681</a>: Allow HTTP/2 push when using request wrapping. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Provide the <code>SessionInitializerFilter</code> that can be used to + ensure that an HTTP session exists when initiating a WebSocket + connection. Patch provided by isapir. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61682">61682</a>: When re-prioritising HTTP/2 streams, ensure that both + parent and children fields are correctly updated to avoid a possible + <code>StackOverflowError</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve concurrency by reducing the scope of the synchronisation for + <code>javax.security.auth.message.config.AuthConfigFactory</code> in the + JASPIC API implementation. Based on a patch by Pavan Kumar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid a possible <code>NullPointerException</code> when timing out + <code>AsyncContext</code> instances during shut down. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61777">61777</a>: Avoid a <code>NullPointerException</code> when + detaching a JASPIC <code>RegistrationListener</code>. Patch provided by + Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61778">61778</a>: Correct the return value when detaching a JASPIC + <code>RegistrationListener</code>. Patch provided by Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61779">61779</a>: Avoid a <code>NullPointerException</code> when a + <code>null</code> <code>RegistrationListener</code> is passed to + <code>AuthConfigFactory.getConfigProvider()</code>. Patch provided by + Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61780">61780</a>: Only include the default JASPIC registration ID in the + return value for a call to + <code>AuthConfigFactory.getRegistrationIDs()</code> if a + <code>RegistrationContext</code> has been registered using the default + registration ID. Patch provided by Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61781">61781</a>: Enable JASPIC provider registrations to be persisted + when the layer and/or application context are <code>null</code>. Patch + provided by Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61782">61782</a>: When calling + <code>AuthConfigFactory.doRegisterConfigProvider()</code> and the + requested JASPIC config provider class is found by the web application + class loader, do not attempt to load the class with the class loader + that loaded the JASPIC API. Patch provided by Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61783">61783</a>: When calling + <code>AuthConfigFactory.removeRegistration()</code> and the registration + is persistent, it should be removed from the persistent store. Patch + provided by Lazar. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61784">61784</a>: Correctly handle the case when + <code>AuthConfigFactoryImpl.registerConfigProvider()</code> is called + with a provider name of <code>null</code>. Patch provided by Lazar. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61795">61795</a>: Add a property to the <code>Authenticator</code> + implementations to enable a custom JASPIC <code>CallbackHandler</code> + to be specified. Patch provided by Lazar. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61568">61568</a>: Avoid a potential <code>SecurityException</code> when + using the NIO2 connector and a new thread is added to the pool. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61583">61583</a>: Correct a further regression in the fix to enable the + use of Java key stores that contained multiple keys that did not all + have the same password. This fixes PKCS11 key store handling with + multiple keys selected with an alias. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve NIO2 syncing for async IO operations. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Sendfile support for HTTP/2 and NIO2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Reduce default HTTP/2 stream concurrent execution within a connection + from 200 to 20. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61668">61668</a>: Avoid a possible NPE when calling + <code>AbstractHttp11Protocol.getSSLProtocol()</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61673">61673</a>: Avoid a possible + <code>ConcurrentModificationException</code> when working with the + streams associated with a connection. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61719">61719</a>: Avoid possible NPE calling + InputStream.setReadListener with HTTP/2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61736">61736</a>: Improve performance of NIO connector when clients + leave large time gaps between network packets. Patch provided by Zilong + Song. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61740">61740</a>: Correct an off-by-one error in the Hpack header index + validation that caused intermittent request failures when using HTTP/2. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61604">61604</a>: Fix SMAP generation for JSPs that generate no output. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61816">61816</a>: Invalid expressions in attribute values or template + text should trigger a translation (compile time) error, not a run time + error. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61604">61604</a>: Add support for authentication in the websocket + client. Patch submitted by J Fernandez. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct Javadoc links to point to Java SE 8 and Java EE 8. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Enable Javadoc to be built with Java 9. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61603">61603</a>: Add XML filtering for the status servlet output where + needed. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the description of how the CGI servlet maps a request to a + script in the CGI How-To. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix incorrect behavior that attempts to resend channel messages more + than the actual setting value of <code>maxRetryAttempts</code>. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the remaining Sender can send channel messages by avoiding + unintended <code>ChannelException</code> caused by comparing the number + of failed members and the number of remaining Senders. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that remaining SelectionKeys that were not handled by throwing a + <code>ChannelException</code> during SelectionKey processing are + handled. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.2_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61439">61439</a> and exclude the JPA, JAX-WS and EJB + annotations completely from the Tomcat distributions. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve handling of endorsed directories. The endorsed directory + mechanism will only be used if the <code>JAVA_ENDORSED_DIRS</code> + system property is explicitly set or if + <code>$CATALINA_HOME/endorsed</code> exists. When running on Java 9, any + such attempted use of the endorsed directory mechanism will trigger an + error and Tomcat will fail to start. (rjung) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=51496">51496</a>: When using the Windows installer, check if the + requested service name already exists and, if it does, prompt the user + to select an alternative service name. Patch provided by Ralph + Plawetzki. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61590">61590</a>: Enable <code>service.bat</code> to recognise when + <code>JAVA_HOME</code> is configured for a Java 9 JDK. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61598">61598</a>: Update the Windows installer to search the new (as of + Java 9) registry locations when looking for a JRE. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add generation of a SHA-512 hash for release artifacts to the build + script. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61658">61658</a>: Update MIME mappings for fonts to use + <code>font/*</code> as per RFC8081. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.16 to + pick up the latest Windows binaries built with APR 1.6.3 and OpenSSL + 1.0.2m. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the NSIS Installer used to build the Windows installer to version + 3.02.1. (kkolinko) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the Windows installer to use "The Apache Software Foundation" as + the Publisher when Tomcat is displayed in the list of installed + applications in Microsoft Windows. (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61803">61803</a>: Remove outdated SSL information from the Security + documentation. (remm) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.1_(markt)"><span style="float: right;">2017-09-30</span> Tomcat 9.0.1 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.1_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Use the correct path when loading the JVM <code>logging.properties</code> + file for Java 9. (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add additional validation to the resource handling required to fix + CVE-2017-12617 on Windows. The checks were being performed elsewhere but + adding them to the resource handling ensures that the checks are always + performed. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.1_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61563">61563</a>: Correct typos in Spanish translation. Patch provided by + Gonzalo Vásquez. (csutherl) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61542">61542</a>: Fix CVE-2017-12617 and prevent JSPs from being + uploaded via a specially crafted request when HTTP PUT was enabled. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61554">61554</a>: Exclude test files in unusual encodings and markdown + files intended for display in GitHub from RAT analysis. Patch provided + by Chris Thistlethwaite. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60762">60762</a>: Add the ability to make changes to the TLS + configuration of a connector at runtime without having to restart the + Connector. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add an option to reject requests that contain HTTP headers with invalid + (non-token) header names with a 400 response and reject such requests by + default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Implement the requirements of RFC 7230 (and RFC 2616) that HTTP/1.1 + requests must include a <code>Host</code> header and any request that + does not must be rejected with a 400 response. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Implement the requirements of RFC 7230 that any HTTP/1.1 request that + specifies a host in the request line, must specify the same host in the + <code>Host</code> header and that any such request that does not, must + be rejected with a 400 response. This check is optional but enabled by + default. It may be disabled with the + <code>allowHostHeaderMismatch</code> attribute of the Connector. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Implement the requirements of RFC 7230 that any HTTP/1.1 request that + contains multiple <code>Host</code> headers is rejected with a 400 + response. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Add a way to set the property source in embedded mode. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61557">61557</a>: Correct a further regression in the fix to enable the + use of Java key stores that contain multiple keys that do not all have + the same password. The regression broke support for some FIPS compliant + key stores. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61545">61545</a>: Correctly handle invocations of methods defined in the + <code>PooledConnection</code> interface when using pooled XA + connections. Patch provided by Nils Winkler. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59904">59904</a> so that values less than zero are accepted + instead of throwing a NegativeArraySizeException. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Complete the implementation of the Servlet 4.0 specification. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M27_(markt)"><span style="float: right;">2017-09-19</span> Tomcat 9.0.0.M27 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Before generating an error page in the <code>ErrorReportValve</code>, + check to see if I/O is still permitted for the associated connection + before generating the error page so that the page generation can be + skipped if the page is never going to be sent. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61189">61189</a>: Add the ability to set environment variables for + individual CGI scripts. Based on a patch by jm009. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61210">61210</a>: When running under a SecurityManager, do not print a + warning about not being able to read a logging configuration file when + that file does not exist. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61280">61280</a>: Add RFC 7617 support to the + <code>BasicAuthenticator</code>. Note that the default configuration + does not change the existing behaviour. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61424">61424</a>: Avoid a possible <code>StackOverflowError</code> when + running under a <code>SecurityManager</code> and using + <code>Subject.doAs()</code>. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When running under Java 9 or later, and the + <code>urlCacheProtection</code> option of the + <code>JreMemoryLeakPreventionListener</code> is enabled, use the API + added in Java 9 to only disable the caching for JAR URL connections. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61489">61489</a>: When using the CGI servlet, make the generation of + command line arguments from the query string (as per section 4.4 of RFC + 3875) optional and disabled by default. Based on a patch by jm009. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61503">61503</a>: This corrects a potential regression in the fix for + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60940">60940</a> with an alternative solution that adds the + <code>JarEntry</code> objects normally skipped by a + <code>JarInputStream</code> only if those entries exist. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + The minimum required Tomcat Native version has been increased to 1.2.14. + This version includes a new API needed for correct client certificate + support when using a Java connector with OpenSSL TLS implementation and + support for the <code>SSL_CONF</code> OpenSSL API. (rjung) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for the OpenSSL <code>SSL_CONF</code> API when using + TLS with OpenSSL implementation. It can be used by adding + <code>OpenSSLConf</code> elements underneath <code>SSLHostConfig</code>. + The new element contains a list of <code>OpenSSLConfCmd</code> elements, + each with the attributes <code>name</code> and <code>value</code>. + (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When using a Java connector in combination with the OpenSSL TLS + implementation, do not configure each SSL connection object via + the OpenSSLEngine. For OpenSSL the SSL object inherits its + settings from the SSL_CTX which we have already configured. + (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When using JSSE TLS configuration with the OpenSSL implementation and + client certificates: include client CA subjects in the TLS handshake + so that the client can choose an appropriate client certificate to + present. (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If an invalid option is specified for the + <code>certificateVerification</code> attribute of an + <code>SSLHostConfig</code> element, treat it as <code>required</code> + which is the most secure / restrictive option in addition to reporting + the configuration error. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the handling of client disconnections during the TLS + renegotiation handshake. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Prevent exceptions being thrown during normal shutdown of NIO + connections. This enables TLS connections to close cleanly. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix possible race condition when setting IO listeners on an upgraded + connection. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the APR/native connector uses blocking I/O for TLS + renegotiation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48655">48655</a>: Enable Tomcat to shutdown cleanly when using sendfile, + the APR/native connector and a multi-part download is in progress. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58244">58244</a>: Handle the case when OpenSSL resumes a TLS session + using a ticket and the full client certificate chain is not available. + In this case the client certificate without the chain will be presented + to the application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the warning message when JSSE and OpenSSL configuration styles + are mixed on the same <code>SSLHostConfig</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61415">61415</a>: Fix TLS renegotiation with OpenSSL based connections + and session caching. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Delay checking that the configured attributes for an + <code>SSLHostConfig</code> instance are consistent with the configured + SSL implementation until <code>Connector</code> start to avoid incorrect + warnings when the SSL implementation changes during initialisation. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61450">61450</a>: Fix default key alias algorithm. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61451">61451</a>: Correct a regression in the fix to enable the use of + Java key stores that contained multiple keys that did not all have the + same password. The regression broke support for any key store that did + not store keys in PKCS #8 format such as hardware key stores and Windows + key stores. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60523">60523</a>: Reduce the number of packets used to send WebSocket + messages by not flushing between the header and the payload when the + two are written together. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61491">61491</a>: When using the <code>permessage-deflate</code> + extension, correctly handle the sending of empty messages after + non-empty messages to avoid the <code>IllegalArgumentException</code>. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Show connector cipher list in the manager web application in the + correct cipher order. (rjung) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + To avoid unexpected session timeout notification from backup session, + update the access time when receiving the map member notification + message. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add member info to the log message when the failure detection check + fails in <code>TcpFailureDetector</code>. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid Ping timeout until the added map member by receiving + <code>MSG_START</code> message is completely started. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When sending a channel message, make sure that the Sender has connected. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the backup node selection logic that node 0 is returned twice + consecutively. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix race condition of <code>responseMap</code> in + <code>RpcChannel</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61391">61391</a>: Ensure that failed queries are logged if the + <code>SlowQueryReport</code> interceptor is configured to do so and the + connection has been abandoned. Patch provided by Craig Webb. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61425">61425</a>: Ensure that transaction of idle connection has + terminated when the <code>testWhileIdle</code> is set to + <code>true</code> and <code>defaultAutoCommit</code> is set to + <code>false</code>. Patch provided by WangZheng. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M27_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61419">61419</a>: Replace a Unix style comment in the DOS bat file + <code>catalina.bat</code> with the correct <code>rem</code> markup. + (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61439">61439</a>: Remove the Java Annotation API classes from + tomcat-embed-core.jar and package them in a separate JAR in the + embedded distribution to provide end users with greater flexibility to + handle potential conflicts with the JRE and/or other JARs. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61441">61441</a>: Improve the detection of <code>JAVA_HOME</code> by the + <code>daemon.sh</code> script when running on a platform where Java has + been installed from an RPM. (rjung) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.14 to + pick up the latest Windows binaries built with APR 1.6.2 and OpenSSL + 1.0.2l. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61599">61599</a>: Update to Commons Daemon 1.1.0 for improved Java 9 + support. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M26_(markt)"><span style="float: right;">2017-08-08</span> Tomcat 9.0.0.M26 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M26_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct multiple regressions in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> that could + corrupt static content served by the <code>DefaultServlet</code>.(markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a bug in the <code>PushBuilder</code> implementation that + meant push URLs containing <code>%nn</code> sequences were not correctly + decoded. Identified by FindBugs. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61164">61164</a>: Add support for the <code>%X</code> pattern in the + <code>AccessLogValve</code> that reports the connection status at the + end of the request. Patch provided by Zemian Deng. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61351">61351</a>: Correctly handle %nn decoding of URL patterns in + web.xml and similar locations that may legitimately contain characters + that are not permitted by RFC 3986. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61366">61366</a>: Add a new attribute, <code>localDataSource</code>, to + the <code>JDBCStore</code> that allows the Store to be configured to use + a DataSource defined by the web application rather than the default of + using a globally defined DataSource. Patch provided by Jonathan + Horowitz. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M26_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61086">61086</a>: Ensure to explicitly signal an empty request body for + HTTP 205 responses. Additional fix to r1795278. Based on a patch + provided by Alexandr Saperov. (violetagg) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61345">61345</a>: Add a server listener that can be used to do system + property replacement from the property source configured in the + digester. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add additional logging to record problems that occur while waiting for + the NIO pollers to stop during the Connector stop process. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M26_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61364">61364</a>: Ensure that files are closed after detecting encoding + of JSPs so that files do not remain locked by the file system. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M26_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57767">57767</a>: Add support to the WebSocket client for following + redirects when attempting to establish a WebSocket connection. Patch + provided by J Fernandez. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M25_(markt)"><span style="float: right;">2017-07-28</span> Tomcat 9.0.0.M25 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M25_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Performance improvements for service loader look-ups (and look-ups of + other class loader resources) when the web application is deployed in a + packed WAR file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60963">60963</a>: Add <code>ExtractingRoot</code>, a new + <code>WebResourceRoot</code> implementation that extracts JARs to the + work directory for improved performance when deploying packed WAR files. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61253">61253</a>: Add warn message when Digester.updateAttributes + throws an exception instead of ignoring it. (csutherl) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a further regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> that could + cause an byte order mark character to appear at the start of content + included by the <code>DefaultServlet</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61313">61313</a>: Make the read timeout configurable in the + <code>JNDIRealm</code> and ensure that a read timeout will result in an + attempt to fail over to the alternateURL. Based on patches by Peter + Maloney and Felix Schumacher. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M25_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the documentation for how <code>StandardRoot</code> is + configured. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M25_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61316">61316</a>: Fix corruption of UTF-16 encoded source files in + released source distributions. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M24_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M24 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M24_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=52924">52924</a>: Add support for a Tomcat specific deployment + descriptor, <code>/WEB-INF/tomcat-web.xml</code>. This descriptor has an + identical format to <code>/WEB-INF/web.xml</code>. The Tomcat descriptor + takes precedence over any settings in <code>conf/web.xml</code> but does + not take precedence over any settings in <code>/WEB-INF/web.xml</code>. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61232">61232</a>: When log rotation is disabled only one separator will + be used when generating the log file name. For example if the prefix is + <code>catalina.</code> and the suffix is <code>.log</code> then the log + file name will be <code>catalina.log</code> instead of + <code>catalina..log</code>. Patch provided by Katya Stoycheva. + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61264">61264</a>: Correct a regression in the refactoring to use + <code>Charset</code> rather than <code>String</code> to store request + character encoding that prevented <code>getReader()</code> throwing an + <code>UnsupportedEncodingException</code> if the user agent specifies + an unsupported character encoding. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a> that could cause an + incorrect <code>Content-Length</code> header to be sent by the + <code>DefaultServlet</code> if the encoding of a static is not + consistent with the encoding of the response. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M24_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Enable TLS connectors to use Java key stores that contain multiple keys + where each key has a separate password. Based on a patch by Frank + Taffelt. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the handling of HTTP/2 stream resets due to excessive headers + when a continuation frame is used. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M24_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=53031">53031</a>: Add support for the <code>fork</code> option when + compiling JSPs with the Jasper Ant task and javac. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M24_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=52791">52791</a>: Add the ability to set the defaults used by the + Windows installer from a configuration file. Patch provided by Sandra + Madden. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M23_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M23 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=49464">49464</a>: Improve the Default Servlet's handling of static files + when the file encoding is not compatible with the required response + encoding. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61214">61214</a>: Remove deleted attribute <code>servlets</code> from + the Context MBean description. Patch provided by Alexis Hassler. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61215">61215</a>: Correctly define <code>addConnectorPort</code> and + <code>invalidAuthenticationWhenDeny</code> in the + <code>mbean-descriptors.xml</code> file for the + <code>org.apache.catalina.valves</code> package so that the attributes + are accessible via JMX. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61216">61216</a>: Improve layout for <code>CompositeData</code> and + <code>TabularData</code> when viewing via the JMX proxy servlet. Patch + provided by Alexis Hassler. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Additional permission for deleting files is granted to JULI as it is + required by FileHandler when running under a Security Manager. The + thread that cleans the log files is marked as daemon thread. + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61229">61229</a>: Correct a regression in 9.0.0.M21 that broke WebDAV + handling for resources with names that included a <code>&</code> + character. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Restore the ability to configure support for SSLv3. Enabling this + protocol will trigger a warning in the logs since it is known to be + insecure. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add LoadBalancerDrainingValve, a Valve designed to reduce the amount of + time required for a node to drain its authenticated users. (schultz) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not log a warning when a <code>null</code> session is returned for an + OpenSSL based TLS session since this is expected when session tickets + are enabled. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When the access log valve logs a TLS related request attribute and the + NIO2 connector is used with OpenSSL, ensure that the TLS attributes are + available to the access log valve when the connection is closing. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60461">60461</a>: Sync SSL session access for the APR connector. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61224">61224</a>: Make the <code>GlobalRequestProcessor</code> MBean + attributes read-only. Patch provided by Alexis Hassler. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=49176">49176</a>: When generating JSP runtime error messages that quote + the relevant JSP source code, switch from using the results of the JSP + page parsing process to using the JSR 045 source map data to identify + the correct part of the JSP source from the stack trace. This + significantly reduces the memory footprint of Jasper in development + mode, provides a small performance improvement for error page generation + and enables source quotes to continue to be provided after a Tomcat + restart. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove references to the Loader attribute + <code>searchExternalFirst</code> from the documentation since the + attribute is no longer supported. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=51513">51513</a>: Add support for the <code>compressionMinSize</code> + attribute to the <code>GzipInterceptor</code>, add optional statistics + collection and expose the Interceptor over JMX. Based on a patch by + Christian Stöber. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61127">61127</a>Allow human-readable names for channelSendOptions and + mapSendOptions. Patch provided by Igal Sapir. (schultz) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M23_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Restore the local definition of the web service annotations since the + JRE provided versions are deprecated and Java 9 does not provide them by + default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add necessary Java 9 configuration options to the startup scripts to + prevent warnings being generated on web application stop. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M22_(markt)"><span style="float: right;">2017-06-26</span> Tomcat 9.0.0.M22 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48543">48543</a>: Add the option to specify an alternative file name for + the <code>catalina.config</code> system property. Also document that + relative, as well as absolute, URLs are permitted. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61072">61072</a>: Respect the documentation statements that allow + using the platform default secure random for session id generation. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the javadoc for + <code>o.a.c.connector.CoyoteAdapter#parseSessionCookiesId</code>. + Patch provided by John Andrew (XUZHOUWANG) via Github. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61101">61101</a>: CORS filter should set Vary header in response. + Submitted by Rick Riemer. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61105">61105</a>: Add a new JULI FileHandler configuration for + specifying the maximum number of days to keep the log files. By default + the log files will be kept 90 days as configured in + <code>logging.properties</code>. (violetagg) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the Servlet 4.0 implementation to add support for setting + trailer fields for HTTP responses. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61125">61125</a>: Ensure that <code>WarURLConnection</code> returns the + correct value for calls to <code>getLastModified()</code> as this is + required for the correct detection of JSP modifications when the JSP is + packaged in a WAR file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the <code>SSLValve</code> so it is able to handle client + certificate headers from Nginx. Based on a patch by Lucas Ventura Carro. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61134">61134</a>: Do not use '[' and ']' symbols around substituted + text fragments when generating the default error pages. Patch provided + by Katya Todorova. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61154">61154</a>: Allow the Manager and Host Manager web applications to + start by default when running under a security manager. This was + accomplished by adding a custom permission, + <code>org.apache.catalina.security.DeployXmlPermission</code>, that + permits an application to use a <code>META-INF/context.xml</code> file + and then granting that permission to the Manager and Host Manager. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61173">61173</a>: Polish the javadoc for + <code>o.a.catalina.startup.Tomcat</code>. Patch provided by + peterhansson_se. (violetagg) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + A new configuration property <code>crawlerIps</code> is added to the + <code>o.a.catalina.valves.CrawlerSessionManagerValve</code>. Using this + property one can specify a regular expression that will be used to + identify crawlers based on their IP address. Based on a patch provided + by Tetradeus. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61180">61180</a>: Log a warning message rather than an information + message if it takes more than 100ms to initialised a + <code>SecureRandom</code> instance for a web application to use to + generate session identifiers. Patch provided by Piotr Chlebda. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61185">61185</a>: When an asynchronous request is dispatched via + <code>AsyncContext.dispatch()</code> ensure that + <code>getRequestURI()</code> for the dispatched request matches that of + the original request. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61197">61197</a>: Ensure that the charset name used in the + <code>Content-Type</code> header has exactly the same form as that + provided by the application. This reverts a behavioural change in + 9.0.0.M21 that caused problems for some clients. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61201">61201</a>: Ensure that the <code>SCRIPT_NAME</code> environment + variable for CGI executables is populated in a consistent way regardless + of how the CGI servlet is mapped to a request. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure to send a space between trailer field name and field value + for HTTP responses trailer fields. (huxing) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61086">61086</a>: Explicitly signal an empty request body for HTTP 205 + responses. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61120">61120</a>: Do not ignore path parameters when processing HTTP/2 + requests. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Revert a change introduced in the fix for bug <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60718">60718</a> that + changed the status code recorded in the access log when the client + dropped the connection from 200 to 500. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Make asynchronous error handling more robust. In particular ensure that + <code>onError()</code> is called for any registered + <code>AsyncListener</code>s after an I/O error on a non-container + thread. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add additional syncs to the SSL session object provided by the OpenSSL + engine so that a concurrent destruction cannot cause a JVM crash. + (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=44787">44787</a>: Improve error message when JSP compiler configuration + options are not valid. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=45931">45931</a>: Extend Jasper's <code>timeSpaces</code> option to add + support for <code>single</code> which replaces template text that + consists entirely of whitespace with a single space character. Based on + a patch by Meetesh Karia. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=53011">53011</a>: When pre-compiling with JspC, report all compilation + errors rather than stopping after the first error. A new option + <code>-failFast</code> can be used to restore the previous behaviour of + stopping after the first error. Based on a patch provided by Marc Pompl. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61137">61137</a>: <code>j.s.jsp.tagext.TagLibraryInfo#uri</code> and + <code>j.s.jsp.tagext.TagLibraryInfo#prefix</code> fields should not be + final. Patch provided by Katya Todorova. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the log message when a <code>MessageHandler</code> for + <code>PongMessage</code> does not implement + <code>MessageHandler.Whole</code>. (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve thread-safety of <code>Future</code>s used to report the result + of sending WebSocket messages. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61183">61183</a>: Correct a regression in the previous fix for + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58624">58624</a> that could trigger a deadlock depending on the locking + strategy employed by the client code. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Better document the meaning of the trimSpaces option for Jasper. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61150">61150</a>: Configure the Manager and Host-Manager web + applications to permit serialization and deserialization of + CRSFPreventionFilter related session objects to avoid warning messages + and/or stack traces on web application stop and/or start when running + under a security manager. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the TLS configuration documentation to remove SSLv2 and SSLv3 + from the list of supported protocols. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M22_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=45832">45832</a>: Add HTTP DIGEST authentication support to the Catalina + Ant tasks used to communicate with the Manager application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=45879">45879</a>: Add the <code>RELEASE-NOTES</code> file to the root of + the installation created by the Tomcat installer for Windows to make it + easier for users to identify the installed Tomcat version. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61055">61055</a>: Clarify the code comments in the rewrite valve to make + clear that there are no plans to provide proxy support for this valve + since Tomcat does not have proxy capabilities. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61076">61076</a>: Document the <code>altDDName</code> attribute for the + <code>Context</code> element. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct typo in Jar Scan Filter Configuration Reference. + Issue reported via comments.apache.org. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the requirement for the minimum Java SE version in Application + Developer's Guide. Issue reported via comments.apache.org. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61145">61145</a>: Add missing <code>@Documented</code> annotation to + annotations in the annotations API. Patch provided by Katya Todorova. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61146">61146</a>: Add missing <code>lookup()</code> method to + <code>@EJB</code> annotation in the annotations API. Patch provided by + Katya Todorova. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct typo in Context Container Configuration Reference. + Patch provided by Katya Todorova. (violetagg) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M21_(markt)"><span style="float: right;">2017-05-10</span> Tomcat 9.0.0.M21 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/General">General</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Allow to exclude JUnit test classes using the build property + <code>test.exclude</code> and document the property in + BUILDING.txt. (rjung) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Review those places where Tomcat re-encodes a URI or URI component and + ensure that that correct encoding (path differs from query string) is + applied and that the encoding is applied consistently. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid a <code>NullPointerException</code> when reading attributes for a + initialised HTTP connector where TLS is enabled. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Always quote the <code>hostName</code> of an <code>SSLHostConfig</code> + element when using it as part of the JMX object name to avoid errors that + prevent the associated TLS connector from starting if a wild card + <code>hostName</code> is configured (because <code>*</code> is a + reserved character for JMX object names). (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the default <code>URIEncoding</code> for a <code>Connector</code> + to <code>UTF-8</code> as required by the Servlet 4.0 specification. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Switch to using <code>Charset</code> rather than <code>String</code> to + store encoding settings (including for configuration and for the + <code>Content-Type header</code>) to reduce the number of places the + associated <code>Charset</code> needs to be looked up. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Use a more reliable mechanism for the <code>DefaultServlet</code> when + determining if the current request is for custom error page or not. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that when the Default or WebDAV servlets process an error + dispatch that the error resource is processed via the + <code>doGet()</code> method irrespective of the method used for the + original request that triggered the error. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If a static custom error page is specified that does not exist or cannot + be read, ensure that the intended error status is returned rather than a + 404 or 403. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When the WebDAV servlet is configured and an error dispatch is made to a + custom error page located below <code>WEB-INF</code>, ensure that the + target error page is displayed rather than a 404 response. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the Servlet 4.0 implementation to add support for obtaining + trailer fields from chunked HTTP requests. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61047">61047</a>: Add MIME mapping for woff2 fonts in the default + web.xml. Patch provided by Justin Williamson. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the logic that selects the encoding to use to decode the query + string in the <code>SSIServletExternalResolver</code> so that the + <code>useBodyEncodingForURI</code> attribute of the + <code>Connector</code> is correctly taken into account. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Within the Expires filter, make the content type value specified with the + <code>ExpiresByType</code> parameter, case insensitive. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When a <code>TrustManager</code> is configured that does not support + <code>certificateVerificationDepth</code> only log a warning about that + lack of support when <code>certificateVerificationDepth</code> has been + explicitly set. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60970">60970</a>: Extend the fix for large headers to push requests. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not include a <code>Date</code> header in HTTP/2 responses with + status codes less than 200. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When sending an HTTP/2 push promise with the NIO2 connector, the pushed + stream ID should only be included with the initial push promise frame + and not any subsequent continuation frames. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When no BOM is present and an encoding is detected, do not skip the + bytes used to detect the encoding since they are not part of a BOM. + (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61057">61057</a>: Update to Eclipse JDT Compiler 4.6.3. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61065">61065</a>: Ensure that once the class is resolved by + <code>javax.el.ImportHandler#resolveClass</code> it will be cached with + the proper name. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Introduce new API <code>o.a.tomcat.websocket.WsSession#suspend</code>/ + <code>o.a.tomcat.websocket.WsSession#resume</code> that can be used to + suspend/resume reading of the incoming messages. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=61003">61003</a>: Ensure the flags for reading/writing in + <code>o.a.t.websocket.AsyncChannelWrapperSecure</code> are correctly + reset even if some exceptions occurred during processing. (markt/violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Web_Applications">Web Applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add documents for <code>maxIdleTime</code> attribute to Channel Receiver + docs. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add features to get the statistics of the thread pool of the + <code>Receiver</code> component and + <code>MessageDispatchInterceptor</code>. These statistics information + can be acquired via JMX. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add <code>maxIdleTime</code> attribute to <code>NioReceiverMBean</code> + in order to expose to JMX. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add JMX support for <code>Channel Interceptors</code>. The Interceptors + that implement JMX support are <code>TcpFailureDetector</code>, + <code>ThroughputInterceptor</code>, <code>TcpPingInterceptor</code>, + <code>StaticMembershipInterceptor</code>, + <code>MessageDispatchInterceptor</code> and + <code>DomainFilterInterceptor</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M21_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Modify the Ant build script used to publish to a Maven repository so + that it no longer requires artifacts to be GPG signed. This is make it + possible for the CI system to upload snapshot builds to the ASF Maven + repository. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M20_(markt)"><span style="float: right;">2017-04-18</span> Tomcat 9.0.0.M20 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the Servlet 4.0 API implementation to reflect the change in + method name from <code>getPushBuilder()</code> to + <code>newPushBuilder()</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct various edge cases in the new HTTP Host header validation + parser. Patch provided by Katya Todorova. (martk) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the X to comma refactoring that broke JMX + operations that take parameters. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid a <code>NullPointerException</code> when reading attributes for a + running HTTP connector where TLS is not enabled. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=47214">47214</a>: Refactor code so that explicitly referenced inner + classes are given explicit names rather than being anonymous. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59825">59825</a>: Log a message that lists the components in the + processing chain that do not support async processing when a call to + <code>ServletRequest.startAsync()</code> fails. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60940">60940</a>: Improve the handling of the <code>META-INF/</code> and + <code>META-INF/MANIFEST.MF</code> entries for Jar files located in + <code>/WEB-INF/lib</code> when running a web application from a packed + WAR file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Pre-load the <code>ExceptionUtils</code> class. Since the class is used + extensively in error handling, it is prudent to pre-load it to avoid any + failure to load this class masking the true problem during error + handling. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid potential <code>NullPointerException</code>s related to access + logging during shutdown, some of which have been observed when running + the unit tests. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When there is no <code>javax.servlet.WriteListener</code> registered + then a call to <code>javax.servlet.ServletOutputStream#isReady</code> + will return <code>false</code> instead of throwing + <code>IllegalStateException</code>. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When there is no <code>javax.servlet.ReadListener</code> registered + then a call to <code>javax.servlet.ServletInputStream#isReady</code> + will return <code>false</code> instead of throwing + <code>IllegalStateException</code>. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Align cipher configuration parsing with current OpenSSL master. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60970">60970</a>: Fix infinite loop if application tries to write a + large header to the response when using HTTP/2. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=47214">47214</a>: Refactor code so that explicitly referenced inner + classes are given explicit names rather than being anonymous. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60925">60925</a>: Improve the handling of access to properties defined + by interfaces when a <code>BeanELResolver</code> is used under a + <code>SecurityManager</code>. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add JMX support for Tribes components. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the creating a constructor for a proxy class to reduce + duplicate code. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + In <code>StatementFacade</code>, the method call on the statements that + have been closed throw <code>SQLException</code> rather than + <code>NullPointerException</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M20_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60932">60932</a>: Correctly escape single quotes when used in i18n + messages. Based on a patch by Michael Osipov. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Review i18n property files, remove unnecessary escaping and consistently + use <code>[...]</code> to delimit inserted values. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update the custom Ant task that integrates with the Symantec code + signing service to use the now mandatory 2-factor authentication. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactoring in preparation for Java 9. Refactor to avoid using some + methods that will be deprecated in Java 9 onwards. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M19_(markt)"><span style="float: right;">2017-03-30</span> Tomcat 9.0.0.M19 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M19_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=54618">54618</a>: Add support to the + <code>HttpHeaderSecurityFilter</code> for the HSTS preload parameter. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a bug in the implementation of the Servlet 4.0 feature that + allows specifying a default request and/or response character encoding + per web application. <code>null</code> values passed via the + programmatic interface no longer trigger a + <code>NullPointerException</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a potential exception during shutdown when one or more + Containers are configured with a value of 1 for startStopThreads. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60853">60853</a>: Expose the <code>SSLHostConfig</code> and + <code>SSLHostConfigCertificate</code> objects via JMX. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60876">60876</a>: Ensure that <code>Set-Cookie</code> headers generated + by the <code>Rfc6265CookieProcessor</code> are aligned with the + specification. Patch provided by Jim Griswold. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60882">60882</a>: Fix a <code>NullPointerException</code> when obtaining + a <code>RequestDispatcher</code> for a request that will not have any + pathInfo associated with it. This was a regression in the changes in + 9.0.0.M18 for the Servlet 4.0 API changes. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Align <code>PushBuilder</code> API with changes from the Servlet expert + group. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Align web.xml parsing rules with changes from the Servlet expert group + for <code><request-character-encoding></code> and + <code><response-character-encoding></code>. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the various implementations of X to comma separated list to a + single utility class and update the code to use the new utility class. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60911">60911</a>: Ensure NPE will not be thrown when looking for SSL + session ID. Based on a patch by Didier Gutacker. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M19_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add async based IO groundwork for HTTP/2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix HTTP/2 incorrect input unblocking on EOF. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Close the connection sooner if an event occurs for a current connection + that is not consistent with the current state of that connection. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Speed up shutdown when using multiple acceptor threads by ensuring that + the code that unlocks the acceptor threads correctly handles the case + where there are multiple threads. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60851">60851</a>: Add <code>application/xml</code> and + <code>application/json</code> to the default list of compressible MIME + types. Patch by Michael Osipov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60852">60852</a>: Correctly spell compressible when used in + configuration attributes and internal code. Based on a patch by Michael + Osipov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60900">60900</a>: Avoid a <code>NullPointerException</code> in the APR + Poller if a connection is closed at the same time as new data arrives on + that connection. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve HPACK specification compliance by fixing some test failures + reported by the h2spec tool written by Moto Ishizawa. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve HTTP/2 specification compliance by fixing some test failures + reported by the h2spec tool written by Moto Ishizawa. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60918">60918</a>: Fix sendfile processing error that could lead to + subsequent requests experiencing an <code>IllegalStateException</code>. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve sendfile handling when requests are pipelined. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M19_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60844">60844</a>: Correctly handle the error when fewer parameter values + than required by the method are used to invoke an EL method expression. + Patch provided by Daniel Gray. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M19_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60764">60764</a>: Implement <code>equals()</code> and + <code>hashCode()</code> in the <code>StatementFacade</code> in order to + enable these methods to be called on the closed statements if any + statement proxy is set. This behavior can be changed with + <code>useStatementFacade</code> attribute. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M19_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor the build script and the NSIS installer script so that either + NSIS 2.x or NSIS 3.x can be used to build the installer. This is + primarily to re-enable building the installer on the Linux based CI + system where the combination of NSIS 3.x and wine leads to failed + installer builds. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M18_(markt)"><span style="float: right;">2017-03-13</span> Tomcat 9.0.0.M18 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60469">60469</a>: Refactor <code>RealmBase</code> for better code re-use + when implementing Realms that use a custom <code>Principal</code>. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60490">60490</a>: Various formatting and layout improvements for the + <code>ErrorReportValve</code>. Patch provided by Michael Osipov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60573">60573</a>: Remove the reason phrase when sending a + <code>100</code> response status for consistency with other response + status lines. Patch provided by Michael Osipov. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60596">60596</a>: Improve performance of DefaultServlet when sendfile + feature is disabled on connector. (kkolinko) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Make it easier for sub-classes of <code>Tomcat</code> to modify the + default web.xml settings by over-riding + <code>getDefaultWebXmlListener()</code>. Patch provided by Aaron + Anderson. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Reduce the contention in the default <code>InstanceManager</code> + implementation when multiple threads are managing objects and need to + reference the annotation cache. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60623">60623</a>: When startStopThreads is 1 (or a special value that + is equivalent to 1) then rather than using an + <code>ExecutorService</code> to start the children of the current + component, the children will be started on the current thread. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60674">60674</a>: Remove <code>final</code> marker from + <code>CorsFilter</code> to enable sub-classing. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60683">60683</a>: Security manager failure causing NPEs when doing IO + on some JVMs. (csutherl) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60688">60688</a>: Update the internal fork of Apache Commons BCEL to + r1782855 to add early access Java 9 support to the annotation scanning + code. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60694">60694</a>: Prevent NPE during authentication when no JASPIC + <code>AuthConfigFactory</code> is available. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60697">60697</a>: When HTTP TRACE requests are disabled on the + Connector, ensure that the HTTP OPTIONS response from custom servlets + does not include TRACE in the returned Allow header. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60718">60718</a>: Improve error handling for asynchronous processing and + correct a number of cases where the <code>requestDestroyed()</code> + event was not being fired and an entry wasn't being made in the access + logs. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60720">60720</a>: Replace "WWW-Authenticate" literal with static final + AUTH_HEADER_NAME in SpnegoAuthenticator. Patch provided by Michael + Osipov. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + The default JASPIC <code>AuthConfigFactory</code> now correctly notifies + registered <code>RegistrationListener</code>s when a new + <code>AuthConfigProvider</code> is registered. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Improve the performance of <code>AuthenticatorBase</code> when there is + no JASPIC configuration available. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When HTTP TRACE requests are disabled on the Connector, ensure that the + HTTP OPTIONS response from the WebDAV servlet does not include + TRACE in the returned Allow header. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60722">60722</a>: Take account of the + <strong>dispatchersUseEncodedPaths</strong> setting on the current + <strong>Context</strong> when generating paths for dispatches triggered + by <code>AsyncContext.dispatch()</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60728">60728</a>: Make the separator Tomcat uses in the Tomcat specific + <code>war:file:...</code> URL protocol customizable via a system + property. The separator is equivalent to the use of the <code>!</code> + character in <code>jar:file:...</code> URLs. The default separator of + <code>*</code> remains unchanged. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the Servlet 4.0 API implementation to align with the latest + proposals from the Servlet 4.0 expert group. This includes updates to + the new Servlet mapping API, new methods on the + <code>ServletContext</code> to make the available API more equivalent to + the deployment descriptor, updates to the HTTP push API and the ability + to set default request and response character encoding per web + application. Note that the Servlet 4.0 API is still a work in progress + and further changes are likely. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60798">60798</a>: Correct a bug in the handling of JARs in unpacked WARs + that meant multiple attempts to read the same entry from a JAR in + succession would fail for the second and subsequent attempts. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60808">60808</a>: Ensure that the <code>Map</code> returned by + <code>ServletRequest.getParameterMap()</code> is fully immutable. Based + on a patch provided by woosan. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60824">60824</a>: Correctly cache the <code>Subject</code> in the + session - if there is a session - when running under a + <code>SecurityManager</code>. Patch provided by Jan Engehausen. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure request and response facades are used when firing application + listeners. (markt/remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve handling of case when an HTTP/2 client sends more data that is + subject to flow control than the current window size allows. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve NIO2 look-ahead parsing of TLS client hello for SNI with large + client hello messages. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Enable ALPN and also, therefore, HTTP/2 for the NIO and NIO2 HTTP + connectors when using the JSSE implementation for TLS when running on + Java 9. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Restore Java 9 direct byte buffer compatibility. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59807">59807</a>: Provide a better error message when there is no + <strong>SSLHostConfig</strong> defined with a <code>hostName</code> that + matches the <code>defaultSSLHostConfigName</code> for the associated + <strong>Connector</strong>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60627">60627</a>: Modify the <code>Rfc6265CookieProcessor</code> so that + in addition to cookie headers that start with an explicit RFC 2109 + <code>$Version=1</code>, cookies that start with <code>$Version=0</code> + are also parsed as RFC 2109 cookies. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Include the value of <code>SslHostConfig.truststoreAlgorithm</code> when + warning that the algorithm does not support the + <code>certificateVerificationDepth</code> configuration option. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that executor thread pools used with connectors pre-start the + configured minimum number of idle threads. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60716">60716</a>: Add a new JSSE specific attribute, + <code>revocationEnabled</code>, to <code>SSLHostConfig</code> to permit + JSSE provider revocation checks to be enabled when no + <code>certificateRevocationListFile</code> has been configured. The + expectation is that configuration will be performed via a JSSE provider + specific mechanisms. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Modify the cookie header generated by the + <code>Rfc6265CookieProcessor</code> so it always sends an + <code>Expires</code> attribute as well as a <code>Max-Age</code> + attribute to avoid problems with Microsoft browsers that do not support + the <code>Max-Age</code> attribute. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60761">60761</a>: Expose a protected getter and setter for + <code>NioEndpoint.stopLatch</code> to make the class easier to extend. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Prevent blocking reads after a stream exception occurs with HTTP/2. + (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Follow up to the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58178">58178</a>. When creating the + <code>ELContext</code> for a tag file, ensure that any registered + <code>ELContextListener</code>s are fired. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor code generated for JSPs to reduce the size of the code required + for tags. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the error handling for simple tags to ensure that the tag is + released and destroyed once used. (remm, violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60769">60769</a>: Correct a regression in the XML encoding detection + refactoring carried out for 9.0.0.M16 that incorrectly always used the + detected BOM encoding in preference to any encoding specified in the + prolog. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Cluster">Cluster</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Make the <code>accessTimeout</code> configurable in + <code>BackupManager</code> and <code>ClusterSingleSignOn</code>. The + <code>accessTimeout</code> is used as a timeout period for PING in + replication map. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60806">60806</a>: To avoid <code>ClassNotFoundException</code>, make + sure that the web application class loader is passed to + <code>ReplicatedContext</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60617">60617</a>: Correctly create a <code>CONNECT</code> request when + establishing a WebSocket connection via a proxy. Patch provided by + Svetlin Zarev. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add log message that PING message has received beyond the timeout + period. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When a PING message that beyond the time-out period has been received, + make sure that valid member is added to the map membership. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that <code>NoRpcChannelReply</code> messages are not received on + <code>RpcCallback</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Web_Applications">Web Applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add Specification and Javadoc references for JASPIC to the Docs + application. (csutherl) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M18_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Spelling corrections provided by Josh Soref. (violetagg) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove local definition of web service annotations since these are + provided by the JRE. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.12 to + pick up the latest Windows binaries built with OpenSSL 1.0.2k. (violetagg) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60784">60784</a>: Update all unit tests that test the HTTP status line + to check for the required space after the status code. Patch provided by + Michael Osipov. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M17_(markt)"><span style="float: right;">2017-01-16</span> Tomcat 9.0.0.M17 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60620">60620</a>: + Extend the <code>JreMemoryLeakPreventionListener</code> to provide + protection against <code>ForkJoinPool.commonPool()</code> related memory + leaks. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure UpgradeProcessor instances associated with closed connections are + removed from the map of current connections to Processors. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove a workaround for a problem previously reported with WebSocket, + TLS and APR that treated some error conditions as not errors. The + original problem cannot be reproduced with the current code and the + work-around is now causing problems. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60497">60497</a>: Follow up fix using a better variable name for the + tag reuse flag. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Revert use of try/finally for simple tags. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Prevent potential processing loop on unexpected WebSocket connection + closure. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Enable reset the statistics without restarting the pool. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M17_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the NSIS Installer used to build the Windows installer to version + 3.01. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Spelling corrections provided by Josh Soref. (violetagg) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M16_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M16 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=53602">53602</a>: Add HTTP status code 451 (RFC 7725) to the list of + HTTP status codes recognised by the ErrorReportValve. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60446">60446</a>: Handle the case where the stored user credential uses + a different key length than the length currently configured for the + <code>CredentialHandler</code>. Based on a patch by Niklas Holm. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the warnings that reference required options for running on Java + 9 to use the latest syntax for those options. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60513">60513</a>: Fix thread safety issue with RMI cleanup code. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Expand the search process for a server certificate when OpenSSL is used + with a JSSE connector and an explicit alias has not been configured. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Extract the common Acceptor code from each Endpoint into a new Acceptor + class that is used by all Endpoints. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60450">60450</a>: Improve the selection algorithm for the default trust + store type for a TLS Virtual Host. In particular, don't use + <code>PKCS12</code> as a default trust store type. Better document how + the default trust store type is selected for a TLS virtual host. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60451">60451</a>: Correctly handle HTTP/2 header values that contain + characters with unicode code points in the range 128 to 255. Reject + with a clear error message HTTP/2 header values that contain characters + with unicode code points above 255. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the logic that selects an address to use to unlock the Acceptor + to take account of platforms what do not listen on all local addresses + when configured with an address of <code>0.0.0.0</code> or + <code>::</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the refactoring to make wider use of + <code>ByteBuffer</code> that caused an intermittent failure in the unit + tests. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60482">60482</a>: HTTP/2 shouldn't do URL decoding on the query string. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix an HTTP/2 compression error. Once a new size has been agreed for the + dynamic HPACK table, the next header block must begin with a dynamic + table update. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60508">60508</a>: Set request start time for HTTP/2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + The default output buffer size for AJP connectors is now based on the + configured AJP packet size rather than the minimum permitted AJP packet + size. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Implement a simpler JSP file encoding detector that delegates XML prolog + encoding detection to the JRE rather than using a custom XML parser. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60497">60497</a>: Restore previous tag reuse behavior following the use + of try/finally. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the error handling for simple tags to ensure that the tag is + released and destroyed once used. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly handle blocking WebSocket writes when the write times out just + before the write is attempted. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/Web_Applications">Web Applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60344">60344</a>: Add a note to BUILDING.txt regarding using the source + bundle with the correct line endings. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60467">60467</a>: remove problematic characters from XML documentation. + Based upon a patch by Michael Osipov. (schultz) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + In the documentation web application, be explicit that clustering + requires a secure network for all of the cluster network traffic. + (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the ASF logos to the new versions. + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60468">60468</a>: Correct the format of the sample ISO-8601 date used + to report the build date for the documentation. Patch provided by + Michael Osipov. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M16_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the ASF logos used in the Apache Tomcat installer for Windows to + use the new versions. + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M15_(markt)"><span style="float: right;">2016-12-08</span> Tomcat 9.0.0.M15 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M15_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Increment version due a local build configuration error with 9.0.0.M14 + that wasn't caught until after digital signing had been completed + Signing requires unique names so a new tag was required. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M14_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M14 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60202">60202</a>: Add an available flag to realms, to indicate the + state, or the realm backend. Update lockout realm to only register + auth failures if the realm is available. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60340">60340</a>: Readability improvements for CSS used in + DefaultServlet and ErrorReportValve. Patch provided by Michael + Osipov. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60351">60351</a>: Delay creating <code>META-INF/war-tracker</code> file + until after the WAR has been expanded to address the case where the + Tomcat process terminates during the expansion. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly generate URLs for resources located inside JARs that are + themselves located inside a packed WAR file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly handle the <code>configClass</code> attribute of a Host when + embedding Tomcat. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60368">60368</a>: Stop creating a default connector on start in + embedded mode. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60379">60379</a>: Dispose of the GSS credential once it is no longer + required. Patch provided by Michael Osipov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60380">60380</a>: Ensure that a call to + <code>HttpServletRequest#logout()</code> triggers a call to + <code>TomcatPrincipal#logout()</code>. Based on a patch by Michael + Osipov. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60381">60381</a>: Provide a standard <code>toString()</code> + implementation for components that implement <code>Contained</code>. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60387">60387</a>: Correct the javadoc for + <code>o.a.catalina.AccessLog.setRequestAttributesEnabled</code>. + The default value is different for the different implementations. + (violetagg) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60393">60393</a>: Use consistent parameter naming in implementations of + <code>Realm#authenticate(GSSContext, boolean)</code>. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the <code>org.apache.naming</code> package to reduce duplicate + code. Duplicate code identified by the Simian tool. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the implementations of + <code>HttpServletRequest#getRequestURL()</code> to reduce duplicate + code. Duplicate code identified by the Simian tool. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor Catalina interfaces to make wider use of the + <code>Contained</code> interface and reduce duplication. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the <code>getName()</code> method from <code>RealmBase</code> + along with the various constants used by the sub-classes to store the + return value. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60395">60395</a>: Log when an <code>Authenticator</code> passes an + incomplete <code>GSSContext</code> to a Realm since it indicates a bug + in the <code>Authenticator</code>. Patch provided by Michael Osipov. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60400">60400</a>: When expanding the buffer used for reading the + request body, ensure the read position will be restored to the + original one. (violetagg) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the MBean implementations for the internal Tomcat components + to reduce code duplication. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60410">60410</a>: Ensure that multiple calls to + <code>JarInputStreamWrapper#close()</code> do not incorrectly trigger + the closure of the underlying JAR or WAR file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60411">60411</a>: Implement support in the <code>RewriteValve</code> for + symbolic names to specify the redirect code to use when returning a + redirect response to the user agent. Patch provided by Michael Osipov. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60413">60413</a>: In the <code>RewriteValve</code> write empty capture + groups as the empty string rather than as <code>"null"</code> + when generating the re-written URL. Based on a patch by Michael Osipov. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60372">60372</a>: Ensure the response headers' buffer limit is reset to + the capacity of this buffer when IOException occurs while writing the + headers to the socket. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the availability of configured upgrade protocols that + require ALPN is correctly reported during Tomcat start. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60386">60386</a>: Implement a more sophisticated pruning algorithm for + removing closed streams from the priority tree to ensure that the tree + does not grow too large. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60409">60409</a>: When unable to complete sendfile request, ensure the + Processor will be added to the cache only once. (markt/violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the endpoint is able to unlock the acceptor thread during + shutdown if the endpoint is configured to listen to any local address + of a specific type such as <code>0.0.0.0</code> or <code>::</code>. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add a new configuration option, <code>ipv6v6only</code> to the APR + connectors that allows them to be configure to only accept IPv6 + connections when configured with an IPv6 address rather than the + default which is to accept IPv4 connections as well if the operating + system uses a dual network stack. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the logic that unlocks the acceptor thread so a better choice is + made for the address to connect to when a connector is configured for + any local port. This reduces the likelihood of the unlock failing. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60436">60436</a>: Avoid a potential NPE when processing async timeouts. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Reduce the window in which an async request that has just started + processing on a container thread remains eligible for an async timeout. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60431">60431</a>: Improve handling of varargs in UEL expressions. Based + on a patch by Ben Wolfe. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a typo in Host Configuration Reference. + Issue reported via comments.apache.org. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60412">60412</a>: Add information on the comment syntax for the + <code>RewriteValve</code> configuration. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Reduce the warning logs for a message received from a different domain + in order to avoid excessive log outputs. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60437">60437</a>: Avoid possible handshake overflows in the websocket + client. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58816">58816</a>: Implement the statistics of jdbc-pool. The stats infos + are <code>borrowedCount</code>, <code>returnedCount</code>, + <code>createdCount</code>, <code>releasedCount</code>, + <code>reconnectedCount</code>, <code>releasedIdleCount</code> and + <code>removeAbandonedCount</code>. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60194">60194</a>: If <code>validationQuery</code> is not specified, + connection validation is done by calling the <code>isValid()</code> + method. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60398">60398</a>: Fix testcase of <code>TestSlowQueryReport</code>. + (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M14_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Allow customization of service.bat, such as heap memory size, service + startup mode and JVM args. Patch provided by isapir via Github. + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60366">60366</a>: Change <code>catalina.bat</code> to use directly + <code>LOGGING_MANAGER</code> and <code>LOGGING_CONFIG</code> variables + in order to configure logging, instead of modifying + <code>JAVA_OPTS</code>. Patch provided by Petter Isberg. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60383">60383</a>: JASPIC API is added as a dependency to the + <code>org.apache.tomcat:tomcat-catalina</code> maven artifact. + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update the comments associated with the TLS Connector examples in + <code>server.xml</code>. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + New property is added <code>test.verbose</code> in order to control + whether the output of the tests is displayed on the console or not. + Patch provided by Emmanuel Bourg. (violetagg) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + <code>TestOpenSSLCipherConfigurationParser.testSpecification</code> + - if there are test failures, provide more detailed information. Patch + provided by Emmanuel Bourg. (violetagg) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M13_(markt)"><span style="float: right;">2016-11-08</span> Tomcat 9.0.0.M13 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M13_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Check that threadPriority values used in AbstractProtocol are valid. + (fschumacher) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M12_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M12 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When creating a new Connector via JMX, ensure that both HTTP/1.1 and + AJP/1.3 connectors can be created. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Reduce multiple error messages when Connector fails to instantiate the + associated ProtocolHandler. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60152">60152</a>: Provide an option for Connector Lifecycle exceptions + to be re-thrown rather than logged. This is controlled by the new + <code>throwOnFailure</code> attribute of the Connector. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Include the Context name in the log message when an item cannot be + added to the cache. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Exclude JAR files in <code>/WEB-INF/lib</code> from the static resource + cache. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When calling <code>getResourceAsStream()</code> on a directory, ensure + that <code>null</code> is returned. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60161">60161</a>: Allow creating subcategories of the container logger, + and use it for the rewrite valve. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly test for control characters when reading the provided shutdown + password. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60297">60297</a>: Simplify connector creation in embedded mode. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor creation of containers in embedded mode for more consistency + and flexibility. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Log a warning if running on Java 9 with the ThreadLocal memory leak + detection enabled (the default) but without the command line option it + now requires. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When a Connector is configured to use an executor, ensure that the + StoreConfig component includes the executor name when writing the + Connector configuration. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When configuring the JMX remote listener, specify the allowed types for + the credentials. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the HPACK header table size configuration that transposed the + client and server table sizes when creating the encoder and decoder. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Review HTTP/2 implementation removing unused code, reducing visibility + where possible and using final where appropriate. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Don't continue to process an HTTP/2 stream if it is reset during header + parsing. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + HTTP/2 uses separate headers for each Cookie. As required by RFC 7540, + merge these into a single Cookie header before processing continues. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Align the HTTP/2 implementation with the HTTP/1.1 implementation and + return a 500 response when an unhandled exception occurs during request + processing. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the HTTP header parser so that DEL is not treated as a valid + token character. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add checks around the handling of HTTP/2 pseudo headers. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for trailer headers to the HTTP/2 implementation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60232">60232</a>: When processing headers for an HTTP/2 stream, ensure + that the read buffer is large enough for the header being processed. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add configuration options to the HTTP/2 implementation to control the + maximum number of headers allowed, the maximum size of headers allowed, + the maximum number of trailer headers allowed, the maximum size of + trailer headers allowed and the maximum number of cookies allowed. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly differentiate between sending and receiving a reset frame when + tracking the state of an HTTP/2 stream. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the undocumented support for using the old Connector attribute + names <code>backlog</code>, <code>soLinger</code> and + <code>soTimeout</code> that were renamed several major versions ago. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60319">60319</a>: When using an Executor, disconnect it from the + Connector attributes <code>maxThreads</code>, + <code>minSpareThreads</code> and <code>threadPriority</code> to enable + the configuration settings to be consistently reported. These Connector + attributes will be reported as <code>-1</code> when an Executor is in + use. The values used by the executor may be set and obtained via the + Executor. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If an I/O error occurs during async processing on a non-container + thread, ensure that the <code>onError()</code> event is triggered. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve detection of I/O errors during async processing on non-container + threads and trigger async error handling when they are detected. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add additional checks for valid characters to the HTTP request line + parsing so invalid request lines are rejected sooner. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update to the Eclipse JDT Compiler 4.6.1. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add HTTP/2 configuration information to the documentation web + application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix default value of <code>validationInterval</code> attribute in + jdbc-pool. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a typo in CGI How-To. + Issue reported via comments.apache.org. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When the proxy node sends a backup retrieve message, ensure that using + the <code>channelSendOptions</code> that has been set rather than the + default <code>channelSendOptions</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M12_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add the JASPIC API jar to the Maven Central publication script. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove classes from tomcat-util-scan.jar that are duplicates of those in + tomcat-util.jar. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Update the NSIS Installer used to build the Windows installer to version + 3.0. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M11_(markt)"><span style="float: right;">2016-10-10</span> Tomcat 9.0.0.M11 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59961">59961</a>: Add an option to the <code>StandardJarScanner</code> + to control whether or not JAR Manifests are scanned for additional + class path entries. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60013">60013</a>: Refactor the previous fix to align the behaviour of + the Rewrite Valve with mod_rewrite. As part of this, provide an + implementation for the <code>B</code> and <code>NE</code> flags and + improve the handling for the <code>QSA</code> flag. Includes multiple + test cases by Santhana Preethiand a patch by Tiago Oliveira. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60087">60087</a>: Refactor the web resources handling to use the Tomcat + specific <code>war:file:...</code> URL protocol to refer to WAR files + and their contents rather than the standard <code>jar:file:...</code> + form since some components of the JRE, such as JAR verification, give + unexpected results when the standard form is used. A side-effect of the + refactoring is that when using packed WARs, it is now possible to + reference a WAR and/or specific JARs within a WAR in the security policy + file used when running under a <code>SecurityManager</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60116">60116</a>: Fix a problem with the rewrite valve that caused back + references evaluated in conditions to be forced to lower case when using + the <code>NC</code> flag. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure <code>Digester.useContextClassLoader</code> is considered in + case the class loader is used. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60117">60117</a>: Ensure that the name of <code>LogLevel</code> is + localized when using <code>OneLineFormatter</code>. Patch provided by + Tatsuya Bessho. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60138">60138</a>: Fix the <code>SSLHostConfig</code> so that the + <code>protocols</code> attribute is limited to the protocols supported + by the current JSSE implementation rather than the default protocols + used by the implementation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60146">60146</a>: Improve performance for resource retrieval by making + calls to WebResource.getInputStream() trigger caching if the resource is + small enough. Patch provided by mohitchugh. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60151">60151</a>: Improve the exception error messages when a + <code>ResourceLink</code> fails to specify the type, specifies an + unknown type or specifies the wrong type. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60167">60167</a>: Ignore empty lines in <code>/etc/passwd</code> files + when using the <code>PasswdUserDatabase</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60170">60170</a>: Exclude the compressed test file + <code>index.html.br</code> from RAT analysis. Patch provided by Gavin + McDonald. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When starting web resources, ensure that class resources are only + started once. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the access checks for linked global resources to handle the case + where the current class loader is a child of the web application class + loader. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60196">60196</a>: Ensure that the <code>isMandatory</code> flag is + correctly set when using JASPIC authentication. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60199">60199</a>: Log a warning if deserialization issues prevent a + session attribute from being loaded. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60208">60208</a>: When using RFC6265 compliant cookies, the + <code>/</code> character should not be allowed in a cookie name since + the RFC6265 will drop such cookies as invalid. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Introduce new methods <code>read(ByteBuffer)</code>/ + <code>write(ByteBuffer)</code> in + <code>o.a.catalina.connector.CoyoteInputStream</code>/ + <code>o.a.catalina.connector.CoyoteOutputStream</code>. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Refactor the code that implements the requirement that a call to + <code>complete()</code> or <code>dispatch()</code> made from a + non-container thread before the container initiated thread that called + <code>startAsync()</code> completes must be delayed until the container + initiated thread has completed. Rather than implementing this by + blocking the non-container thread, extend the internal state machine to + track this. This removes the possibility that blocking the non-container + thread could trigger a deadlock. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fail earlier if the client closes the connection during SNI processing. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60123">60123</a>: Avoid potential threading issues that could cause + excessively large values to be returned for the processing time of + a current request. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60174">60174</a>: Log instances of <code>HeadersTooLargeException</code> + during request processing. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60173">60173</a>: Allow up to 64kB HTTP/2 header table size limit. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Java 9 compatibility of direct ByteBuffer cleaner. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60101">60101</a>: Remove preloading of the class that was deleted. + (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Expand the documentation for the nested elements within a + <code>Resources</code> element to clarify the behaviour of different + configuration options with respect to the order in which resources are + searched. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add an example of using the <code>classesToInitialize</code> attribute + of the <code>JreMemoryLeakPreventionListener</code> to the documentation + web application. Based on a patch by Cris Berneburg. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60192">60192</a>: Correct a typo in the status output of the Manager + application. Patch provided by Radhakrishna Pemmasani. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Notify jmx when returning the connection that has been marked suspect. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the <code>POOL_EMPTY</code> notification has been added to + the jmx notification types. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60099">60099</a>: Ensure that use all method arguments as a cache key + when using <code>StatementCache</code>. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M11_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update the download location for Objenesis. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60164">60164</a>: Replace <code>log4j-core*.jar</code> with + <code>log4j-web*.jar</code> since it is <code>log4j-web*.jar</code> that + contains the <code>ServletContainerInitializer</code>. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add documentation to the bin/catalina.bat script to remind users that + environment variables don't affect the configuration of Tomcat when + run as a Windows Service. Based upon a documentation patch by + James H.H. Lampert. (schultz) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.10 to + pick up the latest Windows binaries built with OpenSSL 1.0.2j. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M10_(markt)"><span style="float: right;">2016-09-05</span> Tomcat 9.0.0.M10 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59813">59813</a>: Ensure that circular relations of the Class-Path + attribute from JAR manifests will be processed correctly. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that reading the <code>singleThreadModel</code> attribute of a + <code>StandardWrapper</code> via JMX does not trigger initialisation of + the associated servlet. With some frameworks this can trigger an + unexpected initialisation thread and if initialisation is not thread-safe + the initialisation can then fail. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Compatibility with rewrite from httpd for non existing headers. + (jfclere) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + By default, treat paths used to obtain a request dispatcher as encoded. + This behaviour can be changed per web application via the + <code>dispatchersUseEncodedPaths</code> attribute of the Context. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Provide a mechanism that enables the container to check if a component + (typically a web application) has been granted a given permission when + running under a SecurityManager without the current execution stack + having to have passed through the component. Use this new mechanism to + extend SecurityManager protection to the system property replacement + feature of the digester. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When retrieving an object via a <code>ResourceLink</code>, ensure that + the object obtained is of the expected type. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59823">59823</a>: Ensure that JASPIC configuration is taken into account + when calling <code>HttpServletRequest.authenticate()</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59824">59824</a>: Mark the <code>RewriteValve</code> as supporting async + processing by default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59839">59839</a>: Apply <code>roleSearchAsUser</code> to all nested + searches in JNDIRealm. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59859">59859</a>: Fix resource leak in WebDAV servlet. Based on patch by + Coty Sutherland. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59862">59862</a>: Allow nested jar files scanning to be filtered with + the system property + <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code>. Patch + is provided by Terence Bandoian. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59866">59866</a>: When scanning <code>WEB-INF/classes</code> for + annotations, don't scan the contents of + <code>WEB-INF/classes/META-INF</code> (if present) since classes will + never be loaded from that location. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59888">59888</a>: Correctly handle tabs and spaces in quoted version one + cookies when using the <code>Rfc6265CookieProcessor</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + A number of the JRE memory leaks addressed by the + <code>JreMemoryLeakPreventionListener</code> have been fixed in Java 9 + so the associated protection is now disabled when running on Java 9 + onwards. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59912">59912</a>: Fix an edge case in input stream handling where an + <code>IOException</code> could be thrown when reading a POST body. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59913">59913</a>: Correct a regression introduced with the support for + the Servlet 4 <code>HttpServletRequest.getMapping()</code> API that + caused the attributes for forwarded requests to be lost if requested + from within a subsequent include. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59966">59966</a>: Do not start the web application if the error page + configuration in web.xml is invalid. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Switch the CGI servlet to the standard logging mechanism and remove + support for the debug attribute. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60012">60012</a>: Improvements in the log messages. Based on + suggestions by Nemo Chen. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Changes to the <code>allowLinking</code> attribute of a + <code>StandardRoot</code> instance now invalidate the cache if caching + is enabled. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add a new initialisation parameter, <code>envHttpHeaders</code>, to + the CGI Servlet to mitigate <a href="https://httpoxy.org">httpoxy</a> + (<a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5388">CVE-2016-5388</a>) by default and to provide a mechanism that can be + used to mitigate any future, similar issues. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When adding and removing <code>ResourceLink</code>s dynamically, ensure + that the global resource is only visible via the + <code>ResourceLinkFactory</code> when it is meant to be. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60008">60008</a>: When processing CORs requests, treat any origin with a + URI scheme of <code>file</code> as a valid origin. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve handling of exceptions during a Lifecycle events triggered by a + state transition. The exception is now caught and the component is now + placed into the <code>FAILED</code> state. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60013">60013</a>: Fix encoding issues when using the RewriteValve with + UTF-8 query strings or UTF-8 redirect URLs. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60022">60022</a>: Improve handling when a WAR file and/or the associated + exploded directory are symlinked into the <code>appBase</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a file descriptor leak when reading the global web.xml. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Consistently decode URL patterns provided via web.xml using the encoding + of the web.xml file where specified or UTF-8 where no explicit encoding + is specified. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Make timing attacks against the Realm implementations harder. (schultz) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in refactoring to enable injection of custom + keystores that broke the automatic conversion of OpenSSL style PEM + key and certificate files for use with JSSE TLS connectors. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59910">59910</a>: Don't hardcode key alias value to "tomcat" for JSSE. + When using a keystore, OpenSSL will still default to it. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59904">59904</a>: Add a limit (default 200) for the number of cookies + allowed per request. Based on a patch by gehui. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59925">59925</a>: Correct regression in r1628368 and ensure that HTTP + separators are handled as configured in the + <code>LegacyCookieProcessor</code>. Patch provided by Kyohei Nakamura. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59950">59950</a>: Correct log message when reporting that the current + number of HTTP/2 streams for a connection could not be pruned to below + the limit. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that <code>Semaphore.release</code> is called in all cases. Even + when there is an exception. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60030">60030</a>: Correct a potential infinite loop in the SNI parsing + code triggered by failing to handle an end of stream condition. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor the JSSE client certificate validation so that the + effectiveness of the <code>certificateVerificationDepth</code> + configuration attribute does not depend on the presence of a certificate + revocation list. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Small logging optimization in the <code>Rfc6265CookieProcessor</code>. + Patch provided by Svetlin Zarev. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + OpenSSL now disables 3DES by default so reflect this when using OpenSSL + syntax to select ciphers. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Use the proper ERROR socket status code for async errors with NIO2. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60035">60035</a>: Fix a potential connection leak if the client drops a + TLS connection before the handshake completes. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Log a warning at start up if a JSSE TLS connector is configured with + a trusted certificate that is either not yet valid or has expired. + (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When writing out a full web.xml file with JspC ensure that the encoding + used in the XML prolog matches the encoding used to write the contents + of the file. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve the error handling for custom tags to ensure that the tag is + returned to the pool or released and destroyed once used. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60032">60032</a>: Fix handling of method calls that use varargs within + EL value expressions. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ignore <code>engineOptionsClass</code> and <code>scratchdir</code> when + running under a security manager. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fixed StringIndexOutOfBoundsException. Based on a patch provided by + wuwen via Github. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59908">59908</a>: Ensure that a reason phrase is included in the close + message if a session is closed due to a timeout. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59867">59867</a>: Correct the documentation provided by Manager's + 403.jsp. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59868">59868</a>: Clarify the documentation for the Manager web + application to make clearer that the host name and IP address in the + server section are the primary host name and IP address. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59940">59940</a>: Correct the name of the + <code>truststorePassword</code> attribute of the + <code>SSLHostConfig</code> element in the configuration documentation. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + MBeans Descriptors How-To is moved to + <code>mbeans-descriptors-howto.html</code>. Patch provided by Radoslav + Husar. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update NIO Connector configuration documentation with an information + about <code>socket.directSslBuffer</code>. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60034">60034</a>: Correct a typo in the Manager How-To page of the + documentation web application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the name of the CRL location configuration attributes in the + documentation web application. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + In order to avoid the unintended skip of <code>PoolCleaner</code>, + remove the check code of the execution interval in the task that has + been scheduled. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59850">59850</a>: Ensure that the <code>ResultSet</code> is closed when + enabling the <code>StatementCache</code> interceptor. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59923">59923</a>: Reduce the default value of + <code>validationInterval</code> in order to avoid the potential issue + that continues to return an invalid connection after database restart. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the <code>ResultSet</code> is returned as Proxy object when + enabling the <code>StatementDecoratorInterceptor</code>. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=60043">60043</a>: Ensure that the <code>suspectTimeout</code> works + without removing connection when the <code>removeAbandoned</code> is + disabled. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add log message of when returning the connection that has been marked + suspect. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct Javadoc for <code>ConnectionPool.suspect()</code>. Based on a + patch by Yahya Cahyadi. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M10_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59871">59871</a>: Add a property (<code>timeFormat</code>) to + JULI's <code>OneLineFormatter</code> to enable the format of the + time stamp used in log messages to be configured. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59899">59899</a>: Update Tomcat's copy of the Java Persistence + annotations to include the changes made in 2.1 / JavaEE 7. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fixed typos in mbeans-descriptors.xml files. (violetagg) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons BCEL to r1757132 to align with the + BCEL 6 release. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons DBCP2 to r1757164 to pick up a + couple of bug fixes. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Codec to r1757174. Code formatting + changes only. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons FileUpload to afdedc9. This pulls in + a fix to improve the performance with large multipart boundaries. + (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M9_(markt)"><span style="float: right;">2016-07-12</span> Tomcat 9.0.0.M9 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=18500">18500</a>: Add limited support for wildcard host names and host + aliases. Names of the form <code>*.domainname</code> are now permitted. + Note that an exact host name match takes precedence over a wild card + host name match. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57705">57705</a>: Add debug logging for requests denied by the remote + host and remote address valves and filters. Based on a patch by Graham + Leggett. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58588">58588</a> that removed the + entire <code>org.apache.juli</code> package from the embedded JARs + rendering them unusable. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59399">59399</a>: Add a new option to the Realm implementations that + ship with Tomcat that allows the HTTP status code used for HTTP -> HTTPS + redirects to be controlled per Realm. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59708">59708</a>: Modify the LockOutRealm logic. Valid authentication + attempts during the lock out period will no longer reset the lock out + timer to zero. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Change the default of the + <code>sessionCookiePathUsesTrailingSlash</code> attribute of the + <code>Context</code> element to <code>false</code> since the problems + caused when a Servlet is mapped to <code>/*</code> are more significant + than the security risk of not enabling this option by default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Follow-up to <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59655">59655</a>. Improve the documentation for configuring + permitted cookie names. Patch provided by Kyohei Nakamura. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not attempt to start web resources during a web application's + initialisation phase since the web application is not fully configured + at that point and the web resources may not be correctly configured. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve error handling around user code prior to calling + <code>InstanceManager.destroy()</code> to ensure that the method is + executed. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a cause of multiple attempts to close the same socket. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor the certificate keystore and trust store generation to make it + easier for embedded users to inject their own key stores. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Add a <code>maxConcurrentStreamExecution</code> on the HTTP/2 + protocol handler to allow restricting the amount of concurrent stream + that are being executed in a single connection. The default is to + not limit it. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59233">59233</a>: Add the ability to add TLS virtual hosts dynamically. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a problem with <code>ServletRequest.getServerPort()</code> for + secure HTTP/2 connections that meant an incorrect value was returned when + using the default port. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve error handling around user code prior to calling + <code>InstanceManager.destroy()</code> to ensure that the method is + executed. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve error handling around user code prior to calling + <code>InstanceManager.destroy()</code> to ensure that the method is + executed. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Now the WebSocket implementation is not built directly on top of the + Servlet API and can use Tomcat internals, there is no need for the + dedicated WebSocket Executor. It has been replaced by the use of the + Connector/Endpoint provided Executor. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve error handling around user code prior to calling + <code>InstanceManager.destroy()</code> to ensure that the method is + executed. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Web_Applications">Web Applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not log an additional case of <code>IOException</code>s in the + error handler for the Drawboard WebSocket example when the root cause is + the client disconnecting since the logs add no value. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59642">59642</a>: Mention the <code>localDataSource</code> in the + <code>DataSourceRealm</code> section of the Realm How-To. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59672">59672</a>: Update the security considerations page of the + documentation web application to take account of the fact that the + Manager and HostManager applications now have a + <code>RemoteAddrValve</code> configured by default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Follow-up to the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59399">59399</a>. Ensure that the new attribute + <code>transportGuaranteeRedirectStatus</code> is documented for all + <strong>Realm</strong>s. Also document the <code>NullRealm</code> and + when it is automatically created for an <strong>Engine</strong>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix the description of <code>maxAge</code> attribute in jdbc-pool doc. + This attribute works both when a connection is returned and when a + connection is borrowed. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59774">59774</a>: Correct the <code>prefix</code> values in the + documented examples for configuring the <code>AccessLogValve</code>. + Patch provided by Mike Noordermeer. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add log message when the ping has timed-out. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If the ping message has been received at the + <code>AbstractReplicatedMap#leftOver</code> method, ensure that notify + the member is alive than ignore it. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix the duplicated connection release when connection verification + failed. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that do not remove the abandoned connection that has been already + released. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M9_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove JULI plus log4j extras and embedded artifacts from Maven release + script. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Use the mirror network rather than the ASF master site to download the + current ASF dependencies. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.8 to + pick up the latest fixes and make 1.2.8 the minimum recommended version. + (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M8_(markt)"><span style="float: right;">2016-06-13</span> Tomcat 9.0.0.M8 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M8_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove accidentally committed debug code. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M7_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M7 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + RMI Target related memory leaks are avoidable which makes them an + application bug that needs to be fixed rather than a JRE bug to work + around. Therefore, start logging RMI Target related memory leaks on web + application stop. Add an option that controls if the check for these + leaks is made. Log a warning if running on Java 9 with this check + enabled but without the command line option it requires. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure NPE will not be thrown during deployment when scanning jar files + without MANIFEST.MF file. (violetagg) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the <code>clearReferencesStatic</code> option from + <code>StandardContext</code>. It was known to cause problems with some + libraries (such as log4j) and was only linked to suspected memory leaks + rather than known memory leaks. It had been disabled by default with no + increase in the reports of memory leaks for some time. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59604">59604</a>: Correct the assumption made in the URL decoding that + the default platform encoding is always compatible with ISO-8859-1. This + assumption is not always valid, e.g. on z/OS. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59608">59608</a>: Skip over any invalid <code>Class-Path</code> attribute + from JAR manifests. Log errors at debug level due to many bad libraries. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix error message when failed to register MBean. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59655">59655</a>: Configure the cookie name validation to use RFC6265 + rules by default to align it with the default cookie parser. Document + the impact system properties have on cookie name validation. (mark) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that requests with HTTP method names that are not tokens (as + required by RFC 7231) are rejected with a 400 response. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When an asynchronous request is processed by the AJP connector, ensure + that request processing has fully completed before starting the next + request. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve handling of HTTP/2 stream resets. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58750">58750</a>: The HTTP Server header is no longer set by default. A + Server header may be configured by setting the <code>server</code> + attribute on the <code>Connector</code>. A new <code>Connector</code> + attribute, <code>serverRemoveAppProvidedValues</code> may be used to + remove any Server header set by a web application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59564">59564</a>: Correct offset when reading into HTTP/2 input buffer + that could cause problems reading request bodies. (violetagg/markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Modify the handling of read/write timeouts so that the appropriate error + handling (<code>ReadListener.onError()</code>, + <code>WriteListener.onError()</code> or + <code>AsyncListener.onError()</code>) is called. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If an async dispatch results in the completion of request processing, + ensure that any remaining request body is swallowed before starting the + processing of the next request else the remaining body may be read as the + start of the next request leading to a 400 response. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59567">59567</a>: Fix NPE scanning webapps for TLDs when an exploded + JAR has an empty WEB-INF/classes/META-INF folder. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a memory leak in the expression language implementation that caused + the class loader of the first web application to use expressions to be + pinned in memory. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59654">59654</a>: Improve error message when attempting to use a TLD + file from an invalid location. Patch provided by Huxing Zhang. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59659">59659</a>: Fix possible memory leak in WebSocket handling of + unexpected client disconnects. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58891">58891</a>: Update the SSL how-to. Based on a suggestion by + Alexander Kjäll. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Extras">Extras</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58588">58588</a>: Remove the JULI extras package from the distribution. + It was only useful for switching Tomcat's internal logging to log4j + 1.2.x and that version of log4j is no longer supported. No additional + Tomcat code is required if switching Tomcat's internal logging to log + via log4j 2.x. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a memory leak with the pool cleaner thread that retained a reference + to the web application class loader for the first web application to use + a connection pool. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M7_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons DBCP 2 to r1743696 (2.1.1 plus + additional fixes). (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Pool 2 to r1743697 (2.4.2 plus + additional fixes). (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons File Upload to r1743698 (1.3.1 plus + additional fixes). (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Use UTF-8 with a standard prolog for all XML files. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58626">58626</a>: Add support for a new environment variable + (<code>USE_NOHUP</code>) that causes <code>nohup</code> to be used when + starting Tomcat. It is disabled by default except on HP-UX where it is + enabled by default since it is required when starting Tomcat at boot on + HP-UX. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M6_(markt)"><span style="float: right;">2016-05-16</span> Tomcat 9.0.0.M6 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M6_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that annotated web components packed in web fragments will be + processed when <code>unpackWARs</code> is enabled. (violetagg) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M5_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M5 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48922">48922</a>: Apply a very small performance improvement to the + date formatting in Tomcat's internal request object. Based on a patch + provided by Ondrej Medek. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59206">59206</a>: Ensure NPE will not be thrown by + <code>o.a.tomcat.util.file.ConfigFileLoader</code> when + <code>catalina.base</code> is not specified. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59217">59217</a>: Remove duplication in the recycling of the path in + <code>o.a.tomcat.util.http.ServerCookie</code>. Patch is provided by + Kyohei Nakamura. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fixed possible NPE in + <code>o.a.catalina.loader.WebappClassLoaderBase.getResourceAsStream</code> + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59213">59213</a>: Async dispatches should be based off a wrapped + request. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that <code>javax.servlet.ServletRequest</code> and + <code>javax.servlet.ServletResponse</code> provided during + <code>javax.servlet.AsyncListener</code> registration are made + available via <code>javax.servlet.AsyncEvent.getSuppliedRequest</code> + and <code>javax.servlet.AsyncEvent.getSuppliedResponse</code> + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59219">59219</a>: Ensure <code>AsyncListener.onError()</code> is called + if an <code>Exception</code> is thrown during async processing. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59220">59220</a>: Ensure that <code>AsyncListener.onComplete()</code> is + called if the async request times out and the response is already + committed. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59226">59226</a>: Process the <code>Class-Path</code> attribute from + JAR manifests for JARs on the class path excluding JARs packaged in + <code>WEB-INF/lib</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59255">59255</a>: Fix possible NPE in mapper. (kkolinko/remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59256">59256</a>: <code>slf4j-taglib*.jar</code> should not be excluded + from the standard JAR scanning by default. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Clarify the log message that specifying both urlPatterns and value + attributes in @WebServlet and @WebFilter annotations is not allowed. + (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure the exceptions caused by Valves will be available in the log + files so that they can be evaluated when + <code>o.a.catalina.valves.ErrorReportValve.showReport</code> is + disabled. Patch is provided by Svetlin Zarev. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove unused <code>distributable</code> attribute that is defined as + <code>TransientAttribute</code> of <code>Manager</code> in StoreConfig. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix handling of Cluster Receiver in StoreConfig. The <code>bind</code> + and <code>host</code> attributes define as + <code>TransientAttribute</code>. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59261">59261</a>: <code>ServletRequest.getAsyncContext()</code> now + throws an <code>IllegalStateException</code> as required by the Servlet + specification if the request is not in asynchronous mode when called. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59269">59269</a>: Correct the implementation of + <code>PersistentManagerBase</code> so that <code>minIdleSwap</code> + functions as designed and sessions are swapped out to keep the active + session count below <code>maxActiveSessions</code>. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the implementation of the proposed Servlet 4.0 API to provide + mapping type information for the current request to reflect discussions + within the EG. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly configure the base path for a resources directory provided by + an expanded JAR file. Patch provided by hengyunabc. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + When multiple compressed formats are available and the client does not + express a preference, use the server order to determine the preferred + format. Based on a patch by gmokki. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59284">59284</a>: Allow the Tomcat provided JASPIC + <code>SimpleServerAuthConfig</code> to pick up module configuration + properties from either the property set passed to its constructor or + from the properties passed in the call to <code>getAuthContext</code>. + Based on a patch by Thomas Maslen. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59310">59310</a>: Do not add a <code>Content-Length: 0</code> header for + custom responses to <code>HEAD</code> requests that do not set a + <code>Content-Length</code> value. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When normalizing paths, improve the handling when paths end with + <code>/.</code> or <code>/..</code> and ensure that input and output are + consistent with respect to whether or not they end with <code>/</code>. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59317">59317</a>: Ensure that + <code>HttpServletRequest.getRequestURI()</code> returns an encoded URI + rather than a decoded URI after a dispatch. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Use the correct URL for the fragment when reporting errors processing + a <code>web-fragment.xml</code> file from a JAR located in an unpacked + WAR. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that <code>JarScanner</code> only uses the explicit call-back to + process <code>WEB-INF/classes</code> and only when configured to treat + the contents of <code>WEB-INF/classes</code> as a possible exploded JAR. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the <code>java2DDisposerProtection</code> option from the + <code>JreMemoryLeakPreventionListener</code>. The leak is fixed in Java + 7 onwards and Tomcat 9 requires Java 8 so the option is unnecessary. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the <code>securityPolicyProtection</code> option from the + <code>JreMemoryLeakPreventionListener</code>. The leak is fixed in Java + 8 onwards and Tomcat 9 requires Java 8 so the option is unnecessary. + (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove the <code>securityLoginConfigurationProtection</code> option from + the <code>JreMemoryLeakPreventionListener</code>. The leak is fixed in + Java 8 onwards and Tomcat 9 requires Java 8 so the option is + unnecessary. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the value for the header <code>X-Frame-Options</code> is + constructed correctly according to the specification when + <code>ALLOW-FROM</code> option is used. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix an <code>IllegalArgumentException</code> if the first use of an + internal <code>Response</code> object requires JASPIC authentication. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Do not trigger unnecessary session ID changes when using JASPIC and the + user is authenticated using cached credentials. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59437">59437</a>: Ensure that the JASPIC <code>CallbackHandler</code> is + thread-safe. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59449">59449</a>: In <code>ContainerBase</code>, ensure that the process + to remove a child container is the reverse of the process to add one. + Patch provided by Huxing Zhang. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improves OpenSSL engine robustness when SSL allocation fails for + some reason. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + OpenSSL engine code cleanups. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Align cipher configuration parsing with current OpenSSL master. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Change the default for <code>honorCipherOrder</code> to + <code>false</code>. With the current default TLS configuration, it is no + longer necessary for this to be <code>true</code> for a reasonably + secure configuration. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add a new environment variable <code>JSSE_OPTS</code> that is intended + to be used to pass JVM wide configuration to the JSSE implementation. + The default value is <code>-Djdk.tls.ephemeralDHKeySize=2048</code> + which protects against weak Diffie-Hellman keys. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58970">58970</a>: Fix a connection counting bug in the NIO connector + that meant some dropped connections were not removed from the current + connection count. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59289">59289</a>: Do not recycle upgrade processors in unexpected close + situations. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59295">59295</a>: Use <code>Locale.toLanguageTag()</code> to construct + the <code>Content-Language</code> HTTP header to ensure the locale is + correctly represented. Patch provided by zikfat. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59295">59295</a>: Add support for using pem encoded certificates with + JSSE SSL. Submitted by Emmanuel Bourg with additional tweaks. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Make the TLS certificate chain available to clients when using + JSSE+OpenSSL with the certificate chain stored in a Java KeyStore. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Work around <a href="https://github.com/openssl/openssl/issues/188">a + known issue in OpenSSL</a> that does not permit the TLS handshake to be + failed if the ALPN negotiation fails. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59421">59421</a>: Add direct HTTP/2 connection support. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly handle a call to <code>AsyncContext.complete()</code> from a + non-container thread when non-blocking I/O is being used. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59451">59451</a>: Correct Javadoc for <code>MessageBytes</code>. Patch + provided by Kyohei Nakamura. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59450">59450</a>: Correctly handle the case where the + <code>LegacyCookieProcessor</code> is configured with + <code>allowHttpSepsInV0</code> set to <code>false</code> and + <code>forwardSlashIsSeparator</code> set to <code>true</code>. Patch + provided by Kyohei Nakamura. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When scanning JARs for TLDs, correctly handle the (rare) case where a + JAR has been exploded into <code>WEB-INF/classes</code> and the web + application is deployed as a packed WAR. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59640">59640</a>: NPEs with not found TLDs. (remm) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59189">59189</a>: Explicitly release the native memory held by the + <code>Inflater</code> and <code>Deflater</code> when using + PerMessageDeflate and the WebSocket session ends. Based on a patch by + Henrik Olsson. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Restore the <code>WsServerContainer.doUpgrade()</code> method which was + accidentally removed since it is not used by Tomcat. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a regression caused by the connector refactoring and ensure that the + thread context class loader is set to the web application + classloader when processing WebSocket messages on the server. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that a client disconnection triggers the error handling for the + associated WebSocket end point. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Make WebSocket client more robust when handling errors during the close + of a WebSocket session. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59218">59218</a>: Correct the path to <code>jaspic-providers.xml</code> + in Jaspic How-To. Patch is provided by Tatsuya Bessho. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Remove button that has accidentally been added to the host manager. + Submitted by Coty Sutherland. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Update in the documentation the link to the maven repository where + Tomcat snapshot artifacts are deployed. (markt/violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Clarify in the documentation that calls to + <code>ServletContext.log(String, Throwable)</code> or + <code>GenericServlet.log(String, Throwable)</code> are logged at the + SEVERE level. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a typo in SSL/TLS Configuration How-To. + Issue reported via comments.apache.org. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Avoid NPE when a proxy node failed to retrieve a backup entry. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add the flag indicating that member is a localMember. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix potential NPE that depends on the setting order of attributes of + static member when using the static cluster. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add get/set method for the channel that is related to + <code>ChannelInterceptor</code>. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + As with the multicast cluster environment, in the static cluster + environment, the local member inherits properties from the cluster + receiver. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add get/set method for the channel that is related to each Channel + services. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add name to channel in order to identify channels. In tomcat cluster + environment, it is set the cluster name + "-Channel" as default value. + (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add the channel name to the thread which is invoked by channel services + in order to identify the associated channel. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that clear the channel instance from channel services when + stopping channel. (kfujino) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Implement map state in the replication map. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the ping is not executed during the start/stop of the + replication map. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + In ping processing in the replication map, send not the + <code>INIT</code> message but the newly introduced <code>PING</code> + message. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M5_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59211">59211</a>: Add hamcrest to Eclipse classpath. Patch is provided + by Huxing Zhang. (violetagg) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59276">59276</a>: Update optional Checkstyle library to 6.17. + (kkolinko) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59280">59280</a>: Update the NSIS Installer used to build the + Windows Installers to version 2.51. (kkolinko) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.7 to + pick up the Windows binaries that are based on OpenSSL 1.0.2h and APR + 1.5.2. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M4_(markt)"><span style="float: right;">2016-03-16</span> Tomcat 9.0.0.M4 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that <code>/WEB-INF/classes</code> is never processed as a web + fragment. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Switch default connector when native is installed. Unless configured + otherwise, the NIO endpoint will be used by default. If SSL is + configured, OpenSSL will be used rather than JSSE. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58867">58867</a>. When configuring a + Context to use an external directory for the <code>docBase</code>, and + that directory happens to be located along side the original WAR, use + the directory as the <code>docBase</code> rather than expanding the + WAR into the <code>appBase</code> and using the newly created expanded + directory as the <code>docBase</code>. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58351">58351</a>: Make the server build date and server version number + accessible via JMX. Patch provided by Huxing Zhang. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58988">58988</a>: Special characters in the substitutions for the + RewriteValve can now be quoted with a backslash. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58999">58999</a>: Fix class and resource name filtering in + WebappClassLoader. It throws a StringIndexOutOfBoundsException if the + name is exactly "org" or "javax". (rjung) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add JASPIC (JSR-196) support. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Make checking for var and map replacement in RewriteValve a bit stricter + and correct detection of colon in var replacement. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor the web application class loader to reduce the impact of JAR + scanning on the memory footprint of the web application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix some resource leaks in the error handling for accessing files from + JARs and WARs. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor the JAR and JAR-in-WAR resource handling to reduce the memory + footprint of the web application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor the web.xml parsing so a new parser is created every time the + web application starts rather than creating and caching the parser when + the Context is created. This enables the parser to take account of + modified Context configuration parameters and reduces (slightly) the + memory footprint of a running Tomcat instance. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Switch the web application class loader to the + <code>ParallelWebappClassLoader</code> by default. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57809">57809</a>: Remove the custom context attribute that held the + effective web.xml. Components needing access to configuration + information may access it via the Servlet API. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Refactor JAR scanning to reduce memory footprint. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59001">59001</a>: Correctly handle the case when Tomcat is installed on + a path where one of the segments ends in an exclamation mark. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Expand the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59001">59001</a> to cover the special sequences used + in Tomcat's custom jar:war: URLs. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59043">59043</a>: Avoid warning while expiring sessions associated with + a single sign on if <code>HttpServletRequest.logout()</code> is used. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59054">59054</a>: Ensure that using the + <code>CrawlerSessionManagerValve</code> in a distributed environment + does not trigger an error when the Valve registers itself in the + session. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add socket properties support to storeconfig. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix incorrect parsing of the NE and NC flags in rewrite rules. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59065">59065</a>: Correct the timing of the check for colons in paths + on non-Windows systems implemented in <code>catalina.sh</code> so it + works correctly with Cygwin. Patch provided by Ed Randall. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When a Host is configured with an appBase that does not exist, create + the appBase before trying to expand an external WAR file into it. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59115">59115</a>: When using the Servlet 3.0 file upload, the submitted + file name may be provided as a token or a quoted-string. If a + quoted-string, unquote the string before returning it to the user. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59123">59123</a>: Close <code>NamingEnumeration</code> objects used by + the <code>JNDIRealm</code> once they are no longer required. + (fschumacher/markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Implement the proposed Servlet 4.0 API to provide mapping type + information for the current request. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59138">59138</a>: Correct a false positive warning for ThreadLocal + related memory leaks when the key class but not the value class has been + loaded by the web application class loader. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59017">59017</a>: Make the pre-compressed file support in the Default + Servlet generic so any compression may be used rather than just gzip. + Patch provided by Mikko Tiihonen. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59145">59145</a>: Don't log an invalid warning when a user logs out of + a session associated with SSO. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59150">59150</a>: Add an additional flag on APR listener to allow + disabling automatic use of OpenSSL. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59151">59151</a>: Fix a regression in the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a> that + added additional (and arguably unnecessary) validation to the provided + redirect location. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59154">59154</a>: Fix a <code>NullPointerException</code> in the + <code>JAASMemoryLoginModule</code> resulting from the introduction of + the <code>CredentialHandler</code> to <code>Realm</code>s. + (schultz/markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Handle the case in the NIO2 connector where the required TLS buffer + sizes increase after the connection has been initiated. (markt/remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Bad processing of handshake errors in NIO2. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Use JSSE session configuration options with OpenSSL. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59015">59015</a>: Fix potential cause of endless APR Poller loop during + shutdown if the Poller experiences an error during the shutdown process. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Align cipher aliases for <code>kECDHE</code> and <code>ECDHE</code> with + the current OpenSSL implementation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59081">59081</a>: Retain the user defined cipher order when defining + ciphers. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59089">59089</a>: Correctly ignore HTTP headers that include non-token + characters in the header name. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update to the Eclipse JDT Compiler 4.5.1. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57583">57583</a>: Improve the performance of + <code>javax.servlet.jsp.el.ScopedAttributeELResolver</code> when + resolving attributes that do not exist. This improvement only works when + Jasper is used with Tomcat's EL implementation. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a timing issue on session close that could result in an exception + being thrown for an incomplete message even through the message was + completed. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly handle compression of partial messages when the final message + fragment has a zero length payload. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59119">59119</a>: Correct read logic for WebSocket client when using + secure connections. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59134">59134</a>: Correct client connect logic for secure connections + made through a proxy. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Web_applications">Web applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct an error in the documentation of the expected behaviour for + automatic deployment. If a WAR is updated and an expanded directory is + present, the directory will always be deleted and recreated by expanding + the WAR if <code>unpackWARs</code> is <code>true</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48674">48674</a>: Implement an option within the Host Manager web + application to persist the current configuration. Based on a patch by + Coty Sutherland. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58935">58935</a>: Remove incorrect references in the documentation to + using <code>jar:file:</code> URLs with the Manager application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the description of the + <code>ServletRequest.getServerPort()</code> in Proxy How-To. + Issue reported via comments.apache.org. (violetagg) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + The Manager and Host Manager applications are now only accessible via + <code>localhost</code> by default. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + If promoting a proxy node to a primary node when getting a session, + notify the change of the new primary node to the original backup node. + (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M4_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58283">58283</a>: Change the default download location for libraries + during the build process from <code>/usr/share/java</code> to + <code>${user.home}/temp</code>. Patch provided by Ahmed Hosni. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=59031">59031</a>: When using the Windows uninstaller, do not remove the + contents of any directories that have been symlinked into the Tomcat + directory structure. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.5 to + pick up the Windows binaries that are based on OpenSSL 1.0.2g and APR + 1.5.1. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Modify the default <code>tomcat-users.xml</code> file to make it harder + for users to configure the entries intended for use with the examples + web application for the Manager application. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M3_(markt)"><span style="float: right;">2016-02-05</span> Tomcat 9.0.0.M3 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M3_(markt)/General">General</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Allow to configure multiple JUnit test class patterns with the build + property <code>test.name</code> and document the property in + BUILDING.txt. (rjung) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M3_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Protect initialization of <code>ResourceLinkFactory</code> when + running with a SecurityManager. (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a thread safety issue in the filtering of session attributes + based on the implementing class name of the value object. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix class loader decision on the delegation for class loading and + resource lookup and make it faster too. (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58768">58768</a>: Log a warning if a redirect fails because of an + invalid location. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58827">58827</a>: Remove remains of JSR-77 implementation. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58946">58946</a>: Ensure that the request parameter map remains + immutable when processing via a RequestDispatcher. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58905">58905</a>: Ensure that <code>Tomcat.silence()</code> silences the + correct logger and respects the current setting. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M3_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct a regression in the connector refactoring in 9.0.0.M2 that broke + TLS support for the APR/native connector. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct an NPE when listing the enabled ciphers (e.g. via the Manager + web application) for a TLS enabled APR/native connector. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + New configuration option <code>ajpFlush</code> for the AJP connectors + to disable the sending of AJP flush packets. (rjung) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Handle the case in the NIO connector where the required TLS buffer sizes + increase after the connection has been initiated. (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M2_(markt)"><span style="float: right;">not released</span> Tomcat 9.0.0.M2 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor creation of <code>MapperListener</code> to ensure that the + <code>Mapper</code> used is the <code>Mapper</code> associated with the + <code>Service</code> for which the listener was created. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Move the functionality that provides redirects for context roots and + directories where a trailing <code>/</code> is added from the Mapper to + the <code>DefaultServlet</code>. This enables such requests to be + processed by any configured Valves and Filters before the redirect is + made. This behaviour is configurable via the + <code>mapperContextRootRedirectEnabled</code> and + <code>mapperDirectoryRedirectEnabled</code> attributes of the Context + which may be used to restore the previous behaviour. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor <code>Service.getContainer()</code> to return an + <code>Engine</code> rather than a <code>Container</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=34319">34319</a>: Only load those keys in <code>StoreBase.processExpire</code> + from JDBCStore, that are old enough, to be expired. Based on a patch + by Tom Anderson. (fschumacher) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a>: As per RFC7231 (HTTP/1.1), allow HTTP/1.1 and later + redirects to use relative URIs. This is controlled by a new attribute + <code>useRelativeRedirects</code> on the <strong>Context</strong> and + defaults to <code>true</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58629">58629</a>: Allow an embedded Tomcat instance to start when the + <code>Service</code> has no <code>Engine</code> configured. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correctly notify the MapperListener associated with a Service if the + Engine for that Service is changed. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Make a web application's CredentialHandler available through a context + attribute. This allows a web application to use the same algorithm + for validating or generating new stored credentials from cleartext + ones. (schultz) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58635">58635</a>: Enable break points to be set within agent code when + running Tomcat with a Java agent. Based on a patch by Huxing Zhang. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fixed potential NPE in <code>HostConfig</code> while deploying an + application. Issue reported by coverity scan. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58655">58655</a>: Fix an <code> IllegalStateException</code> when + calling <code>HttpServletResponse.sendRedirect()</code> with the + <code>RemoteIpFilter</code>. This was caused by trying to correctly + generate the absolute URI for the redirect. With the fix for + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=56917">56917</a>, redirects may now be relative making the + <code>sendRedirect()</code> implementation for the + <code>RemoteIpFilter</code> much simpler. This also addresses issues + where the redirect may not have behaved as expected when redirecting + from http to https to from https to http. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58657">58657</a>: Exceptions in a Servlet 3.1 <code>ReadListener</code> + or <code>WriteListener</code> do not need to be immediately fatal to the + connection. Allow an error response to be written. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct implementation of + <code>validateClientProvidedNewSessionId</code> so client provided + session IDs may be rejected if validation is enabled. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58701">58701</a>: Reset the <code>instanceInitialized</code> field in + <code>StandardWrapper</code> when unloading a Servlet so that a new + instance may be correctly initialized. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Add a new flag <code>aprPreferred</code> to the Apr listener. if set to + <code>false</code>, when using the connector defaults, it will use + NIO + OpenSSL if tomcat-native is available, rather than the APR + connector. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add path parameter handling to + <code>HttpServletRequest.getContextPath()</code>. This is a follow-up to + the fix for <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57215">57215</a>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58692">58692</a>: Make <code>StandardJarScanner</code> more robust. Log + a warning if a class path entry cannot be scanned rather than triggering + the failure of the web application. Includes a test case written by + Derek Abdine. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58702">58702</a>: Ensure an access log entry is generated if the client + aborts the connection. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fixed various issues reported by Findbugs. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58735">58735</a>: Add support for the <code>X-XSS-Protection</code> + header to the <code>HttpHeaderSecurityFilter</code>. Patch provided by + Jacopo Cappellato. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add the <code>StatusManagerServlet</code> to the list of Servlets that + can only be loaded by privileged applications. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Simplify code and fix messages in + <code>org.apache.catalina.core.DefaultInstanceManager</code> class. + (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58751">58751</a>: Correctly handle the case where an + <code>AsyncListener</code> dispatches to a Servlet on an asynchronous + timeout and the Servlet uses <code>sendError()</code> to trigger an + error page. Includes a test case based on code provided by Andy + Wilkinson.(markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the proper file encoding if specified will be used when + a readme file is served by DefaultServlet. (violetagg) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix declaration of <code>localPort</code> attribute of Connector MBean: + it is read-only. (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58766">58766</a>: Make skipping non-class files during annotation + scanning faster by checking the file name first. Improve debug logging. + (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58836">58836</a>: Correctly merge query string parameters when + processing a forwarded request where the target includes a query string + that contains a parameter with no value. (markt/kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Make sure that shared Digester is reset in an unlikely error case + in <code>HostConfig.deployWAR()</code>. (kkolinko) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Extend the feature available in the cluster session manager + implementations that enables session attribute replication to be + filtered based on attribute name to all session manager implementations. + Note that configuration attribute name has changed from + <code>sessionAttributeFilter</code> to + <code>sessionAttributeNameFilter</code>. Apply the filter on load as + well as unload to ensure that configuration changes made while the web + application is stopped are applied to any persisted data. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Extend the session attribute filtering options to include filtering + based on the implementation class of the value and optional + <code>WARN</code> level logging if an attribute is filtered. These + options are available for all of the Manager implementations that ship + with Tomcat. When a <code>SecurityManager</code> is used filtering will + be enabled by default. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Remove <code>distributable</code> and <code>maxInactiveInterval</code> + from the <code>Manager</code> interface because the attributes are never + used. The equivalent attributes from the <code>Context</code> always + take precedence. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58867">58867</a>: Improve checking on Host start for WAR files that have + been modified while Tomcat has stopped and re-expand them if + <code>unpackWARs</code> is <code>true</code>. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58900">58900</a>: Correctly undeploy symlinked resources and prevent an + infinite cycle of deploy / undeploy. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58621">58621</a>: The certificate chain cannot be set using the main + certificate attribute, so restore the certificate chain property. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Allow a new SSL config type where a connector can use either JSSE or + OpenSSL. Both could be allowed, but it would likely create support + issues. This type is used by the OpenSSL implementation for NIOx. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Improve upgrade context classloader handling by using Context.bind and + unbind. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Improve OpenSSL keystore/truststore configuration by using the code + from the JSSE implementation. (remm, jfclere) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix a potential loop when a client drops the connection unexpectedly. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + OpenSSL renegotiation support for client certificate authentication. + (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix NIO connector renegotiation. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58659">58659</a>: Fix a potential deadlock during HTTP/2 processing when + the connection window size is limited. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Jasper">Jasper</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57136#c25">57136#c25</a>: Change default value of + <code>quoteAttributeEL</code> setting in Jasper to be <code>true</code> + for better compatibility with other implementations and older versions + of Tomcat. Add command line option <code>-no-quoteAttributeEL</code> in + JspC. (kkolinko) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix handling of missing messages in + <code>org.apache.el.util.MessageFactory</code>. (violetagg) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Cluster">Cluster</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Enable an explicit configuration of local member in the static cluster + membership. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix potential integer overflow in <code>DeltaSession</code>. + Reported by coverity scan. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + In order to avoid that the heartbeat thread and the background thread to + run <code>Channel.heartbeat</code> simultaneously, if + <code>heartbeatBackgroundEnabled</code> of <code>SimpleTcpCluster</code> + set to <code>true</code>, ensure that the heartbeat thread does not + start. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/WebSocket">WebSocket</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=55006">55006</a>: The WebSocket client now honors the + <code>java.net.java.net.ProxySelector</code> configuration (using the + HTTP type) when establishing WebSocket connections to servers. Based on + a patch by Niki Dokovski. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58624">58624</a>: Correct a potential deadlock if the WebSocket + connection is closed when a message write is in progress. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57489">57489</a>: Ensure <code>onClose()</code> is called when a + WebSocket connection is closed even if the sending of the close message + fails. Includes test cases by Barry Coughlan. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Web_Applications">Web Applications</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58631">58631</a>: Correct the continuation character use in the Windows + Service How-To page of the documentation web application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct the SSL documentation for deprecated attributes to point to the + correct, new location for attributes related to individual certificates. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct some typos in the JNDI resources How-To. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Don't create session unnecessarily in the Manager application. (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Don't create session unnecessarily in the Host Manager application. + (markt) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=58723">58723</a>: Clarify documentation and error messages for the text + interface of the manager to make clear that version must be used with + path when referencing contexts deployed using parallel deployment. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Document <code>test.threads</code> option in BUILDING.txt. (kkolinko) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ensure that the static member is registered to the add suspect list even + if the static member that is registered to the remove suspect list has + disappeared. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + When using a static cluster, add the members that have been cached in + the membership service to the map members list in order to ensure that + the map member is a static member. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add support for the startup notification of local members in the static + cluster. (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Ignore the unnecessary member remove operation from different domain. + (kfujino) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Add support for the shutdown notification of local members in the static + cluster. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/jdbc-pool">jdbc-pool</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Correct evaluation of system property + <code>org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader</code>. + It was basically ignored before. Reported by coverity scan. (fschumacher) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Fix potential integer overflow in <code>ConnectionPool</code> and + <code>PooledConnection</code>. Reported by coverity scan. (fschumacher) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M2_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update optional Checkstyle library to 6.14.1. (kkolinko) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the packaged version of the Tomcat Native Library to 1.2.4 to + pick up the Windows binaries that are based on OpenSSL 1.0.2e and APR + 1.5.1. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the NSIS Installer used to build the Windows Installers to + version 2.50. (markt/kkolinko) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons BCEL to r1725718 to align with the + refactoring for BCEL 6, the next major BCEL release. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons DBCP 2 to r1725730 (2.1.1 plus + additional fixes). (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Pool 2 to r1725738 (2.4.2 plus + additional fixes). (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Update the internal fork of Commons Codec to r1725746 (1.9 plus + additional fixes). (markt) + </li> + </ul> + </div></div> +</div><h3 id="Tomcat_9.0.0.M1_(markt)"><span style="float: right;">2015-11-17</span> Tomcat 9.0.0.M1 (markt)</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_9.0.0.M1_(markt)/General">General</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Make Java 8 the minimum required version to build and run Tomcat 9. + (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Remove support for Comet. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Tighten up the default file permissions for the <code>.tar.gz</code> + distribution so no files or directories are world readable by default. + Configure Tomcat to run with a default umask of <code>0027</code> which + may be overridden by setting <code>UMASK</code> in + <code>setenv.sh</code>. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Remove native code (Windows Service Wrapper, APR/native connector) + support for Windows Itanium. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M1_(markt)/Catalina">Catalina</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + The default HTTP cookie parser has been changed to + <code>org.apache.tomcat.util.http.Rfc6265CookieProcessor</code>. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M1_(markt)/Coyote">Coyote</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + Remove support for the HTTP BIO and AJP BIO connectors. (markt) + </li> + <li><img alt="Code: " class="icon" src="./images/code.gif"> + Refactor HTTP upgrade and AJP implementations to reduce duplication. + (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for HPACK header encoding and decoding, contributed + by Stuart Douglas. (remm) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=57108">57108</a>: Add support for Server Name Indication (SNI). There + has been significant changes to the SSL configuration in server.xml to + support this. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add SSL engine for JSSE backed by OpenSSL. Includes ALPN support. + Based on code contributed by Numa de Montmollin and derived from code + developed by Twitter and Netty. (remm) + </li> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + RFC 7230 states that clients should ignore reason phrases in HTTP/1.1 + response messages. Since the reason phrase is optional, Tomcat no longer + sends it. As a result the system property + <code>org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER</code> is no + longer used and has been removed. (markt) + </li> + <li><img alt="Update: " class="icon" src="./images/update.gif"> + The minimum required Tomcat Native version has been increased to 1.2.2. + The 1.2.x branch includes ALPN and SNI support which are required for + HTTP/2. (markt) + </li> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Add support for HTTP/2 including server push. (markt) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M1_(markt)/Tribes">Tribes</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Fix: " class="icon" src="./images/fix.gif"> + Clarify the handling of Copy message and Copy nodes. (kfujino) + </li> + </ul> + </div></div> + <div class="subsection"><h4 id="Tomcat_9.0.0.M1_(markt)/Other">Other</h4><div class="text"> + <ul class="changelog"> + <li><img alt="Add: " class="icon" src="./images/add.gif"> + Support the use of the <code>threads</code> attribute on Ant's + junit task. Note that using this with a value of greater than one will + disable Cobertura code coverage. (markt) + </li> + </ul> + </div></div> +</div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/class-loader-howto.html b/src/tomcat/webapps/docs/class-loader-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..ca0ce7905a123d4a8e81c4d63c832efd19372c87 --- /dev/null +++ b/src/tomcat/webapps/docs/class-loader-howto.html @@ -0,0 +1,264 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Class Loader HOW-TO</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/class-loader-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Class Loader HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a></li><li><a href="#Class_Loader_Definitions">Class Loader Definitions</a></li><li><a href="#XML_Parsers_and_Java">XML Parsers and Java</a></li><li><a href="#Running_under_a_security_manager">Running under a security manager</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + +<p>Like many server applications, Tomcat installs a variety of class loaders +(that is, classes that implement <code>java.lang.ClassLoader</code>) to allow +different portions of the container, and the web applications running on the +container, to have access to different repositories of available classes and +resources. This mechanism is used to provide the functionality defined in the +Servlet Specification, version 2.4 — in particular, Sections 9.4 +and 9.6.</p> + +<p>In a Java environment, class loaders are +arranged in a parent-child tree. Normally, when a class loader is asked to +load a particular class or resource, it delegates the request to a parent +class loader first, and then looks in its own repositories only if the parent +class loader(s) cannot find the requested class or resource. Note, that the +model for web application class loaders <em>differs</em> slightly from this, +as discussed below, but the main principles are the same.</p> + +<p>When Tomcat is started, it creates a set of class loaders that are +organized into the following parent-child relationships, where the parent +class loader is above the child class loader:</p> + +<div class="codeBox"><pre><code> Bootstrap + | + System + | + Common + / \ + Webapp1 Webapp2 ...</code></pre></div> + +<p>The characteristics of each of these class loaders, including the source +of classes and resources that they make visible, are discussed in detail in +the following section.</p> + +</div><h3 id="Class_Loader_Definitions">Class Loader Definitions</h3><div class="text"> + +<p>As indicated in the diagram above, Tomcat creates the following class +loaders as it is initialized:</p> +<ul> +<li><p><strong>Bootstrap</strong> — This class loader contains the basic + runtime classes provided by the Java Virtual Machine, plus any classes from + JAR files present in the System Extensions directory + (<code>$JAVA_HOME/jre/lib/ext</code>). <em>Note</em>: some JVMs may + implement this as more than one class loader, or it may not be visible + (as a class loader) at all.</p></li> +<li><p><strong>System</strong> — This class loader is normally initialized + from the contents of the <code>CLASSPATH</code> environment variable. All + such classes are visible to both Tomcat internal classes, and to web + applications. However, the standard Tomcat startup scripts + (<code>$CATALINA_HOME/bin/catalina.sh</code> or + <code>%CATALINA_HOME%\bin\catalina.bat</code>) totally ignore the contents + of the <code>CLASSPATH</code> environment variable itself, and instead + build the System class loader from the following repositories: + </p> + <ul> + <li><p><em>$CATALINA_HOME/bin/bootstrap.jar</em> — Contains the + main() method that is used to initialize the Tomcat server, and the + class loader implementation classes it depends on.</p></li> + <li><p><em>$CATALINA_BASE/bin/tomcat-juli.jar</em> or + <em>$CATALINA_HOME/bin/tomcat-juli.jar</em> — Logging + implementation classes. These include enhancement classes to + <code>java.util.logging</code> API, known as Tomcat JULI, + and a package-renamed copy of Apache Commons Logging library + used internally by Tomcat. + See <a href="logging.html">logging documentation</a> for more + details.</p> + <p>If <code>tomcat-juli.jar</code> is present in + <em>$CATALINA_BASE/bin</em>, it is used instead of the one in + <em>$CATALINA_HOME/bin</em>. It is useful in certain logging + configurations</p></li> + <li><p><em>$CATALINA_HOME/bin/commons-daemon.jar</em> — The classes + from <a href="http://commons.apache.org/daemon/">Apache Commons + Daemon</a> project. + This JAR file is not present in the <code>CLASSPATH</code> built by + <code>catalina.bat</code>|<code>.sh</code> scripts, but is referenced + from the manifest file of <em>bootstrap.jar</em>.</p></li> + </ul> + </li> +<li><p><strong>Common</strong> — This class loader contains additional + classes that are made visible to both Tomcat internal classes and to all + web applications.</p> + <p>Normally, application classes should <strong>NOT</strong> + be placed here. The locations searched by this class loader are defined by + the <code>common.loader</code> property in + $CATALINA_BASE/conf/catalina.properties. The default setting will search the + following locations in the order they are listed:</p> + <ul> + <li>unpacked classes and resources in <code>$CATALINA_BASE/lib</code></li> + <li>JAR files in <code>$CATALINA_BASE/lib</code></li> + <li>unpacked classes and resources in <code>$CATALINA_HOME/lib</code></li> + <li>JAR files in <code>$CATALINA_HOME/lib</code></li> + </ul> + <p>By default, this includes the following:</p> + <ul> + <li><em>annotations-api.jar</em> — JavaEE annotations classes.</li> + <li><em>catalina.jar</em> — Implementation of the Catalina servlet + container portion of Tomcat.</li> + <li><em>catalina-ant.jar</em> — Tomcat Catalina Ant tasks.</li> + <li><em>catalina-ha.jar</em> — High availability package.</li> + <li><em>catalina-storeconfig.jar</em> — Generation of XML + configuration files from current state</li> + <li><em>catalina-tribes.jar</em> — Group communication package.</li> + <li><em>ecj-*.jar</em> — Eclipse JDT Java compiler.</li> + <li><em>el-api.jar</em> — EL 3.0 API.</li> + <li><em>jasper.jar</em> — Tomcat Jasper JSP Compiler and Runtime.</li> + <li><em>jasper-el.jar</em> — Tomcat Jasper EL implementation.</li> + <li><em>jsp-api.jar</em> — JSP 2.3 API.</li> + <li><em>servlet-api.jar</em> — Servlet 4.0 API.</li> + <li><em>tomcat-api.jar</em> — Several interfaces defined by Tomcat.</li> + <li><em>tomcat-coyote.jar</em> — Tomcat connectors and utility classes.</li> + <li><em>tomcat-dbcp.jar</em> — Database connection pool + implementation based on package-renamed copy of Apache Commons Pool + and Apache Commons DBCP.</li> + <li><em>tomcat-i18n-**.jar</em> — Optional JARs containing resource bundles + for other languages. As default bundles are also included in each + individual JAR, they can be safely removed if no internationalization + of messages is needed.</li> + <li><em>tomcat-jdbc.jar</em> — An alternative database connection pool + implementation, known as Tomcat JDBC pool. See + <a href="jdbc-pool.html">documentation</a> for more details.</li> + <li><em>tomcat-util.jar</em> — Common classes used by various components of + Apache Tomcat.</li> + <li><em>tomcat-websocket.jar</em> — WebSocket 1.1 implementation</li> + <li><em>websocket-api.jar</em> — WebSocket 1.1 API</li> + </ul></li> +<li><p><strong>WebappX</strong> — A class loader is created for each web + application that is deployed in a single Tomcat instance. All unpacked + classes and resources in the <code>/WEB-INF/classes</code> directory of + your web application, plus classes and resources in JAR files + under the <code>/WEB-INF/lib</code> directory of your web application, + are made visible to this web application, but not to other ones.</p></li> +</ul> + +<p>As mentioned above, the web application class loader diverges from the +default Java delegation model (in accordance with the recommendations in the +Servlet Specification, version 2.4, section 9.7.2 Web Application Classloader). +When a request to load a +class from the web application's <em>WebappX</em> class loader is processed, +this class loader will look in the local repositories <strong>first</strong>, +instead of delegating before looking. There are exceptions. Classes which are +part of the JRE base classes cannot be overridden. There are some exceptions +such as the XML parser components which can be overridden using the appropriate +JVM feature which is the endorsed standards override feature for Java <= 8 +and the upgradeable modules feature for Java 9+. +Lastly, the web application class loader will always delegate first for JavaEE +API classes for the specifications implemented by Tomcat +(Servlet, JSP, EL, WebSocket). All other class loaders in Tomcat follow the +usual delegation pattern.</p> + +<p>Therefore, from the perspective of a web application, class or resource +loading looks in the following repositories, in this order:</p> +<ul> +<li>Bootstrap classes of your JVM</li> +<li><em>/WEB-INF/classes</em> of your web application</li> +<li><em>/WEB-INF/lib/*.jar</em> of your web application</li> +<li>System class loader classes (described above)</li> +<li>Common class loader classes (described above)</li> +</ul> + +<p>If the web application class loader is +<a href="config/loader.html">configured</a> with +<code><Loader delegate="true"/></code> +then the order becomes:</p> +<ul> +<li>Bootstrap classes of your JVM</li> +<li>System class loader classes (described above)</li> +<li>Common class loader classes (described above)</li> +<li><em>/WEB-INF/classes</em> of your web application</li> +<li><em>/WEB-INF/lib/*.jar</em> of your web application</li> +</ul> + +</div><h3 id="XML_Parsers_and_Java">XML Parsers and Java</h3><div class="text"> + +<p>Starting with Java 1.4 a copy of JAXP APIs and an XML parser are packed +inside the JRE. This has impacts on applications that wish to use their own +XML parser.</p> + +<p>In old versions of Tomcat, you could simply replace the XML parser +in the Tomcat libraries directory to change the parser +used by all web applications. However, this technique will not be effective +when you are running modern versions of Java, because the usual class loader +delegation process will always choose the implementation inside the JDK in +preference to this one.</p> + +<p>Java <= 8 supports a mechanism called the "Endorsed Standards Override +Mechanism" to allow replacement of APIs created outside of the JCP +(i.e. DOM and SAX from W3C). It can also be used to update the XML parser +implementation. For more information, see: +<a href="http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html"> +http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html</a>. For +Java 9+, use the upgradeable modules feature.</p> + +<p>Tomcat utilizes the endorsed mechanism by including the system property setting +<code>-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS</code> in the +command line that starts the container. The default value of this option is +<em>$CATALINA_HOME/endorsed</em>. This <em>endorsed</em> directory is not +created by default. Note that the endorsed feature is no longer supported +with Java 9 and the above system property will only be set if either the +directory <em>$CATALINA_HOME/endorsed</em> exists, or the variable +<code>JAVA_ENDORSED_DIRS</code> has been set. +</p> + +<p>Note that overriding any JRE component carries risk. If the overriding +component does not provide a 100% compatible API (e.g. the API provided by +Xerces is not 100% compatible with the XML API provided by the JRE) then there +is a risk that Tomcat and/or the deployed application will experience errors.</p> + +</div><h3 id="Running_under_a_security_manager">Running under a security manager</h3><div class="text"> + +<p>When running under a security manager the locations from which classes +are permitted to be loaded will also depend on the contents of your policy +file. See <a href="security-manager-howto.html">Security Manager HOW-TO</a> +for further information.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/cluster-howto.html b/src/tomcat/webapps/docs/cluster-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..bfcb9c435413d3691c09101b2534964512248594 --- /dev/null +++ b/src/tomcat/webapps/docs/cluster-howto.html @@ -0,0 +1,681 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Clustering/Session Replication HOW-TO</title><meta name="author" content="Filip Hanik"><meta name="author" content="Peter Rossbach"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/cluster-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Clustering/Session Replication HOW-TO</h2><h3 id="Important_Note">Important Note</h3><div class="text"> +<p><b>You can also check the <a href="config/cluster.html">configuration reference documentation.</a></b> +</p> +</div><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#For_the_impatient">For the impatient</a></li><li><a href="#Security">Security</a></li><li><a href="#Cluster_Basics">Cluster Basics</a></li><li><a href="#Overview">Overview</a></li><li><a href="#Cluster_Information">Cluster Information</a></li><li><a href="#Bind_session_after_crash_to_failover_node">Bind session after crash to failover node</a></li><li><a href="#Configuration_Example">Configuration Example</a></li><li><a href="#Cluster_Architecture">Cluster Architecture</a></li><li><a href="#How_it_Works">How it Works</a></li><li><a href="#Monitoring_your_Cluster_with_JMX">Monitoring your Cluster with JMX</a></li><li><a href="#FAQ">FAQ</a></li></ul> +</div><h3 id="For_the_impatient">For the impatient</h3><div class="text"> + <p> + Simply add + </p> + <div class="codeBox"><pre><code><Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/></code></pre></div> + <p> + to your <code><Engine></code> or your <code><Host></code> element to enable clustering. + </p> + <p> + Using the above configuration will enable all-to-all session replication + using the <code>DeltaManager</code> to replicate session deltas. By all-to-all we mean that the session gets replicated to all the other + nodes in the cluster. This works great for smaller cluster but we don't recommend it for larger clusters(a lot of Tomcat nodes). + Also when using the delta manager it will replicate to all nodes, even nodes that don't have the application deployed.<br> + To get around this problem, you'll want to use the BackupManager. This manager only replicates the session data to one backup + node, and only to nodes that have the application deployed. Downside of the BackupManager: not quite as battle tested as the delta manager. + </p> + <p> + Here are some of the important default values: + </p> + <ol> + <li>Multicast address is 228.0.0.4</li> + <li>Multicast port is 45564 (the port and the address together determine cluster membership.</li> + <li>The IP broadcasted is <code>java.net.InetAddress.getLocalHost().getHostAddress()</code> (make sure you don't broadcast 127.0.0.1, this is a common error)</li> + <li>The TCP port listening for replication messages is the first available server socket in range <code>4000-4100</code></li> + <li>Listener is configured <code>ClusterSessionListener</code></li> + <li>Two interceptors are configured <code>TcpFailureDetector</code> and <code>MessageDispatchInterceptor</code></li> + </ol> + <p> + The following is the default cluster configuration: + </p> + <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" + channelSendOptions="8"> + + <Manager className="org.apache.catalina.ha.session.DeltaManager" + expireSessionsOnShutdown="false" + notifyListenersOnReplication="true"/> + + <Channel className="org.apache.catalina.tribes.group.GroupChannel"> + <Membership className="org.apache.catalina.tribes.membership.McastService" + address="228.0.0.4" + port="45564" + frequency="500" + dropTime="3000"/> + <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" + address="auto" + port="4000" + autoBind="100" + selectorTimeout="5000" + maxThreads="6"/> + + <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> + <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> + </Sender> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> + </Channel> + + <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" + filter=""/> + <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> + + <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" + tempDir="/tmp/war-temp/" + deployDir="/tmp/war-deploy/" + watchDir="/tmp/war-listen/" + watchEnabled="false"/> + + <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> + </Cluster></code></pre></div> + <p>Will cover this section in more detail later in this document.</p> +</div><h3 id="Security">Security</h3><div class="text"> + +<p>The cluster implementation is written on the basis that a secure, trusted +network is used for all of the cluster related network traffic. It is not safe +to run a cluster on a insecure, untrusted network.</p> + +<p>There are many options for providing a secure, trusted network for use by a +Tomcat cluster. These include:</p> +<ul> + <li>private LAN</li> + <li>a Virtual Private Network (VPN)</li> + <li>IPSEC</li> +</ul> + +</div><h3 id="Cluster_Basics">Cluster Basics</h3><div class="text"> + +<p>To run session replication in your Tomcat 9 container, the following steps +should be completed:</p> +<ul> + <li>All your session attributes must implement <code>java.io.Serializable</code></li> + <li>Uncomment the <code>Cluster</code> element in server.xml</li> + <li>If you have defined custom cluster valves, make sure you have the <code>ReplicationValve</code> defined as well under the Cluster element in server.xml</li> + <li>If your Tomcat instances are running on the same machine, make sure the <code>Receiver.port</code> + attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100</li> + <li>Make sure your <code>web.xml</code> has the + <code><distributable/></code> element</li> + <li>If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <code><Engine name="Catalina" jvmRoute="node01" ></code> + and that the jvmRoute attribute value matches your worker name in workers.properties</li> + <li>Make sure that all nodes have the same time and sync with NTP service!</li> + <li>Make sure that your loadbalancer is configured for sticky session mode.</li> +</ul> +<p>Load balancing can be achieved through many techniques, as seen in the +<a href="balancer-howto.html">Load Balancing</a> chapter.</p> +<p>Note: Remember that your session state is tracked by a cookie, so your URL must look the same from the out + side otherwise, a new session will be created.</p> +<p>Note: Clustering support currently requires the JDK version 1.5 or later.</p> +<p>The Cluster module uses the Tomcat JULI logging framework, so you can configure logging + through the regular logging.properties file. To track messages, you can enable logging on the key: <code>org.apache.catalina.tribes.MESSAGES</code></p> +</div><h3 id="Overview">Overview</h3><div class="text"> + +<p>To enable session replication in Tomcat, three different paths can be followed to achieve the exact same thing:</p> +<ol> + <li>Using session persistence, and saving the session to a shared file system (PersistenceManager + FileStore)</li> + <li>Using session persistence, and saving the session to a shared database (PersistenceManager + JDBCStore)</li> + <li>Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat (lib/catalina-tribes.jar + lib/catalina-ha.jar)</li> +</ol> + +<p>In this release of session replication, Tomcat can perform an all-to-all replication of session state using the <code>DeltaManager</code> or + perform backup replication to only one node using the <code>BackupManager</code>. + The all-to-all replication is an algorithm that is only efficient when the clusters are small. For larger clusters, to use + a primary-secondary session replication where the session will only be stored at one backup server simply setup the BackupManager. <br> + Currently you can use the domain worker attribute (mod_jk > 1.2.8) to build cluster partitions + with the potential of having a more scalable cluster solution with the DeltaManager(you'll need to configure the domain interceptor for this). + In order to keep the network traffic down in an all-to-all environment, you can split your cluster + into smaller groups. This can be easily achieved by using different multicast addresses for the different groups. + A very simple setup would look like this: + </p> + +<div class="codeBox"><pre><code> DNS Round Robin + | + Load Balancer + / \ + Cluster1 Cluster2 + / \ / \ + Tomcat1 Tomcat2 Tomcat3 Tomcat4</code></pre></div> + +<p>What is important to mention here, is that session replication is only the beginning of clustering. + Another popular concept used to implement clusters is farming, i.e., you deploy your apps only to one + server, and the cluster will distribute the deployments across the entire cluster. + This is all capabilities that can go into with the FarmWarDeployer (s. cluster example at <code>server.xml</code>)</p> +<p>In the next section will go deeper into how session replication works and how to configure it.</p> + +</div><h3 id="Cluster_Information">Cluster Information</h3><div class="text"> +<p>Membership is established using multicast heartbeats. + Hence, if you wish to subdivide your clusters, you can do this by + changing the multicast IP address or port in the <code><Membership></code> element. +</p> +<p> + The heartbeat contains the IP address of the Tomcat node and the TCP port that + Tomcat listens to for replication traffic. All data communication happens over TCP. +</p> +<p> + The <code>ReplicationValve</code> is used to find out when the request has been completed and initiate the + replication, if any. Data is only replicated if the session has changed (by calling setAttribute or removeAttribute + on the session). +</p> +<p> + One of the most important performance considerations is the synchronous versus asynchronous replication. + In a synchronous replication mode the request doesn't return until the replicated session has been + sent over the wire and reinstantiated on all the other cluster nodes. + Synchronous vs. asynchronous is configured using the <code>channelSendOptions</code> + flag and is an integer value. The default value for the <code>SimpleTcpCluster/DeltaManager</code> combo is + 8, which is asynchronous. +</p> +<p> + For convenience, <code>channelSendOptions</code> can be set by name(s) rather than integer, + which are then translated to their integer value upon startup. The valid option names are: + "asynchronous" (alias "async"), "byte_message" (alias "byte"), "multicast", "secure", + "synchronized_ack" (alias "sync"), "udp", "use_ack". Use comma to separate multiple names, + e.g. pass "async, multicast" for the options + <code>SEND_OPTIONS_ASYNCHRONOUS | SEND_OPTIONS_MULTICAST</code>. +</p> +<p> + You can read more on the <a href="tribes/introduction.html">send flag(overview)</a> or the + <a href="http://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/tribes/Channel.html">send flag(javadoc)</a>. + During async replication, the request is returned before the data has been replicated. async + replication yields shorter request times, and synchronous replication guarantees the session + to be replicated before the request returns. +</p> +</div><h3 id="Bind_session_after_crash_to_failover_node">Bind session after crash to failover node</h3><div class="text"> +<p> + If you are using mod_jk and not using sticky sessions or for some reasons sticky session don't + work, or you are simply failing over, the session id will need to be modified as it previously contained + the worker id of the previous tomcat (as defined by jvmRoute in the Engine element). + To solve this, we will use the JvmRouteBinderValve. +</p> +<p> + The JvmRouteBinderValve rewrites the session id to ensure that the next request will remain sticky + (and not fall back to go to random nodes since the worker is no longer available) after a fail over. + The valve rewrites the JSESSIONID value in the cookie with the same name. + Not having this valve in place, will make it harder to ensure stickiness in case of a failure for the mod_jk module. +</p> +<p> + Remember, if you are adding your own valves in server.xml then the defaults are no longer valid, + make sure that you add in all the appropriate valves as defined by the default. +</p> +<p> + <b>Hint:</b><br> + With attribute <i>sessionIdAttribute</i> you can change the request attribute name that included the old session id. + Default attribute name is <i>org.apache.catalina.ha.session.JvmRouteOrignalSessionID</i>. +</p> +<p> + <b>Trick:</b><br> + You can enable this mod_jk turnover mode via JMX before you drop a node to all backup nodes! + Set enable true on all JvmRouteBinderValve backups, disable worker at mod_jk + and then drop node and restart it! Then enable mod_jk Worker and disable JvmRouteBinderValves again. + This use case means that only requested session are migrated. +</p> + + +</div><h3 id="Configuration_Example">Configuration Example</h3><div class="text"> + <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" + channelSendOptions="6"> + + <Manager className="org.apache.catalina.ha.session.BackupManager" + expireSessionsOnShutdown="false" + notifyListenersOnReplication="true" + mapSendOptions="6"/> + <!-- + <Manager className="org.apache.catalina.ha.session.DeltaManager" + expireSessionsOnShutdown="false" + notifyListenersOnReplication="true"/> + --> + <Channel className="org.apache.catalina.tribes.group.GroupChannel"> + <Membership className="org.apache.catalina.tribes.membership.McastService" + address="228.0.0.4" + port="45564" + frequency="500" + dropTime="3000"/> + <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" + address="auto" + port="5000" + selectorTimeout="100" + maxThreads="6"/> + + <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> + <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> + </Sender> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> + </Channel> + + <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" + filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/> + + <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" + tempDir="/tmp/war-temp/" + deployDir="/tmp/war-deploy/" + watchDir="/tmp/war-listen/" + watchEnabled="false"/> + + <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> + </Cluster></code></pre></div> + <p> + Break it down!! + </p> + <div class="codeBox"><pre><code> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" + channelSendOptions="6"></code></pre></div> + <p> + The main element, inside this element all cluster details can be configured. + The <code>channelSendOptions</code> is the flag that is attached to each message sent by the + SimpleTcpCluster class or any objects that are invoking the SimpleTcpCluster.send method. + The description of the send flags is available at <a href="http://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/tribes/Channel.html"> + our javadoc site</a> + The <code>DeltaManager</code> sends information using the SimpleTcpCluster.send method, while the backup manager + sends it itself directly through the channel. + <br>For more info, Please visit the <a href="config/cluster.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Manager className="org.apache.catalina.ha.session.BackupManager" + expireSessionsOnShutdown="false" + notifyListenersOnReplication="true" + mapSendOptions="6"/> + <!-- + <Manager className="org.apache.catalina.ha.session.DeltaManager" + expireSessionsOnShutdown="false" + notifyListenersOnReplication="true"/> + --></code></pre></div> + <p> + This is a template for the manager configuration that will be used if no manager is defined in the <Context> + element. In Tomcat 5.x each webapp marked distributable had to use the same manager, this is no longer the case + since Tomcat you can define a manager class for each webapp, so that you can mix managers in your cluster. + Obviously the managers on one node's application has to correspond with the same manager on the same application on the other node. + If no manager has been specified for the webapp, and the webapp is marked <distributable/> Tomcat will take this manager configuration + and create a manager instance cloning this configuration. + <br>For more info, Please visit the <a href="config/cluster-manager.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Channel className="org.apache.catalina.tribes.group.GroupChannel"></code></pre></div> + <p> + The channel element is <a href="tribes/introduction.html">Tribes</a>, the group communication framework + used inside Tomcat. This element encapsulates everything that has to do with communication and membership logic. + <br>For more info, Please visit the <a href="config/cluster-channel.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Membership className="org.apache.catalina.tribes.membership.McastService" + address="228.0.0.4" + port="45564" + frequency="500" + dropTime="3000"/></code></pre></div> + <p> + Membership is done using multicasting. Please note that Tribes also supports static memberships using the + <code>StaticMembershipInterceptor</code> if you want to extend your membership to points beyond multicasting. + The address attribute is the multicast address used and the port is the multicast port. These two together + create the cluster separation. If you want a QA cluster and a production cluster, the easiest config is to + have the QA cluster be on a separate multicast address/port combination than the production cluster.<br> + The membership component broadcasts TCP address/port of itself to the other nodes so that communication between + nodes can be done over TCP. Please note that the address being broadcasted is the one of the + <code>Receiver.address</code> attribute. + <br>For more info, Please visit the <a href="config/cluster-membership.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" + address="auto" + port="5000" + selectorTimeout="100" + maxThreads="6"/></code></pre></div> + <p> + In tribes the logic of sending and receiving data has been broken into two functional components. The Receiver, as the name suggests + is responsible for receiving messages. Since the Tribes stack is thread less, (a popular improvement now adopted by other frameworks as well), + there is a thread pool in this component that has a maxThreads and minThreads setting.<br> + The address attribute is the host address that will be broadcasted by the membership component to the other nodes. + <br>For more info, Please visit the <a href="config/cluster-receiver.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> + <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> + </Sender></code></pre></div> + <p> + The sender component, as the name indicates is responsible for sending messages to other nodes. + The sender has a shell component, the <code>ReplicationTransmitter</code> but the real stuff done is done in the + sub component, <code>Transport</code>. + Tribes support having a pool of senders, so that messages can be sent in parallel and if using the NIO sender, + you can send messages concurrently as well.<br> + Concurrently means one message to multiple senders at the same time and Parallel means multiple messages to multiple senders + at the same time. + <br>For more info, Please visit the <a href="config/cluster-sender.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/> + <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> + </Channel></code></pre></div> + <p> + Tribes uses a stack to send messages through. Each element in the stack is called an interceptor, and works much like the valves do + in the Tomcat servlet container. + Using interceptors, logic can be broken into more manageable pieces of code. The interceptors configured above are:<br> + TcpFailureDetector - verifies crashed members through TCP, if multicast packets get dropped, this interceptor protects against false positives, + ie the node marked as crashed even though it still is alive and running.<br> + MessageDispatchInterceptor - dispatches messages to a thread (thread pool) to send message asynchronously.<br> + ThroughputInterceptor - prints out simple stats on message traffic.<br> + Please note that the order of interceptors is important. The way they are defined in server.xml is the way they are represented in the + channel stack. Think of it as a linked list, with the head being the first most interceptor and the tail the last. + <br>For more info, Please visit the <a href="config/cluster-interceptor.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" + filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/></code></pre></div> + <p> + The cluster uses valves to track requests to web applications, we've mentioned the ReplicationValve and the JvmRouteBinderValve above. + The <Cluster> element itself is not part of the pipeline in Tomcat, instead the cluster adds the valve to its parent container. + If the <Cluster> elements is configured in the <Engine> element, the valves get added to the engine and so on. + <br>For more info, Please visit the <a href="config/cluster-valve.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" + tempDir="/tmp/war-temp/" + deployDir="/tmp/war-deploy/" + watchDir="/tmp/war-listen/" + watchEnabled="false"/></code></pre></div> + <p> + The default tomcat cluster supports farmed deployment, ie, the cluster can deploy and undeploy applications on the other nodes. + The state of this component is currently in flux but will be addressed soon. There was a change in the deployment algorithm + between Tomcat 5.0 and 5.5 and at that point, the logic of this component changed to where the deploy dir has to match the + webapps directory. + <br>For more info, Please visit the <a href="config/cluster-deployer.html">reference documentation</a> + </p> + <div class="codeBox"><pre><code> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> + </Cluster></code></pre></div> + <p> + Since the SimpleTcpCluster itself is a sender and receiver of the Channel object, components can register themselves as listeners to + the SimpleTcpCluster. The listener above <code>ClusterSessionListener</code> listens for DeltaManager replication messages + and applies the deltas to the manager that in turn applies it to the session. + <br>For more info, Please visit the <a href="config/cluster-listener.html">reference documentation</a> + </p> + +</div><h3 id="Cluster_Architecture">Cluster Architecture</h3><div class="text"> + +<p><b>Component Levels:</b></p> +<div class="codeBox"><pre><code> Server + | + Service + | + Engine + | \ + | --- Cluster --* + | + Host + | + ------ + / \ + Cluster Context(1-N) + | \ + | -- Manager + | \ + | -- DeltaManager + | -- BackupManager + | + --------------------------- + | \ + Channel \ + ----------------------------- \ + | \ + Interceptor_1 .. \ + | \ + Interceptor_N \ + ----------------------------- \ + | | | \ + Receiver Sender Membership \ + -- Valve + | \ + | -- ReplicationValve + | -- JvmRouteBinderValve + | + -- LifecycleListener + | + -- ClusterListener + | \ + | -- ClusterSessionListener + | + -- Deployer + \ + -- FarmWarDeployer + +</code></pre></div> + + +</div><h3 id="How_it_Works">How it Works</h3><div class="text"> +<p>To make it easy to understand how clustering works, We are gonna take you through a series of scenarios. + In the scenario we only plan to use two tomcat instances <code>TomcatA</code> and <code>TomcatB</code>. + We will cover the following sequence of events:</p> + +<ol> +<li><code>TomcatA</code> starts up</li> +<li><code>TomcatB</code> starts up (Wait that TomcatA start is complete)</li> +<li><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</li> +<li><code>TomcatA</code> crashes</li> +<li><code>TomcatB</code> receives a request for session <code>S1</code></li> +<li><code>TomcatA</code> starts up</li> +<li><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</li> +<li><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</li> +<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity.</li> +</ol> + +<p>Ok, now that we have a good sequence, we will take you through exactly what happens in the session replication code</p> + +<ol> +<li><b><code>TomcatA</code> starts up</b> + <p> + Tomcat starts up using the standard start up sequence. When the Host object is created, a cluster object is associated with it. + When the contexts are parsed, if the distributable element is in place in web.xml + Tomcat asks the Cluster class (in this case <code>SimpleTcpCluster</code>) to create a manager + for the replicated context. So with clustering enabled, distributable set in web.xml + Tomcat will create a <code>DeltaManager</code> for that context instead of a <code>StandardManager</code>. + The cluster class will start up a membership service (multicast) and a replication service (tcp unicast). + More on the architecture further down in this document. + </p> +</li> +<li><b><code>TomcatB</code> starts up</b> + <p> + When TomcatB starts up, it follows the same sequence as TomcatA did with one exception. + The cluster is started and will establish a membership (TomcatA,TomcatB). + TomcatB will now request the session state from a server that already exists in the cluster, + in this case TomcatA. TomcatA responds to the request, and before TomcatB starts listening + for HTTP requests, the state has been transferred from TomcatA to TomcatB. + In case TomcatA doesn't respond, TomcatB will time out after 60 seconds, and issue a log + entry. The session state gets transferred for each web application that has distributable in + its web.xml. Note: To use session replication efficiently, all your tomcat instances should be + configured the same. + </p> +</li> +<li><B><code>TomcatA</code> receives a request, a session <code>S1</code> is created.</B> + <p> + The request coming in to TomcatA is treated exactly the same way as without session replication. + The action happens when the request is completed, the <code>ReplicationValve</code> will intercept + the request before the response is returned to the user. + At this point it finds that the session has been modified, and it uses TCP to replicate the + session to TomcatB. Once the serialized data has been handed off to the operating systems TCP logic, + the request returns to the user, back through the valve pipeline. + For each request the entire session is replicated, this allows code that modifies attributes + in the session without calling setAttribute or removeAttribute to be replicated. + a useDirtyFlag configuration parameter can be used to optimize the number of times + a session is replicated. + </p> + +</li> +<li><b><code>TomcatA</code> crashes</b> + <p> + When TomcatA crashes, TomcatB receives a notification that TomcatA has dropped out + of the cluster. TomcatB removes TomcatA from its membership list, and TomcatA will no longer + be notified of any changes that occurs in TomcatB. + The load balancer will redirect the requests from TomcatA to TomcatB and all the sessions + are current. + </p> +</li> +<li><b><code>TomcatB</code> receives a request for session <code>S1</code></b> + <p>Nothing exciting, TomcatB will process the request as any other request. + </p> +</li> +<li><b><code>TomcatA</code> starts up</b> + <p>Upon start up, before TomcatA starts taking new request and making itself + available to it will follow the start up sequence described above 1) 2). + It will join the cluster, contact TomcatB for the current state of all the sessions. + And once it receives the session state, it finishes loading and opens its HTTP/mod_jk ports. + So no requests will make it to TomcatA until it has received the session state from TomcatB. + </p> +</li> +<li><b><code>TomcatA</code> receives a request, invalidate is called on the session (<code>S1</code>)</b> + <p>The invalidate call is intercepted, and the session is queued with invalidated sessions. + When the request is complete, instead of sending out the session that has changed, it sends out + an "expire" message to TomcatB and TomcatB will invalidate the session as well. + </p> + +</li> +<li><b><code>TomcatB</code> receives a request, for a new session (<code>S2</code>)</b> + <p>Same scenario as in step 3) + </p> + + +</li> +<li><code>TomcatA</code> The session <code>S2</code> expires due to inactivity. + <p>The invalidate call is intercepted the same was as when a session is invalidated by the user, + and the session is queued with invalidated sessions. + At this point, the invalidated session will not be replicated across until + another request comes through the system and checks the invalid queue. + </p> +</li> +</ol> + +<p>Phuuuhh! :)</p> + +<p><b>Membership</b> + Clustering membership is established using very simple multicast pings. + Each Tomcat instance will periodically send out a multicast ping, + in the ping message the instance will broad cast its IP and TCP listen port + for replication. + If an instance has not received such a ping within a given timeframe, the + member is considered dead. Very simple, and very effective! + Of course, you need to enable multicasting on your system. +</p> + +<p><b>TCP Replication</b> + Once a multicast ping has been received, the member is added to the cluster + Upon the next replication request, the sending instance will use the host and + port info and establish a TCP socket. Using this socket it sends over the serialized data. + The reason I choose TCP sockets is because it has built in flow control and guaranteed delivery. + So I know, when I send some data, it will make it there :) +</p> + +<p><b>Distributed locking and pages using frames</b> + Tomcat does not keep session instances in sync across the cluster. + The implementation of such logic would be to much overhead and cause all + kinds of problems. If your client accesses the same session + simultaneously using multiple requests, then the last request + will override the other sessions in the cluster. +</p> + +</div><h3 id="Monitoring_your_Cluster_with_JMX">Monitoring your Cluster with JMX</h3><div class="text"> +<p>Monitoring is a very important question when you use a cluster. Some of the cluster objects are JMX MBeans </p> +<p>Add the following parameter to your startup script with Java 5:</p> +<div class="codeBox"><pre><code>set CATALINA_OPTS=\ +-Dcom.sun.management.jmxremote \ +-Dcom.sun.management.jmxremote.port=%my.jmx.port% \ +-Dcom.sun.management.jmxremote.ssl=false \ +-Dcom.sun.management.jmxremote.authenticate=false</code></pre></div> + +<p> + List of Cluster Mbeans +</p> +<table class="defaultTable"> + + <tr> + <th>Name</th> + <th>Description</th> + <th>MBean ObjectName - Engine</th> + <th>MBean ObjectName - Host</th> + </tr> + + <tr> + <td>Cluster</td> + <td>The complete cluster element</td> + <td><code>type=Cluster</code></td> + <td><code>type=Cluster,host=${HOST}</code></td> + </tr> + + <tr> + <td>DeltaManager</td> + <td>This manager control the sessions and handle session replication </td> + <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td> + <td><code>type=Manager,context=${APP.CONTEXT.PATH}, host=${HOST}</code></td> + </tr> + + <tr> + <td>FarmWarDeployer</td> + <td>Manages the process of deploying an application to all nodes in the cluster</td> + <td>Not supported</td> + <td><code>type=Cluster, host=${HOST}, component=deployer</code></td> + </tr> + + <tr> + <td>Member</td> + <td>Represents a node in the cluster</td> + <td>type=Cluster, component=member, name=${NODE_NAME}</td> + <td><code>type=Cluster, host=${HOST}, component=member, name=${NODE_NAME}</code></td> + </tr> + + <tr> + <td>ReplicationValve</td> + <td>This valve control the replication to the backup nodes</td> + <td><code>type=Valve,name=ReplicationValve</code></td> + <td><code>type=Valve,name=ReplicationValve,host=${HOST}</code></td> + </tr> + + <tr> + <td>JvmRouteBinderValve</td> + <td>This is a cluster fallback valve to change the Session ID to the current tomcat jvmroute.</td> + <td><code>type=Valve,name=JvmRouteBinderValve, + context=${APP.CONTEXT.PATH}</code></td> + <td><code>type=Valve,name=JvmRouteBinderValve,host=${HOST}, + context=${APP.CONTEXT.PATH}</code></td> + </tr> + +</table> +</div><h3 id="FAQ">FAQ</h3><div class="text"> +<p>Please see <a href="http://wiki.apache.org/tomcat/FAQ/Clustering">the clustering section of the FAQ</a>.</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/comments.html b/src/tomcat/webapps/docs/comments.html new file mode 100644 index 0000000000000000000000000000000000000000..856bb74e5101d339f3ec137d5be3ce77995a8492 --- /dev/null +++ b/src/tomcat/webapps/docs/comments.html @@ -0,0 +1,122 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Documentation User Comments</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/comments"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Documentation User Comments</h2><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>The Tomcat documentation integrates the +<a href="https://comments.apache.org/help.html">Apache Comments System</a>. +It allows users to add comments to most documentation pages. The comments +section can be found at the end of each page.</p> + +</div><h3 id="Allowed_Content">Allowed Content</h3><div class="text"> + +<p>Please use the Apache Comments System responsibly. We can only provide +this service to the community as long as it isn't misused.</p> + +<p>The comments are not for general Q&A. +Comments should be pointed towards suggestions on improving the documentation +or server. Questions on how to use Apache Tomcat should be directed +to our <a href="http://tomcat.apache.org/lists.html">mailing lists</a>.</p> + +<p>Comments may be removed by moderators if they are either +implemented or considered invalid/off-topic.</p> + +<p>HTML is not allowed in comments, and will just display as raw source code +if attempted. Links that do not point to an Apache site (*.apache.org) will +need approval by a moderator before the comment is visible to regular visitors.</p> + +</div><h3 id="License">License</h3><div class="text"> + +<p>Any submitted comments must be contributed under the terms of the +<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p> + +</div><h3 id="Verified_Users">Verified Users</h3><div class="text"> + +<p>Verified users gain the Apache feather next to their name, +and may post comments with links in them without requiring approval +by a moderator before the comments are shown. Being a verified user +in itself does not give you moderating rights. If you are interested +in becoming a verified user, please contact us on the +<a href="http://tomcat.apache.org/lists.html#tomcat-users">users mailing list</a>.</p> + +<p>All ASF committers are automatically verified users.</p> + +</div><h3 id="Moderators">Moderators</h3><div class="text"> + +<p>Moderators are allowed to mark comments as "Resolved", "Invalid" +or "Sticky", remove marks, approve comments e.g. if they contain +a link, and delete comments. Moderators can also subscribe to new +comments and comment updates and use the dashboard to gain some +overview over all comments of a site.</p> + +<p>To use the moderation features, you need to login to the comments +system. Furthermore you will need to allow cookies to be set for +comments.apache.org (this is done using a secure https cookie). Once +logged in as a moderator you will see additional moderation +options attached to each comment.</p> + +<p>If you are a long time follower of the Apache Tomcat projects +and you are interested in becoming a moderator, please contact us on the +<a href="http://tomcat.apache.org/lists.html#tomcat-users">users mailing list</a>.</p> + +</div><h3 id="Privacy_Policy">Privacy Policy</h3><div class="text"> + +<p>No data except what you personally submit is kept on record. +A cookie is used to keep track of moderators and other people +who wish to create an account to avoid having to enter their +credentials whenever they wish to post a comment.</p> + +<p>To prevent spam and unsolicited comments, we use a digest of +visitors' IPs to keep track of comments posted by them.</p> + +<p>Entering an email address when you post a comment is completely +optional, and will not be shared with anyone. If you enter an +email address, it will be used to notify you when someone posts +a reply to one of your comments, provided you have registered +an account and validated your email address.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/ajp.html b/src/tomcat/webapps/docs/config/ajp.html new file mode 100644 index 0000000000000000000000000000000000000000..03ff7590130413cec4367cdd7bffe5b2d372c6d9 --- /dev/null +++ b/src/tomcat/webapps/docs/config/ajp.html @@ -0,0 +1,734 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The AJP Connector</title><meta name="author" content="Yoav Shapira"><meta name="author" content="Andrew R. Jaquith"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/ajp"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The AJP Connector</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementations">Standard Implementations</a></li><li><a href="#Java_TCP_socket_attributes">Java TCP socket attributes</a></li><li><a href="#NIO_specific_configuration">NIO specific configuration</a></li><li><a href="#NIO2_specific_configuration">NIO2 specific configuration</a></li><li><a href="#APR/native_specific_configuration">APR/native specific configuration</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Proxy_Support">Proxy Support</a></li><li><a href="#Connector_Comparison">Connector Comparison</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>AJP Connector</strong> element represents a + <strong>Connector</strong> component that communicates with a web + connector via the <code>AJP</code> protocol. This is used for cases + where you wish to invisibly integrate Tomcat into an existing (or new) + Apache installation, and you want Apache to handle the static content + contained in the web application, and/or utilize Apache's SSL + processing.</p> + + <p>This connector supports load balancing when used in conjunction with + the <code>jvmRoute</code> attribute of the + <a href="engine.html">Engine</a>.</p> + + <p>The native connectors supported with this Tomcat release are:</p> + <ul> + <li>JK 1.2.x with any of the supported servers. See + <a href="http://tomcat.apache.org/connectors-doc/">the JK docs</a> + for details.</li> + <li>mod_proxy on Apache httpd 2.x (included by default in Apache HTTP + Server 2.2), with AJP enabled: see + <a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html">the + httpd docs</a> for details.</li> + </ul> + + <p><b>Other native connectors supporting AJP may work, but are no longer + supported.</b></p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Connector</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">ajpFlush</code></td><td> + <p>A boolean value which can be used to enable or disable sending + AJP flush messages to the fronting proxy whenever an explicit + flush happens. The default value is <code>true</code>.<br> + An AJP flush message is a SEND_BODY_CHUNK packet with no body content. + Proxy implementations like mod_jk or mod_proxy_ajp will flush the + data buffered in the web server to the client when they receive + such a packet. Setting this to <code>false</code> can reduce + AJP packet traffic but might delay sending packets to the client. + At the end of the response, AJP does always flush to the client.</p> + </td></tr><tr><td><code class="attributeName">allowTrace</code></td><td> + <p>A boolean value which can be used to enable or disable the TRACE + HTTP method. If not specified, this attribute is set to false.</p> + </td></tr><tr><td><code class="attributeName">asyncTimeout</code></td><td> + <p>The default timeout for asynchronous requests in milliseconds. If not + specified, this attribute is set to the Servlet specification default of + 30000 (30 seconds).</p> + </td></tr><tr><td><code class="attributeName">enableLookups</code></td><td> + <p>Set to <code>true</code> if you want calls to + <code>request.getRemoteHost()</code> to perform DNS lookups in + order to return the actual host name of the remote client. Set + to <code>false</code> to skip the DNS lookup and return the IP + address in String form instead (thereby improving performance). + By default, DNS lookups are disabled.</p> + </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td> + <p>The maximum number of headers in a request that are allowed by the + container. A request that contains more headers than the specified limit + will be rejected. A value of less than 0 means no limit. + If not specified, a default of 100 is used.</p> + </td></tr><tr><td><code class="attributeName">maxParameterCount</code></td><td> + <p>The maximum number of parameter and value pairs (GET plus POST) which + will be automatically parsed by the container. Parameter and value pairs + beyond this limit will be ignored. A value of less than 0 means no limit. + If not specified, a default of 10000 is used. Note that + <code>FailedRequestFilter</code> <a href="filter.html">filter</a> can be + used to reject requests that hit the limit.</p> + </td></tr><tr><td><code class="attributeName">maxPostSize</code></td><td> + <p>The maximum size in bytes of the POST which will be handled by + the container FORM URL parameter parsing. The limit can be disabled by + setting this attribute to a value less than zero. If not specified, this + attribute is set to 2097152 (2 megabytes). Note that the + <a href="filter.html#Failed_Request_Filter"><code>FailedRequestFilter</code></a> + can be used to reject requests that exceed this limit.</p> + </td></tr><tr><td><code class="attributeName">maxSavePostSize</code></td><td> + <p>The maximum size in bytes of the POST which will be saved/buffered by + the container during FORM or CLIENT-CERT authentication. For both types + of authentication, the POST will be saved/buffered before the user is + authenticated. For CLIENT-CERT authentication, the POST is buffered for + the duration of the SSL handshake and the buffer emptied when the request + is processed. For FORM authentication the POST is saved whilst the user + is re-directed to the login form and is retained until the user + successfully authenticates or the session associated with the + authentication request expires. The limit can be disabled by setting this + attribute to -1. Setting the attribute to zero will disable the saving of + POST data during authentication. If not specified, this attribute is set + to 4096 (4 kilobytes).</p> + </td></tr><tr><td><code class="attributeName">parseBodyMethods</code></td><td> + <p>A comma-separated list of HTTP methods for which request + bodies will be parsed for request parameters identically + to POST. This is useful in RESTful applications that want to + support POST-style semantics for PUT requests. + Note that any setting other than <code>POST</code> causes Tomcat + to behave in a way that goes against the intent of the servlet + specification. + The HTTP method TRACE is specifically forbidden here in accordance + with the HTTP specification. + The default is <code>POST</code></p> + </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td> + <p>The TCP port number on which this <strong>Connector</strong> + will create a server socket and await incoming connections. Your + operating system will allow only one server application to listen + to a particular port number on a particular IP address. If the special + value of 0 (zero) is used, then Tomcat will select a free port at random + to use for this connector. This is typically only useful in embedded and + testing applications.</p> + </td></tr><tr><td><code class="attributeName">protocol</code></td><td> + <p>Sets the protocol to handle incoming traffic. To configure an AJP + connector this must be specified. If no value for protocol is provided, + an <a href="http.html">HTTP connector</a> rather than an AJP connector + will be configured.<br> + The standard protocol value for an AJP connector is <code>AJP/1.3</code> + which uses an auto-switching mechanism to select either a Java NIO based + connector or an APR/native based connector. If the + <code>PATH</code> (Windows) or <code>LD_LIBRARY_PATH</code> (on most unix + systems) environment variables contain the Tomcat native library, the + native/APR connector will be used. If the native library cannot be + found, the Java NIO based connector will be used.<br> + To use an explicit protocol rather than rely on the auto-switching + mechanism described above, the following values may be used:<br> + <code>org.apache.coyote.ajp.AjpNioProtocol</code> + - non blocking Java NIO connector.<br> + <code>org.apache.coyote.ajp.AjpNio2Protocol</code> + - non blocking Java NIO2 connector.<br> + <code>org.apache.coyote.ajp.AjpAprProtocol</code> + - the APR/native connector.<br> + Custom implementations may also be used.<br> + Take a look at our <a href="#Connector_Comparison">Connector + Comparison</a> chart. + </p> + </td></tr><tr><td><code class="attributeName">proxyName</code></td><td> + <p>If this <strong>Connector</strong> is being used in a proxy + configuration, configure this attribute to specify the server name + to be returned for calls to <code>request.getServerName()</code>. + See <a href="#Proxy_Support">Proxy Support</a> for more + information.</p> + </td></tr><tr><td><code class="attributeName">proxyPort</code></td><td> + <p>If this <strong>Connector</strong> is being used in a proxy + configuration, configure this attribute to specify the server port + to be returned for calls to <code>request.getServerPort()</code>. + See <a href="#Proxy_Support">Proxy Support</a> for more + information.</p> + </td></tr><tr><td><code class="attributeName">redirectPort</code></td><td> + <p>If this <strong>Connector</strong> is supporting non-SSL + requests, and a request is received for which a matching + <code><security-constraint></code> requires SSL transport, + Catalina will automatically redirect the request to the port + number specified here.</p> + </td></tr><tr><td><code class="attributeName">scheme</code></td><td> + <p>Set this attribute to the name of the protocol you wish to have + returned by calls to <code>request.getScheme()</code>. For + example, you would set this attribute to "<code>https</code>" + for an SSL Connector. The default value is "<code>http</code>". + </p> + </td></tr><tr><td><code class="attributeName">secure</code></td><td> + <p>Set this attribute to <code>true</code> if you wish to have + calls to <code>request.isSecure()</code> to return <code>true</code> + for requests received by this Connector. You would want this on an + SSL Connector or a non SSL connector that is receiving data from a + SSL accelerator, like a crypto card, a SSL appliance or even a webserver. + The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">URIEncoding</code></td><td> + <p>This specifies the character encoding used to decode the URI bytes, + after %xx decoding the URL. If not specified, UTF-8 will be used unless + the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to <code>true</code> + in which case ISO-8859-1 will be used.</p> + </td></tr><tr><td><code class="attributeName">useBodyEncodingForURI</code></td><td> + <p>This specifies if the encoding specified in contentType should be used + for URI query parameters, instead of using the URIEncoding. This + setting is present for compatibility with Tomcat 4.1.x, where the + encoding specified in the contentType, or explicitly set using + Request.setCharacterEncoding method was also used for the parameters from + the URL. The default value is <code>false</code>. + </p> + <p><em>Notes:</em> See notes on this attribute in + <a href="http.html">HTTP Connector</a> documentation.</p> + </td></tr><tr><td><code class="attributeName">useIPVHosts</code></td><td> + <p>Set this attribute to <code>true</code> to cause Tomcat to use + the IP address passed by the native web server to determine the Host + to send the request to. The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">xpoweredBy</code></td><td> + <p>Set this attribute to <code>true</code> to cause Tomcat to advertise + support for the Servlet specification using the header recommended in the + specification. The default value is <code>false</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementations">Standard Implementations</h4><div class="text"> + + <p>To use AJP, you must specify the protocol attribute (see above).</p> + + <p>The standard AJP connectors (NIO, NIO2 and APR/native) all support the + following attributes in addition to the common Connector attributes listed + above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">acceptCount</code></td><td> + <p>The maximum queue length for incoming connection requests when + all possible request processing threads are in use. Any requests + received when the queue is full will be refused. The default + value is 100.</p> + </td></tr><tr><td><code class="attributeName">acceptorThreadCount</code></td><td> + <p>The number of threads to be used to accept connections. Increase this + value on a multi CPU machine, although you would never really need more + than <code>2</code>. Also, with a lot of non keep alive connections, you + might want to increase this value as well. Default value is + <code>1</code>.</p> + </td></tr><tr><td><code class="attributeName">acceptorThreadPriority</code></td><td> + <p>The priority of the acceptor threads. The threads used to accept + new connections. The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means.</p> + </td></tr><tr><td><code class="attributeName">address</code></td><td> + <p>For servers with more than one IP address, this attribute + specifies which address will be used for listening on the specified + port. By default, this port will be used on all IP addresses + associated with the server. A value of <code>127.0.0.1</code> + indicates that the Connector will only listen on the loopback + interface.</p> + </td></tr><tr><td><code class="attributeName">bindOnInit</code></td><td> + <p>Controls when the socket used by the connector is bound. By default it + is bound when the connector is initiated and unbound when the connector is + destroyed. If set to <code>false</code>, the socket will be bound when the + connector is started and unbound when it is stopped.</p> + </td></tr><tr><td><code class="attributeName">clientCertProvider</code></td><td> + <p>When client certificate information is presented in a form other than + instances of <code>java.security.cert.X509Certificate</code> it needs to + be converted before it can be used and this property controls which JSSE + provider is used to perform the conversion. For example it is used with + the AJP connectors, the <a href="http.html">HTTP APR connector</a> and + with the <a href="valve.html#SSL_Authenticator_Valve"> + org.apache.catalina.valves.SSLValve</a>.If not specified, the default + provider will be used.</p> + </td></tr><tr><td><code class="attributeName">connectionLinger</code></td><td> + <p>The number of seconds during which the sockets used by this + <strong>Connector</strong> will linger when they are closed. The default + value is <code>-1</code> which disables socket linger.</p> + </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td> + <p>The number of milliseconds this <strong>Connector</strong> will wait, + after accepting a connection, for the request URI line to be + presented. The default value for AJP protocol connectors + is <code>-1</code> (i.e. infinite).</p> + </td></tr><tr><td><code class="attributeName">executor</code></td><td> + <p>A reference to the name in an <a href="executor.html">Executor</a> + element. If this attribute is set, and the named executor exists, the + connector will use the executor, and all the other thread attributes will + be ignored. Note that if a shared executor is not specified for a + connector then the connector will use a private, internal executor to + provide the thread pool.</p> + </td></tr><tr><td><code class="attributeName">executorTerminationTimeoutMillis</code></td><td> + <p>The time that the private internal executor will wait for request + processing threads to terminate before continuing with the process of + stopping the connector. If not set, the default is <code>5000</code> (5 + seconds).</p> + </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td> + <p>The number of milliseconds this <strong>Connector</strong> will wait for + another AJP request before closing the connection. + The default value is to use the value that has been set for the + connectionTimeout attribute.</p> + </td></tr><tr><td><code class="attributeName">maxConnections</code></td><td> + <p>The maximum number of connections that the server will accept and + process at any given time. When this number has been reached, the server + will accept, but not process, one further connection. This additional + connection be blocked until the number of connections being processed + falls below <strong>maxConnections</strong> at which point the server will + start accepting and processing new connections again. Note that once the + limit has been reached, the operating system may still accept connections + based on the <code>acceptCount</code> setting. The default value varies by + connector type. For NIO and NIO2 the default is <code>10000</code>. + For APR/native, the default is <code>8192</code>.</p> + <p>Note that for APR/native on Windows, the configured value will be + reduced to the highest multiple of 1024 that is less than or equal to + maxConnections. This is done for performance reasons.<br> + If set to a value of -1, the maxConnections feature is disabled + and connections are not counted.</p> + </td></tr><tr><td><code class="attributeName">maxCookieCount</code></td><td> + <p>The maximum number of cookies that are permitted for a request. A value + of less than zero means no limit. If not specified, a default value of 200 + will be used.</p> + </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td> + <p>The maximum number of request processing threads to be created + by this <strong>Connector</strong>, which therefore determines the + maximum number of simultaneous requests that can be handled. If + not specified, this attribute is set to 200. If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td> + <p>The minimum number of threads always kept running. If not specified, + the default of <code>10</code> is used. If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">packetSize</code></td><td> + <p>This attribute sets the maximum AJP packet size in Bytes. The maximum + value is 65536. It should be the same as the <code>max_packet_size</code> + directive configured for mod_jk. Normally it is not necessary to change + the maximum packet size. Problems with the default value have been + reported when sending certificates or certificate chains. The default + value is 8192. If set to less than 8192 then the setting will ignored and + the default value of 8192 used.</p> + </td></tr><tr><td><code class="attributeName">processorCache</code></td><td> + <p>The protocol handler caches Processor objects to speed up performance. + This setting dictates how many of these objects get cached. + <code>-1</code> means unlimited, default is <code>200</code>. If not using + Servlet 3.0 asynchronous processing, a good default is to use the same as + the maxThreads setting. If using Servlet 3.0 asynchronous processing, a + good default is to use the larger of maxThreads and the maximum number of + expected concurrent requests (synchronous and asynchronous).</p> + </td></tr><tr><td><code class="attributeName">requiredSecret</code></td><td> + <p>Only requests from workers with this secret keyword will be accepted. + </p> + </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td> + <p>If set to <code>true</code>, the TCP_NO_DELAY option will be + set on the server socket, which improves performance under most + circumstances. This is set to <code>true</code> by default.</p> + </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td> + <p>The priority of the request processing threads within the JVM. + The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means.If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">throwOnFailure</code></td><td> + <p>If the Connector experiences an Exception during a Lifecycle transition + should the Exception be rethrown or logged? If not specified, the default + of <code>false</code> will be used. Note that the default can be changed + by the <code>org.apache.catalina.startup.EXIT_ON_INIT_FAILURE</code> + system property.</p> + </td></tr><tr><td><code class="attributeName">tomcatAuthentication</code></td><td> + <p>If set to <code>true</code>, the authentication will be done in Tomcat. + Otherwise, the authenticated principal will be propagated from the native + webserver and used for authorization in Tomcat. Note that this principal + will have no roles associated with it. + The default value is <code>true</code>. If + <code>tomcatAuthorization</code> is set to <code>true</code> this + attribute has no effect.</p> + </td></tr><tr><td><code class="attributeName">tomcatAuthorization</code></td><td> + <p>If set to <code>true</code>, the authenticated principal will be + propagated from the native webserver and considered already authenticated + in Tomcat. If the web application has one or more security constraints, + authorization will then be performed by Tomcat and roles assigned to the + authenticated principal. If the appropriate Tomcat Realm for the request + does not recognise the provided user name, a Principal will be still be + created but it will have no roles. The default value is + <code>false</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Java_TCP_socket_attributes">Java TCP socket attributes</h4><div class="text"> + + <p>The NIO and NIO2 implementation support the following Java TCP socket + attributes in addition to the common Connector and HTTP attributes listed + above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">socket.rxBufSize</code></td><td> + <p>(int)The socket receive buffer (SO_RCVBUF) size in bytes. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.txBufSize</code></td><td> + <p>(int)The socket send buffer (SO_SNDBUF) size in bytes. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.tcpNoDelay</code></td><td> + <p>(bool)This is equivalent to standard attribute + <strong>tcpNoDelay</strong>.</p> + </td></tr><tr><td><code class="attributeName">socket.soKeepAlive</code></td><td> + <p>(bool)Boolean value for the socket's keep alive setting + (SO_KEEPALIVE). JVM default used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.ooBInline</code></td><td> + <p>(bool)Boolean value for the socket OOBINLINE setting. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.soReuseAddress</code></td><td> + <p>(bool)Boolean value for the sockets reuse address option + (SO_REUSEADDR). JVM default used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.soLingerOn</code></td><td> + <p>(bool)Boolean value for the sockets so linger option (SO_LINGER). + A value for the standard attribute <strong>connectionLinger</strong> + that is >=0 is equivalent to setting this to <code>true</code>. + A value for the standard attribute <strong>connectionLinger</strong> + that is <0 is equivalent to setting this to <code>false</code>. + Both this attribute and <code>soLingerTime</code> must be set else the + JVM defaults will be used for both.</p> + </td></tr><tr><td><code class="attributeName">socket.soLingerTime</code></td><td> + <p>(int)Value in seconds for the sockets so linger option (SO_LINGER). + This is equivalent to standard attribute + <strong>connectionLinger</strong>. + Both this attribute and <code>soLingerOn</code> must be set else the + JVM defaults will be used for both.</p> + </td></tr><tr><td><code class="attributeName">socket.soTimeout</code></td><td> + <p>This is equivalent to standard attribute + <strong>connectionTimeout</strong>.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceConnectionTime</code></td><td> + <p>(int)The first value for the performance settings. See + <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a> + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceLatency</code></td><td> + <p>(int)The second value for the performance settings. See + <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a> + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceBandwidth</code></td><td> + <p>(int)The third value for the performance settings. See + <a href="http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a> + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.unlockTimeout</code></td><td> + <p>(int) The timeout for a socket unlock. When a connector is stopped, it will try to release the acceptor thread by opening a connector to itself. + The default value is <code>250</code> and the value is in milliseconds</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="NIO_specific_configuration">NIO specific configuration</h4><div class="text"> + + <p>The following attributes are specific to the NIO connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers. Default is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Sun's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a read ByteBuffer. This attribute controls the size of this buffer. By + default this read buffer is sized at <code>8192</code> bytes. For lower + concurrency, you can increase this to buffer more data. For an extreme + amount of keep alive connections, decrease this number or increase your + heap size.</p> + </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a write ByteBuffer. This attribute controls the size of this buffer. By + default this write buffer is sized at <code>8192</code> bytes. For low + concurrency you can increase this to buffer more response data. For an + extreme amount of keep alive connections, decrease this number or + increase your heap size.<br> + The default value here is pretty low, you should up it if you are not + dealing with tens of thousands concurrent connections.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td> + <p>(int)The NIO connector uses a class called NioChannel that holds + elements linked to a socket. To reduce garbage collection, the NIO + connector caches these channel objects. This value specifies the size of + this cache. The default value is <code>500</code>, and represents that + the cache will hold 500 NioChannel objects. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td> + <p>(int)The NioChannel pool can also be size based, not used object + based. The size is calculated as follows:<br> + NioChannel + <code>buffer size = read buffer size + write buffer size</code><br> + SecureNioChannel <code>buffer size = application read buffer size + + application write buffer size + network read buffer size + + network write buffer size</code><br> + The value is in bytes, the default value is <code>1024*1024*100</code> + (100MB).</p> + </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td> + <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.keyCache</code></td><td> + <p>(int)Tomcat will cache KeyAttachment objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.eventCache</code></td><td> + <p>(int)Tomcat will cache PollerEvent objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">selectorPool.maxSelectors</code></td><td> + <p>(int)The max selectors to be used in the pool, to reduce selector + contention. Use this option when the command line + <code>org.apache.tomcat.util.net.NioSelectorShared</code> value is set + to false. Default value is <code>200</code>.</p> + </td></tr><tr><td><code class="attributeName">selectorPool.maxSpareSelectors</code></td><td> + <p>(int)The max spare selectors to be used in the pool, to reduce + selector contention. When a selector is returned to the pool, the system + can decide to keep it or let it be GC'd. Use this option when the + command line <code>org.apache.tomcat.util.net.NioSelectorShared</code> + value is set to false. Default value is <code>-1</code> (unlimited).</p> + </td></tr><tr><td><code class="attributeName">command-line-options</code></td><td> + <p>The following command line options are available for the NIO + connector:<br> + <code>-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false</code> + - default is <code>true</code>. Set this value to <code>false</code> if you wish to + use a selector for each thread. When you set it to <code>false</code>, you can + control the size of the pool of selectors by using the + <strong>selectorPool.maxSelectors</strong> attribute.</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="NIO2_specific_configuration">NIO2 specific configuration</h4><div class="text"> + + <p>The following attributes are specific to the NIO2 connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">useCaches</code></td><td> + <p>(bool)Use this attribute to enable or disable object caching to + reduce the amount of GC objects produced. + The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers. Default is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Sun's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a read ByteBuffer. This attribute controls the size of this buffer. By + default this read buffer is sized at <code>8192</code> bytes. For lower + concurrency, you can increase this to buffer more data. For an extreme + amount of keep alive connections, decrease this number or increase your + heap size.</p> + </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a write ByteBuffer. This attribute controls the size of this buffer. By + default this write buffer is sized at <code>8192</code> bytes. For low + concurrency you can increase this to buffer more response data. For an + extreme amount of keep alive connections, decrease this number or + increase your heap size.<br> + The default value here is pretty low, you should up it if you are not + dealing with tens of thousands concurrent connections.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td> + <p>(int)The NIO2 connector uses a class called Nio2Channel that holds + elements linked to a socket. To reduce garbage collection, the NIO + connector caches these channel objects. This value specifies the size of + this cache. The default value is <code>500</code>, and represents that + the cache will hold 500 Nio2Channel objects. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td> + <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="APR/native_specific_configuration">APR/native specific configuration</h4><div class="text"> + + <p>The APR/native implementation supports the following attributes in + addition to the common Connector and AJP attributes listed above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">pollTime</code></td><td> + <p>Duration of a poll call in microseconds. Lowering this value will + slightly decrease latency of connections being kept alive in some cases + , but will use more CPU as more poll calls are being made. The default + value is 2000 (2ms). + </p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>None at this time.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <div class="subsection"><h4 id="Proxy_Support">Proxy Support</h4><div class="text"> + + <p>The <code>proxyName</code> and <code>proxyPort</code> attributes can + be used when Tomcat is run behind a proxy server. These attributes + modify the values returned to web applications that call the + <code>request.getServerName()</code> and <code>request.getServerPort()</code> + methods, which are often used to construct absolute URLs for redirects. + Without configuring these attributes, the values returned would reflect + the server name and port on which the connection from the proxy server + was received, rather than the server name and port to whom the client + directed the original request.</p> + + <p>For more information, see the + <a href="../proxy-howto.html">Proxy Support HOW-TO</a>.</p> + + </div></div> + + <div class="subsection"><h4 id="Connector_Comparison">Connector Comparison</h4><div class="text"> + + <p>Below is a small chart that shows how the connectors differ.</p> + + <table class="defaultTable" style="text-align: center;"> + <tr> + <th></th> + <th style="text-align: center;">Java Nio Connector<br>NIO</th> + <th style="text-align: center;">Java Nio2 Connector<br>NIO2</th> + <th style="text-align: center;">APR/native Connector<br>APR</th> + </tr> + <tr> + <th>Classname</th> + <td><code class="noHighlight">AjpNioProtocol</code></td> + <td><code class="noHighlight">AjpNio2Protocol</code></td> + <td><code class="noHighlight">AjpAprProtocol</code></td> + </tr> + <tr> + <th>Tomcat Version</th> + <td>7.x onwards</td> + <td>8.x onwards</td> + <td>5.5.x onwards</td> + </tr> + <tr> + <th>Support Polling</th> + <td>YES</td> + <td>YES</td> + <td>YES</td> + </tr> + <tr> + <th>Polling Size</th> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + </tr> + <tr> + <th>Read Request Headers</th> + <td>Blocking</td> + <td>Blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Read Request Body</th> + <td>Blocking</td> + <td>Blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Write Response Headers and Body</th> + <td>Blocking</td> + <td>Blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Wait for next Request</th> + <td>Non Blocking</td> + <td>Non Blocking</td> + <td>Non Blocking</td> + </tr> + <tr> + <th>Max Connections</th> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + </tr> + </table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/automatic-deployment.html b/src/tomcat/webapps/docs/config/automatic-deployment.html new file mode 100644 index 0000000000000000000000000000000000000000..00d501c4dc1a882e1f268826ee5eebe41fe2a7a2 --- /dev/null +++ b/src/tomcat/webapps/docs/config/automatic-deployment.html @@ -0,0 +1,540 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - Automatic Deployment - Use cases</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/automatic-deployment"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Automatic Deployment - Use cases</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Key">Key</a></li><li><a href="#New_files">New files</a></li><li><a href="#Deleted_files">Deleted files</a></li><li><a href="#Modified_files">Modified files</a></li><li><a href="#Added_files">Added files</a></li><li><a href="#Notes">Notes</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>This page defines the expected behaviour of the automatic deployer in many + typical use cases. This is a complex area of Tomcat's functionality. + While any difference between this document and Tomcat's behaviour is a + bug, the fix may be to change this document, Tomcat's behaviour or + both.</p> + +</div><h3 id="Key">Key</h3><div class="text"> + + <table class="detail-table"> + <tr> + <th>Term</th><th>Description</th> + </tr> + <tr> + <td>XML</td> + <td>An XML configuration file located in the Host's + <em>configBase</em>. It must contain a single <Context> element + and may contain optional nested elements. It does not define an + explicit <em>docBase</em> attribute. It represents a single web + application. It is often referred to as a context.xml file.</td> + </tr><tr> + <td>XML+EW</td> + <td>An XML configuration file located in the Host's + <em>configBase</em>. It must contain a single <Context> element + and may contain optional nested elements. It includes an explicit + <em>docBase</em> attribute that points to an external WAR. It + represents a single web application. It is often referred to as a + context.xml file.</td> + </tr><tr> + <td>XML+ED</td> + <td>An XML configuration file located in the Host's + <em>configBase</em>. It must contain a single <Context> element + and may contain optional nested elements. It includes an explicit + <em>docBase</em> attribute that points to an external directory. It + represents a single web application. It is often referred to as a + context.xml file.</td> + </tr><tr> + <td>WAR</td> + <td>A WAR file located in the Host's <em>appBase</em>. The WAR does + not include an embedded context.xml file.</td> + </tr><tr> + <td>WAR+XML</td> + <td>A WAR file located in the Host's <em>appBase</em>. The WAR does + include an embedded context.xml file.</td> + </tr><tr> + <td>DIR</td> + <td>A directory located in the Host's <em>appBase</em>. The directory + does not include an embedded context.xml file.</td> + </tr><tr> + <td>DIR+XML</td> + <td>A directory located in the Host's <em>appBase</em>. The directory + does include an embedded context.xml file.</td> + </tr><tr> + <td>redeploy</td> + <td>The Context object that represents the web application is destroyed + and a new Context object is created. If present and permitted by the + configuration, this new Context object is created by parsing the + context.xml file. The web.xml file is parsed during the application + start process. Any sessions stored in the standard Manager in the + default configuration will not be persisted. Any requests to the web + application during the redeploy will be handled as if the web + application is not deployed.</td> + </tr><tr> + <td>reload</td> + <td>The Context object that represents the web application is stopped and + then started. The web.xml file is parsed during the application start + process. Any sessions stored in the standard Manager in the default + configuration will not be persisted. Any requests to the web + application during the reload will be held until the reload completes + at which point they will continue using the reloaded web application. + </td> + </tr> + </table> + +</div><h3 id="New_files">New files</h3><div class="text"> + + <p>This section describes Tomcat's behaviour when the automatic + deployment process discovers a new web application.</p> + + <table class="detail-table"> + <tr> + <th rowspan="2">Starting artifact(s)</th> + <th colspan="3">Configuration Settings</th> + <th colspan="4">Result</th> + </tr> + <tr> + <th>deployXML</th><th>copyXML</th><th>unpackWARs</th> + <th>XML</th><th>WAR</th><th>DIR</th><th>Notes</th> + </tr> + <tr> + <td>XML</td> + <td>either</td><td>either</td><td>either</td> + <td>Y</td><td>N</td><td>N</td><td>1, 2, 3</td> + </tr> + <tr> + <td>XML+EW</td> + <td>either</td><td>either</td><td>false</td> + <td>Y</td><td>N</td><td>N</td><td>1</td> + </tr> + <tr> + <td>XML+EW</td> + <td>either</td><td>either</td><td>true</td> + <td>Y</td><td>N</td><td>Y</td><td>1</td> + </tr> + <tr> + <td>XML+ED</td> + <td>either</td><td>either</td><td>either</td> + <td>Y</td><td>N</td><td>N</td><td>1, 2</td> + </tr> + <tr> + <td>WAR+XML</td> + <td>false</td><td>either</td><td>false</td> + <td>N</td><td>Y</td><td>N</td><td>4</td> + </tr> + <tr> + <td>WAR+XML</td> + <td>false</td><td>either</td><td>true</td> + <td>N</td><td>Y</td><td>Y</td><td>4</td> + </tr> + <tr> + <td>WAR+XML</td> + <td>true</td><td>false</td><td>false</td> + <td>N</td><td>Y</td><td>N</td><td></td> + </tr> + <tr> + <td>WAR+XML</td> + <td>true</td><td>false</td><td>true</td> + <td>N</td><td>Y</td><td>Y</td><td></td> + </tr> + <tr> + <td>WAR+XML</td> + <td>true</td><td>true</td><td>false</td> + <td>Y</td><td>Y</td><td>N</td><td></td> + </tr> + <tr> + <td>WAR+XML</td> + <td>true</td><td>true</td><td>true</td> + <td>Y</td><td>Y</td><td>Y</td><td></td> + </tr> + <tr> + <td>WAR</td> + <td>either</td><td>either</td><td>false</td> + <td>N</td><td>Y</td><td>N</td><td></td> + </tr> + <tr> + <td>WAR</td> + <td>either</td><td>either</td><td>true</td> + <td>N</td><td>Y</td><td>Y</td><td></td> + </tr> + <tr> + <td>DIR+XML</td> + <td>false</td><td>either</td><td>either</td> + <td>N</td><td>N</td><td>Y</td><td>4</td> + </tr> + <tr> + <td>DIR+XML</td> + <td>true</td><td>false</td><td>either</td> + <td>N</td><td>N</td><td>Y</td><td></td> + </tr> + <tr> + <td>DIR+XML</td> + <td>true</td><td>true</td><td>either</td> + <td>Y</td><td>N</td><td>Y</td><td></td> + </tr> + <tr> + <td>DIR</td> + <td>false</td><td>either</td><td>either</td> + <td>N</td><td>N</td><td>Y</td><td></td> + </tr> + </table> + +</div><h3 id="Deleted_files">Deleted files</h3><div class="text"> + + <p>This section describes Tomcat's behaviour when the automatic + deployment process detects that a web application file has been deleted.</p> + + <p>When a file is deleted or modified any redeploy resources that are listed + after the modified/deleted resource are themselves deleted (and possibly + re-created). The order of redeploy resources is:</p> + + <ol> + <li>WAR</li> + <li>DIR</li> + <li>XML</li> + <li>global resources</li> + </ol> + + <p>There are some exceptions to the deletion rule above:</p> + + <ul> + <li>global resources are never deleted</li> + <li>external resources are never deleted</li> + <li>if the WAR or DIR has been modified then the XML file is only deleted if + <em>copyXML</em> is <code>true</code> and <em>deployXML</em> is + <code>true</code></li> + </ul> + + <p>In the following table:</p> + + <ul> + <li>'-' means "unchanged from not present". i.e. the artifact wasn't present + before the change and isn't present after it either. '-' rather than 'N' + is used to focus attention on what changes.</li> + <li>'R' means that the directory is re-created by expanding the WAR file. + This will only happen if <em>unpackWARs</em> is <code>true</code>.</li> + <li>'XW' means that the if the WAR contains a META-INF/context.xml file it + will be extracted and placed in the Host's <em>configBase</em>. + This only happens if <em>copyXML</em> is <code>true</code> and + <em>deployXML</em> is <code>true</code>.</li> + <li>'XD' means that the if the directory contains a META-INF/context.xml + file it will be copied to the Host's <em>configBase</em>. This only + happens if <em>copyXML</em> is <code>true</code> and <em>deployXML</em> + is <code>true</code>.</li> + </ul> + + <table class="detail-table"> + <tr> + <th colspan="3">Artifacts present</th> + <th rowspan="2">Artifact removed</th> + <th colspan="4">Artifacts remaining</th> + </tr> + <tr> + <th>XML</th><th>WAR</th><th>DIR</th> + <th>XML</th><th>WAR</th><th>DIR</th><th>Notes</th> + </tr> + <tr> + <td>N</td><td>N</td><td>Y</td> + <td>DIR</td> + <td>-</td><td>-</td><td>N</td><td></td> + </tr> + <tr> + <td>N</td><td>Y</td><td>N</td> + <td>WAR</td> + <td>-</td><td>N</td><td>-</td><td></td> + </tr> + <tr> + <td>N</td><td>Y</td><td>Y</td> + <td>DIR</td> + <td>-</td><td>Y</td><td>R</td><td></td> + </tr> + <tr> + <td>N</td><td>Y</td><td>Y</td> + <td>WAR</td> + <td>-</td><td>N</td><td>N</td><td></td> + </tr> + <tr> + <td>Y</td><td>N</td><td>N</td> + <td>XML</td> + <td>N</td><td>-</td><td>-</td><td></td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y</td> + <td>DIR</td> + <td>N</td><td>-</td><td>N</td><td>5</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y</td> + <td>XML</td> + <td>XD</td><td>-</td><td>Y</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>N</td> + <td>WAR</td> + <td>N</td><td>N</td><td>-</td><td>5</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>N</td> + <td>XML</td> + <td>XW</td><td>Y</td><td>-</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>DIR</td> + <td>XW</td><td>Y</td><td>R</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>WAR</td> + <td>N</td><td>N</td><td>N</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>XML</td> + <td>XW</td><td>Y</td><td>Y</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y (external)</td><td>N</td> + <td>WAR</td> + <td>Y</td><td>N</td><td>-</td><td>3</td> + </tr> + <tr> + <td>Y</td><td>Y (external)</td><td>N</td> + <td>XML</td> + <td>N</td><td>Y (external)</td><td>-</td><td>6</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y (external)</td> + <td>DIR</td> + <td>Y</td><td>-</td><td>N</td><td>3</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y (external)</td> + <td>XML</td> + <td>N</td><td>-</td><td>Y (external)</td><td>6</td> + </tr> + <tr> + <td>Y</td><td>Y (external)</td><td>Y</td> + <td>DIR</td> + <td>Y</td><td>Y (external)</td><td>R</td><td></td> + </tr> + <tr> + <td>Y</td><td>Y (external)</td><td>Y</td> + <td>WAR</td> + <td>Y</td><td>N</td><td>N</td><td>3</td> + </tr> + <tr> + <td>Y</td><td>Y (external)</td><td>Y</td> + <td>XML</td> + <td>N</td><td>Y (external)</td><td>N</td><td>6</td> + </tr> + </table> + +</div><h3 id="Modified_files">Modified files</h3><div class="text"> + + <p>This section describes Tomcat's behaviour when the automatic + deployment process detects that a web application file has been modified.</p> + + <p>In the following table:</p> + + <ul> + <li>'-' means "unchanged from not present". i.e. the artifact wasn't present + before the change and isn't present after it either. '-' rather than 'N' + is used to focus attention on what changes.</li> + <li>'M' means that the artifact has been modified.</li> + <li>'R' means that the directory is deleted and re-created by expanding the + WAR file. This will only happen if <em>unpackWARs</em> is + <code>true</code>.</li> + </ul> + + <table class="detail-table"> + <tr> + <th colspan="3">Artifacts present</th> + <th rowspan="2">Artifact modified</th> + <th colspan="4">Artifacts remaining</th> + </tr> + <tr> + <th>XML</th><th>WAR</th><th>DIR</th> + <th>XML</th><th>WAR</th><th>DIR</th><th>Action</th> + </tr> + <tr> + <td>N</td><td>N</td><td>Y</td> + <td>DIR</td> + <td>-</td><td>-</td><td>M</td><td>None</td> + </tr> + <tr> + <td>N</td><td>Y</td><td>N</td> + <td>WAR</td> + <td>-</td><td>M</td><td>-</td><td>Redeploy</td> + </tr> + <tr> + <td>N</td><td>Y</td><td>Y</td> + <td>DIR</td> + <td>-</td><td>Y</td><td>M</td><td>None</td> + </tr> + <tr> + <td>N</td><td>Y</td><td>Y</td> + <td>WAR</td> + <td>-</td><td>M</td><td>R</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>N</td> + <td>XML</td> + <td>M</td><td>-</td><td>-</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y</td> + <td>DIR</td> + <td>Y</td><td>-</td><td>M</td><td>None</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y</td> + <td>XML</td> + <td>M</td><td>-</td><td>Y</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>N</td> + <td>WAR</td> + <td>Y</td><td>M</td><td>-</td><td>Reload</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>N</td> + <td>XML</td> + <td>M</td><td>Y</td><td>-</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>DIR</td> + <td>Y</td><td>Y</td><td>M</td><td>None</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>WAR</td> + <td>Y</td><td>M</td><td>R</td><td>Reload</td> + </tr> + <tr> + <td>Y</td><td>Y</td><td>Y</td> + <td>XML</td> + <td>M</td><td>Y</td><td>Y</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>Y(external)</td><td>N</td> + <td>WAR</td> + <td>Y</td><td>M(external)</td><td>-</td><td>Reload</td> + </tr> + <tr> + <td>Y</td><td>Y(external)</td><td>N</td> + <td>XML</td> + <td>M</td><td>Y(external)</td><td>-</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y(external)</td> + <td>DIR</td> + <td>Y</td><td>-</td><td>M(external)</td><td>None</td> + </tr> + <tr> + <td>Y</td><td>N</td><td>Y(external)</td> + <td>XML</td> + <td>M</td><td>-</td><td>Y(external)</td><td>Redeploy</td> + </tr> + <tr> + <td>Y</td><td>Y(external)</td><td>Y</td> + <td>DIR</td> + <td>Y</td><td>Y(external)</td><td>M</td><td>None</td> + </tr> + <tr> + <td>Y</td><td>Y(external)</td><td>Y</td> + <td>WAR</td> + <td>Y</td><td>M(external)</td><td>R</td><td>Reload</td> + </tr> + <tr> + <td>Y</td><td>Y(external)</td><td>Y</td> + <td>XML</td> + <td>M</td><td>Y(external)</td><td>Y</td><td>Redeploy</td> + </tr> + </table> + +</div><h3 id="Added_files">Added files</h3><div class="text"> + + <p>This is treated as if the added file has been modified with the following + additional actions:</p> + + <ul> + <li>If a WAR is added, any DIR is removed and may be recreated depending on + <em>unpackWARs</em>.</li> + <li>If an XML file is added that refers to an external <em>docBase</em> any + WAR or DIR in the appBase will be removed. The DIR may be recreated if + the external resource is a WAR and <em>unpackWARs</em> is true.</li> + <li>If a DIR is added when a WAR already exists and <em>unpackWARs</em> is + <code>false</code>, the DIR will be ignored but a warning will be + logged when the DIR is first detected. If the WAR is removed, the DIR + will be left and may be deployed via automatic deployment.</li> + <li>If a WAR is added to the <em>appBase</em> when an external WAR already + exists, the WAR in the <em>appBase</em> will be ignored but a warning + will be logged when the WAR in the <em>appBase</em> is first detected. + If the external WAR is removed, the WAR in the <em>appBase</em> will be + left and may be deployed via automatic deployment.</li> + <li>If an XML file is added to the META-INF directory of an application + deployed from that DIR, the application will always be redeployed. The + result will be the same as for a new deployment.</li> + </ul> + +</div><h3 id="Notes">Notes</h3><div class="text"> + + <ol> + <li><em>deployXML</em> and <em>copyXML</em> are ignored since an XML file + was discovered in the <em>configBase</em>.</li> + <li><em>unpackWARs</em> is ignored since there is no WAR file.</li> + <li>The context will fail to start because there is no content in the + expected <em>docBase</em>.</li> + <li>The web application fails to deploy because it contains an embedded + META-INF/context.xml, <em>deployXML</em> is <code>false</code> and an + XML has not been provided in the <em>configBase</em>.</li> + <li>The XML file is only deleted if <em>copyXML</em> is <code>true</code> + and <em>deployXML</em> is <code>true</code>.</li> + <li>Although the external resource is still present, the web application is + fully undeployed as Tomcat has no knowledge of the external resource. + </li> + </ol> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-channel.html b/src/tomcat/webapps/docs/config/cluster-channel.html new file mode 100644 index 0000000000000000000000000000000000000000..10acd6a0d512f2d9dd22efcbac0f7cd2f4a136de --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-channel.html @@ -0,0 +1,140 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Channel object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-channel"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Channel object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.GroupChannel_Attributes">org.apache.catalina.tribes.group.GroupChannel Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + The cluster channel is the main component of a small framework we've nicknamed Apache Tribes.<br> + The channel manages a set of sub components and together they create a group communication framework.<br> + This framework is then used internally by the components that need to send messages between different Tomcat instances. + <br> + A few examples of these components would be the SimpleTcpCluster that does the messaging for the DeltaManager, + or the BackupManager that uses a different replication strategy. The ReplicatedContext object does also + use the channel object to communicate context attribute changes. +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + <p><b><a href="cluster-membership.html">Channel/Membership</a>:</b> <br> + The Membership component is responsible for auto discovering new nodes in the cluster + and also to provide for notifications for any nodes that have not responded with a heartbeat. + The default implementation uses multicast.<br> + In the membership component you configure how your nodes, aka. members, are to be discovered and/or + divided up. + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> + <p><b><a href="cluster-sender.html">Channel/Sender</a>:</b> <br> + The Sender component manages all outbound connections and data messages that are sent + over the network from one node to another. + This component allows messages to be sent in parallel. + The default implementation uses TCP client sockets, and socket tuning for outgoing messages are + configured here.<br> + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> + <p><b><a href="cluster-sender.html#transport">Channel/Sender/Transport</a>:</b> <br> + The Transport component is the bottom IO layer for the sender component. + The default implementation uses non-blocking TCP client sockets.<br> + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> + <p><b><a href="cluster-receiver.html">Channel/Receiver</a>:</b> <br> + The receiver component listens for messages from other nodes. + Here you will configure the cluster thread pool, as it will dispatch incoming + messages to a thread pool for faster processing. + The default implementation uses non-blocking TCP server sockets.<br> + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> + <p><b><a href="cluster-interceptor.html">Channel/Interceptor</a>:</b> <br> + The channel will send messages through an interceptor stack. Because of this, you have the ability to + customize the way messages are sent and received, and even how membership is handled.<br> + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + The default value here is <code>org.apache.catalina.tribes.group.GroupChannel</code> and is + currently the only implementation available. + </td></tr></table> + + + </div></div> + + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.GroupChannel_Attributes">org.apache.catalina.tribes.group.GroupChannel Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">heartbeat</code></td><td> + Flag whether the channel manages its own heartbeat. + If set to true, the channel start a local thread for the heart beat. + If set this flag to false, you must set SimpleTcpCluster#heartbeatBackgroundEnabled + to true. default value is true. + </td></tr><tr><td><code class="attributeName">heartbeatSleeptime</code></td><td> + If heartbeat == true, specifies the interval of heartbeat thread in milliseconds. + The default is 5000 (5 seconds). + </td></tr><tr><td><code class="attributeName">optionCheck</code></td><td> + If set to true, the GroupChannel will check the option flags that each + interceptor is using. Reports an error if two interceptor share the same + flag. The default is false. + </td></tr><tr><td><code class="attributeName">jmxEnabled</code></td><td> + Flag whether the channel components register with JMX or not. + The default value is true. + </td></tr><tr><td><code class="attributeName">jmxDomain</code></td><td> + if <code>jmxEnabled</code> set to true, specifies the jmx domain which + this channel should be registered. The ClusterChannel is used as the + default value. + </td></tr><tr><td><code class="attributeName">jmxPrefix</code></td><td> + if <code>jmxEnabled</code> set to true, specifies the jmx prefix which + will be used with channel ObjectName. + </td></tr></table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-deployer.html b/src/tomcat/webapps/docs/config/cluster-deployer.html new file mode 100644 index 0000000000000000000000000000000000000000..78ce430cd2c09ed3623e79e65d6d800f939c576a --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-deployer.html @@ -0,0 +1,107 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Deployer object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-deployer"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Deployer object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.deploy.FarmWarDeployer">org.apache.catalina.ha.deploy.FarmWarDeployer</a><ol><li><a href="#Attributes">Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p>The Farm War Deployer can deploy and undeploy web applications on the other + nodes in the cluster.</p> + <p><strong>Note: </strong>FarmWarDeployer can be configured at host level + cluster only. + </p> +</div><h3 id="org.apache.catalina.ha.deploy.FarmWarDeployer">org.apache.catalina.ha.deploy.FarmWarDeployer</h3><div class="text"> + + <div class="subsection"><h4 id="Attributes">Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + The cluster deployer class, currently only one is available, + <code>org.apache.catalina.ha.deploy.FarmWarDeployer.</code> + </td></tr><tr><td><strong><code class="attributeName">deployDir</code></strong></td><td> + Deployment directory. This is the pathname of a directory where deploy + the web applications. You may specify an absolute pathname, or a + pathname that is relative to the $CATALINA_BASE directory. In the + current implementation, this attribute must be the same value as the + <strong>Host's appBase</strong>. + </td></tr><tr><td><strong><code class="attributeName">tempDir</code></strong></td><td> + The temporaryDirectory to store binary data when downloading a war from + the cluster. You may specify an absolute pathname, or a pathname that is + relative to the $CATALINA_BASE directory. + </td></tr><tr><td><code class="attributeName">watchDir</code></td><td> + This is the pathname of a directory where watch for changes(add/modify/remove) + of web applications. You may specify an absolute pathname, or a pathname + that is relative to the $CATALINA_BASE directory. + <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this + attribute will have no effect. + </td></tr><tr><td><code class="attributeName">watchEnabled</code></td><td> + Set to true if you want to watch for changes of web applications. + Only when this attribute set to true, you can trigger a deploy/undeploy + of web applications. The flag's value defaults to false. + </td></tr><tr><td><code class="attributeName">processDeployFrequency</code></td><td> + Frequency of the Farm watchDir check. Cluster wide deployment will be + done once for the specified amount of backgroundProcess calls (ie, the + lower the amount, the most often the checks will occur). The minimum + value is 1, and the default value is 2. + <strong>Note: </strong> if <strong>watchEnabled</strong> is false, this + attribute will have no effect. + </td></tr><tr><td><code class="attributeName">maxValidTime</code></td><td> + The maximum valid time(in seconds) of FileMessageFactory. + FileMessageFactory will be removed immediately after receiving the + complete WAR file but when failing to receive a FileMessage which was + sent dividing, FileMessageFactory will leak without being removed. + FileMessageFactory that is leaking will be automatically removed after + maxValidTime. If a negative value specified, FileMessageFactory will + never be removed. If the attribute is not provided, a default of 300 + seconds (5 minutes) is used. + </td></tr></table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-interceptor.html b/src/tomcat/webapps/docs/config/cluster-interceptor.html new file mode 100644 index 0000000000000000000000000000000000000000..a77a773be53ea18935c1aa532f48eb91264e575e --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-interceptor.html @@ -0,0 +1,262 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Channel Interceptor object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-interceptor"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Channel Interceptor object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Available_Interceptors">Available Interceptors</a></li><li><a href="#Static_Membership">Static Membership</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor Attributes</a></li><li><a href="#org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a><ol><li><a href="#StaticMember_Attributes">StaticMember Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + Apache Tribes supports an interceptor architecture to intercept both messages and membership notifications. + This architecture allows decoupling of logic and opens the way for some very kewl feature add ons. + </p> +</div><h3 id="Available_Interceptors">Available Interceptors</h3><div class="text"> + <ul> + <li><code>org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.NonBlockingCoordinator</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.OrderInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.SimpleCoordinator</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.TwoPhaseCommitInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.FragmentationInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.GzipInterceptor</code></li> + <li><code>org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor</code></li> + </ul> +</div><h3 id="Static_Membership">Static Membership</h3><div class="text"> + <p> + In addition to dynamic discovery, Apache Tribes also supports static membership, with membership verification. + To achieve this add the <code>org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor</code> + after the <code>org.apache.catalina.tribes.group.interceptors.TcpFailureDetector</code> interceptor. + Inside the <code>StaticMembershipInterceptor</code> you can add the static members you wish to have. + The <code>TcpFailureDetector</code> will do a health check on the static members,and also monitor them for crashes + so they will have the same level of notification mechanism as the members that are automatically discovered.</p> + <div class="codeBox"><pre><code> <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor"> + <LocalMember className="org.apache.catalina.tribes.membership.StaticMember" + domain="staging-cluster" + uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1}"/> + <Member className="org.apache.catalina.tribes.membership.StaticMember" + port="5678" + securePort="-1" + host="tomcat01.mydomain.com" + domain="staging-cluster" + uniqueId="{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}"/> + </Interceptor></code></pre></div> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Required, as there is no default + </td></tr><tr><td><code class="attributeName">optionFlag</code></td><td> + If you want the interceptor to trigger on certain message depending on the message's option flag, + you can setup the interceptors flag here. + The default value is <code>0</code>, meaning this interceptor will trigger on all messages. + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.DomainFilterInterceptor Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">domain</code></strong></td><td> + The logical cluster domain that this Interceptor accepts. + Two different type of values are possible:<br> + 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes + using ISO-8859-1 encoding.<br> + 2. byte array in string form, for example {216,123,12,3}<br> + </td></tr><tr><td><code class="attributeName">logInterval</code></td><td> + This value indicates the interval for logging for messages from different domains. + The default is 100, which means that to log per 100 messages. + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">optionFlag</code></td><td> + The default and hard coded value is <code>8 (org.apache.catalina.tribes.Channel.SEND_OPTIONS_ASYNCHRONOUS)</code>. + The dispatcher will trigger on this value only, as it is predefined by Tribes. + </td></tr><tr><td><code class="attributeName">alwaysSend</code></td><td> + What behavior should be executed when the dispatch queue is full. If <code>true</code> (default), then the message is + is sent synchronously, if <code>false</code> an error is thrown. + </td></tr><tr><td><code class="attributeName">maxQueueSize</code></td><td> + Size in bytes of the dispatch queue, the default value is <code> 1024*1024*64 (64MB)</code> sets the maximum queue size for the dispatch queue + if the queue fills up, one can trigger the behavior, if <code>alwaysSend</code> is set to true, the message will be sent synchronously + if the flag is false, an error is thrown + </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td> + The maximum number of threads in this pool, default is 10. + </td></tr><tr><td><code class="attributeName">maxSpareThreads</code></td><td> + The number of threads to keep in the pool, default is 2. + </td></tr><tr><td><code class="attributeName">keepAliveTime</code></td><td> + Maximum number of milliseconds of until Idle thread terminates. Default value is 5000(5 seconds). + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes">org.apache.catalina.tribes.group.interceptors.TcpFailureDetector Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">connectTimeout</code></td><td> + Specifies the timeout, in milliseconds, to use when attempting a TCP connection + to the suspect node. Default is 1000. + </td></tr><tr><td><code class="attributeName">performSendTest</code></td><td> + If true is set, send a test message to the suspect node. Default is true. + </td></tr><tr><td><code class="attributeName">performReadTest</code></td><td> + If true is set, read the response of the test message that sent. Default is false. + <strong>Note: </strong>if <code>performSendTest</code> is false, this attribute will have no effect. + </td></tr><tr><td><code class="attributeName">readTestTimeout</code></td><td> + Specifies the timeout, in milliseconds, to use when performing a read test + to the suspicious node. Default is 5000. + </td></tr><tr><td><code class="attributeName">removeSuspectsTimeout</code></td><td> + The maximum time(in seconds) for remove from removeSuspects. Member of + removeSuspects will be automatically removed after removeSuspectsTimeout. + If a negative value specified, the removeSuspects members never be + removed until disappeared really. If the attribute is not provided, + a default of 300 seconds (5 minutes) is used. + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">interval</code></td><td> + If useThread == true, defines the interval of sending a ping message. + default is 1000 ms. + </td></tr><tr><td><code class="attributeName">useThread</code></td><td> + Flag of whether to start a thread for sending a ping message. + If set to true, this interceptor will start a local thread for sending a ping message. + if set to false, channel heartbeat will send a ping message. + default is false. + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor_Attributes">org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">interval</code></td><td> + Defines the interval in number of messages when we are to report the throughput statistics. + The report is logged to the <code>org.apache.juli.logging.LogFactory.getLog(ThroughputInterceptor.class)</code> + logger under the <code>INFO</code> level. + Default value is to report every <code>10000</code> messages. + </td></tr></table> + </div></div> +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <div class="subsection"><h4 id="StaticMember_Attributes">StaticMember Attributes</h4><div class="text"> + <p><b>LocalMember:</b> <br> + Static member that is the local member of the static cluster group. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Only one implementation available:<code>org.apache.catalina.tribes.membership.StaticMember</code> + </td></tr><tr><td><code class="attributeName">port</code></td><td> + There is no need to set. + The value of this attribute inherits from the cluster receiver setting. + </td></tr><tr><td><code class="attributeName">securePort</code></td><td> + There is no need to set. + The value of this attribute inherits from the cluster receiver setting. + </td></tr><tr><td><code class="attributeName">host</code></td><td> + There is no need to set. + The value of this attribute inherits from the cluster receiver setting. + </td></tr><tr><td><code class="attributeName">domain</code></td><td> + The logical cluster domain for that this static member listens for cluster messages. + Two different type of values are possible:<br> + 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes + using ISO-8859-1 encoding. + 2. byte array in string form, for example {216,123,12,3}<br> + </td></tr><tr><td><strong><code class="attributeName">uniqueId</code></strong></td><td> + A universally uniqueId for this static member. + The values must be 16 bytes in the following form:<br> + 1. byte array in string form, for example {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}<br> + </td></tr></table> + + <p><b>Member:</b> <br> + Static member that add to the static cluster group. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Only one implementation available:<code>org.apache.catalina.tribes.membership.StaticMember</code> + </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td> + The port that this static member listens to for cluster messages + </td></tr><tr><td><code class="attributeName">securePort</code></td><td> + The secure port this static member listens to for encrypted cluster messages + default value is <code>-1</code>, this value means the member is not listening on a secure port + </td></tr><tr><td><strong><code class="attributeName">host</code></strong></td><td> + The host (or network interface) that this static member listens for cluster messages. + Three different type of values are possible:<br> + 1. IP address in the form of "216.123.1.23"<br> + 2. Hostnames like "tomcat01.mydomain.com" or "tomcat01" as long as they resolve correctly<br> + 3. byte array in string form, for example {216,123,12,3}<br> + </td></tr><tr><td><code class="attributeName">domain</code></td><td> + The logical cluster domain for that this static member listens for cluster messages. + Two different type of values are possible:<br> + 1. Regular string values like "staging-domain" or "tomcat-cluster" will be converted into bytes + using ISO-8859-1 encoding.<br> + 2. byte array in string form, for example {216,123,12,3}<br> + </td></tr><tr><td><strong><code class="attributeName">uniqueId</code></strong></td><td> + A universally uniqueId for this static member. + The values must be 16 bytes in the following form:<br> + 1. byte array in string form, for example {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}<br> + </td></tr></table> + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-listener.html b/src/tomcat/webapps/docs/config/cluster-listener.html new file mode 100644 index 0000000000000000000000000000000000000000..e83ad3ea6d7d1dc4c1b7ce3c9916eca24156f457 --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-listener.html @@ -0,0 +1,77 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The ClusterListener object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-listener"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The ClusterListener object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.session.ClusterSessionListener">org.apache.catalina.ha.session.ClusterSessionListener</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The <code>org.apache.catalina.ha.ClusterListener</code> base class + lets you listen in on messages that are received by the <code>Cluster</code> component. + </p> + +</div><h3 id="org.apache.catalina.ha.session.ClusterSessionListener">org.apache.catalina.ha.session.ClusterSessionListener</h3><div class="text"> + <p> + When using the DeltaManager, the messages are received by the Cluster object and are propagated to the + to the manager through this listener. + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + + </td></tr></table> + + + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-manager.html b/src/tomcat/webapps/docs/config/cluster-manager.html new file mode 100644 index 0000000000000000000000000000000000000000..40b4b924bbdf6abe5dbba55d03099ad5987d420f --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-manager.html @@ -0,0 +1,283 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The ClusterManager object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-manager"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The ClusterManager object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#The_<Manager>">The <Manager></a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#org.apache.catalina.ha.session.DeltaManager_Attributes">org.apache.catalina.ha.session.DeltaManager Attributes</a></li><li><a href="#org.apache.catalina.ha.session.BackupManager_Attributes">org.apache.catalina.ha.session.BackupManager Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p>A cluster manager is an extension to Tomcat's session manager interface, + <code>org.apache.catalina.Manager</code>. + A cluster manager must implement the + <code>org.apache.catalina.ha.ClusterManager</code> and is solely responsible + for how the session is replicated.<br> + There are currently two different managers, the + <code>org.apache.catalina.ha.session.DeltaManager</code> replicates deltas of + session data to all members in the cluster. This implementation is proven and + works very well, but has a limitation as it requires the cluster members to be + homogeneous, all nodes must deploy the same applications and be exact + replicas. The <code>org.apache.catalina.ha.session.BackupManager</code> also + replicates deltas but only to one backup node. The location of the backup node + is known to all nodes in the cluster. It also supports heterogeneous + deployments, so the manager knows at what locations the web application is + deployed.</p> +</div><h3 id="The_<Manager>">The <Manager></h3><div class="text"> + <p>The <code><Manager></code> element defined inside the + <code><Cluster></code> element is the template defined for all web + applications that are marked <code><distributable/></code> in their + <code>web.xml</code> file. However, you can still override the manager + implementation on a per web application basis, by putting the + <code><Manager></code> inside the <code><Context></code> element + either in the <code><a href="context.html">context.xml</a></code> file or the + <code><a href="index.html">server.xml</a></code> file.</p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + </td></tr><tr><td><code class="attributeName">name</code></td><td> + <b>The name of this cluster manager, the name is used to identify a + session manager on a node. The name might get modified by the + <code>Cluster</code> element to make it unique in the container.</b> + </td></tr><tr><td><code class="attributeName">notifyListenersOnReplication</code></td><td> + Set to <code>true</code> if you wish to have session listeners notified + when session attributes are being replicated or removed across Tomcat + nodes in the cluster. + </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td> + <p>Frequency of the session expiration, and related manager operations. + Manager operations will be done once for the specified amount of + backgroundProcess calls (i.e., the lower the amount, the more often the + checks will occur). The minimum value is 1, and the default value is 6. + </p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate session IDs. + If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the Manager + will use the platform default provider and the default algorithm. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the Manager + will use the platform default provider and the default algorithm. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">recordAllActions</code></td><td> + <p>Flag whether send all actions for session across Tomcat cluster + nodes. If set to false, if already done something to the same attribute, + make sure don't send multiple actions across Tomcat cluster nodes. + In that case, sends only the actions that have been added at last. + Default is <code>false</code>.</p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.ha.session.DeltaManager_Attributes">org.apache.catalina.ha.session.DeltaManager Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">expireSessionsOnShutdown</code></td><td> + When a web application is being shutdown, Tomcat issues an expire call + to each session to notify all the listeners. If you wish for all + sessions to expire on all nodes when a shutdown occurs on one node, set + this value to <code>true</code>. + Default value is <code>false</code>. + </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td> + The maximum number of active sessions that will be created by this + Manager, or -1 (the default) for no limit. For this manager, all + sessions are counted as active sessions irrespective if whether or not + the current node is the primary node for the session. + </td></tr><tr><td><code class="attributeName">notifySessionListenersOnReplication</code></td><td> + Set to <code>true</code> if you wish to have session listeners notified + when sessions are created and expired across Tomcat nodes in the + cluster. + </td></tr><tr><td><code class="attributeName">notifyContainerListenersOnReplication</code></td><td> + Set to <code>true</code> if you wish to have container listeners notified + across Tomcat nodes in the cluster. + </td></tr><tr><td><code class="attributeName">stateTransferTimeout</code></td><td> + The time in seconds to wait for a session state transfer to complete + from another node when a node is starting up. + Default value is <code>60</code> seconds. + </td></tr><tr><td><code class="attributeName">sendAllSessions</code></td><td> + Flag whether send sessions as split blocks. + If set to <code>true</code>, send all sessions as one big block. + If set to <code>false</code>, send sessions as split blocks. + Default value is <code>true</code>. + </td></tr><tr><td><code class="attributeName">sendAllSessionsSize</code></td><td> + The number of sessions in a session block message. This value is + effective only when <code>sendAllSessions</code> is <code>false</code>. + Default is <code>1000</code>. + </td></tr><tr><td><code class="attributeName">sendAllSessionsWaitTime</code></td><td> + Wait time between sending of session block messages. This value is + effective only when <code>sendAllSessions</code> is <code>false</code>. + Default is <code>2000</code> milliseconds. + </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + replicated. An attribute will only be replicated if its name matches + this pattern. If the pattern is zero length or <code>null</code>, all + attributes are eligible for replication. The pattern is anchored so the + session attribute name must fully match the pattern. As an example, the + value <code>(userName|sessionHistory)</code> will only replicate the + two session attributes named <code>userName</code> and + <code>sessionHistory</code>. If not specified, the default value of + <code>null</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + replicated. An attribute will only be replicated if the implementation + class name of the value matches this pattern. If the pattern is zero + length or <code>null</code>, all attributes are eligible for + replication. The pattern is anchored so the fully qualified class name + must fully match the pattern. If not specified, the default value of + <code>null</code> will be used unless a <code>SecurityManager</code> is + enabled in which case the default will be + <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p> + </td></tr><tr><td><code class="attributeName">stateTimestampDrop</code></td><td> + When this node sends a <code>GET_ALL_SESSIONS</code> message to other + node, all session messages that are received as a response are queued. + If this attribute is set to <code>true</code>, the received session + messages (except any <code>GET_ALL_SESSIONS</code> sent by other nodes) + are filtered by their timestamp. A message is dropped if it is not a + <code>GET_ALL_SESSIONS</code> message and its timestamp is earlier than + the timestamp of our <code>GET_ALL_SESSIONS</code> message. + If set to <code>false</code>, all queued session messages are handled. + Default is <code>true</code>. + </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td> + <p>If <strong>sessionAttributeNameFilter</strong> or + <strong>sessionAttributeValueClassNameFilter</strong> blocks an + attribute, should this be logged at <code>WARN</code> level? If + <code>WARN</code> level logging is disabled then it will be logged at + <code>DEBUG</code>. The default value of this attribute is + <code>false</code> unless a <code>SecurityManager</code> is enabled in + which case the default will be <code>true</code>.</p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.catalina.ha.session.BackupManager_Attributes">org.apache.catalina.ha.session.BackupManager Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">mapSendOptions</code></td><td> + The backup manager uses a replicated map, this map is sending and + receiving messages. You can setup the flag for how this map is sending + messages, the default value is <code>6</code>(synchronous).<br> + Note that if you use asynchronous messaging it is possible for update + messages for a session to be processed by the receiving node in a + different order to the order in which they were sent. + </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td> + The maximum number of active sessions that will be created by this + Manager, or -1 (the default) for no limit. For this manager, only + sessions where the current node is the primary node for the session are + considered active sessions. + </td></tr><tr><td><code class="attributeName">rpcTimeout</code></td><td> + Timeout for RPC message used for broadcast and transfer state from + another map. + Default value is <code>15000</code> milliseconds. + </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + replicated. An attribute will only be replicated if its name matches + this pattern. If the pattern is zero length or <code>null</code>, all + attributes are eligible for replication. The pattern is anchored so the + session attribute name must fully match the pattern. As an example, the + value <code>(userName|sessionHistory)</code> will only replicate the + two session attributes named <code>userName</code> and + <code>sessionHistory</code>. If not specified, the default value of + <code>null</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + replicated. An attribute will only be replicated if the implementation + class name of the value matches this pattern. If the pattern is zero + length or <code>null</code>, all attributes are eligible for + replication. The pattern is anchored so the fully qualified class name + must fully match the pattern. If not specified, the default value of + <code>null</code> will be used unless a <code>SecurityManager</code> is + enabled in which case the default will be + <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p> + </td></tr><tr><td><code class="attributeName">terminateOnStartFailure</code></td><td> + Set to true if you wish to terminate replication map when replication + map fails to start. If replication map is terminated, associated context + will fail to start. If you set this attribute to false, replication map + does not end. It will try to join the map membership in the heartbeat. + Default value is <code>false</code> . + </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td> + <p>If <strong>sessionAttributeNameFilter</strong> or + <strong>sessionAttributeValueClassNameFilter</strong> blocks an + attribute, should this be logged at <code>WARN</code> level? If + <code>WARN</code> level logging is disabled then it will be logged at + <code>DEBUG</code>. The default value of this attribute is + <code>false</code> unless a <code>SecurityManager</code> is enabled in + which case the default will be <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">accessTimeout</code></td><td> + The timeout for a ping message. If a remote map does not respond within + this timeout period, its regarded as disappeared. + Default value is <code>5000</code> milliseconds. + </td></tr></table> + </div></div> +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + <h3>All Manager Implementations</h3> + <p>All Manager implementations allow nesting of a + <strong><SessionIdGenerator></strong> element. It defines + the behavior of session id generation. All implementations + of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the + following attributes: + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td> + <p>The length of the session ID may be changed with the + <strong>sessionIdLength</strong> attribute. + </p> + </td></tr></table> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-membership.html b/src/tomcat/webapps/docs/config/cluster-membership.html new file mode 100644 index 0000000000000000000000000000000000000000..17c7d2ae8efefe8b4d1a517317c84e0f302b7213 --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-membership.html @@ -0,0 +1,163 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Membership object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-membership"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Membership object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Default_Implementation">Default Implementation</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Multicast_Attributes">Multicast Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The membership component in the Apache Tribes <a href="cluster-channel.html">Channel</a> is responsible + for dynamic discovery of other members(nodes) in the cluster. + </p> +</div><h3 id="Default_Implementation">Default Implementation</h3><div class="text"> + <p> + The default implementation of the cluster group notification is built on top of multicast heartbeats + sent using UDP packets to a multicast IP address. + Cluster members are grouped together by using the same multicast address/port combination. + Each member sends out a heartbeat with a given interval (<code>frequency</code>), and this + heartbeat is used for dynamic discovery. + In a similar fashion, if a heartbeat has not been received in a timeframe specified by <code>dropTime</code> + ms. a member is considered suspect and the channel and any membership listener will be notified. + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Multicast_Attributes">Multicast Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p> + The default value is <code>org.apache.catalina.tribes.membership.McastService</code> + and is currently the only implementation. + This implementation uses multicast heartbeats for member discovery. + </p> + </td></tr><tr><td><code class="attributeName">address</code></td><td> + <p> + The multicast address that the membership will broadcast its presence and listen + for other heartbeats on. The default value is <code>228.0.0.4</code> + Make sure your network is enabled for multicast traffic.<br> + The multicast address, in conjunction with the <code>port</code> is what + creates a cluster group. To divide up your farm into several different group, or to + split up QA from production, change the <code>port</code> or the <code>address</code> + <br>Previously known as mcastAddr. + </p> + </td></tr><tr><td><code class="attributeName">port</code></td><td> + <p> + The multicast port, the default value is <code>45564</code><br> + The multicast port, in conjunction with the <code>address</code> is what + creates a cluster group. To divide up your farm into several different group, or to + split up QA from production, change the <code>port</code> or the <code>address</code> + </p> + </td></tr><tr><td><code class="attributeName">frequency</code></td><td> + <p> + The frequency in milliseconds in which heartbeats are sent out. The default value is <code>500</code> ms.<br> + In most cases the default value is sufficient. Changing this value, simply changes the interval in between heartbeats. + </p> + </td></tr><tr><td><code class="attributeName">dropTime</code></td><td> + <p> + The membership component will time out members and notify the Channel if a member fails to send a heartbeat within + a give time. The default value is <code>3000</code> ms. This means, that if a heartbeat is not received from a + member in that timeframe, the membership component will notify the cluster of this.<br> + On a high latency network you may wish to increase this value, to protect against false positives.<br> + Apache Tribes also provides a <a href="cluster-interceptor.html#org.apache.catalina.tribes.group.interceptors.TcpFailureDetector_Attributes"><code>TcpFailureDetector</code></a> that will + verify a timeout using a TCP connection when a heartbeat timeout has occurred. This protects against false positives. + </p> + </td></tr><tr><td><code class="attributeName">bind</code></td><td> + <p> + Use this attribute if you wish to bind your multicast traffic to a specific network interface. + By default, or when this attribute is unset, it tries to bind to <code>0.0.0.0</code> and sometimes on multihomed hosts + this becomes a problem. + </p> + </td></tr><tr><td><code class="attributeName">ttl</code></td><td> + <p> + The time-to-live setting for the multicast heartbeats. + This setting should be a value between 0 and 255. The default value is VM implementation specific. + </p> + </td></tr><tr><td><code class="attributeName">domain</code></td><td> + <p> + Apache Tribes has the ability to logically group members into domains, by using this domain attribute. + The <code>org.apache.catalina.tribes.Member.getDomain()</code> method returns the value specified here. + </p> + </td></tr><tr><td><code class="attributeName">soTimeout</code></td><td> + <p> + The sending and receiving of heartbeats is done on a single thread, hence to avoid blocking this thread forever, + you can control the <code>SO_TIMEOUT</code> value on this socket.<br> + If a value smaller or equal to 0 is presented, the code will default this value to frequency + </p> + </td></tr><tr><td><code class="attributeName">recoveryEnabled</code></td><td> + <p> + In case of a network failure, Java multicast socket don't transparently fail over, instead the socket will continuously + throw IOException upon each receive request. When recoveryEnabled is set to true, this will close the multicast socket + and open a new socket with the same properties as defined above.<br> + The default is <code>true</code>. <br> + </p> + </td></tr><tr><td><code class="attributeName">recoveryCounter</code></td><td> + <p> + When <code>recoveryEnabled==true</code> this value indicates how many + times an error has to occur before recovery is attempted. The default is + <code>10</code>. <br> + </p> + </td></tr><tr><td><code class="attributeName">recoverySleepTime</code></td><td> + <p> + When <code>recoveryEnabled==true</code> this value indicates how long time (in milliseconds) + the system will sleep in between recovery attempts, until it recovers successfully. + The default is <code>5000</code> (5 seconds). <br> + </p> + </td></tr><tr><td><code class="attributeName">localLoopbackDisabled</code></td><td> + <p> + Membership uses multicast, it will call <code>java.net.MulticastSocket.setLoopbackMode(localLoopbackDisabled)</code>. + When <code>localLoopbackDisabled==true</code> multicast messages will not reach other nodes on the same local machine. + The default is <code>false</code>. <br> + </p> + </td></tr></table> + + + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-receiver.html b/src/tomcat/webapps/docs/config/cluster-receiver.html new file mode 100644 index 0000000000000000000000000000000000000000..305381589d7a2d658ab74f0ff807769b2cb7aae5 --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-receiver.html @@ -0,0 +1,159 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Receiver object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-receiver"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Receiver object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Blocking_vs_Non-Blocking_Receiver">Blocking vs Non-Blocking Receiver</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#NioReceiver">NioReceiver</a></li><li><a href="#BioReceiver">BioReceiver</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The receiver component is responsible for receiving cluster messages. + As you might notice through the configuration, is that the receiving of messages + and sending of messages are two different components, this is different from many other + frameworks, but there is a good reason for it, to decouple the logic for how messages are sent from + how messages are received.<br> + The receiver is very much like the Tomcat Connector, its the base of the thread pool + for incoming cluster messages. The receiver is straight forward, but all the socket settings + for incoming traffic are managed here. + </p> +</div><h3 id="Blocking_vs_Non-Blocking_Receiver">Blocking vs Non-Blocking Receiver</h3><div class="text"> + <p> + The receiver supports both a non blocking, <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>, and a + blocking, <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>. It is preferred to use the non blocking receiver + to be able to grow your cluster without running into thread starvation.<br> + Using the non blocking receiver allows you to with a very limited thread count to serve a large number of messages. + Usually the rule is to use 1 thread per node in the cluster for small clusters, and then depending on your message frequency + and your hardware, you'll find an optimal number of threads peak out at a certain number. + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + The implementation of the receiver component. Two implementations available, + <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> and + <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>.<br> + The <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> is the + preferred implementation + </td></tr><tr><td><code class="attributeName">address</code></td><td> + The address (network interface) to listen for incoming traffic. + Same as the bind address. The default value is <code>auto</code> and translates to + <code>java.net.InetAddress.getLocalHost().getHostAddress()</code>. + </td></tr><tr><td><code class="attributeName">direct</code></td><td> + Possible values are <code>true</code> or <code>false</code>. + Set to true if you want the receiver to use direct bytebuffers when reading data + from the sockets. + </td></tr><tr><td><code class="attributeName">port</code></td><td> + The listen port for incoming data. The default value is <code>4000</code>. + To avoid port conflicts the receiver will automatically bind to a free port within the range of + <code> port <= bindPort < port+autoBind</code> + So for example, if port is 4000, and autoBind is set to 10, then the receiver will open up + a server socket on the first available port in the range 4000-4009. + </td></tr><tr><td><code class="attributeName">autoBind</code></td><td> + Default value is <code>100</code>. + Use this value if you wish to automatically avoid port conflicts the cluster receiver will try to open a + server socket on the <code>port</code> attribute port, and then work up <code>autoBind</code> number of times. + </td></tr><tr><td><code class="attributeName">securePort</code></td><td> + The secure listen port. This port is SSL enabled. If this attribute is omitted no SSL port is opened up. + There default value is unset, meaning there is no SSL socket available. + </td></tr><tr><td><code class="attributeName">udpPort</code></td><td> + The UDP listen port. If this attribute is omitted no UDP port is opened up. + There default value is unset, meaning there is no UDP listener available. + </td></tr><tr><td><code class="attributeName">selectorTimeout</code></td><td> + The value in milliseconds for the polling timeout in the <code>NioReceiver</code>. On older versions of the JDK + there have been bugs, that should all now be cleared out where the selector never woke up. + The default value is a very high <code>5000</code> milliseconds. + </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td> + The maximum number of threads in the receiver thread pool. The default value is <code>6</code> + Adjust this value relative to the number of nodes in the cluster, the number of messages being exchanged and + the hardware you are running on. A higher value doesn't mean more efficiency, tune this value according to your + own test results. + </td></tr><tr><td><code class="attributeName">minThreads</code></td><td> + Minimum number of threads to be created when the receiver is started up. Default value is <code>6</code> + </td></tr><tr><td><code class="attributeName">maxIdleTime</code></td><td> + Maximum number of milliseconds of until Idle thread terminates. Default value is <code>60000</code> milliseconds. + </td></tr><tr><td><code class="attributeName">ooBInline</code></td><td> + Boolean value for the socket OOBINLINE option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">rxBufSize</code></td><td> + The receiver buffer size on the receiving sockets. Value is in bytes, the default value is <code>43800</code> bytes. + </td></tr><tr><td><code class="attributeName">txBufSize</code></td><td> + The sending buffer size on the receiving sockets. Value is in bytes, the default value is <code>25188</code> bytes. + </td></tr><tr><td><code class="attributeName">udpRxBufSize</code></td><td> + The receive buffer size on the datagram socket. + Default value is <code>25188</code> bytes. + </td></tr><tr><td><code class="attributeName">udpTxBufSize</code></td><td> + The send buffer size on the datagram socket. + Default value is <code>43800</code> bytes. + </td></tr><tr><td><code class="attributeName">soKeepAlive</code></td><td> + Boolean value for the socket SO_KEEPALIVE option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">soLingerOn</code></td><td> + Boolean value to determine whether to use the SO_LINGER socket option. + Possible values are <code>true</code> or <code>false</code>. Default value is <code>true</code>. + </td></tr><tr><td><code class="attributeName">soLingerTime</code></td><td> + Sets the SO_LINGER socket option time value. The value is in seconds. + The default value is <code>3</code> seconds. + </td></tr><tr><td><code class="attributeName">soReuseAddress</code></td><td> + Boolean value for the socket SO_REUSEADDR option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td> + Boolean value for the socket TCP_NODELAY option. Possible values are <code>true</code> or <code>false</code>. + The default value is <code>true</code> + </td></tr><tr><td><code class="attributeName">timeout</code></td><td> + Sets the SO_TIMEOUT option on the socket. The value is in milliseconds and the default value is <code>3000</code> + milliseconds. + </td></tr><tr><td><code class="attributeName">useBufferPool</code></td><td> + Boolean value whether to use a shared buffer pool of cached <code>org.apache.catalina.tribes.io.XByteBuffer</code> + objects. If set to true, the XByteBuffer that is used to pass a message up the channel, will be recycled at the end + of the requests. This means that interceptors in the channel must not maintain a reference to the object + after the <code>org.apache.catalina.tribes.ChannelInterceptor#messageReceived</code> method has exited. + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="NioReceiver">NioReceiver</h4><div class="text"> + </div></div> + <div class="subsection"><h4 id="BioReceiver">BioReceiver</h4><div class="text"> + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-sender.html b/src/tomcat/webapps/docs/config/cluster-sender.html new file mode 100644 index 0000000000000000000000000000000000000000..2079f3dfd35a9b3d73bc3a4a87873b031388b8ee --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-sender.html @@ -0,0 +1,175 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Sender object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-sender"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Sender object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Concurrent_Parallel_Delivery">Concurrent Parallel Delivery</a></li><li><a href="#Nested_Elements">Nested Elements</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Sender_Attributes">Common Sender Attributes</a></li><li><a href="#Common_Transport_Attributes">Common Transport Attributes</a></li><li><a href="#Common_PooledSender_Attributes">Common PooledSender Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The channel sender component is responsible for delivering outgoing cluster messages over the network. + In the default implementation, <code>org.apache.catalina.tribes.transport.ReplicationTransmitter</code>, + the sender is a fairly empty shell with not much logic around a fairly complex <code><Transport></code> + component the implements the actual delivery mechanism. + </p> +</div><h3 id="Concurrent_Parallel_Delivery">Concurrent Parallel Delivery</h3><div class="text"> + <p> + In the default <code>transport</code> implementation, <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>, + Apache Tribes implements what we like to call "Concurrent Parallel Delivery". + This means that we can send a message to more than one destination at the same time(parallel), and + deliver two messages to the same destination at the same time(concurrent). Combine these two and we have + "Concurrent Parallel Delivery". + </p> + <p> + When is this useful? The simplest example we can think of is when part of your code is sending a 10MB message, + like a war file being deployed, and you need to push through a small 10KB message, say a session being replicated, + you don't have to wait for the 10MB message to finish, as a separate thread will push in the small message + transmission at the same time. Currently there is no interrupt, pause or priority mechanism available, but check back soon. + </p> +</div><h3 id="Nested_Elements">Nested Elements</h3><div class="text"> + <p> + The nested element <code><Transport></code> is not required, but encouraged, as this is where + you would set all the socket options for the outgoing messages. Please see its attributes below. + There are two implementations, in a similar manner to the <a href="cluster-receiver.html">receiver</a>, one is non-blocking + based and the other is built using blocking IO. <br> + <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code> is the blocking implementation and + <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>. + Parallel delivery is not available for the blocking implementation due to the fact that it is blocking a thread on sending data. + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + <div class="subsection"><h4 id="Common_Sender_Attributes">Common Sender Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Required, only available implementation is <code>org.apache.catalina.tribes.transport.ReplicationTransmitter</code> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="Common_Transport_Attributes">Common Transport Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Required, an implementation of the <code>org.apache.catalina.tribes.transport.MultiPointSender</code>.<br> + Non-blocking implementation is <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code><br> + Blocking implementation is <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code> + </td></tr><tr><td><code class="attributeName">rxBufSize</code></td><td> + The receive buffer size on the socket. + Default value is <code>25188</code> bytes. + </td></tr><tr><td><code class="attributeName">txBufSize</code></td><td> + The send buffer size on the socket. + Default value is <code>43800</code> bytes. + </td></tr><tr><td><code class="attributeName">udpRxBufSize</code></td><td> + The receive buffer size on the datagram socket. + Default value is <code>25188</code> bytes. + </td></tr><tr><td><code class="attributeName">udpTxBufSize</code></td><td> + The send buffer size on the datagram socket. + Default value is <code>43800</code> bytes. + </td></tr><tr><td><code class="attributeName">directBuffer</code></td><td> + Possible values are <code>true</code> or <code>false</code>. + Set to true if you want the receiver to use direct bytebuffers when writing data + to the sockets. Default value is <code>false</code> + </td></tr><tr><td><code class="attributeName">keepAliveCount</code></td><td> + The number of requests that can go through the socket before the socket is closed, and reopened + for the next request. The default value is <code>-1</code>, which is unlimited. + </td></tr><tr><td><code class="attributeName">keepAliveTime</code></td><td> + The number of milliseconds a connection is kept open after its been opened. + The default value is <code>-1</code>, which is unlimited. + </td></tr><tr><td><code class="attributeName">timeout</code></td><td> + Sets the SO_TIMEOUT option on the socket. The value is in milliseconds and the default value is <code>3000</code> + milliseconds.(3 seconds) This timeout starts when a message send attempt is starting, until the transfer has been completed. + For the NIO sockets, this will mean, that the caller can guarantee that we will not attempt sending the message + longer than this timeout value. For the blocking IO implementation, this translated directly to the soTimeout.<br> + A timeout will not spawn a retry attempt, in order to guarantee the return of the application thread. + </td></tr><tr><td><code class="attributeName">maxRetryAttempts</code></td><td> + How many times do we retry a failed message, that received a IOException at the socket level. + The default value is <code>1</code>, meaning we will retry a message that has failed once. + In other words, we will attempt a message send no more than twice. One is the original send, and one is the + <code>maxRetryAttempts</code>. + </td></tr><tr><td><code class="attributeName">ooBInline</code></td><td> + Boolean value for the socket OOBINLINE option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">soKeepAlive</code></td><td> + Boolean value for the socket SO_KEEPALIVE option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">soLingerOn</code></td><td> + Boolean value to determine whether to use the SO_LINGER socket option. + Possible values are <code>true</code> or <code>false</code>. Default value is <code>true</code>. + </td></tr><tr><td><code class="attributeName">soLingerTime</code></td><td> + Sets the SO_LINGER socket option time value. The value is in seconds. + The default value is <code>3</code> seconds. + </td></tr><tr><td><code class="attributeName">soReuseAddress</code></td><td> + Boolean value for the socket SO_REUSEADDR option. Possible values are <code>true</code> or <code>false</code>. + </td></tr><tr><td><code class="attributeName">soTrafficClass</code></td><td> + Sets the traffic class level for the socket, the value is between 0 and 255. + Default value is <code>int soTrafficClass = 0x04 | 0x08 | 0x010;</code> + Different values are defined in <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setTrafficClass(int)"> + java.net.Socket#setTrafficClass(int)</a>. + </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td> + Boolean value for the socket TCP_NODELAY option. Possible values are <code>true</code> or <code>false</code>. + The default value is <code>true</code> + </td></tr><tr><td><code class="attributeName">throwOnFailedAck</code></td><td> + Boolean value, default value is <code>true</code>. + If set to true, the sender will throw a <code>org.apache.catalina.tribes.RemoteProcessException</code> + when we receive a negative ack from the remote member. + Set to false, and Tribes will treat a positive ack the same way as a negative ack, that the message was received. + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="Common_PooledSender_Attributes">Common PooledSender Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">poolSize</code></td><td> + The maximum number of concurrent connections from A to B. + The value is based on a per-destination count. + The default value is <code>25</code> + </td></tr><tr><td><code class="attributeName">maxWait</code></td><td> + The maximum number of milliseconds that the senderPool will wait when + there are no available senders. The default value is <code>3000</code> + milliseconds.(3 seconds). + </td></tr></table> + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster-valve.html b/src/tomcat/webapps/docs/config/cluster-valve.html new file mode 100644 index 0000000000000000000000000000000000000000..237242a12e3d47eb5171e9a4f7dd51d931d0d92c --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster-valve.html @@ -0,0 +1,168 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster Valve object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster-valve"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster Valve object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#org.apache.catalina.ha.tcp.ReplicationValve">org.apache.catalina.ha.tcp.ReplicationValve</a><ol><li><a href="#org.apache.catalina.ha.tcp.ReplicationValve/Attributes">Attributes</a></li></ol></li><li><a href="#org.apache.catalina.ha.session.JvmRouteBinderValve">org.apache.catalina.ha.session.JvmRouteBinderValve</a><ol><li><a href="#org.apache.catalina.ha.session.JvmRouteBinderValve/Attributes">Attributes</a></li></ol></li><li><a href="#org.apache.catalina.ha.authenticator.ClusterSingleSignOn">org.apache.catalina.ha.authenticator.ClusterSingleSignOn</a><ol><li><a href="#org.apache.catalina.ha.authenticator.ClusterSingleSignOn/Attributes">Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + A cluster valve is no different from any other <a href="valve.html">Tomcat <code>Valve</code></a>. + The cluster valves are interceptors in the invocation chain for HTTP requests, and the clustering implementation + uses these valves to make intelligent decision around data and when data should be replicated. + </p> + <p> + A cluster valve must implement the <code>org.apache.catalina.ha.ClusterValve</code> interface. + This is a simple interface that extends the <code>org.apache.catalina.Valve</code> interface. + </p> +</div><h3 id="org.apache.catalina.ha.tcp.ReplicationValve">org.apache.catalina.ha.tcp.ReplicationValve</h3><div class="text"> + The <code>ReplicationValve</code> will notify the cluster at the end of a HTTP request + so that the cluster can make a decision whether there is data to be replicated or not. + <div class="subsection"><h4 id="org.apache.catalina.ha.tcp.ReplicationValve/Attributes">Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + Set value to <code>org.apache.catalina.ha.tcp.ReplicationValve</code> + </td></tr><tr><td><code class="attributeName">filter</code></td><td> + For known file extensions or urls, you can use this Valve to notify the + cluster that the session has not been modified during this request and + the cluster doesn't have to probe the session managers for changes. If + the request matches this filter pattern, the cluster assumes there has + been no session change. An example filter would look like <code> + filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" + </code>. The filter is a regular expression using + <code>java.util.regex</code>. + </td></tr><tr><td><code class="attributeName">primaryIndicator</code></td><td> + Boolean value, so to true, and the replication valve will insert a request attribute with the name + defined by the <code>primaryIndicatorName</code> attribute. + The value inserted into the request attribute is either <code>Boolean.TRUE</code> or + <code>Boolean.FALSE</code> + </td></tr><tr><td><code class="attributeName">primaryIndicatorName</code></td><td> + Default value is <code>org.apache.catalina.ha.tcp.isPrimarySession</code> + The value defined here is the name of the request attribute that contains the boolean value + if the session is primary on this server or not. + </td></tr><tr><td><code class="attributeName">statistics</code></td><td> + Boolean value. Set to <code>true</code> if you want the valve to collect request statistics. + Default value is <code>false</code> + </td></tr></table> + </div></div> +</div><h3 id="org.apache.catalina.ha.session.JvmRouteBinderValve">org.apache.catalina.ha.session.JvmRouteBinderValve</h3><div class="text"> + In case of a mod_jk failover, the <code>JvmRouteBinderValve</code> will replace the + <code>jvmWorker</code> attribute in the session Id, to make future requests stick to this + node. If you want fallback capability, don't enable this valve, but if you want your failover to stick, + and for mod_jk not to have to keep probing the node that went down, you use this valve. + <div class="subsection"><h4 id="org.apache.catalina.ha.session.JvmRouteBinderValve/Attributes">Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <code>org.apache.catalina.ha.session.JvmRouteBinderValve</code> + </td></tr><tr><td><code class="attributeName">enabled</code></td><td> + Default value is <code>true</code> + Runtime attribute to turn on and off turn over of the session's jvmRoute value. + </td></tr><tr><td><code class="attributeName">sessionIdAttribute</code></td><td> + Old sessionid before failover is registered in request attributes with this attribute. + Default attribute name is <code>org.apache.catalina.ha.session.JvmRouteOrignalSessionID</code>. + </td></tr></table> + </div></div> +</div><h3 id="org.apache.catalina.ha.authenticator.ClusterSingleSignOn">org.apache.catalina.ha.authenticator.ClusterSingleSignOn</h3><div class="text"> + The <code>ClusterSingleSignOn</code> supports feature of single sign on in cluster. + By using <code>ClusterSingleSignOn</code>, the security identity authenticated + by one web application is recognized by other web applications on the same virtual host, + and it is propagated to other nodes in the cluster. + + <p>See the <a href="host.html#Single_Sign_On">Single Sign On</a> special + feature on the <strong>Host</strong> element for more information.</p> + + <p><strong>Note: </strong>ClusterSingleSignOn can be configured at host level cluster only. + </p> + + <div class="subsection"><h4 id="org.apache.catalina.ha.authenticator.ClusterSingleSignOn/Attributes">Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.ha.authenticator.ClusterSingleSignOn</strong>.</p> + </td></tr><tr><td><code class="attributeName">cookieDomain</code></td><td> + <p>Sets the host domain to be used for sso cookies.</p> + </td></tr><tr><td><code class="attributeName">mapSendOptions</code></td><td> + <p>The Valve uses a replicated map. You can setup the flag for how this + map sends messages. The default value is <code>6</code> (synchronous). + Note that if you use asynchronous messaging it is possible for update + messages to be processed by the receiving node in a different order to + the order in which they were sent.</p> + </td></tr><tr><td><code class="attributeName">requireReauthentication</code></td><td> + <p>Default false. Flag to determine whether each request needs to be + reauthenticated to the security <strong>Realm</strong>. If "true", this + Valve uses cached security credentials (username and password) to + reauthenticate to the <strong>Realm</strong> each request associated + with an SSO session. If "false", the Valve can itself authenticate + requests based on the presence of a valid SSO cookie, without + rechecking with the <strong>Realm</strong>.</p> + </td></tr><tr><td><code class="attributeName">rpcTimeout</code></td><td> + <p>The Valve uses a replicated map. This is the timeout for messages + that transfer state to/from the other nodes in the cluster. If not + specified, a default value of <code>15000</code> milliseconds is used. + </p> + </td></tr><tr><td><code class="attributeName">terminateOnStartFailure</code></td><td> + <p>Set to <code>true</code> if you wish this Valve to fail if the + underlying replication fails to start. If the Valve fails, then the + associated container will fail to start. If you set this attribute to + false, and the underlying replications fails to start, the Valve will + start and it will attempt to join the cluster and start replication as + part of the heartbeat process. If not specified, the default value of + <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">accessTimeout</code></td><td> + The timeout for a ping message. If a remote map does not respond within + this timeout period, its regarded as disappeared. + Default value is <code>5000</code> milliseconds. + </td></tr></table> + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cluster.html b/src/tomcat/webapps/docs/config/cluster.html new file mode 100644 index 0000000000000000000000000000000000000000..83de624f766d26e1f56e5ebecb8045754b4e8853 --- /dev/null +++ b/src/tomcat/webapps/docs/config/cluster.html @@ -0,0 +1,184 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cluster object</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cluster"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cluster object</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Security">Security</a></li><li><a href="#Engine_vs_Host_placement">Engine vs Host placement</a></li><li><a href="#Context_Attribute_Replication">Context Attribute Replication</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Deprecated_configuration_options">Deprecated configuration options</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#SimpleTcpCluster_Attributes">SimpleTcpCluster Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The tomcat cluster implementation provides session replication, context attribute replication and + cluster wide WAR file deployment. + While the <code>Cluster</code> configuration is fairly complex, the default configuration will work + for most people out of the box. </p><p> + The Tomcat Cluster implementation is very extensible, and hence we have exposed a myriad of options, + making the configuration seem like a lot, but don't lose faith, instead you have a tremendous control + over what is going on.</p> +</div><h3 id="Security">Security</h3><div class="text"> + +<p>The cluster implementation is written on the basis that a secure, trusted +network is used for all of the cluster related network traffic. It is not safe +to run a cluster on a insecure, untrusted network.</p> + +<p>There are many options for providing a secure, trusted network for use by a +Tomcat cluster. These include:</p> +<ul> + <li>private LAN</li> + <li>a Virtual Private Network (VPN)</li> + <li>IPSEC</li> +</ul> + +</div><h3 id="Engine_vs_Host_placement">Engine vs Host placement</h3><div class="text"> + <p> + You can place the <code><Cluster></code> element inside either the <code><Engine></code> + container or the <code><Host></code> container.<br> + Placing it in the engine, means that you will support clustering in all virtual hosts of Tomcat, + and share the messaging component. When you place the <code><Cluster></code> inside the <code><Engine></code> + element, the cluster will append the host name of each session manager to the managers name so that two contexts with + the same name but sitting inside two different hosts will be distinguishable. + </p> +</div><h3 id="Context_Attribute_Replication">Context Attribute Replication</h3><div class="text"> + <p>To configure context attribute replication, simply do this by swapping out the context implementation + used for your application context.</p> + <div class="codeBox"><pre><code><Context className="org.apache.catalina.ha.context.ReplicatedContext"/></code></pre></div> + <p> + This context extends the Tomcat <code><a href="context.html">StandardContext</a></code> + so all the options from the <a href="context.html">base implementation</a> are valid. + </p> +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + <p><b><a href="cluster-manager.html">Manager</a>:</b> <br> + The session manager element identifies what kind of session manager is used in this cluster implementation. + This manager configuration is identical to the one you would use in a regular <code><a href="context.html#Nested_Components"><Context></a></code> configuration. + <br>The default value is the <code>org.apache.catalina.ha.session.DeltaManager</code> that is closely coupled with + the <code>SimpleTcpCluster</code> implementation. Other managers like the <code>org.apache.catalina.ha.session.BackupManager</code> + are/could be loosely coupled and don't rely on the <code>SimpleTcpCluster</code> for its data replication. + </p> + <p><b><a href="cluster-channel.html">Channel</a>:</b> <br> + The Channel and its sub components are all part of the IO layer + for the cluster group, and is a module in it's own that we have nick named "Tribes" + <br> + Any configuring and tuning of the network layer, the messaging and the membership logic + will be done in the channel and its nested components. + You can always find out more about <a href="../tribes/introduction.html">Apache Tribes</a> + </p> + <p><b><a href="cluster-valve.html">Valve</a>:</b> <br> + The Tomcat Cluster implementation uses <code>Tomcat <a href="valve.html">Valves</a></code> to + track when requests enter and exit the servlet container. It uses these valves to be able to make + intelligent decisions on when to replicate data, which is always at the end of a request. + </p> + <p><b><a href="cluster-deployer.html">Deployer</a>:</b> <br> + The Deployer component is the Tomcat Farm Deployer. It allows you to deploy and undeploy applications + cluster wide. + </p> + <p><b><a href="cluster-listener.html">ClusterListener</a>:</b> <br> + ClusterListener's are used to track messages sent and received using the <code>SimpleTcpCluster</code>. + If you wish to track messages, you can add a listener here, or you can add a valve to the channel object. + </p> +</div><h3 id="Deprecated_configuration_options">Deprecated configuration options</h3><div class="text"> + <p> + <b>Deprecated settings:</b> In the previous version of Tomcat you were able to control session + manager settings using manager.<property>=value. + This has been discontinued, as the way it was written interferes with + the ability to support multiple different manager classes under one cluster implementation, + as the same properties might have the different effect on different managers. + </p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + <div class="subsection"><h4 id="SimpleTcpCluster_Attributes">SimpleTcpCluster Attributes</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>The main cluster class, currently only one is available, + <code>org.apache.catalina.ha.tcp.SimpleTcpCluster</code> + </p> + </td></tr><tr><td><strong><code class="attributeName">channelSendOptions</code></strong></td><td> + <p>The Tribes channel send options, default is <code>8</code>.<br> + This option is used to set the flag that all messages sent through the + SimpleTcpCluster uses. The flag decides how the messages are sent, and is a simple logical OR.</p> + + <div class="codeBox"><pre><code>int options = Channel.SEND_OPTIONS_ASYNCHRONOUS | + Channel.SEND_OPTIONS_SYNCHRONIZED_ACK | + Channel.SEND_OPTIONS_USE_ACK;</code></pre></div> + <p>Some of the values are:<br> + <code>Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004</code><br> + <code>Channel.SEND_OPTIONS_ASYNCHRONOUS = 0x0008</code><br> + <code>Channel.SEND_OPTIONS_USE_ACK = 0x0002</code><br> + So to use ACK and ASYNC messaging, the flag would be <code>10</code> (8+2) + <br> + Note that if you use ASYNC messaging it is possible for update messages + for a session to be processed by the receiving nodes in a different order + to the order in which they were sent. + </p> + <p> + You may also set these options as a comma separated string, e.g. "async, multicast", which + will be translated into <code>Channel.SEND_OPTIONS_ASYNCHRONOUS | Channel.SEND_OPTIONS_MULTICAST</code> + <br> + The valid option names are "asynchronous" (alias "async"), "byte_message" (alias "byte") + , "multicast", "secure", "synchronized_ack" (alias "sync"), "udp", "use_ack" + </p> + </td></tr><tr><td><code class="attributeName">channelStartOptions</code></td><td> + <p>Sets the start and stop flags for the <Channel> object used by the cluster. + The default is <code>Channel.DEFAULT</code> which starts all the channel services, such as + sender, receiver, multicast sender and multicast receiver. + The following flags are available today:</p> + <div class="codeBox"><pre><code>Channel.DEFAULT = Channel.SND_RX_SEQ (1) | + Channel.SND_TX_SEQ (2) | + Channel.MBR_RX_SEQ (4) | + Channel.MBR_TX_SEQ (8);</code></pre></div> + <p>To start a channel without multicasting, you would want to use the value <code>Channel.SND_RX_SEQ | Channel.SND_TX_SEQ</code> + that equals to <code>3</code>. + </p> + </td></tr><tr><td><code class="attributeName">heartbeatBackgroundEnabled</code></td><td> + <p>Flag whether invoke channel heartbeat at container background thread. Default value is false. + Enable this flag don't forget to disable the channel heartbeat thread. + </p> + </td></tr><tr><td><code class="attributeName">notifyLifecycleListenerOnFailure</code></td><td> + <p>Flag whether notify LifecycleListeners if all ClusterListener couldn't accept channel message. + Default value is false. + </p> + </td></tr></table> + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/context.html b/src/tomcat/webapps/docs/config/context.html new file mode 100644 index 0000000000000000000000000000000000000000..e1d188c80eab56725e397f3a8875d56414b1bea5 --- /dev/null +++ b/src/tomcat/webapps/docs/config/context.html @@ -0,0 +1,1228 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Context Container</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/context"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Context Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a><ol><li><a href="#Parallel_deployment">Parallel deployment</a></li><li><a href="#Naming">Naming</a></li><li><a href="#Defining_a_context">Defining a context</a></li></ol></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Automatic_Context_Configuration">Automatic Context Configuration</a></li><li><a href="#Context_Parameters">Context Parameters</a></li><li><a href="#Environment_Entries">Environment Entries</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li><li><a href="#Resource_Definitions">Resource Definitions</a></li><li><a href="#Resource_Links">Resource Links</a></li><li><a href="#Transaction">Transaction</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p><em> + The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat. + </em></p> + + <p>The <strong>Context</strong> element represents a <em>web + application</em>, which is run within a particular virtual host. + Each web application is based on a <em>Web Application Archive</em> + (WAR) file, or a corresponding directory containing the corresponding + unpacked contents, as described in the Servlet Specification (version + 2.2 or later). For more information about web application archives, + you can download the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet + Specification</a>, and review the Tomcat + <a href="../appdev/index.html">Application Developer's Guide</a>.</p> + + <p>The web application used to process each HTTP request is selected + by Catalina based on matching the longest possible prefix of the + Request URI against the <em>context path</em> of each defined Context. + Once selected, that Context will select an appropriate servlet to + process the incoming request, according to the servlet mappings defined + by the web application deployment.</p> + + <p>You may define as many <strong>Context</strong> elements as you + wish. Each such Context MUST have a unique context name within a virtual + host. The context path does not need to be unique (see <em>parallel + deployment</em> below). In addition, a Context must be present with a + context path equal to + a zero-length string. This Context becomes the <em>default</em> + web application for this virtual host, and is used to process all + requests that do not match any other Context's context path.</p> + + <div class="subsection"><h4 id="Parallel_deployment">Parallel deployment</h4><div class="text"> + <p><b>You may deploy multiple versions of a web application with the same + context path at the same time.</b> The rules used to match requests to a + context version are as follows: + </p> + <ul> + <li>If no session information is present in the request, use the latest + version.</li> + <li>If session information is present in the request, check the session + manager of each version for a matching session and if one is found, use that + version.</li> + <li>If session information is present in the request but no matching session + can be found, use the latest version.</li> + </ul> + <p>The <a href="host.html">Host</a> may be configured (via the + <code>undeployOldVersions</code>) to remove old versions deployed in this way + once they are no longer in use.</p> + </div></div> + + <div class="subsection"><h4 id="Naming">Naming</h4><div class="text"> + <p>When <code>autoDeploy</code> or <code>deployOnStartup</code> operations + are performed by a Host, the name and context path of the web application are + derived from the name(s) of the file(s) that define(s) the web application. + Consequently, the context path <strong>may not</strong> be defined in a + <code>META-INF/context.xml</code> embedded in the application and there is a + close relationship between the <em>context name</em>, <em>context path</em>, + <em>context version</em> and the <em>base file name</em> (the name minus any + <code>.war</code> or <code>.xml</code> extension) of the file.</p> + + <p>If no version is specified then the <em>context name</em> is always the + same as the <em>context path</em>. If the <em>context path</em> is the empty + string then the <em>base name</em> will be ROOT (always in upper case) + otherwise the <em>base name</em> will be the <em>context path</em> with the + leading '/' removed and any remaining '/' characters replaced with '#'.</p> + + <p>If a version is specified then the <em>context path</em> remains unchanged + and both the <em>context name</em> and the <em>base name</em> have the string + '##' appended to them followed by the version identifier.</p> + + <p>Some examples of these naming conventions are given below.</p> + + <table class="detail-table"> + <tr> + <th>Context Path</th> + <th>Context Version</th> + <th>Context Name</th> + <th>Base File Name</th> + <th>Example File Names (.xml, .war & directory)</th> + </tr> + <tr> + <td>/foo</td> + <td><i>None</i></td> + <td>/foo</td> + <td>foo</td> + <td>foo.xml, foo.war, foo</td> + </tr> + <tr> + <td>/foo/bar</td> + <td><i>None</i></td> + <td>/foo/bar</td> + <td>foo#bar</td> + <td>foo#bar.xml, foo#bar.war, foo#bar</td> + </tr> + <tr> + <td><i>Empty String</i></td> + <td><i>None</i></td> + <td><i>Empty String</i></td> + <td>ROOT</td> + <td>ROOT.xml, ROOT.war, ROOT</td> + </tr> + <tr> + <td>/foo</td> + <td>42</td> + <td>/foo##42</td> + <td>foo##42</td> + <td>foo##42.xml, foo##42.war, foo##42</td> + </tr> + <tr> + <td>/foo/bar</td> + <td>42</td> + <td>/foo/bar##42</td> + <td>foo#bar##42</td> + <td>foo#bar##42.xml, foo#bar##42.war, foo#bar##42</td> + </tr> + <tr> + <td><i>Empty String</i></td> + <td>42</td> + <td>##42</td> + <td>ROOT##42</td> + <td>ROOT##42.xml, ROOT##42.war, ROOT##42</td> + </tr> + </table> + + <p>The version component is treated as a <code>String</code> both for + performance reasons and to allow flexibility in versioning schemes. String + comparisons are used to determine version order. If version is not specified, + it is treated as the empty string. + Therefore, + <code>foo.war</code> will be treated as an earlier version than + <code>foo##11.war</code> and + <code>foo##11.war</code> will be treated as an earlier version than + <code>foo##2.war</code>. If using a purely numerical versioning scheme it is + recommended that zero padding is used so that <code>foo##002.war</code> is + treated as an earlier version than <code>foo##011.war</code>. + </p> + + <p>If you want to deploy a WAR file or a directory using a context path that + is not related to the base file name then one of the following options must + be used to prevent double-deployment: + </p> + <ul> + <li>Disable autoDeploy and deployOnStartup and define all + <strong>Context</strong>s in server.xml</li> + <li>Locate the WAR and/or directory outside of the Host's appBase and use + a context.xml file with a docBase attribute to define it.</li> + </ul> + </div></div> + + <div class="subsection"><h4 id="Defining_a_context">Defining a context</h4><div class="text"> + <p><b>It is NOT recommended to place <Context> elements directly in the + server.xml file.</b> This is because it makes modifying the + <strong>Context</strong> configuration more invasive since the main + <code>conf/server.xml</code> file cannot be reloaded without restarting + Tomcat.</p> + + <p>Individual <strong>Context</strong> elements may be explicitly defined: + </p> + <ul> + <li>In an individual file at <code>/META-INF/context.xml</code> inside the + application files. Optionally (based on the Host's copyXML attribute) + this may be copied to + <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> and renamed to + application's base file name plus a ".xml" extension.</li> + <li>In individual files (with a ".xml" extension) in the + <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> directory. + The context path and version will be derived from the base name of the file + (the file name less the .xml extension). This file will always take precedence + over any context.xml file packaged in the web application's META-INF + directory.</li> + <li>Inside a <a href="host.html">Host</a> element in the main + <code>conf/server.xml</code>.</li> + </ul> + + <p>Default <strong>Context</strong> elements may be defined that apply to + multiple web applications. Configuration for an individual web application + will override anything configured in one of these defaults. Any nested + elements, e.g. <Resource> elements, that are defined in a default + <strong>Context</strong> will be created once for each + <strong>Context</strong> to which the default applies. They will <b>not</b> be + shared between <strong>Context</strong> elements. + </p> + <ul> + <li>In the <code>$CATALINA_BASE/conf/context.xml</code> file: + the Context element information will be loaded by all web applications.</li> + <li>In the + <code>$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default</code> + file: the Context element information will be loaded by all web applications + of that host.</li> + </ul> + + <p>With the exception of server.xml, files that define <strong>Context + </strong> elements may only define a single <strong>Context</strong> element. + </p> + + <p>In addition to explicitly specified Context elements, there are + several techniques by which Context elements can be created automatically + for you. See <a href="host.html#Automatic_Application_Deployment"> + Automatic Application Deployment</a> and + <a href="host.html#User_Web_Applications">User Web Applications</a> + for more information.</p> + + <p>To define multiple contexts that use a single WAR file or directory, + use one of the options described in the <a href="#Naming">Naming</a> + section above for creating a <strong>Context</strong> that has a path + that is not related to the base file name.</p> + </div></div> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Context</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allowCasualMultipartParsing</code></td><td> + <p>Set to true if Tomcat should automatically parse + multipart/form-data request bodies when HttpServletRequest.getPart* + or HttpServletRequest.getParameter* is called, even when the + target servlet isn't marked with the @MultipartConfig annotation + (See Servlet Specification 3.0, Section 3.2 for details). + Note that any setting other than <code>false</code> causes Tomcat + to behave in a way that is not technically spec-compliant. + The default is <code>false</code></p> + </td></tr><tr><td><code class="attributeName">altDDName</code></td><td> + <p>The absolute path to the alternative deployment descriptor for this + context. This overrides the default deployment descriptor located at + <code>/WEB-INF/web.xml</code>.</p> + </td></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td> + <p>This value represents the delay in seconds between the + invocation of the backgroundProcess method on this context and + its child containers, including all wrappers. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this host + and all its child containers. A context will use background + processing to perform session expiration and class monitoring for + reloading. If not specified, the default value for this attribute is + -1, which means the context will rely on the background processing + thread of its parent host.</p> + </td></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Context</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><code class="attributeName">containerSciFilter</code></td><td> + <p>The regular expression that specifies which container provided SCIs + should be filtered out and not used for this context. Matching uses + <code>java.util.regex.Matcher.find()</code> so the regular expression + only has to match a sub-string of the fully qualified class name of the + container provided SCI for it to be filtered out. If not specified, + no filtering will be applied.</p> + </td></tr><tr><td><code class="attributeName">cookies</code></td><td> + <p>Set to <code>true</code> if you want cookies to be used for + session identifier communication if supported by the client (this + is the default). Set to <code>false</code> if you want to disable + the use of cookies for session identifier communication, and rely + only on URL rewriting by the application.</p> + </td></tr><tr><td><code class="attributeName">crossContext</code></td><td> + <p>Set to <code>true</code> if you want calls within this application + to <code>ServletContext.getContext()</code> to successfully return a + request dispatcher for other web applications running on this virtual + host. Set to <code>false</code> (the default) in security + conscious environments, to make <code>getContext()</code> always + return <code>null</code>.</p> + </td></tr><tr><td><strong><code class="attributeName">docBase</code></strong></td><td> + <p>The <em>Document Base</em> (also known as the <em>Context + Root</em>) directory for this web application, or the pathname + to the web application archive file (if this web application is + being executed directly from the WAR file). You may specify + an absolute pathname for this directory or WAR file, or a pathname + that is relative to the <code>appBase</code> directory of the + owning <a href="host.html">Host</a>.</p> + <p>The value of this field must not be set unless the Context element is + defined in server.xml or the <code>docBase</code> is not located under + the <a href="host.html">Host</a>'s <code>appBase</code>.</p> + <p>If a symbolic link is used for docBase then changes to the + symbolic link will only be effective after a Tomcat restart or + by undeploying and redeploying the context. A context reload is not + sufficient.</p> + </td></tr><tr><td><code class="attributeName">dispatchersUseEncodedPaths</code></td><td> + <p>Controls whether paths used in calls to obtain a request dispatcher + ares expected to be encoded. This affects both how Tomcat handles calls + to obtain a request dispatcher as well as how Tomcat generates paths + used to obtain request dispatchers internally. If not specified, the + default value of <code>true</code> is used.</p> + </td></tr><tr><td><code class="attributeName">failCtxIfServletStartFails</code></td><td> + <p>Set to <code>true</code> to have the context fail its startup if any + servlet that has load-on-startup >=0 fails its own startup.</p> + <p>If not specified, the attribute of the same name in the parent Host + configuration is used if specified. Otherwise the default value of + <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">fireRequestListenersOnForwards</code></td><td> + <p>Set to <code>true</code> to fire any configured + ServletRequestListeners when Tomcat forwards a request. This is + primarily of use to users of CDI frameworks that use + ServletRequestListeners to configure the necessary environment for a + request. If not specified, the default value of <code>false</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">logEffectiveWebXml</code></td><td> + <p>Set to <code>true</code> if you want the effective web.xml used for a + web application to be logged (at INFO level) when the application + starts. The effective web.xml is the result of combining the + application's web.xml with any defaults configured by Tomcat and any + web-fragment.xml files and annotations discovered. If not specified, the + default value of <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">mapperContextRootRedirectEnabled</code></td><td> + <p>If enabled, requests for a web application context root will be + redirected (adding a trailing slash) if necessary by the Mapper rather + than the default Servlet. This is more efficient but has the side effect + of confirming that the context path exists. If not specified, the + default value of <code>true</code> is used.</p> + </td></tr><tr><td><code class="attributeName">mapperDirectoryRedirectEnabled</code></td><td> + <p>If enabled, requests for a web application directory will be + redirected (adding a trailing slash) if necessary by the Mapper rather + than the default Servlet. This is more efficient but has the side effect + of confirming that the directory is exists. If not specified, the + default value of <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">override</code></td><td> + <p>Set to <code>true</code> to ignore any settings in both the global + or <a href="host.html">Host</a> default contexts. By default, settings + from a default context will be used but may be overridden by a setting + the same attribute explicitly for the Context.</p> + </td></tr><tr><td><code class="attributeName">path</code></td><td> + <p>The <em>context path</em> of this web application, which is + matched against the beginning of each request URI to select the + appropriate web application for processing. All of the context paths + within a particular <a href="host.html">Host</a> must be unique. + If you specify a context path of an empty string (""), you are + defining the <em>default</em> web application for this Host, which + will process all requests not assigned to other Contexts.</p> + <p>This attribute must only be used when statically defining a Context + in server.xml. In all other circumstances, the path will be inferred + from the filenames used for either the .xml context file or the docBase. + </p> + <p>Even when statically defining a Context in server.xml, this attribute + must not be set unless either the docBase is not located under the + <a href="host.html">Host</a>'s <code>appBase</code> or both + <code>deployOnStartup</code> and <code>autoDeploy</code> are false. If + this rule is not followed, double deployment is likely to result.</p> + </td></tr><tr><td><code class="attributeName">preemptiveAuthentication</code></td><td> + <p>When set to <code>true</code> and the user presents credentials for a + resource that is not protected by a security constraint, if the + authenticator supports preemptive authentication (the standard + authenticators provided with Tomcat do) then the user' credentials + will be processed. If not specified, the default of <code>false</code>is + used. + </p> + </td></tr><tr><td><code class="attributeName">privileged</code></td><td> + <p>Set to <code>true</code> to allow this context to use container + servlets, like the manager servlet. Use of the <code>privileged</code> + attribute will change the context's parent class loader to be the + <em>Server</em> class loader rather than the <em>Shared</em> class + loader. Note that in a default installation, the <em>Common</em> class + loader is used for both the <em>Server</em> and the <em>Shared</em> + class loaders.</p> + </td></tr><tr><td><code class="attributeName">reloadable</code></td><td> + <p>Set to <code>true</code> if you want Catalina to monitor classes in + <code>/WEB-INF/classes/</code> and <code>/WEB-INF/lib</code> for + changes, and automatically reload the web application if a change + is detected. This feature is very useful during application + development, but it requires significant runtime overhead and is + not recommended for use on deployed production applications. That's + why the default setting for this attribute is <i>false</i>. You + can use the <a href="../manager-howto.html">Manager</a> web + application, however, to trigger reloads of deployed applications + on demand.</p> + </td></tr><tr><td><code class="attributeName">resourceOnlyServlets</code></td><td> + <p>Comma separated list of Servlet names (as used in + <code>/WEB-INF/web.xml</code>) that expect a resource to be present. + Ensures that welcome files associated with Servlets that expect a + resource to be present (such as the JSP Servlet) are not used when there + is no resource present. This prevents issues caused by the clarification + of welcome file mapping in section 10.10 of the Servlet 3.0 + specification. If the + <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to + <code>true</code>, the default value of this attribute will be the empty + string, else the default value will be <code>jsp</code>.</p> + </td></tr><tr><td><code class="attributeName">sendRedirectBody</code></td><td> + <p>If <code>true</code>, redirect responses will include a short + response body that includes details of the redirect as recommended by + RFC 2616. This is disabled by default since including a response body + may cause problems for some application component such as compression + filters.</p> + </td></tr><tr><td><code class="attributeName">sessionCookieDomain</code></td><td> + <p>The domain to be used for all session cookies created for this + context. If set, this overrides any domain set by the web application. + If not set, the value specified by the web application, if any, will be + used.</p> + </td></tr><tr><td><code class="attributeName">sessionCookieName</code></td><td> + <p>The name to be used for all session cookies created for this + context. If set, this overrides any name set by the web application. + If not set, the value specified by the web application, if any, will be + used, or the name <code>JSESSIONID</code> if the web application does + not explicitly set one.</p> + </td></tr><tr><td><code class="attributeName">sessionCookiePath</code></td><td> + <p>The path to be used for all session cookies created for this + context. If set, this overrides any path set by the web application. + If not set, the value specified by the web application will be used, or + the context path used if the web application does not explicitly set + one. To configure all web application to use an empty path (this can be + useful for portlet specification implementations) set this attribute to + <code>/</code> in the global <code>CATALINA_BASE/conf/context.xml</code> + file.</p> + <p>Note: Once one web application using + <code>sessionCookiePath="/"</code> obtains a session, all + subsequent sessions for any other web application in the same host also + configured with <code>sessionCookiePath="/"</code> will always + use the same session ID. This holds even if the session is invalidated + and a new one created. This makes session fixation protection more + difficult and requires custom, Tomcat specific code to change the + session ID shared by the multiple applications.</p> + </td></tr><tr><td><code class="attributeName">sessionCookiePathUsesTrailingSlash</code></td><td> + <p>Some browsers, such as Internet Explorer, Safari and Edge, will send + a session cookie for a context with a path of <code>/foo</code> with a + request to <code>/foobar</code> in violation of RFC6265. This could + expose a session ID from an application deployed at <code>/foo</code> to + an application deployed at <code>/foobar</code>. If the application + deployed at <code>/foobar</code> is untrusted, this could create a + security risk. However, it should be noted that RFC 6265, section 8.5 + makes clear that path alone should not be view as sufficient to prevent + untrusted applications accessing cookies from other applications. To + mitigate this risk, this attribute may be set to <code>true</code> and + Tomcat will add a trailing slash to the path associated with the session + cookie so, in the above example, the cookie path becomes /foo/. However, + with a cookie path of /foo/, browsers will no longer send the cookie + with a request to /foo. This should not be a problem unless there is a + servlet mapped to /*. In this case this attribute will need to be set to + <code>false</code> to disable this feature. The default value for this + attribute is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">swallowAbortedUploads</code></td><td> + <p>Set to false if Tomcat should <b>not</b> read any additional request + body data for aborted uploads and instead abort the client connection. + This setting is used in the following situations: + </p> + <ul> + <li>the size of the request body is larger than the + <code>maxPostSize</code> configured in the connector</li> + <li>the size limit of a MultiPart upload is reached</li> + <li>the servlet sets the response status to 413 (Request Entity Too + Large) </li> + </ul> + <p> + Not reading the additional data will free the request processing thread + more quickly. Unfortunately most HTTP clients will not read the response + if they cannot write the full request.</p> + <p>The default is <code>true</code>, so additional data will be + read.</p> + <p>Note if an error occurs during the request processing that triggers + a 5xx response, any unread request data will always be ignored and the + client connection will be closed once the error response has been + written.</p> + </td></tr><tr><td><code class="attributeName">swallowOutput</code></td><td> + <p>If the value of this flag is <code>true</code>, the bytes output to + System.out and System.err by the web application will be redirected to + the web application logger. If not specified, the default value + of the flag is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">tldValidation</code></td><td> + <p>If the value of this flag is <code>true</code>, the TLD files + will be XML validated on context startup. If the + <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to + <code>true</code>, the default value of this attribute will be + <code>true</code>, else the default value will be <code>false</code>. + Setting this attribute to <code>true</code> will incur a performance + penalty.</p> + </td></tr><tr><td><code class="attributeName">useHttpOnly</code></td><td> + <p>Should the HttpOnly flag be set on session cookies to prevent client + side script from accessing the session ID? Defaults to + <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">useRelativeRedirects</code></td><td> + <p>Controls whether HTTP 1.1 and later location headers generated by a + call to + <code>javax.servlet.http.HttpServletResponse#sendRedirect(String)</code> + will use relative or absolute redirects. Relative redirects are more + efficient but may not work with reverse proxies that change the context + path. It should be noted that it is not recommended to use a reverse + proxy to change the context path because of the multiple issues it + creates. Absolute redirects should work with reverse proxies that change + the context path but may cause issues with the + <code>org.apache.catalina.filters.RemoteIpFilter</code> if the filter is + changing the scheme and/or port. If the + <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to + <code>true</code>, the default value of this attribute will be + <code>false</code>, else the default value will be <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">validateClientProvidedNewSessionId</code></td><td> + <p>When a client provides the ID for a new session, this attribute + controls whether that ID is validated. The only use case for using a + client provided session ID is to have a common session ID across + multiple web applications. Therefore, any client provided session ID + should already exist in another web application. If this check is + enabled, the client provided session ID will only be used if the session + ID exists in at least one other web application for the current host. + Note that the following additional tests are always applied, + irrespective of this setting:</p> + <ul> + <li>The session ID is provided by a cookie</li> + <li>The session cookie has a path of {@code /}</li> + </ul> + <p>If not specified, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">wrapperClass</code></td><td> + <p>Java class name of the <code>org.apache.catalina.Wrapper</code> + implementation class that will be used for servlets managed by this + Context. If not specified, a standard default value will be used.</p> + </td></tr><tr><td><code class="attributeName">xmlBlockExternal</code></td><td> + <p>If the value of this flag is <code>true</code>, the parsing of + <code>web.xml</code>, <code>web-fragment.xml</code>, + <code>tomcat-web.xml</code>, <code>*.tld</code>, <code>*.jspx</code>, + <code>*.tagx</code> and <code>tagPlugins.xml</code> files for this web + application will not permit external entities to be loaded. If not + specified, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">xmlNamespaceAware</code></td><td> + <p>If the value of this flag is <code>true</code>, the parsing of + <code>web.xml</code>, <code>web-fragment.xml</code> and + <code>tomcat-web.xml</code> files for this web application will be + namespace-aware. Note that <code>*.tld</code>, <code>*.jspx</code> and + <code>*.tagx</code> files are always parsed using a namespace-aware + parser and that the <code>tagPlugins.xml</code> file (if any) is never + parsed using a namespace-aware parser. Note also that if you turn this + flag on, you should probably also turn <code>xmlValidation</code> on. If + the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to + <code>true</code>, the default value of this attribute will be + <code>true</code>, else the default value will be <code>false</code>. + Setting this attribute to <code>true</code> will incur a performance + penalty.</p> + </td></tr><tr><td><code class="attributeName">xmlValidation</code></td><td> + <p>If the value of this flag is <code>true</code>, the parsing of + <code>web.xml</code>, <code>web-fragment.xml</code> and + <code>tomcat-web.xml</code> files for this web application will use a + validating parser. If the + <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to + <code>true</code>, the default value of this attribute will be + <code>true</code>, else the default value will be <code>false</code>. + Setting this attribute to <code>true</code> will incur a performance + penalty.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Context</strong> is + <strong>org.apache.catalina.core.StandardContext</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">addWebinfClassesResources</code></td><td> + <p>This attribute controls if, in addition to static resources being + served from <code>META-INF/resources</code> inside web application JAR + files, static resources are also served from + <code>WEB-INF/classes/META-INF/resources</code>. This only applies to + web applications with a major version of 3 or higher. Since this is a + proprietary extension to the Servlet 3 specification, it is disabled by + default. To enable this feature, set the attribute to <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">antiResourceLocking</code></td><td> + <p>If true, Tomcat will prevent any file locking. + This will significantly impact startup time of applications, + but allows full webapp hot deploy and undeploy on platforms + or configurations where file locking can occur. + If not specified, the default value is <code>false</code>.</p> + + <p>Please note that setting this to <code>true</code> has some side + effects, including the disabling of JSP reloading in a running server: + see <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=37668"> + Bugzilla 37668</a>.</p> + + <p>Please note that setting this flag to true in applications that are + outside the appBase for the Host (the <code>webapps</code> directory + by default) will cause the application to be <strong>deleted</strong> on + Tomcat shutdown. You probably don't want to do this, so think twice + before setting antiResourceLocking=true on a webapp that's outside the + appBase for its Host.</p> + </td></tr><tr><td><code class="attributeName">clearReferencesHttpClientKeepAliveThread</code></td><td> + <p>If <code>true</code> and an <code>sun.net.www.http.HttpClient</code> + keep-alive timer thread has been started by this web application and is + still running, Tomcat will change the context class loader for that + thread from the web application class loader to the parent of the web + application class loader to prevent a memory leak. Note that the + keep-alive timer thread will stop on its own once the keep-alives all + expire however, on a busy system that might not happen for some time. If + not specified, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">clearReferencesRmiTargets</code></td><td> + <p>If <code>true</code>, Tomcat looks for memory leaks associated with + RMI Targets and clears any it finds. This feature uses reflection to + identify the leaks and therefore requires that the command line option + <code>-XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED</code> is set + when running on Java 9 and above. Applications without memory leaks + should operate correctly with this attribute set to <code>false</code>. + If not specified, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">clearReferencesStopThreads</code></td><td> + <p>If <code>true</code>, Tomcat attempts to terminate threads that have + been started by the web application. Stopping threads is performed via + the deprecated (for good reason) <code>Thread.stop()</code> method and + is likely to result in instability. As such, enabling this should be + viewed as an option of last resort in a development environment and is + not recommended in a production environment. If not specified, the + default value of <code>false</code> will be used. If this feature is + enabled, web applications may take up to two seconds longer to stop as + executor threads are given up to two seconds to stop gracefully before + <code>Thread.stop()</code> is called on any remaining threads.</p> + </td></tr><tr><td><code class="attributeName">clearReferencesStopTimerThreads</code></td><td> + <p>If <code>true</code>, Tomcat attempts to terminate + <code>java.util.Timer</code> threads that have been started by the web + application. Unlike standard threads, timer threads can be stopped + safely although there may still be side-effects for the application. If + not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">copyXML</code></td><td> + <p>Set to <code>true</code> if you want a context XML descriptor + embedded inside the application (located at + <code>/META-INF/context.xml</code>) to be copied to the owning + <a href="host.html">Host</a>'s <code>xmlBase</code> when the application + is deployed. On subsequent starts, the copied context XML descriptor + will be used in preference to any context XML descriptor embedded inside + the application even if the descriptor embedded inside the application + is more recent. The flag's value defaults to <code>false</code>. Note if + the <strong>deployXML</strong> attribute of the owning + <a href="host.html">Host</a> is <code>false</code> or if the + <strong>copyXML</strong> attribute of the owning + <a href="host.html">Host</a> is <code>true</code>, this attribute will + have no effect.</p> + </td></tr><tr><td><code class="attributeName">jndiExceptionOnFailedWrite</code></td><td> + <p>If <code>true</code>, any attempt by an application to modify the + provided JNDI context with a call to bind(), unbind(), + createSubContext(), destroySubContext() or close() will trigger a + <code>javax.naming.OperationNotSupportedException</code> as required by + section EE.5.3.4 of the Java EE specification. This exception can be + disabled by setting this attribute to false in which case any calls to + modify the JNDI context will return <b>without</b> making any changes + and methods that return values will return <code>null</code>. If not + specified, the specification compliant default of <code>true</code> will + be used.</p> + </td></tr><tr><td><code class="attributeName">renewThreadsWhenStoppingContext</code></td><td> + <p>If <code>true</code>, when this context is stopped, Tomcat renews all + the threads from the thread pool that was used to serve this context. + This also requires that the + <code>ThreadLocalLeakPreventionListener</code> be configured in + <code>server.xml</code> and that the <code>threadRenewalDelay</code> + property of the <code>Executor</code> be >=0. If not specified, the + default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">unloadDelay</code></td><td> + <p>Number of ms that the container will wait for servlets to unload. + If not specified, the default value is <code>2000</code> ms.</p> + </td></tr><tr><td><code class="attributeName">unpackWAR</code></td><td> + <p>If <code>false</code>, the <strong>unpackWARs</strong> attribute of + the owning <a href="host.html">Host</a> will be overridden and the WAR + file will not be unpacked. If <code>true</code>, the value of the owning + <a href="host.html">Host</a>'s <strong>unpackWARs</strong> + attribute will determine if the WAR is unpacked. If not specified, the + default value is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">useNaming</code></td><td> + <p>Set to <code>true</code> (the default) to have Catalina enable a + JNDI <code>InitialContext</code> for this web application that is + compatible with Java2 Enterprise Edition (J2EE) platform + conventions.</p> + </td></tr><tr><td><code class="attributeName">workDir</code></td><td> + <p>Pathname to a scratch directory to be provided by this Context + for temporary read-write use by servlets within the associated web + application. This directory will be made visible to servlets in the + web application by a servlet context attribute (of type + <code>java.io.File</code>) named + <code>javax.servlet.context.tempdir</code> as described in the + Servlet Specification. If not specified, a suitable directory + underneath <code>$CATALINA_BASE/work</code> will be provided.</p> + </td></tr></table> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>You can nest at most one instance of the following utility components + by nesting a corresponding element inside your <strong>Context</strong> + element:</p> + <ul> + <li><a href="cookie-processor.html"><strong>Cookie Processor</strong></a> - + Configure parsing and generation of HTTP cookie headers.</li> + <li><a href="loader.html"><strong>Loader</strong></a> - + Configure the web application class loader that will be used to load + servlet and bean classes for this web application. Normally, the + default configuration of the class loader will be sufficient.</li> + <li><a href="manager.html"><strong>Manager</strong></a> - + Configure the session manager that will be used to create, destroy, + and persist HTTP sessions for this web application. Normally, the + default configuration of the session manager will be sufficient.</li> + <li><a href="realm.html"><strong>Realm</strong></a> - + Configure a realm that will allow its + database of users, and their associated roles, to be utilized solely + for this particular web application. If not specified, this web + application will utilize the Realm associated with the owning + <a href="host.html">Host</a> or <a href="engine.html">Engine</a>.</li> + <li><a href="resources.html"><strong>Resources</strong></a> - + Configure the resource manager that will be used to access the static + resources associated with this web application. Normally, the + default configuration of the resource manager will be sufficient.</li> + <li><strong>WatchedResource</strong> - The auto deployer will monitor the + specified static resource of the web application for updates, and will + reload the web application if it is updated. The content of this element + must be a string.</li> + <li><a href="jar-scanner.html"><strong>JarScanner</strong></a> - + Configure the Jar Scanner that will be used to scan the web application + for JAR files and directories of class files. It is typically used during + web application start to identify configuration files such as TLDs o + web-fragment.xml files that must be processed as part of the web + application initialisation. Normally, the default Jar Scanner + configuration will be sufficient.</li> + </ul> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="Logging">Logging</h4><div class="text"> + + <p>A context is associated with the + <code>org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path]</code> + log category. Note that the brackets are actually part of the name, don't omit them.</p> + + </div></div> + + + <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text"> + + <p>When you run a web server, one of the output files normally generated + is an <em>access log</em>, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional <a href="valve.html">Valve</a> implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.</p> + + <p>You can ask Catalina to create an access log for all requests + processed by an <a href="engine.html">Engine</a>, + <a href="host.html">Host</a>, or <a href="context.html">Context</a> + by nesting a <a href="valve.html">Valve</a> element like this:</p> + +<div class="codeBox"><pre><code><Context> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="localhost_access_log" suffix=".txt" + pattern="common"/> + ... +</Context></code></pre></div> + + <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a> + for more information on the configuration attributes that are + supported.</p> + + </div></div> + + + <div class="subsection"><h4 id="Automatic_Context_Configuration">Automatic Context Configuration</h4><div class="text"> + + <p>If you use the standard <strong>Context</strong> implementation, + the following configuration steps occur automatically when Catalina + is started, or whenever this web application is reloaded. No special + configuration is required to enable this feature.</p> + + <ul> + <li>If you have not declared your own <a href="loader.html">Loader</a> + element, a standard web application class loader will be configured. + </li> + <li>If you have not declared your own <a href="manager.html">Manager</a> + element, a standard session manager will be configured.</li> + <li>If you have not declared your own <a href="resources.html">Resources</a> + element, a standard resources manager will be configured.</li> + <li>The web application properties listed in <code>conf/web.xml</code> + will be processed as defaults for this web application. This is used + to establish default mappings (such as mapping the <code>*.jsp</code> + extension to the corresponding JSP servlet), and other standard + features that apply to all web applications.</li> + <li>The web application properties listed in the + <code>/WEB-INF/tomcat-web.xml</code> resource for this web application + will be processed (if this resource exists), taking precedence over the + defaults.</li> + <li>The web application properties listed in the + <code>/WEB-INF/web.xml</code> resource for this web application + will be processed (if this resource exists).</li> + <li>If your web application has specified security constraints that might + require user authentication, an appropriate Authenticator that + implements the login method you have selected will be configured.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Context_Parameters">Context Parameters</h4><div class="text"> + + <p>You can configure named values that will be made visible to the + web application as servlet context initialization parameters by nesting + <code><Parameter></code> elements inside this element. For + example, you can create an initialization parameter like this:</p> +<div class="codeBox"><pre><code><Context> + ... + <Parameter name="companyName" value="My Company, Incorporated" + override="false"/> + ... +</Context></code></pre></div> + + <p>This is equivalent to the inclusion of the following element in the + web application deployment descriptor (<code>/WEB-INF/web.xml</code>): + </p> +<div class="codeBox"><pre><code><context-param> + <param-name>companyName</param-name> + <param-value>My Company, Incorporated</param-value> +</context-param></code></pre></div> + <p>but does <em>not</em> require modification of the deployment descriptor + to customize this value.</p> + + <p>The valid attributes for a <code><Parameter></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">description</code></td><td> + <p>Optional, human-readable description of this context + initialization parameter.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the context initialization parameter to be created.</p> + </td></tr><tr><td><code class="attributeName">override</code></td><td> + <p>Set this to <code>false</code> if you do <strong>not</strong> want + a <code><context-param></code> for the same parameter name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.</p> + </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td> + <p>The parameter value that will be presented to the application + when requested by calling + <code>ServletContext.getInitParameter()</code>.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Environment_Entries">Environment Entries</h4><div class="text"> + + <p>You can configure named values that will be made visible to the + web application as environment entry resources, by nesting + <code><Environment></code> entries inside this element. For + example, you can create an environment entry like this:</p> +<div class="codeBox"><pre><code><Context> + ... + <Environment name="maxExemptions" value="10" + type="java.lang.Integer" override="false"/> + ... +</Context></code></pre></div> + + <p>This is equivalent to the inclusion of the following element in the + web application deployment descriptor (<code>/WEB-INF/web.xml</code>): + </p> +<div class="codeBox"><pre><code><env-entry> + <env-entry-name>maxExemptions</env-entry-name> + <env-entry-value>10</env-entry-value> + <env-entry-type>java.lang.Integer</env-entry-type> +</env-entry></code></pre></div> + <p>but does <em>not</em> require modification of the deployment descriptor + to customize this value.</p> + + <p>The valid attributes for an <code><Environment></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">description</code></td><td> + <p>Optional, human-readable description of this environment entry.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the environment entry to be created, relative to the + <code>java:comp/env</code> context.</p> + </td></tr><tr><td><code class="attributeName">override</code></td><td> + <p>Set this to <code>false</code> if you do <strong>not</strong> want + an <code><env-entry></code> for the same environment entry name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.</p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>The fully qualified Java class name expected by the web application + for this environment entry. Must be a legal value for + <code><env-entry-type></code> in the web application deployment + descriptor.</p> + </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td> + <p>The parameter value that will be presented to the application + when requested from the JNDI context. This value must be convertable + to the Java type defined by the <code>type</code> attribute.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text"> + + <p>If you have implemented a Java object that needs to know when this + <strong>Context</strong> is started or stopped, you can declare it by + nesting a <strong>Listener</strong> element inside this element. The + class name you specify must implement the + <code>org.apache.catalina.LifecycleListener</code> interface, and + the class must be packaged in a jar and placed in the + <code>$CATALINA_HOME/lib</code> directory. + It will be notified about the occurrence of the corresponding + lifecycle events. Configuration of such a listener looks like this:</p> + +<div class="codeBox"><pre><code><Context> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Context></code></pre></div> + + <p>Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.</p> + + </div></div> + + + <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text"> + + <p>You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or + <a href="context.html">Context</a> element. The remote address or name + will be checked against configured "accept" and/or "deny" + filters, which are defined using <code>java.util.regex</code> Regular + Expression syntax. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:</p> + +<div class="codeBox"><pre><code><Context> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow=".*\.mycompany\.com|www\.yourcompany\.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192\.168\.1\.\d+"/> + ... +</Context></code></pre></div> + + <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a> + and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for + more information about the configuration options that are supported.</p> + + </div></div> + + + <div class="subsection"><h4 id="Resource_Definitions">Resource Definitions</h4><div class="text"> + + <p>You can declare the characteristics of the resource + to be returned for JNDI lookups of <code><resource-ref></code> and + <code><resource-env-ref></code> elements in the web application + deployment descriptor. You <strong>MUST</strong> also define + the needed resource parameters as attributes of the <code>Resource</code> + element, to configure the object factory to be used (if not known to Tomcat + already), and the properties used to configure that object factory.</p> + + <p>For example, you can create a resource definition like this:</p> +<div class="codeBox"><pre><code><Context> + ... + <Resource name="jdbc/EmployeeDB" auth="Container" + type="javax.sql.DataSource" + description="Employees Database for HR Applications"/> + ... +</Context></code></pre></div> + + <p>This is equivalent to the inclusion of the following element in the + web application deployment descriptor (<code>/WEB-INF/web.xml</code>):</p> +<div class="codeBox"><pre><code><resource-ref> + <description>Employees Database for HR Applications</description> + <res-ref-name>jdbc/EmployeeDB</res-ref-name> + <res-ref-type>javax.sql.DataSource</res-ref-type> + <res-auth>Container</res-auth> +</resource-ref></code></pre></div> + + <p>but does <em>not</em> require modification of the deployment + descriptor to customize this value.</p> + + <p>The valid attributes for a <code><Resource></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">auth</code></td><td> + <p>Specify whether the web Application code signs on to the + corresponding resource manager programmatically, or whether the + Container will sign on to the resource manager on behalf of the + application. The value of this attribute must be + <code>Application</code> or <code>Container</code>. This + attribute is <strong>required</strong> if the web application + will use a <code><resource-ref></code> element in the web + application deployment descriptor, but is optional if the + application uses a <code><resource-env-ref></code> instead.</p> + </td></tr><tr><td><code class="attributeName">closeMethod</code></td><td> + <p>Name of the zero-argument method to call on a singleton resource when + it is no longer required. This is intended to speed up clean-up of + resources that would otherwise happen as part of garbage collection. + This attribute is ignored if the <code>singleton</code> attribute is + false. If not specified, no default is defined and no close method will + be called.</p> + <p>For Apache Commons DBCP and Apache Tomcat JDBC connection pools + you can use <code>closeMethod="close"</code>.</p> + </td></tr><tr><td><code class="attributeName">description</code></td><td> + <p>Optional, human-readable description of this resource.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the resource to be created, relative to the + <code>java:comp/env</code> context.</p> + </td></tr><tr><td><code class="attributeName">scope</code></td><td> + <p>Specify whether connections obtained through this resource + manager can be shared. The value of this attribute must be + <code>Shareable</code> or <code>Unshareable</code>. By default, + connections are assumed to be shareable.</p> + </td></tr><tr><td><code class="attributeName">singleton</code></td><td> + <p>Specify whether this resource definition is for a singleton resource, + i.e. one where there is only a single instance of the resource. If this + attribute is <code>true</code>, multiple JNDI lookups for this resource + will return the same object. If this attribute is <code>false</code>, + multiple JNDI lookups for this resource will return different objects. + This attribute must be <code>true</code> for + <code>javax.sql.DataSource</code> resources to enable JMX registration + of the DataSource. The value of this attribute must be <code>true</code> + or <code>false</code>. By default, this attribute is <code>true</code>. + </p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>The fully qualified Java class name expected by the web + application when it performs a lookup for this resource.</p> + </td></tr></table> + + + </div></div> + + + <div class="subsection"><h4 id="Resource_Links">Resource Links</h4><div class="text"> + + <p>This element is used to create a link to a global JNDI resource. Doing + a JNDI lookup on the link name will then return the linked global + resource.</p> + + <p>For example, you can create a resource link like this:</p> +<div class="codeBox"><pre><code><Context> + ... + <ResourceLink name="linkToGlobalResource" + global="simpleValue" + type="java.lang.Integer" + ... +</Context></code></pre></div> + + <p>The valid attributes for a <code><ResourceLink></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">global</code></strong></td><td> + <p>The name of the linked global resource in the + global JNDI context.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the resource link to be created, relative to the + <code>java:comp/env</code> context.</p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>The fully qualified Java class name expected by the web + application when it performs a lookup for this resource link.</p> + </td></tr><tr><td><code class="attributeName">factory</code></td><td> + <p>The fully qualified Java class name for the class creating these objects. + This class should implement the <code>javax.naming.spi.ObjectFactory</code> interface.</p> + </td></tr></table> + + <p>When the attribute <code>factory="org.apache.naming.factory.DataSourceLinkFactory"</code> the resource link can be used with + two additional attributes to allow a shared data source to be used with different credentials. + When these two additional attributes are used in combination with the <code>javax.sql.DataSource</code> + type, different contexts can share a global data source with different credentials. + Under the hood, what happens is that a call to <a href="http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html#getConnection()"><code>getConnection()</code></a> + is simply translated to a call <a href="http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"> + <code>getConnection(username, password)</code></a> on the global data source. This is an easy way to get code to be transparent to what schemas are being used, + yet be able to control connections (or pools) in the global configuration. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">username</code></td><td> + <p><code>username</code> value for the <code>getConnection(username, password)</code> + call on the linked global DataSource. + </p> + </td></tr><tr><td><code class="attributeName">password</code></td><td> + <p><code>password</code> value for the <code>getConnection(username, password)</code> + call on the linked global DataSource. + </p> + </td></tr></table> + <p>Shared Data Source Example:</p> + <p><strong>Warning:</strong> This feature works only if the global DataSource +supports <code>getConnection(username, password)</code> method. +<a href="http://commons.apache.org/dbcp/">Apache Commons DBCP</a> pool that +Tomcat uses by default does not support it. See its Javadoc for +<code>BasicDataSource</code> class. +<a href="../jdbc-pool.html">Apache Tomcat JDBC pool</a> does support it, +but by default this support is disabled and can be enabled by +<code>alternateUsernameAllowed</code> attribute. See its documentation +for details.</p> +<div class="codeBox"><pre><code><GlobalNamingResources> + ... + <Resource name="sharedDataSource" + global="sharedDataSource" + type="javax.sql.DataSource" + factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" + alternateUsernameAllowed="true" + username="bar" + password="barpass" + ... + ... +</GlobalNamingResources> + +<Context path="/foo"...> + ... + <ResourceLink + name="appDataSource" + global="sharedDataSource" + type="javax.sql.DataSource" + factory="org.apache.naming.factory.DataSourceLinkFactory" + username="foo" + password="foopass" + ... +</Context> +<Context path="/bar"...> + ... + <ResourceLink + name="appDataSource" + global="sharedDataSource" + type="javax.sql.DataSource" + ... +</Context></code></pre></div> + <p>When a request for <code>getConnection()</code> is made in the + <code>/foo</code> context, the request is translated into + <code>getConnection("foo","foopass")</code>, + while a request in the <code>/bar</code> gets passed straight through.</p> + </div></div> + + <div class="subsection"><h4 id="Transaction">Transaction</h4><div class="text"> + + <p>You can declare the characteristics of the UserTransaction + to be returned for JNDI lookup for <code>java:comp/UserTransaction</code>. + You <strong>MUST</strong> define an object factory class to instantiate + this object as well as the needed resource parameters as attributes of the + <code>Transaction</code> + element, and the properties used to configure that object factory.</p> + + <p>The valid attributes for the <code><Transaction></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td> + <p>The class name for the JNDI object factory.</p> + </td></tr></table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/cookie-processor.html b/src/tomcat/webapps/docs/config/cookie-processor.html new file mode 100644 index 0000000000000000000000000000000000000000..f0e81b1fd317e2262c1c64ff4f33dc011d088d6e --- /dev/null +++ b/src/tomcat/webapps/docs/config/cookie-processor.html @@ -0,0 +1,174 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Cookie Processor Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/cookie-processor"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Cookie Processor Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li><li><a href="#Legacy_Cookie_Processor_-_org.apache.tomcat.util.http.LegacyCookieProcessor">Legacy Cookie Processor - org.apache.tomcat.util.http.LegacyCookieProcessor</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>CookieProcessor</strong> element represents the component that + parses received cookie headers into <code>javax.servlet.http.Cookie</code> + objects accessible through <code>HttpServletRequest.getCookies()</code> and + converts <code>javax.servlet.http.Cookie</code> objects added to the response + through <code>HttpServletResponse.addCookie()</code> to the HTTP headers + returned to the client.</p> + + <p>A CookieProcessor element MAY be nested inside a + <a href="context.html">Context</a> component. If it is not included, a default + implementation will be created automatically.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>CookieProcessor</strong> support the + following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.tomcat.util.http.CookieProcessor</code> + interface. If not specified, the standard value (defined below) will be + used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>CookieProcessor</strong> is + <code>org.apache.tomcat.util.http.Rfc6265CookieProcessor</code>.</p> + + <p>This cookie processor is based on RFC6265 with the following changes to + support better interoperability:</p> + + <ul> + <li>Values 0x80 to 0xFF are permitted in cookie-octet to support the use + of UTF-8 in cookie values as used by HTML 5.</li> + <li>For cookies without a value, the '=' is not required after the name as + some browsers do not sent it.</li> + </ul> + + <p>The RFC 6265 cookie processor is generally more lenient than the legacy + cookie parser. In particular:</p> + + <ul> + <li>The '<code>=</code>' and '<code>/</code>' characters are always + permitted in a cookie value.</li> + <li>Name only cookies are always permitted.</li> + <li>The cookie header is always preserved.</li> + </ul> + + <p>No additional attributes are supported by the <strong>RFC 6265 Cookie + Processor</strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Legacy_Cookie_Processor_-_org.apache.tomcat.util.http.LegacyCookieProcessor">Legacy Cookie Processor - org.apache.tomcat.util.http.LegacyCookieProcessor</h4><div class="text"> + + <p>This is the legacy cookie parser based on RFC6265, RFC2109 and RFC2616. + It implements a strict interpretation of the cookie specifications. Due to + various interoperability issues with browsers not all strict behaviours + are enabled by default and additional options are available to further + relax the behaviour of this cookie processor if required.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allowEqualsInValue</code></td><td> + <p>If this is <code>true</code> Tomcat will allow '<code>=</code>' + characters when parsing unquoted cookie values. If <code>false</code>, + cookie values containing '<code>=</code>' will be terminated when the + '<code>=</code>' is encountered and the remainder of the cookie value + will be dropped.</p> + <p>If not set the specification compliant default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">allowHttpSepsInV0</code></td><td> + <p>If this is <code>true</code> Tomcat will allow HTTP separators in + cookie names and values.</p> + <p>If not specified, the default specification compliant value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">allowNameOnly</code></td><td> + <p>If this is <code>true</code> Tomcat will allow name only cookies + (with or without trailing '<code>=</code>') when parsing cookie headers. + If <code>false</code>, name only cookies will be dropped.</p> + <p>If not set the specification compliant default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">alwaysAddExpires</code></td><td> + <p>If this is <code>true</code> Tomcat will always add an expires + parameter to a SetCookie header even for cookies with version greater + than zero. This is to work around a known IE6 and IE7 bug that causes I + to ignore the Max-Age parameter in a SetCookie header.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set + to <code>true</code>, the default of this setting will be + <code>false</code>, else the default value will be <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">forwardSlashIsSeparator</code></td><td> + <p>If this is <code>true</code> Tomcat will treat the forward slash + character ('<code>/</code>') as an HTTP separator when processing cookie + headers. If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + is set to <code>true</code>, the default of this setting will be + <code>true</code>, else the default value will be <code>false</code>. + </p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>No element may be nested inside a <strong>CookieProcessor</strong>.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>No special features are associated with a <strong>CookieProcessor</strong> + element.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/credentialhandler.html b/src/tomcat/webapps/docs/config/credentialhandler.html new file mode 100644 index 0000000000000000000000000000000000000000..d7217d033bdd3ca8ec85de9ef5ddf809576520c9 --- /dev/null +++ b/src/tomcat/webapps/docs/config/credentialhandler.html @@ -0,0 +1,209 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The CredentialHandler Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/credentialhandler"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The CredentialHandler Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#MessageDigestCredentialHandler">MessageDigestCredentialHandler</a></li><li><a href="#NestedCredentialHandler">NestedCredentialHandler</a></li><li><a href="#SecretKeyCredentialHandler">SecretKeyCredentialHandler</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>CredentialHandler</strong> element represents the component + used by a <a href="realm.html">Realm</a> to compare a provided credential such + as a password with the version of the credential stored by the + <a href="realm.html">Realm</a>. The <strong>CredentialHandler</strong> can + also be used to generate a new stored version of a given credential that would + be required, for example, when adding a new user to a + <a href="realm.html">Realm</a> or when changing a user's password.</p> + + <p>A <strong>CredentialHandler</strong> element MUST be nested inside a + <a href="realm.html">Realm</a> component. If it is not included, + a default <strong>CredentialHandler</strong> will be created using the + <strong>MessageDigestCredentialHandler</strong>.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>CredentialHandler</strong> support the + following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.CredentialHandler</code> + interface.</p> + </td></tr></table> + + <p>Unlike most Catalina components, there are several standard + <strong>CredentialHandler</strong> implementations available. As a result, + if a <strong>CredentialHandler</strong> element is present then the + <code>className</code> attribute MUST be used to select the implementation + you wish to use.</p> + + </div></div> + + + <div class="subsection"><h4 id="MessageDigestCredentialHandler">MessageDigestCredentialHandler</h4><div class="text"> + + <p>The <strong>MessageDigestCredentialHandler</strong> is used when stored + passwords are protected by a message digest. This credential handler + supports the following forms of stored passwords:</p> + <ul> + <li><strong>plainText</strong> - the plain text credentials if no + algorithm is specified</li> + <li><strong>encodedCredential</strong> - a hex encoded digest of the + password digested using the configured digest</li> + <li><strong>{MD5}encodedCredential</strong> - a Base64 encoded MD5 + digest of the password</li> + <li><strong>{SHA}encodedCredential</strong> - a Base64 encoded SHA1 digest + of the password</li> + <li><strong>{SSHA}encodedCredential</strong> - 20 character salt followed + by the salted SHA1 digest Base64 encoded</li> + <li><strong>salt$iterationCount$encodedCredential</strong> - a hex encoded + salt, iteration code and a hex encoded credential, each separated by + $</li> + </ul> + + <p>If the stored password form does not include an iteration count then an + iteration count of 1 is used.</p> + + <p>If the stored password form does not include salt then no salt is + used.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">algorithm</code></td><td> + <p>The name of the <code>java.security.MessageDigest</code> algorithm + used to encode user passwords stored in the database. If not specified, + user passwords are assumed to be stored in clear-text.</p> + </td></tr><tr><td><code class="attributeName">encoding</code></td><td> + <p>Digesting the password requires that it is converted to bytes. This + attribute determines the character encoding to use for conversions + between characters and bytes. If not specified, UTF-8 will be used.</p> + </td></tr><tr><td><code class="attributeName">iterations</code></td><td> + <p>The number of iterations to use when creating a new stored credential + from a clear text credential.</p> + </td></tr><tr><td><code class="attributeName">saltLength</code></td><td> + <p>The length of the randomly generated salt to use when creating a + new stored credential from a clear text credential.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="NestedCredentialHandler">NestedCredentialHandler</h4><div class="text"> + + <p>The <strong>NestedCredentialHandler</strong> is an implementation of + <strong>CredentialHandler</strong> that delegates to one or more + sub-CredentialHandlers.</p> + + <p>Using the <strong>NestedCredentialHandler</strong> gives the developer + the ability to combine multiple <strong>CredentialHandler</strong>s of the + same or different types.</p> + + <p>Sub-CredentialHandlers are defined by nesting CredentialHandler elements + inside the <code>CredentialHandler</code> element that defines the + NestedCredentialHandler. Credentials will be matched against each + <code>CredentialHandler</code> in the order they are listed. A match against + any CredentialHandler will be sufficient for the credentials to be + considered matched.</p> + + </div></div> + + <div class="subsection"><h4 id="SecretKeyCredentialHandler">SecretKeyCredentialHandler</h4><div class="text"> + + <p>The <strong>SecretKeyCredentialHandler</strong> is used when stored + passwords are built using <code>javax.crypto.SecretKeyFactory</code>. This + credential handler supports the following forms of stored passwords:</p> + <ul> + <li><strong>salt$iterationCount$encodedCredential</strong> - a hex encoded + salt, iteration code and a hex encoded credential, each separated by + $</li> + </ul> + + <p>If the stored password form does not include an iteration count then an + iteration count of 1 is used.</p> + + <p>If the stored password form does not include salt then no salt is + used.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">algorithm</code></td><td> + <p>The name of the secret key algorithm used to encode user passwords + stored in the database. If not specified, a default of + <code>PBKDF2WithHmacSHA1</code> is used.</p> + </td></tr><tr><td><code class="attributeName">keyLength</code></td><td> + <p>The length of key to generate for the stored credential. If not + specified, a default of <code>160</code> is used.</p> + </td></tr><tr><td><code class="attributeName">iterations</code></td><td> + <p>The number of iterations to use when creating a new stored credential + from a clear text credential.</p> + </td></tr><tr><td><code class="attributeName">saltLength</code></td><td> + <p>The length of the randomly generated salt to use when creating a + new stored credential from a clear text credential.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>If you are using the <em>NestedCredentialHandler Implementation</em> or a + CredentialHandler that extends the NestedCredentialHandler one or more + <strong><CredentialHandler></strong> elements may be nested inside it. + </p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>No special features are associated with a + <strong>CredentialHandler</strong> element.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/engine.html b/src/tomcat/webapps/docs/config/engine.html new file mode 100644 index 0000000000000000000000000000000000000000..5f855cd4bdf143a289e887d58775d1fd19f391f0 --- /dev/null +++ b/src/tomcat/webapps/docs/config/engine.html @@ -0,0 +1,261 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Engine Container</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/engine"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Engine Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Engine</strong> element represents the entire request + processing machinery associated with a particular Catalina + <a href="service.html">Service</a>. It receives and processes + <em>all</em> requests from one or more <strong>Connectors</strong>, + and returns the completed response to the Connector for ultimate + transmission back to the client.</p> + + <p>Exactly one <strong>Engine</strong> element MUST be nested inside + a <a href="service.html">Service</a> element, following all of the + corresponding Connector elements associated with this Service.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Engine</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td> + <p>This value represents the delay in seconds between the + invocation of the backgroundProcess method on this engine and + its child containers, including all hosts and contexts. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this engine + and all its child containers. If not specified, the default value for + this attribute is 10, which represent a 10 seconds delay.</p> + </td></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Engine</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><strong><code class="attributeName">defaultHost</code></strong></td><td> + <p>The default host name, which identifies the + <a href="host.html">Host</a> that will process requests directed + to host names on this server, but which are not configured in + this configuration file. This name MUST match the <code>name</code> + attributes of one of the <a href="host.html">Host</a> elements + nested immediately inside.</p> + </td></tr><tr><td><code class="attributeName">jvmRoute</code></td><td> + <p>Identifier which must be used in load balancing scenarios to enable + session affinity. The identifier, which must be unique across all + Tomcat servers which participate in the cluster, will be appended to + the generated session identifier, therefore allowing the front end + proxy to always forward a particular session to the same Tomcat + instance.</p> + <p> + Note that the <code>jvmRoute</code> can also be set using the + <code>jvmRoute</code> system property. The <code>jvmRoute</code> + set in an <code><Engine></code> attribute will override + any <code>jvmRoute</code> system property. + </p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>Logical name of this Engine, used in log and error messages. <em>When + using multiple <a href="service.html">Service</a> elements in the same + <a href="server.html">Server</a>, each Engine MUST be assigned a unique + name.</em></p> + </td></tr><tr><td><code class="attributeName">startStopThreads</code></td><td> + <p>The number of threads this <strong>Engine</strong> will use to start + child <a href="host.html">Host</a> elements in parallel. The special + value of 0 will result in the value of + <code>Runtime.getRuntime().availableProcessors()</code> being used. + Negative values will result in + <code>Runtime.getRuntime().availableProcessors() + value</code> being + used unless this is less than 1 in which case 1 thread will be used. If + not specified, the default value of 1 will be used. If 1 thread is + used then rather than using an <code>ExecutorService</code> the current + thread will be used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Engine</strong> is + <strong>org.apache.catalina.core.StandardEngine</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>You can nest one or more <a href="host.html">Host</a> elements inside + this <strong>Engine</strong> element, each representing a different virtual + host associated with this server. At least one <a href="host.html">Host</a> + is required, and one of the nested <a href="host.html">Hosts</a> MUST + have a name that matches the name specified for the + <code>defaultHost</code> attribute, listed above.</p> + + <p>You can nest at most one instance of the following utility components + by nesting a corresponding element inside your <strong>Engine</strong> + element:</p> + <ul> + <li><a href="realm.html"><strong>Realm</strong></a> - + Configure a realm that will allow its + database of users, and their associated roles, to be shared across all + <a href="host.html">Hosts</a> and <a href="context.html">Contexts</a> + nested inside this Engine, unless overridden by a + <a href="realm.html">Realm</a> configuration at a lower level.</li> + </ul> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="Logging">Logging</h4><div class="text"> + + <p>An engine is associated with the + <code>org.apache.catalina.core.ContainerBase.[enginename]</code> + log category. Note that the brackets are actually part of the name, + don't omit them.</p> + + </div></div> + + + <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text"> + + <p>When you run a web server, one of the output files normally generated + is an <em>access log</em>, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional <a href="valve.html">Valve</a> implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.</p> + + <p>You can ask Catalina to create an access log for all requests + processed by an <a href="engine.html">Engine</a>, + <a href="host.html">Host</a>, or <a href="context.html">Context</a> + by nesting a <a href="valve.html">Valve</a> element like this:</p> + +<div class="codeBox"><pre><code><Engine name="Standalone" ...> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="catalina_access_log" suffix=".txt" + pattern="common"/> + ... +</Engine></code></pre></div> + + <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a> + for more information on the configuration attributes that are + supported.</p> + + </div></div> + + + <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text"> + + <p>If you have implemented a Java object that needs to know when this + <strong>Engine</strong> is started or stopped, you can declare it by + nesting a <strong>Listener</strong> element inside this element. The + class name you specify must implement the + <code>org.apache.catalina.LifecycleListener</code> interface, and + it will be notified about the occurrence of the corresponding + lifecycle events. Configuration of such a listener looks like this:</p> + +<div class="codeBox"><pre><code><Engine name="Standalone" ...> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Engine></code></pre></div> + + <p>Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.</p> + + </div></div> + + + <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text"> + + <p>You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or + <a href="context.html">Context</a> element. The remote address or name + will be checked against configured "accept" and/or "deny" + filters, which are defined using <code>java.util.regex</code> Regular + Expression syntax. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:</p> + +<div class="codeBox"><pre><code><Engine name="Standalone" ...> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow=".*\.mycompany\.com|www\.yourcompany\.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192\.168\.1\.\d+"/> + ... +</Engine></code></pre></div> + + <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a> + and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for + more information about the configuration options that are supported.</p> + + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/executor.html b/src/tomcat/webapps/docs/config/executor.html new file mode 100644 index 0000000000000000000000000000000000000000..005e62d59c9df384c89a5aae2c45ae0bb955ca66 --- /dev/null +++ b/src/tomcat/webapps/docs/config/executor.html @@ -0,0 +1,127 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Executor (thread pool)</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/executor"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Executor (thread pool)</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Executor</strong> represents a thread pool that can be shared + between components in Tomcat. Historically there has been a thread pool per + connector created but this allows you to share a thread pool, between (primarily) connector + but also other components when those get configured to support executors</p> + + + <p>The executor has to implement the <code>org.apache.catalina.Executor</code> interface.</p> + + <p>The executor is a nested element to the <a href="service.html">Service</a> element. + And in order for it to be picked up by the connectors, the Executor element has to appear + prior to the Connector element in server.xml</p> +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Executor</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>The class of the implementation. The implementation has to implement the + <code>org.apache.catalina.Executor</code> interface. + This interface ensures that the object can be referenced through its <code>name</code> attribute + and that implements Lifecycle, so that it can be started and stopped with the container. + The default value for the className is <code>org.apache.catalina.core.StandardThreadExecutor</code></p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name used to reference this pool in other places in server.xml. + The name is required and must be unique.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p> + The default implementation supports the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">threadPriority</code></td><td> + <p>(int) The thread priority for threads in the executor, the default is + <code>5</code> (the value of the <code>Thread.NORM_PRIORITY</code> constant)</p> + </td></tr><tr><td><code class="attributeName">daemon</code></td><td> + <p>(boolean) Whether the threads should be daemon threads or not, the default is <code>true</code></p> + </td></tr><tr><td><code class="attributeName">namePrefix</code></td><td> + <p>(String) The name prefix for each thread created by the executor. + The thread name for an individual thread will be <code>namePrefix+threadNumber</code></p> + </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td> + <p>(int) The max number of active threads in this pool, default is <code>200</code></p> + </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td> + <p>(int) The minimum number of threads always kept alive, default is <code>25</code></p> + </td></tr><tr><td><code class="attributeName">maxIdleTime</code></td><td> + <p>(int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less + or equal to minSpareThreads. Default value is <code>60000</code>(1 minute)</p> + </td></tr><tr><td><code class="attributeName">maxQueueSize</code></td><td> + <p>(int) The maximum number of runnable tasks that can queue up awaiting + execution before we reject them. Default value is <code>Integer.MAX_VALUE</code></p> + </td></tr><tr><td><code class="attributeName">prestartminSpareThreads</code></td><td> + <p>(boolean) Whether minSpareThreads should be started when starting the Executor or not, + the default is <code>false</code></p> + </td></tr><tr><td><code class="attributeName">threadRenewalDelay</code></td><td> + <p>(long) If a <a href="listeners.html">ThreadLocalLeakPreventionListener</a> is configured, + it will notify this executor about stopped contexts. + After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time, + this option sets a delay between renewal of any 2 threads. The value is in ms, + default value is <code>1000</code> ms. If value is negative, threads are not renewed.</p> + </td></tr></table> + + + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/filter.html b/src/tomcat/webapps/docs/config/filter.html new file mode 100644 index 0000000000000000000000000000000000000000..92b2238905af0327da970f2b49f986e50d20a154 --- /dev/null +++ b/src/tomcat/webapps/docs/config/filter.html @@ -0,0 +1,1633 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - Container Provided Filters</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/filter"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Container Provided Filters</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Add_Default_Character_Set_Filter">Add Default Character Set Filter</a><ol><li><a href="#Add_Default_Character_Set_Filter/Introduction">Introduction</a></li><li><a href="#Add_Default_Character_Set_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Add_Default_Character_Set_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#CORS_Filter">CORS Filter</a><ol><li><a href="#CORS_Filter/Introduction">Introduction</a></li><li><a href="#CORS_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CORS_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#CORS_Filter_and_HttpServletRequest_attributes">CORS Filter and HttpServletRequest attributes</a></li></ol></li><li><a href="#CSRF_Prevention_Filter">CSRF Prevention Filter</a><ol><li><a href="#CSRF_Prevention_Filter/Introduction">Introduction</a></li><li><a href="#CSRF_Prevention_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CSRF_Prevention_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs">CSRF Prevention Filter for REST APIs</a><ol><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Introduction">Introduction</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Basic_configuration_sample">Basic configuration sample</a></li><li><a href="#RestCsrfPreventionFilter_and_HttpServletRequest_parameters">RestCsrfPreventionFilter and HttpServletRequest parameters</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Filter_Class_Name">Filter Class Name</a></li><li><a href="#CSRF_Prevention_Filter_for_REST_APIs/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Expires_Filter">Expires Filter</a><ol><li><a href="#Expires_Filter/Introduction">Introduction</a></li><li><a href="#Expires_Filter/Basic_configuration_sample">Basic configuration sample</a></li><li><a href="#Alternate_Syntax">Alternate Syntax</a></li><li><a href="#Expiration_headers_generation_eligibility">Expiration headers generation eligibility</a></li><li><a href="#Expiration_configuration_selection">Expiration configuration selection</a></li><li><a href="#Expires_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Expires_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Troubleshooting">Troubleshooting</a></li></ol></li><li><a href="#Failed_Request_Filter">Failed Request Filter</a><ol><li><a href="#Failed_Request_Filter/Introduction">Introduction</a></li><li><a href="#Failed_Request_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Failed_Request_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#HTTP_Header_Security_Filter">HTTP Header Security Filter</a><ol><li><a href="#HTTP_Header_Security_Filter/Introduction">Introduction</a></li><li><a href="#HTTP_Header_Security_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#HTTP_Header_Security_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Remote_Address_Filter">Remote Address Filter</a><ol><li><a href="#Remote_Address_Filter/Introduction">Introduction</a></li><li><a href="#Remote_Address_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Remote_Address_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Example">Example</a></li></ol></li><li><a href="#Remote_Host_Filter">Remote Host Filter</a><ol><li><a href="#Remote_Host_Filter/Introduction">Introduction</a></li><li><a href="#Remote_Host_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Remote_Host_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Remote_IP_Filter">Remote IP Filter</a><ol><li><a href="#Remote_IP_Filter/Introduction">Introduction</a></li><li><a href="#Remote_IP_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Basic_configuration_to_handle_'x-forwarded-for'">Basic configuration to handle 'x-forwarded-for'</a></li><li><a href="#Basic_configuration_to_handle_'x-forwarded-for'_and_'x-forwarded-proto'">Basic configuration to handle 'x-forwarded-for' and 'x-forwarded-proto'</a></li><li><a href="#Advanced_configuration_with_internal_proxies">Advanced configuration with internal proxies</a></li><li><a href="#Advanced_configuration_with_trusted_proxies">Advanced configuration with trusted proxies</a></li><li><a href="#Advanced_configuration_with_internal_and_trusted_proxies">Advanced configuration with internal and trusted proxies</a></li><li><a href="#Advanced_configuration_with_an_untrusted_proxy">Advanced configuration with an untrusted proxy</a></li><li><a href="#Remote_IP_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#Request_Dumper_Filter">Request Dumper Filter</a><ol><li><a href="#Request_Dumper_Filter/Introduction">Introduction</a></li><li><a href="#Request_Dumper_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Request_Dumper_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Request_Dumper_Filter/Sample_Configuration">Sample Configuration</a></li></ol></li><li><a href="#Session_Initializer_Filter">Session Initializer Filter</a><ol><li><a href="#Session_Initializer_Filter/Introduction">Introduction</a></li><li><a href="#Session_Initializer_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Session_Initializer_Filter/Initialisation_parameters">Initialisation parameters</a></li><li><a href="#Session_Initializer_Filter/Sample_Configuration">Sample Configuration</a></li></ol></li><li><a href="#Set_Character_Encoding_Filter">Set Character Encoding Filter</a><ol><li><a href="#Set_Character_Encoding_Filter/Introduction">Introduction</a></li><li><a href="#Set_Character_Encoding_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#Set_Character_Encoding_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li><li><a href="#WebDAV_Fix_Filter">WebDAV Fix Filter</a><ol><li><a href="#WebDAV_Fix_Filter/Introduction">Introduction</a></li><li><a href="#WebDAV_Fix_Filter/Filter_Class_Name">Filter Class Name</a></li><li><a href="#WebDAV_Fix_Filter/Initialisation_parameters">Initialisation parameters</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>Tomcat provides a number of <strong>Filters</strong> which may be + configured for use with all web applications using + <code>$CATALINA_BASE/conf/web.xml</code> or may be configured for individual + web applications by configuring them in the application's + <code>WEB-INF/web.xml</code>. Each filter is described below.</p> + + <p><em>This description uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +</div><h3 id="Add_Default_Character_Set_Filter">Add Default Character Set Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Introduction">Introduction</h4><div class="text"> + + <p>The HTTP specification is clear that if no character set is specified for + media sub-types of the "text" media type, the ISO-8859-1 character set must + be used. However, browsers may attempt to auto-detect the character set. + This may be exploited by an attacker to perform an XSS attack. Internet + Explorer and other browsers have an option to + enable this behavior.</p> + + <p>This filter prevents the attack by explicitly setting a character set. + Unless the provided character set is explicitly overridden by the user the + browser will adhere to the explicitly set character set, thus preventing the + XSS attack.</p> + + </div></div> + + <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Add Default Character Set Filter is + <strong><code>org.apache.catalina.filters.AddDefaultCharsetFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Add_Default_Character_Set_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The Add Default Character Set Filter supports the following initialization + parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">encoding</code></td><td> + <p>Name of the character set which should be set, if no other character set + was set explicitly by a Servlet. This parameter has two special values + <code>default</code> and <code>system</code>. A value of <code>system</code> + uses the JVM wide default character set, which is usually set by locale. + A value of <code>default</code> will use <strong>ISO-8859-1</strong>.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="CORS_Filter">CORS Filter</h3><div class="text"> + <div class="subsection"><h4 id="CORS_Filter/Introduction">Introduction</h4><div class="text"> + <p>This filter is an implementation of W3C's CORS (Cross-Origin Resource + Sharing) <a href="http://www.w3.org/TR/cors/">specification</a>, which is a + mechanism that enables cross-origin requests.</p> + <p>The filter works by adding required <code>Access-Control-*</code> headers + to HttpServletResponse object. The filter also protects against HTTP + response splitting. If request is invalid, or is not permitted, then request + is rejected with HTTP status code 403 (Forbidden). A + <a href="../images/cors-flowchart.png">flowchart</a> that + demonstrates request processing by this filter is available.</p> + <p>The minimal configuration required to use this filter is:</p> + <div class="codeBox"><pre><code><filter> + <filter-name>CorsFilter</filter-name> + <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> +</filter> +<filter-mapping> + <filter-name>CorsFilter</filter-name> + <url-pattern>/*</url-pattern> +</filter-mapping></code></pre></div> + </div></div> + <div class="subsection"><h4 id="CORS_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + <p>The filter class name for the CORS Filter is + <strong><code>org.apache.catalina.filters.CorsFilter</code></strong>.</p> + </div></div> + <div class="subsection"><h4 id="CORS_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + <p>The CORS Filter supports following initialisation parameters:</p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">cors.allowed.origins</code></td><td> + <p>A list of <a href="http://tools.ietf.org/html/rfc6454">origins</a> + that are allowed to access the resource. A <code>*</code> can be + specified to enable access to resource from any origin. Otherwise, a + whitelist of comma separated origins can be provided. Eg: <code> + http://www.w3.org, https://www.apache.org</code>. + <strong>Defaults:</strong> <code>*</code> (Any origin is allowed to + access the resource).</p> + </td></tr><tr><td><code class="attributeName">cors.allowed.methods</code></td><td> + <p>A comma separated list of HTTP methods that can be used to access the + resource, using cross-origin requests. These are the methods which will + also be included as part of <code>Access-Control-Allow-Methods</code> + header in pre-flight response. Eg: <code>GET, POST</code>. + <strong>Defaults:</strong> <code>GET, POST, HEAD, OPTIONS</code></p> + </td></tr><tr><td><code class="attributeName">cors.allowed.headers</code></td><td> + <p>A comma separated list of request headers that can be used when + making an actual request. These headers will also be returned as part + of <code>Access-Control-Allow-Headers</code> header in a pre-flight + response. Eg: <code>Origin,Accept</code>. <strong>Defaults:</strong> + <code>Origin, Accept, X-Requested-With, Content-Type, + Access-Control-Request-Method, Access-Control-Request-Headers</code></p> + </td></tr><tr><td><code class="attributeName">cors.exposed.headers</code></td><td> + <p>A comma separated list of headers other than simple response headers + that browsers are allowed to access. These are the headers which will + also be included as part of <code>Access-Control-Expose-Headers</code> + header in the pre-flight response. Eg: + <code>X-CUSTOM-HEADER-PING,X-CUSTOM-HEADER-PONG</code>. + <strong>Default:</strong> None. Non-simple headers are not exposed by + default.</p> + </td></tr><tr><td><code class="attributeName">cors.preflight.maxage</code></td><td> + <p>The amount of seconds, browser is allowed to cache the result of the + pre-flight request. This will be included as part of + <code>Access-Control-Max-Age</code> header in the pre-flight response. + A negative value will prevent CORS Filter from adding this response + header to pre-flight response. <strong>Defaults:</strong> + <code>1800</code></p> + </td></tr><tr><td><code class="attributeName">cors.support.credentials</code></td><td> + <p>A flag that indicates whether the resource supports user credentials. + This flag is exposed as part of + <code>Access-Control-Allow-Credentials</code> header in a pre-flight + response. It helps browser determine whether or not an actual request + can be made using credentials. <strong>Defaults:</strong> + <code>true</code></p> + </td></tr><tr><td><code class="attributeName">cors.request.decorate</code></td><td> + <p>A flag to control if CORS specific attributes should be added to + HttpServletRequest object or not. <strong>Defaults:</strong> + <code>true</code></p> + </td></tr></table> + <p>Here's an example of a more advanced configuration, that overrides + defaults:</p> + <div class="codeBox"><pre><code><filter> + <filter-name>CorsFilter</filter-name> + <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> + <init-param> + <param-name>cors.allowed.origins</param-name> + <param-value>*</param-value> + </init-param> + <init-param> + <param-name>cors.allowed.methods</param-name> + <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> + </init-param> + <init-param> + <param-name>cors.allowed.headers</param-name> + <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> + </init-param> + <init-param> + <param-name>cors.exposed.headers</param-name> + <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> + </init-param> + <init-param> + <param-name>cors.support.credentials</param-name> + <param-value>true</param-value> + </init-param> + <init-param> + <param-name>cors.preflight.maxage</param-name> + <param-value>10</param-value> + </init-param> +</filter> +<filter-mapping> + <filter-name>CorsFilter</filter-name> + <url-pattern>/*</url-pattern> +</filter-mapping></code></pre></div> + </div></div> + <div class="subsection"><h4 id="CORS_Filter_and_HttpServletRequest_attributes">CORS Filter and HttpServletRequest attributes</h4><div class="text"> + <p>CORS Filter adds information about the request, in HttpServletRequest + object, for consumption downstream. Following attributes are set, if + <code>cors.request.decorate</code> initialisation parameter is + <code>true</code>:</p> + <ul> + <li><strong>cors.isCorsRequest:</strong> Flag to determine if request is + a CORS request.</li> + <li><strong>cors.request.origin:</strong> The Origin URL, i.e. the URL of + the page from where the request originated.</li> + <li><strong>cors.request.type:</strong> Type of CORS request. Possible + values: + <ul> + <li><code>SIMPLE</code>: A request which is not preceded by a + pre-flight request.</li> + <li><code>ACTUAL</code>: A request which is preceded by a pre-flight + request.</li> + <li><code>PRE_FLIGHT</code>: A pre-flight request.</li> + <li><code>NOT_CORS</code>: A normal same-origin request.</li> + <li><code>INVALID_CORS</code>: A cross-origin request, which is + invalid.</li> + </ul> + </li> + <li><strong>cors.request.headers:</strong> Request headers sent as + <code>Access-Control-Request-Headers</code> header, for a pre-flight + request. + </li> + </ul> + </div></div> +</div><h3 id="CSRF_Prevention_Filter">CSRF Prevention Filter</h3><div class="text"> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter/Introduction">Introduction</h4><div class="text"> + + <p>This filter provides basic CSRF protection for a web application. The + filter assumes that it is mapped to <code>/*</code> and that all URLs + returned to the client are encoded via a call to + <code>HttpServletResponse#encodeRedirectURL(String)</code> or + <code>HttpServletResponse#encodeURL(String)</code>.</p> + + <p>This filter prevents CSRF by generating a nonce and storing it in the + session. URLs are also encoded with the same nonce. When the next request is + received the nonce in the request is compared to the nonce in the session + and only if they are the same is the request allowed to continue.</p> + + </div></div> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the CSRF Prevention Filter is + <strong><code>org.apache.catalina.filters.CsrfPreventionFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The CSRF Prevention Filter supports the following initialisation + parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>.</p> + </td></tr><tr><td><code class="attributeName">entryPoints</code></td><td> + <p>A comma separated list of URLs that will not be tested for the + presence of a valid nonce. They are used to provide a way to navigate + back to a protected application after having navigated away from it. + Entry points will be limited to HTTP GET requests and should not trigger + any security sensitive actions.</p> + </td></tr><tr><td><code class="attributeName">nonceCacheSize</code></td><td> + <p>The number of previously issued nonces that will be cached on a LRU + basis to support parallel requests, limited use of the refresh and back + in the browser and similar behaviors that may result in the submission + of a previous nonce rather than the current one. If not set, the default + value of 5 will be used.</p> + </td></tr><tr><td><code class="attributeName">randomClass</code></td><td> + <p>The name of the class to use to generate nonces. The class must be an + instance of <code>java.util.Random</code>. If not set, the default value + of <code>java.security.SecureRandom</code> will be used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="CSRF_Prevention_Filter_for_REST_APIs">CSRF Prevention Filter for REST APIs</h3><div class="text"> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Introduction">Introduction</h4><div class="text"> + + <p>This filter provides basic CSRF protection for REST APIs. The CSRF + protection is applied only for modifying HTTP requests (different from GET, + HEAD, OPTIONS) to protected resources. It is based on a custom header + <code>X-CSRF-Token</code> that provides a valid nonce.</p> + + <p>CSRF protection mechanism for REST APIs consists of the following steps: + <ul> + <li>Client asks for a valid nonce. This is performed with a + non-modifying "Fetch" request to protected resource.</li> + <li>Server responds with a valid nonce mapped to the current user + session.</li> + <li>Client provides this nonce in the subsequent modifying requests in + the frame of the same user session.</li> + <li>Server rejects all modifying requests to protected resources that + do not contain a valid nonce.</li> + </ul> + </p> + + </div></div> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Basic_configuration_sample">Basic configuration sample</h4><div class="text"> + + <p>On the server side</p> + + <ul> + <li>All CSRF protected REST APIs should be protected with an authentication + mechanism.</li> + <li>Protect modifying REST APIs with this filter.</li> + <li>Provide at least one non-modifying operation.</li> + </ul> + <div class="codeBox"><pre><code><filter> + <filter-name>RestCSRF</filter-name> + <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class> +</filter> +<filter-mapping> + <filter-name>RestCSRF</filter-name> + <!-- Modifying operations --> + <url-pattern>/resources/removeResource</url-pattern> + <url-pattern>/resources/addResource</url-pattern> + <!-- Non-modifying operations --> + <url-pattern>/resources/listResources</url-pattern> +</filter-mapping></code></pre></div> + + <p>On the client side</p> + + <ul> + <li>Make a non-modifying "Fetch" request in order to obtain a valid nonce. + This can be done with sending additional header + <code>X-CSRF-Token: Fetch</code></li> + <li>Cache the returned session id and nonce in order to provide them in + the subsequent modifying requests to protected resources.</li> + <li>Modifying requests can be denied and header + <code>X-CSRF-Token: Required</code> will be returned in case of + invalid or missing nonce, expired session or in case the session + id is changed by the server.</li> + </ul> + <div class="codeBox"><pre><code>Client Request: +GET /rest/resources/listResources HTTP/1.1 +X-CSRF-Token: Fetch +Authorization: Basic ... +Host: localhost:8080 +... + +Server Response: +HTTP/1.1 200 OK +Set-Cookie: JSESSIONID=...; Path=/rest; HttpOnly +X-CSRF-Token: ... +... + +Client Request: +POST /rest/resources/addResource HTTP/1.1 +Cookie: JSESSIONID=... +X-CSRF-Token: ... +Authorization: Basic ... +Host: localhost:8080 +... + +Server Response: +HTTP/1.1 200 OK +...</code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="RestCsrfPreventionFilter_and_HttpServletRequest_parameters">RestCsrfPreventionFilter and HttpServletRequest parameters</h4><div class="text"> + + <p>When the client is not able to insert custom headers in its calls to + REST APIs there is additional capability to configure URLs for which a + valid nonce will be accepted as a request parameter.</p> + + <p>Note: If there is a <code>X-CSRF-Token</code> header, it will be taken + with preference over any parameter with the same name in the request. + Request parameters cannot be used to fetch new nonce, only header can be + used to request a new nonce.</p> + + <div class="codeBox"><pre><code><filter> + <filter-name>RestCSRF</filter-name> + <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class> + <init-param> + <param-name>pathsAcceptingParams</param-name> + <param-value>/resources/removeResource,/resources/addResource</param-value> + </init-param> +</filter> +<filter-mapping> + <filter-name>RestCSRF</filter-name> + <url-pattern>/resources/*</url-pattern> +</filter-mapping></code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the CSRF Prevention Filter for REST APIs is + <strong><code>org.apache.catalina.filters.RestCsrfPreventionFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="CSRF_Prevention_Filter_for_REST_APIs/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The CSRF Prevention Filter for REST APIs supports the following + initialisation parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>.</p> + </td></tr><tr><td><code class="attributeName">pathsAcceptingParams</code></td><td> + <p>A comma separated list of URLs that can accept nonces via request + parameter <code>X-CSRF-Token</code>. For use cases when a nonce information cannot + be provided via header, one can provide it via request parameters. If + there is a <code>X-CSRF-Token</code> header, it will be taken with preference over + any parameter with the same name in the request. Request parameters + cannot be used to fetch new nonce, only header can be used to request a + new nonce.</p> + </td></tr><tr><td><code class="attributeName">randomClass</code></td><td> + <p>The name of the class to use to generate nonces. The class must be an + instance of <code>java.util.Random</code>. If not set, the default value + of <code>java.security.SecureRandom</code> will be used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Expires_Filter">Expires Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Expires_Filter/Introduction">Introduction</h4><div class="text"> + + <p> + ExpiresFilter is a Java Servlet API port of <a href="http://httpd.apache.org/docs/2.2/mod/mod_expires.html">Apache + mod_expires</a>. + This filter controls the setting of the <code>Expires</code> HTTP header and the + <code>max-age</code> directive of the <code>Cache-Control</code> HTTP header in + server responses. The expiration date can set to be relative to either the + time the source file was last modified, or to the time of the client access. + </p> + + <p> + These HTTP headers are an instruction to the client about the document's + validity and persistence. If cached, the document may be fetched from the + cache rather than from the source until this time has passed. After that, the + cache copy is considered "expired" and invalid, and a new copy must + be obtained from the source. + </p> + <p> + To modify <code>Cache-Control</code> directives other than <code>max-age</code> (see + <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9">RFC + 2616 section 14.9</a>), you can use other servlet filters or <a href="http://httpd.apache.org/docs/2.2/mod/mod_headers.html">Apache Httpd + mod_headers</a> module. + </p> + + </div></div> + + <div class="subsection"><h4 id="Expires_Filter/Basic_configuration_sample">Basic configuration sample</h4><div class="text"> + <p> + Basic configuration to add '<code>Expires</code>' and '<code>Cache-Control: max-age=</code>' + headers to images, css and javascript. + </p> + + <div class="codeBox"><pre><code><filter> + <filter-name>ExpiresFilter</filter-name> + <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> + <init-param> + <param-name>ExpiresByType image</param-name> + <param-value>access plus 10 minutes</param-value> + </init-param> + <init-param> + <param-name>ExpiresByType text/css</param-name> + <param-value>access plus 10 minutes</param-value> + </init-param> + <init-param> + <param-name>ExpiresByType application/javascript</param-name> + <param-value>access plus 10 minutes</param-value> + </init-param> +</filter> +... +<filter-mapping> + <filter-name>ExpiresFilter</filter-name> + <url-pattern>/*</url-pattern> + <dispatcher>REQUEST</dispatcher> +</filter-mapping></code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="Alternate_Syntax">Alternate Syntax</h4><div class="text"> + <p> + The <code>ExpiresDefault</code> and <code>ExpiresByType</code> directives can also be + defined in a more readable syntax of the form: + </p> + + <div class="codeBox"><pre><code><init-param> + <param-name>ExpiresDefault</param-name> + <param-value><base> [plus] {<num> <type>}*</param-value> +</init-param> + +<init-param> + <param-name>ExpiresByType type</param-name> + <param-value><base> [plus] {<num> <type>}*</param-value> +</init-param> + +<init-param> + <param-name>ExpiresByType type;encoding</param-name> + <param-value><base> [plus] {<num> <type>}*</param-value> +</init-param></code></pre></div> + <p> + where <code><base></code> is one of: + </p> + <ul> + <li><code>access</code></li> + <li><code>now</code> (equivalent to '<code>access</code>')</li> + <li><code>modification</code></li> + </ul> + + <p> + The <code>plus</code> keyword is optional. <code><num></code> should be an + integer value (acceptable to <code>Integer.parseInt()</code>), and + <code><type></code> is one of: + </p> + <ul> + <li><code>year</code>, <code>years</code></li> + <li><code>month</code>, <code>months</code></li> + <li><code>week</code>, <code>weeks</code></li> + <li><code>day</code>, <code>days</code></li> + <li><code>hour</code>, <code>hours</code></li> + <li><code>minute</code>, <code>minutes</code></li> + <li><code>second</code>, <code>seconds</code></li> + </ul> + <p> + For example, any of the following directives can be used to make documents + expire 1 month after being accessed, by default: + </p> + + <div class="codeBox"><pre><code><init-param> + <param-name>ExpiresDefault</param-name> + <param-value>access plus 1 month</param-value> +</init-param> + +<init-param> + <param-name>ExpiresDefault</param-name> + <param-value>access plus 4 weeks</param-value> +</init-param> + +<init-param> + <param-name>ExpiresDefault</param-name> + <param-value>access plus 30 days</param-value> +</init-param></code></pre></div> +<p> +The expiry time can be fine-tuned by adding several +'<code><num> <type></code>' clauses: +</p> + +<div class="codeBox"><pre><code><init-param> + <param-name>ExpiresByType text/html</param-name> + <param-value>access plus 1 month 15 days 2 hours</param-value> +</init-param> + +<init-param> + <param-name>ExpiresByType image/gif</param-name> + <param-value>modification plus 5 hours 3 minutes</param-value> +</init-param></code></pre></div> + <p> + Note that if you use a modification date based setting, the <code>Expires</code> + header will <strong>not</strong> be added to content that does not come from + a file on disk. This is due to the fact that there is no modification time + for such content. + </p> + </div></div> + + <div class="subsection"><h4 id="Expiration_headers_generation_eligibility">Expiration headers generation eligibility</h4><div class="text"> + <p> + A response is eligible to be enriched by <code>ExpiresFilter</code> if : + </p> + <ol> + <li>no expiration header is defined (<code>Expires</code> header or the + <code>max-age</code> directive of the <code>Cache-Control</code> header),</li> + <li>the response status code is not excluded by the directive + <code>ExpiresExcludedResponseStatusCodes</code>,</li> + <li>the <code>Content-Type</code> of the response matches one of the types + defined the in <code>ExpiresByType</code> directives or the + <code>ExpiresDefault</code> directive is defined.</li> + </ol> + + <p> + Note : If <code>Cache-Control</code> header contains other directives than + <code>max-age</code>, they are concatenated with the <code>max-age</code> directive + that is added by the <code>ExpiresFilter</code>. + </p> + + </div></div> + + <div class="subsection"><h4 id="Expiration_configuration_selection">Expiration configuration selection</h4><div class="text"> + <p> + The expiration configuration if elected according to the following algorithm: + </p> + <ol> + <li><code>ExpiresByType</code> matching the exact content-type returned by + <code>HttpServletResponse.getContentType()</code> possibly including the charset + (e.g. '<code>text/xml;charset=UTF-8</code>'),</li> + <li><code>ExpiresByType</code> matching the content-type without the charset if + <code>HttpServletResponse.getContentType()</code> contains a charset (e.g. + '<code>text/xml;charset=UTF-8</code>' -> '<code>text/xml</code>'),</li> + <li><code>ExpiresByType</code> matching the major type (e.g. substring before + '<code>/</code>') of <code>HttpServletResponse.getContentType()</code> + (e.g. '<code>text/xml;charset=UTF-8</code>' -> '<code>text</code>'),</li> + <li><code>ExpiresDefault</code></li> + </ol> + + </div></div> + + <div class="subsection"><h4 id="Expires_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Expires Filter is + <strong><code>org.apache.catalina.filters.ExpiresFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Expires_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The <strong>Expires Filter</strong> supports the following + initialisation parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">ExpiresExcludedResponseStatusCodes</code></td><td> + <p> + This directive defines the http response status codes for which the + <code>ExpiresFilter</code> will not generate expiration headers. By default, the + <code>304</code> status code ("<code>Not modified</code>") is skipped. The + value is a comma separated list of http status codes. + </p> + <p> + This directive is useful to ease usage of <code>ExpiresDefault</code> directive. + Indeed, the behavior of <code>304 Not modified</code> (which does specify a + <code>Content-Type</code> header) combined with <code>Expires</code> and + <code>Cache-Control:max-age=</code> headers can be unnecessarily tricky to + understand. + </p> + <p><i>See sample below the table</i></p> + </td></tr><tr><td><code class="attributeName">ExpiresByType <content-type></code></td><td> + <p> + This directive defines the value of the <code>Expires</code> header and the + <code>max-age</code> directive of the <code>Cache-Control</code> header generated for + documents of the specified type (<i>e.g.</i>, <code>text/html</code>). The second + argument sets the number of seconds that will be added to a base time to + construct the expiration date. The <code>Cache-Control: max-age</code> is + calculated by subtracting the request time from the expiration date and + expressing the result in seconds. + </p> + <p> + The base time is either the last modification time of the file, or the time + of the client's access to the document. Which should be used is + specified by the <code><code></code> field; <code>M</code> means that the + file's last modification time should be used as the base time, and + <code>A</code> means the client's access time should be used. The duration + is expressed in seconds. <code>A2592000</code> stands for + <code>access plus 30 days</code> in alternate syntax. + </p> + <p> + The difference in effect is subtle. If <code>M</code> (<code>modification</code> in + alternate syntax) is used, all current copies of the document in all caches + will expire at the same time, which can be good for something like a weekly + notice that's always found at the same URL. If <code>A</code> ( + <code>access</code> or <code>now</code> in alternate syntax) is used, the date of + expiration is different for each client; this can be good for image files + that don't change very often, particularly for a set of related + documents that all refer to the same images (<i>i.e.</i>, the images will be + accessed repeatedly within a relatively short timespan). + </p> + <p> + <strong>Note:</strong> When the content type includes a charset (e.g. + <code>'ExpiresByType text/xml;charset=utf-8'</code>), Tomcat removes blank chars + between the '<code>;</code>' and the '<code>charset</code>' keyword. Due to this, + configuration of an expiration with a charset must <strong>not</strong> include + such a space character. + </p> + <p><i>See sample below the table</i></p> + <p> + It overrides, for the specified MIME type <i>only</i>, any + expiration date set by the <code>ExpiresDefault</code> directive. + </p> + <p> + You can also specify the expiration time calculation using an alternate + syntax, described earlier in this document. + </p> + </td></tr><tr><td><code class="attributeName">ExpiresDefault</code></td><td> + <p> + This directive sets the default algorithm for calculating the + expiration time for all documents in the affected realm. It can be + overridden on a type-by-type basis by the <code>ExpiresByType</code> directive. See the + description of that directive for details about the syntax of the + argument, and the "alternate syntax" + description as well. + </p> + </td></tr></table> + + <p><i>Sample: exclude response status codes 302, 500 and 503</i></p> + +<div class="codeBox"><pre><code><init-param> + <param-name>ExpiresExcludedResponseStatusCodes</param-name> + <param-value>302, 500, 503</param-value> +</init-param></code></pre></div> + + <p><i>Sample for ExpiresByType initialization parameter</i></p> + + <div class="codeBox"><pre><code><init-param> + <param-name>ExpiresByType text/html</param-name> + <param-value>access plus 1 month 15 days 2 hours</param-value> +</init-param> + +<init-param> + <!-- 2592000 seconds = 30 days --> + <param-name>ExpiresByType image/gif</param-name> + <param-value>A2592000</param-value> +</init-param></code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="Troubleshooting">Troubleshooting</h4><div class="text"> + <p> + To troubleshoot, enable logging on the + <code>org.apache.catalina.filters.ExpiresFilter</code>. + </p> + <p> + Extract of logging.properties + </p> + + <div class="codeBox"><pre><code>org.apache.catalina.filters.ExpiresFilter.level = FINE </code></pre></div> + <p> + Sample of initialization log message: + </p> + + <div class="codeBox"><pre><code>Mar 26, 2010 2:01:41 PM org.apache.catalina.filters.ExpiresFilter init +FINE: Filter initialized with configuration ExpiresFilter[ + excludedResponseStatusCode=[304], + default=null, + byType={ + image=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]], + text/css=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]], + text/javascript=ExpiresConfiguration[startingPoint=ACCESS_TIME, duration=[10 MINUTE]]}]</code></pre></div> + <p> + Sample of per-request log message where <code>ExpiresFilter</code> adds an + expiration date is below. The message is on one line and is wrapped here + for better readability. + </p> + + <div class="codeBox"><pre><code>Mar 26, 2010 2:09:47 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody +FINE: Request "/tomcat.gif" with response status "200" + content-type "image/gif", set expiration date 3/26/10 2:19 PM</code></pre></div> + <p> + Sample of per-request log message where <code>ExpiresFilter</code> does not add + an expiration date: + </p> + + <div class="codeBox"><pre><code>Mar 26, 2010 2:10:27 PM org.apache.catalina.filters.ExpiresFilter onBeforeWriteResponseBody +FINE: Request "/docs/config/manager.html" with response status "200" + content-type "text/html", no expiration configured</code></pre></div> + </div></div> + +</div><h3 id="Failed_Request_Filter">Failed Request Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Failed_Request_Filter/Introduction">Introduction</h4><div class="text"> + + <p>This filter triggers parameters parsing in a request and rejects the + request if some parameters were skipped during parameter parsing because + of parsing errors or request size limitations (such as + <code>maxParameterCount</code> attribute in a + <a href="http.html">Connector</a>). + This filter can be used to ensure that none parameter values submitted by + client are lost.</p> + + <p>Note that parameter parsing may consume the body of an HTTP request, so + caution is needed if the servlet protected by this filter uses + <code>request.getInputStream()</code> or <code>request.getReader()</code> + calls. In general the risk of breaking a web application by adding this + filter is not so high, because parameter parsing does check content type + of the request before consuming the request body.</p> + + <p>Note, that for the POST requests to be parsed correctly, a + <code>SetCharacterEncodingFilter</code> filter must be configured above + this one. See CharacterEncoding page in the FAQ for details.</p> + + <p>The request is rejected with HTTP status code 400 (Bad Request).</p> + + </div></div> + + <div class="subsection"><h4 id="Failed_Request_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Failed Request Filter is + <strong><code>org.apache.catalina.filters.FailedRequestFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Failed_Request_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The Failed Request Filter does not support any initialization parameters.</p> + + </div></div> + +</div><h3 id="HTTP_Header_Security_Filter">HTTP Header Security Filter</h3><div class="text"> + + <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Introduction">Introduction</h4><div class="text"> + + <p>There are a number of HTTP headers that can be added to the response to + improve the security of the connection. This filter provides a mechanism for + adding those headers. Note that security related headers with more complex + requirements, like CORS, are implemented as separate Filters.</p> + + </div></div> + + <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the HTTP Header Security Filter is + <strong><code>org.apache.catalina.filters.HttpHeaderSecurityFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="HTTP_Header_Security_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The HTTP Header Security Filter supports the following initialization + parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">hstsEnabled</code></td><td> + <p>Will an HTTP Strict Transport Security (HSTS) header + (<code>Strict-Transport-Security</code>) be set on the response for + secure requests. Any HSTS header already present will be replaced. See + <a href="http://tools.ietf.org/html/rfc6797">RFC 6797</a> for further + details of HSTS. If not specified, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">hstsMaxAgeSeconds</code></td><td> + <p>The max age value that should be used in the HSTS header. Negative + values will be treated as zero. If not specified, the default value of + <code>0</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">hstsIncludeSubDomains</code></td><td> + <p>Should the includeSubDomains parameter be included in the HSTS + header. If not specified, the default value of <code>false</code> will + be used.</p> + </td></tr><tr><td><code class="attributeName">hstsPreload</code></td><td> + <p>Should the preload parameter be included in the HSTS header. If not + specified, the default value of <code>false</code> will be used. See + <a href="https://hstspreload.org/">https://hstspreload.org</a> for + important information about this parameter.</p> + </td></tr><tr><td><code class="attributeName">antiClickJackingEnabled</code></td><td> + <p>Should the anti click-jacking header (<code>X-Frame-Options</code>) + be set on the response. Any anti click-jacking header already present + will be replaced. If not specified, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">antiClickJackingOption</code></td><td> + <p>What value should be used for the anticlick-jacking header? Must be + one of <code>DENY</code>, <code>SAMEORIGIN</code>, + <code>ALLOW-FROM </code> (case-insensitive). If not specified, the + default value of <code>DENY</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">antiClickJackingUri</code></td><td> + <p>If ALLOW-FROM is used for <strong>antiClickJackingOption</strong>, + what URI should be allowed? If not specified, the default value of an + empty string will be used.</p> + </td></tr><tr><td><code class="attributeName">blockContentTypeSniffingEnabled</code></td><td> + <p>Should the header that blocks content type sniffing + (<code>X-Content-Type-Options</code>) be set on every response. If + already present, the header will be replaced. If not specified, the + default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">xssProtectionEnabled</code></td><td> + <p>Should the header that enables the browser's cross-site scripting + filter protection (<code>X-XSS-Protection: 1; mode=block</code>) + be set on every response. If already present, the header + will be replaced. If not specified, the default value of + <code>true</code> will be used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Remote_Address_Filter">Remote Address Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Remote_Address_Filter/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Remote Address Filter</strong> allows you to compare the + IP address of the client that submitted this request against one or more + <em>regular expressions</em>, and either allow the request to continue + or refuse to process the request from this client. </p> + + <p>The syntax for <em>regular expressions</em> is different than that for + 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code> + package. Please consult the Java documentation for details of the + expressions supported.</p> + + <p><strong>Note:</strong> There is a caveat when using this filter with + IPv6 addresses. Format of the IP address that this valve is processing + depends on the API that was used to obtain it. If the address was obtained + from Java socket using Inet6Address class, its format will be + <code>x:x:x:x:x:x:x:x</code>. That is, the IP address for localhost + will be <code>0:0:0:0:0:0:0:1</code> instead of the more widely used + <code>::1</code>. Consult your access logs for the actual value.</p> + + <p>See also: <a href="#Remote_Host_Filter">Remote Host Filter</a>.</p> + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Remote Address Filter is + <strong><code>org.apache.catalina.filters.RemoteAddrFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The <strong>Remote Address Filter</strong> supports the following + initialisation parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allow</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's IP address is compared to. If this attribute + is specified, the remote address MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote address matches a <code>deny</code> + pattern.</p> + </td></tr><tr><td><code class="attributeName">deny</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's IP address is compared to. If this attribute + is specified, the remote address MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the <code>accept</code> attribute.</p> + </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>. For example, + it can be set to the value <code>404</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Example">Example</h4><div class="text"> + <p>To allow access only for the clients connecting from localhost:</p> +<div class="codeBox"><pre><code> <filter> + <filter-name>Remote Address Filter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class> + <init-param> + <param-name>allow</param-name> + <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value> + </init-param> + </filter> + <filter-mapping> + <filter-name>Remote Address Filter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping></code></pre></div> + </div></div> + +</div><h3 id="Remote_Host_Filter">Remote Host Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Remote_Host_Filter/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Remote Host Filter</strong> allows you to compare the + hostname of the client that submitted this request against one or more + <em>regular expressions</em>, and either allow the request to continue + or refuse to process the request from this client. </p> + + <p>The syntax for <em>regular expressions</em> is different than that for + 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code> + package. Please consult the Java documentation for details of the + expressions supported.</p> + + <p><strong>Note:</strong> This filter processes the value returned by + method <code>ServletRequest.getRemoteHost()</code>. To allow the method + to return proper host names, you have to enable "DNS lookups" feature on + a <strong>Connector</strong>.</p> + + <p>See also: <a href="#Remote_Address_Filter">Remote Address Filter</a>, + <a href="http.html">HTTP Connector</a> configuration.</p> + </div></div> + + <div class="subsection"><h4 id="Remote_Host_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Remote Address Filter is + <strong><code>org.apache.catalina.filters.RemoteHostFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Remote_Host_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The <strong>Remote Host Filter</strong> supports the following + initialisation parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allow</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote hostname matches a <code>deny</code> + pattern.</p> + </td></tr><tr><td><code class="attributeName">deny</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the <code>accept</code> attribute.</p> + </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>. For example, + it can be set to the value <code>404</code>.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Remote_IP_Filter">Remote IP Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Remote_IP_Filter/Introduction">Introduction</h4><div class="text"> + + <p>Tomcat port of + <a href="http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html">mod_remoteip</a>, + this filter replaces the apparent client remote IP address and hostname for + the request with the IP address list presented by a proxy or a load balancer + via a request headers (e.g. "X-Forwarded-For").</p> + + <p>Another feature of this filter is to replace the apparent scheme + (http/https), server port and <code>request.secure</code> with the scheme presented + by a proxy or a load balancer via a request header + (e.g. "X-Forwarded-Proto").</p> + + <p>If used in conjunction with Remote Address/Host filters then this filter + should be defined first to ensure that the correct client IP address is + presented to the Remote Address/Host filters.</p> + + <p><strong>Note:</strong> By default this filter has no effect on the + values that are written into access log. The original values are restored + when request processing leaves the filter and that always happens earlier + than access logging. To pass the remote address, remote host, server port + and protocol values set by this filter to the access log, + they are put into request attributes. Publishing these values here + is enabled by default, but <code>AccessLogValve</code> should be explicitly + configured to use them. See documentation for + <code>requestAttributesEnabled</code> attribute of + <code>AccessLogValve</code>.</p> + + <p>The names of request attributes that are set by this filter + and can be used by access logging are the following:</p> + + <ul> + <li><code>org.apache.catalina.AccessLog.RemoteAddr</code></li> + <li><code>org.apache.catalina.AccessLog.RemoteHost</code></li> + <li><code>org.apache.catalina.AccessLog.Protocol</code></li> + <li><code>org.apache.catalina.AccessLog.ServerPort</code></li> + <li><code>org.apache.tomcat.remoteAddr</code></li> + </ul> + + </div></div> + + <div class="subsection"><h4 id="Remote_IP_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Remote IP Filter is + <strong><code>org.apache.catalina.filters.RemoteIpFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Basic_configuration_to_handle_'x-forwarded-for'">Basic configuration to handle 'x-forwarded-for'</h4><div class="text"> + <p> + The filter will process the <code>x-forwarded-for</code> http header. + </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + </filter> + + <filter-mapping> + <filter-name>RemoteIpFilter</filter-name> + <url-pattern>/*</url-pattern> + <dispatcher>REQUEST</dispatcher> + </filter-mapping></code></pre></div> + </div></div> + + <div class="subsection"><h4 id="Basic_configuration_to_handle_'x-forwarded-for'_and_'x-forwarded-proto'">Basic configuration to handle 'x-forwarded-for' and 'x-forwarded-proto'</h4><div class="text"> + + <p> + The filter will process <code>x-forwarded-for</code> and + <code>x-forwarded-proto</code> http headers. Expected value for the + <code>x-forwarded-proto</code> header in case of SSL connections is + <code>https</code> (case insensitive). </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + <init-param> + <param-name>protocolHeader</param-name> + <param-value>x-forwarded-proto</param-value> + </init-param> + </filter> + + <filter-mapping> + <filter-name>RemoteIpFilter</filter-name> + <url-pattern>/*</url-pattern> + <dispatcher>REQUEST</dispatcher> + </filter-mapping></code></pre></div> + </div></div> + + <div class="subsection"><h4 id="Advanced_configuration_with_internal_proxies">Advanced configuration with internal proxies</h4><div class="text"> + <p>RemoteIpFilter configuration: </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + <init-param> + <param-name>allowedInternalProxies</param-name> + <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value> + </init-param> + <init-param> + <param-name>remoteIpHeader</param-name> + <param-value>x-forwarded-for</param-value> + </init-param> + <init-param> + <param-name>remoteIpProxiesHeader</param-name> + <param-value>x-forwarded-by</param-value> + </init-param> + <init-param> + <param-name>protocolHeader</param-name> + <param-value>x-forwarded-proto</param-value> + </init-param> + </filter></code></pre></div> + <p>Request values:</p> + <table class="defaultTable"> + <tr> + <th>Property</th> + <th>Value Before RemoteIpFilter</th> + <th>Value After RemoteIpFilter</th> + </tr> + <tr> + <td> request.remoteAddr </td> + <td> 192.168.0.10 </td> + <td> 140.211.11.130 </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td> + <td> 140.211.11.130, 192.168.0.10 </td> + <td> null </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td> + <td> null </td> + <td> null </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-proto'<code>]</code> </td> + <td> https </td> + <td> https </td> + </tr> + <tr> + <td> request.scheme </td> + <td> http </td> + <td> https </td> + </tr> + <tr> + <td> request.secure </td> + <td> false </td> + <td> true </td> + </tr> + <tr> + <td> request.serverPort </td> + <td> 80 </td> + <td> 443 </td> + </tr> + </table> + + <p> + Note : <code>x-forwarded-by</code> header is <code>null</code> because only + internal proxies has been traversed by the request. + <code>x-forwarded-for</code> is <code>null</code> because all the proxies are + trusted or internal. + </p> + </div></div> + + + <div class="subsection"><h4 id="Advanced_configuration_with_trusted_proxies">Advanced configuration with trusted proxies</h4><div class="text"> + <p>RemoteIpFilter configuration: </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + <init-param> + <param-name>allowedInternalProxies</param-name> + <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value> + </init-param> + <init-param> + <param-name>remoteIpHeader</param-name> + <param-value>x-forwarded-for</param-value> + </init-param> + <init-param> + <param-name>remoteIpProxiesHeader</param-name> + <param-value>x-forwarded-by</param-value> + </init-param> + <init-param> + <param-name>trustedProxies</param-name> + <param-value>proxy1|proxy2</param-value> + </init-param> + </filter></code></pre></div> + <p>Request values:</p> + <table class="defaultTable"> + <tr> + <th>Property</th> + <th>Value Before RemoteIpFilter</th> + <th>Value After RemoteIpFilter</th> + </tr> + <tr> + <td> request.remoteAddr </td> + <td> 192.168.0.10 </td> + <td> 140.211.11.130 </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td> + <td> 140.211.11.130, proxy1, proxy2 </td> + <td> null </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td> + <td> null </td> + <td> proxy1, proxy2 </td> + </tr> + </table> + + <p> + Note : <code>proxy1</code> and <code>proxy2</code> are both trusted proxies that + come in <code>x-forwarded-for</code> header, they both are migrated in + <code>x-forwarded-by</code> header. <code>x-forwarded-for</code> is <code>null</code> + because all the proxies are trusted or internal. + </p> + </div></div> + + <div class="subsection"><h4 id="Advanced_configuration_with_internal_and_trusted_proxies">Advanced configuration with internal and trusted proxies</h4><div class="text"> + <p>RemoteIpFilter configuration: </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + <init-param> + <param-name>allowedInternalProxies</param-name> + <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value> + </init-param> + <init-param> + <param-name>remoteIpHeader</param-name> + <param-value>x-forwarded-for</param-value> + </init-param> + <init-param> + <param-name>remoteIpProxiesHeader</param-name> + <param-value>x-forwarded-by</param-value> + </init-param> + <init-param> + <param-name>trustedProxies</param-name> + <param-value>proxy1|proxy2</param-value> + </init-param> + </filter></code></pre></div> + <p>Request values:</p> + <table class="defaultTable"> + <tr> + <th>Property</th> + <th>Value Before RemoteIpFilter</th> + <th>Value After RemoteIpFilter</th> + </tr> + <tr> + <td> request.remoteAddr </td> + <td> 192.168.0.10 </td> + <td> 140.211.11.130 </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td> + <td> 140.211.11.130, proxy1, proxy2, 192.168.0.10 </td> + <td> null </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td> + <td> null </td> + <td> proxy1, proxy2 </td> + </tr> + </table> + + <p> + Note : <code>proxy1</code> and <code>proxy2</code> are both trusted proxies that + come in <code>x-forwarded-for</code> header, they both are migrated in + <code>x-forwarded-by</code> header. As <code>192.168.0.10</code> is an internal + proxy, it does not appear in <code>x-forwarded-by</code>. + <code>x-forwarded-for</code> is <code>null</code> because all the proxies are + trusted or internal. + </p> + </div></div> + + <div class="subsection"><h4 id="Advanced_configuration_with_an_untrusted_proxy">Advanced configuration with an untrusted proxy</h4><div class="text"> + + <p>RemoteIpFilter configuration: </p> + <div class="codeBox"><pre><code> <filter> + <filter-name>RemoteIpFilter</filter-name> + <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class> + <init-param> + <param-name>allowedInternalProxies</param-name> + <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value> + </init-param> + <init-param> + <param-name>remoteIpHeader</param-name> + <param-value>x-forwarded-for</param-value> + </init-param> + <init-param> + <param-name>remoteIpProxiesHeader</param-name> + <param-value>x-forwarded-by</param-value> + </init-param> + <init-param> + <param-name>trustedProxies</param-name> + <param-value>proxy1|proxy2</param-value> + </init-param> + </filter></code></pre></div> + <p>Request values:</p> + <table class="defaultTable"> + <tr> + <th>Property</th> + <th>Value Before RemoteIpFilter</th> + <th>Value After RemoteIpFilter</th> + </tr> + <tr> + <td> request.remoteAddr </td> + <td> 192.168.0.10 </td> + <td> untrusted-proxy </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-for'<code>]</code> </td> + <td> 140.211.11.130, untrusted-proxy, proxy1 </td> + <td> 140.211.11.130 </td> + </tr> + <tr> + <td> request.header<code>[</code>'x-forwarded-by'<code>]</code> </td> + <td> null </td> + <td> proxy1 </td> + </tr> + </table> + + <p> + Note : <code>x-forwarded-by</code> holds the trusted proxy <code>proxy1</code>. + <code>x-forwarded-by</code> holds <code>140.211.11.130</code> because + <code>untrusted-proxy</code> is not trusted and thus, we cannot trust that + <code>untrusted-proxy</code> is the actual remote ip. + <code>request.remoteAddr</code> is <code>untrusted-proxy</code> that is an IP + verified by <code>proxy1</code>. + </p> + </div></div> + + <div class="subsection"><h4 id="Remote_IP_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The <strong>Remote IP Filter</strong> supports the + following initialisation parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">remoteIpHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the list of + traversed IP addresses starting from the requesting client. If not + specified, the default of <code>x-forwarded-for</code> is used.</p> + </td></tr><tr><td><code class="attributeName">internalProxies</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that a + proxy's IP address must match to be considered an internal proxy. + Internal proxies that appear in the <strong>remoteIpHeader</strong> will + be trusted and will not appear in the <strong>proxiesHeader</strong> + value. If not specified the default value of <code> + 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3} + </code> will be used.</p> + </td></tr><tr><td><code class="attributeName">proxiesHeader</code></td><td> + <p>Name of the HTTP header created by this valve to hold the list of + proxies that have been processed in the incoming + <strong>remoteIpHeader</strong>. If not specified, the default of + <code>x-forwarded-by</code> is used.</p> + </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td> + <p>Set to <code>true</code> to set the request attributes used by + AccessLog implementations to override the values returned by the + request for remote address, remote host, server port and protocol. + Request attributes are also used to enable the forwarded remote address + to be displayed on the status page of the Manager web application. + If not set, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">trustedProxies</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that a + proxy's IP address must match to be considered an trusted proxy. + Trusted proxies that appear in the <strong>remoteIpHeader</strong> will + be trusted and will appear in the <strong>proxiesHeader</strong> value. + If not specified, no proxies will be trusted.</p> + </td></tr><tr><td><code class="attributeName">protocolHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the protocol + used by the client to connect to the proxy. If not specified, the + default of <code>null</code> is used.</p> + </td></tr><tr><td><code class="attributeName">portHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the port + used by the client to connect to the proxy. If not specified, the + default of <code>null</code> is used.</p> + </td></tr><tr><td><code class="attributeName">protocolHeaderHttpsValue</code></td><td> + <p>Value of the <strong>protocolHeader</strong> to indicate that it is + an HTTPS request. If not specified, the default of <code>https</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">httpServerPort</code></td><td> + <p>Value returned by <code>ServletRequest.getServerPort()</code> + when the <strong>protocolHeader</strong> indicates <code>http</code> + protocol and no <strong>portHeader</strong> is present. If not + specified, the default of <code>80</code> is used.</p> + </td></tr><tr><td><code class="attributeName">httpsServerPort</code></td><td> + <p>Value returned by <code>ServletRequest.getServerPort()</code> + when the <strong>protocolHeader</strong> indicates <code>https</code> + protocol and no <strong>portHeader</strong> is present. If not + specified, the default of <code>443</code> is used.</p> + </td></tr><tr><td><code class="attributeName">changeLocalPort</code></td><td> + <p>If <code>true</code>, the value returned by + <code>ServletRequest.getLocalPort()</code> and + <code>ServletRequest.getServerPort()</code> is modified by the this + filter. If not specified, the default of <code>false</code> is used.</p> + </td></tr></table> + + + </div></div> + +</div><h3 id="Request_Dumper_Filter">Request Dumper Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Request_Dumper_Filter/Introduction">Introduction</h4><div class="text"> + + <p>The Request Dumper Filter logs information from the request and response + objects and is intended to be used for debugging purposes. When using this + Filter, it is recommended that the + <code>org.apache.catalina.filter.RequestDumperFilter</code> logger is + directed to a dedicated file and that the + <code>org.apache.juli.VerbatimFormatter</code> is used.</p> + + <p><strong>WARNING: Using this filter has side-effects.</strong> The + output from this filter includes any parameters included with the request. + The parameters will be decoded using the default platform encoding. Any + subsequent calls to <code>request.setCharacterEncoding()</code> within + the web application will have no effect.</p> + + </div></div> + + <div class="subsection"><h4 id="Request_Dumper_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Request Dumper Filter is + <strong><code>org.apache.catalina.filters.RequestDumperFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Request_Dumper_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The Request Dumper Filter does not support any initialization + parameters.</p> + + </div></div> + + <div class="subsection"><h4 id="Request_Dumper_Filter/Sample_Configuration">Sample Configuration</h4><div class="text"> + + <p>The following entries in a web application's web.xml would enable the + Request Dumper filter for all requests for that web application. If the + entries were added to <code>CATALINA_BASE/conf/web.xml</code>, the Request + Dumper Filter would be enabled for all web applications.</p> + <div class="codeBox"><pre><code><filter> + <filter-name>requestdumper</filter-name> + <filter-class> + org.apache.catalina.filters.RequestDumperFilter + </filter-class> +</filter> +<filter-mapping> + <filter-name>requestdumper</filter-name> + <url-pattern>*</url-pattern> +</filter-mapping></code></pre></div> + + <p>The following entries in CATALINA_BASE/conf/logging.properties would + create a separate log file for the Request Dumper Filter output.</p> + <div class="codeBox"><pre><code># To this configuration below, 1request-dumper.org.apache.juli.FileHandler +# also needs to be added to the handlers property near the top of the file +1request-dumper.org.apache.juli.FileHandler.level = INFO +1request-dumper.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +1request-dumper.org.apache.juli.FileHandler.prefix = request-dumper. +1request-dumper.org.apache.juli.FileHandler.formatter = org.apache.juli.VerbatimFormatter +org.apache.catalina.filters.RequestDumperFilter.level = INFO +org.apache.catalina.filters.RequestDumperFilter.handlers = \ + 1request-dumper.org.apache.juli.FileHandler</code></pre></div> + </div></div> +</div><h3 id="Session_Initializer_Filter">Session Initializer Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Session_Initializer_Filter/Introduction">Introduction</h4><div class="text"> + <p>The Session Initializer Filter initializes the <code>javax.servlet.http.HttpSession</code> + before the Request is processed. This is required for JSR-356 compliant WebSocket implementations, + if the <code>HttpSession</code> is needed during the HandShake phase.</p> + + <p>The Java API for WebSocket does not mandate that an <code>HttpSession</code> would + be initialized upon request, and thus <code>javax.servlet.http.HttpServletRequest</code>'s + <code>getSession()</code> returns <code>null</code> if the <code>HttpSession</code> was not + initialized in advance.</p> + + <p>This filter solves that problem by initializing the HttpSession for any <code>HttpServletRequest</code> + that matches its <code>url-pattern</code>.</p> + </div></div> + + <div class="subsection"><h4 id="Session_Initializer_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + <p>The filter class name for the Session Initializer Filter is + <strong><code>org.apache.catalina.filters.SessionInitializerFilter</code></strong>.</p> + </div></div> + + <div class="subsection"><h4 id="Session_Initializer_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + <p>The Session Initializer Filter does not support any initialization parameters.</p> + </div></div> + + <div class="subsection"><h4 id="Session_Initializer_Filter/Sample_Configuration">Sample Configuration</h4><div class="text"> + <p>The following entries in the Web Application Deployment Descriptor, <strong>web.xml</strong>, + would enable the Session Initializer Filter for requests that match the given URL pattern + (in this example, "/ws/*").</p> + + <div class="codeBox"><pre><code><filter> + <filter-name>SessionInitializer</filter-name> + <filter-class>org.apache.catalina.filters.SessionInitializerFilter</filter-class> +</filter> +<filter-mapping> + <filter-name>SessionInitializer</filter-name> + <url-pattern>/ws/*</url-pattern> +</filter-mapping></code></pre></div> + </div></div> +</div><h3 id="Set_Character_Encoding_Filter">Set Character Encoding Filter</h3><div class="text"> + + <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Introduction">Introduction</h4><div class="text"> + + <p>User agents don't always include character encoding information in + requests. Depending on the how the request is processed, usually the + default encoding of ISO-8859-1 is used. This is not always + desirable. This filter provides options for setting that encoding or + forcing it to a particular value. Essentially this filter calls + <code>ServletRequest.setCharacterEncoding()</code> method.</p> + + <p>Effectively the value set by this filter is used when parsing parameters + in a POST request, if parameter parsing occurs later than this filter. Thus + the order of filter mappings is important. Note that the encoding for GET + requests is not set here, but on a <b>Connector</b>. See + CharacterEncoding page in the FAQ for details.</p> + + </div></div> + + <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the Set Character Encoding Filter is + <strong><code>org.apache.catalina.filters.SetCharacterEncodingFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="Set_Character_Encoding_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The Set Character Encoding Filter supports the following initialization + parameters:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">encoding</code></strong></td><td> + <p>Name of the character encoding which should be set.</p> + </td></tr><tr><td><code class="attributeName">ignore</code></td><td> + <p>Determines if any character encoding specified by the user agent is + ignored. If this attribute is <code>true</code>, any value provided by + the user agent is ignored. If <code>false</code>, the encoding is only + set if the user agent did not specify an encoding. The default value + is <code>false</code>.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="WebDAV_Fix_Filter">WebDAV Fix Filter</h3><div class="text"> + + <div class="subsection"><h4 id="WebDAV_Fix_Filter/Introduction">Introduction</h4><div class="text"> + + <p>Microsoft operating systems have two WebDAV clients. One is used with + port 80, the other is used for all other ports. The implementation used with + port 80 does not adhere to the WebDAV specification and fails when trying to + communicate with the Tomcat WebDAV Servlet. This Filter provides a fix for + this by forcing the use of the WebDAV implementation that works, even when + connecting via port 80.</p> + + </div></div> + + <div class="subsection"><h4 id="WebDAV_Fix_Filter/Filter_Class_Name">Filter Class Name</h4><div class="text"> + + <p>The filter class name for the WebDAV Fix Filter is + <strong><code>org.apache.catalina.filters.WebdavFixFilter</code> + </strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="WebDAV_Fix_Filter/Initialisation_parameters">Initialisation parameters</h4><div class="text"> + + <p>The WebDAV Fix Filter does not support any initialization parameters.</p> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/globalresources.html b/src/tomcat/webapps/docs/config/globalresources.html new file mode 100644 index 0000000000000000000000000000000000000000..2ca615c422bad74048cae5bb5f16009883d29b83 --- /dev/null +++ b/src/tomcat/webapps/docs/config/globalresources.html @@ -0,0 +1,258 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The GlobalNamingResources Component</title><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/globalresources"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The GlobalNamingResources Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Environment_Entries">Environment Entries</a></li><li><a href="#Resource_Definitions">Resource Definitions</a></li><li><a href="#Resource_Links">Resource Links</a></li><li><a href="#Transaction">Transaction</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>GlobalNamingResources</strong> element defines the global + JNDI resources for the <a href="server.html">Server</a>.</p> + + <p>These resources are listed in the server's global JNDI resource context. + This context is distinct from the per-web-application JNDI contexts + described in + the <a href="../jndi-resources-howto.html">JNDI Resources HOW-TO</a>. + The resources defined in this element are <strong>not</strong> visible in + the per-web-application contexts unless you explicitly link them with + <a href="context.html#Resource_Links"><ResourceLink></a> elements. + </p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="Environment_Entries">Environment Entries</h4><div class="text"> + + <p>You can configure named values that will be made visible to all + web applications as environment entry resources by nesting + <code><Environment></code> entries inside this element. For + example, you can create an environment entry like this:</p> +<div class="codeBox"><pre><code><GlobalNamingResources ...> + ... + <Environment name="maxExemptions" value="10" + type="java.lang.Integer" override="false"/> + ... +</GlobalNamingResources></code></pre></div> + + <p>This is equivalent to the inclusion of the following element in the + web application deployment descriptor (<code>/WEB-INF/web.xml</code>): + </p> +<div class="codeBox"><pre><code><env-entry> + <env-entry-name>maxExemptions</env-entry-name> + <env-entry-value>10</env-entry-value> + <env-entry-type>java.lang.Integer</env-entry-type> +</env-entry></code></pre></div> + <p>but does <em>not</em> require modification of the deployment descriptor + to customize this value.</p> + + <p>The valid attributes for an <code><Environment></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">description</code></td><td> + <p>Optional, human-readable description of this environment entry.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the environment entry to be created, relative to the + <code>java:comp/env</code> context.</p> + </td></tr><tr><td><code class="attributeName">override</code></td><td> + <p>Set this to <code>false</code> if you do <strong>not</strong> want + an <code><env-entry></code> for the same environment entry name, + found in the web application deployment descriptor, to override the + value specified here. By default, overrides are allowed.</p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>The fully qualified Java class name expected by the web application + for this environment entry. Must be a legal value for + <code><env-entry-type></code> in the web application deployment + descriptor.</p> + </td></tr><tr><td><strong><code class="attributeName">value</code></strong></td><td> + <p>The parameter value that will be presented to the application + when requested from the JNDI context. This value must be convertable + to the Java type defined by the <code>type</code> attribute.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Resource_Definitions">Resource Definitions</h4><div class="text"> + + <p>You can declare the characteristics of resources + to be returned for JNDI lookups of <code><resource-ref></code> and + <code><resource-env-ref></code> elements in the web application + deployment descriptor by defining them in this element and then linking + them with <a href="context.html#Resource_Links"><ResourceLink></a> + elements + in the <code><strong><Context></strong></code> element. + + You <strong>MUST</strong> also define any other needed parameters using + attributes on the Resource element, to configure + the object factory to be used (if not known to Tomcat already), and + the properties used to configure that object factory.</p> + + <p>For example, you can create a resource definition like this:</p> +<div class="codeBox"><pre><code><GlobalNamingResources ...> + ... + <Resource name="jdbc/EmployeeDB" auth="Container" + type="javax.sql.DataSource" + description="Employees Database for HR Applications"/> + ... +</GlobalNamingResources></code></pre></div> + + <p>This is equivalent to the inclusion of the following element in the + web application deployment descriptor (<code>/WEB-INF/web.xml</code>):</p> +<div class="codeBox"><pre><code><resource-ref> + <description>Employees Database for HR Applications</description> + <res-ref-name>jdbc/EmployeeDB</res-ref-name> + <res-ref-type>javax.sql.DataSource</res-ref-type> + <res-auth>Container</res-auth> +</resource-ref></code></pre></div> + + <p>but does <em>not</em> require modification of the deployment + descriptor to customize this value.</p> + + <p>The valid attributes for a <code><Resource></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">auth</code></td><td> + <p>Specify whether the web Application code signs on to the + corresponding resource manager programmatically, or whether the + Container will sign on to the resource manager on behalf of the + application. The value of this attribute must be + <code>Application</code> or <code>Container</code>. This + attribute is <strong>required</strong> if the web application + will use a <code><resource-ref></code> element in the web + application deployment descriptor, but is optional if the + application uses a <code><resource-env-ref></code> instead.</p> + </td></tr><tr><td><code class="attributeName">closeMethod</code></td><td> + <p>Name of the zero-argument method to call on a singleton resource when + it is no longer required. This is intended to speed up clean-up of + resources that would otherwise happen as part of garbage collection. + This attribute is ignored if the <code>singleton</code> attribute is + false. If not specified, no default is defined and no close method will + be called.</p> + <p>For Apache Commons DBCP and Apache Tomcat JDBC connection pools + you can use <code>closeMethod="close"</code>.</p> + </td></tr><tr><td><code class="attributeName">description</code></td><td> + <p>Optional, human-readable description of this resource.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The name of the resource to be created, relative to the + <code>java:comp/env</code> context.</p> + </td></tr><tr><td><code class="attributeName">scope</code></td><td> + <p>Specify whether connections obtained through this resource + manager can be shared. The value of this attribute must be + <code>Shareable</code> or <code>Unshareable</code>. By default, + connections are assumed to be shareable.</p> + </td></tr><tr><td><code class="attributeName">singleton</code></td><td> + <p>Specify whether this resource definition is for a singleton resource, + i.e. one where there is only a single instance of the resource. If this + attribute is <code>true</code>, multiple JNDI lookups for this resource + will return the same object. If this attribute is <code>false</code>, + multiple JNDI lookups for this resource will return different objects. + This attribute must be <code>true</code> for + <code>javax.sql.DataSource</code> resources to enable JMX registration + of the DataSource. The value of this attribute must be <code>true</code> + or <code>false</code>. By default, this attribute is <code>true</code>. + </p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>The fully qualified Java class name expected by the web + application when it performs a lookup for this resource.</p> + </td></tr></table> + + + </div></div> + + <div class="subsection"><h4 id="Resource_Links">Resource Links</h4><div class="text"> + <p>Use <a href="context.html#Resource_Links"><code><ResourceLink></code></a> + elements to link resources from the global context into + per-web-application contexts. Here is an example of making a custom + factory available to an application, based on the example definition in the + <a href="../jndi-resources-howto.html#Generic_JavaBean_Resources"> + JNDI Resource HOW-TO</a>: + </p> + + <div class="codeBox"><pre><code><Context> + <ResourceLink + name="bean/MyBeanFactory" + global="bean/MyBeanFactory" + type="com.mycompany.MyBean" + /> +</Context></code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="Transaction">Transaction</h4><div class="text"> + + <p>You can declare the characteristics of the UserTransaction + to be returned for JNDI lookup for <code>java:comp/UserTransaction</code>. + You <strong>MUST</strong> define an object factory class to instantiate + this object as well as the needed resource parameters as attributes of the + <code>Transaction</code> + element, and the properties used to configure that object factory.</p> + + <p>The valid attributes for the <code><Transaction></code> element + are as follows:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td> + <p>The class name for the JNDI object factory.</p> + </td></tr></table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/host.html b/src/tomcat/webapps/docs/config/host.html new file mode 100644 index 0000000000000000000000000000000000000000..ba1d5fa8026d63a9a84dc166ca4bad50e8cbd920 --- /dev/null +++ b/src/tomcat/webapps/docs/config/host.html @@ -0,0 +1,630 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Host Container</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/host"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Host Container</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li><li><a href="#Access_Logs">Access Logs</a></li><li><a href="#Automatic_Application_Deployment">Automatic Application Deployment</a></li><li><a href="#Host_Name_Aliases">Host Name Aliases</a></li><li><a href="#Lifecycle_Listeners">Lifecycle Listeners</a></li><li><a href="#Request_Filters">Request Filters</a></li><li><a href="#Single_Sign_On">Single Sign On</a></li><li><a href="#User_Web_Applications">User Web Applications</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Host</strong> element represents a <em>virtual host</em>, + which is an association of a network name for a server (such as + "www.mycompany.com") with the particular server on which Tomcat is running. + For clients to be able to connect to a Tomcat server using its network name, + this name must be registered in the <em>Domain Name Service</em> (DNS) server + that manages the Internet domain you belong to - contact your Network + Administrator for more information.</p> + + <p>In many cases, System Administrators wish to associate more than + one network name (such as <code>www.mycompany.com</code> and + <code>company.com</code>) with the same virtual host and applications. + This can be accomplished using the <a href="#Host_Name_Aliases">Host + Name Aliases</a> feature discussed below.</p> + + <p>One or more <strong>Host</strong> elements are nested inside an + <a href="engine.html">Engine</a> element. Inside the Host element, you + can nest <a href="context.html">Context</a> elements for the web + applications associated with this virtual host. Exactly one of the Hosts + associated with each Engine MUST have a name matching the + <code>defaultHost</code> attribute of that Engine.</p> + + <p>Clients normally use host names to identify the server they wish to connect + to. This host name is also included in the HTTP request headers. Tomcat + extracts the host name from the HTTP headers and looks for a + <strong>Host</strong> with a matching name. If no match is found, the request + is routed to the default host. The name of the default host does not have to + match a DNS name (although it can) since any request where the DNS name does + not match the name of a <strong>Host</strong> element will be routed to the + default host.</p> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Host</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">appBase</code></strong></td><td> + <p>The <em>Application Base</em> directory for this virtual host. + This is the pathname of a directory that may contain web applications + to be deployed on this virtual host. You may specify an + absolute pathname, or a pathname that is relative to the + <code>$CATALINA_BASE</code> directory. See + <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information on automatic recognition and + deployment of web applications. If not specified, the default of + <code>webapps</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">xmlBase</code></td><td> + <p>The <em>XML Base</em> directory for this virtual host. + This is the pathname of a directory that may contain context XML + descriptors to be deployed on this virtual host. You may specify an + absolute pathname for this directory, or a pathname that is relative + to the <code>$CATALINA_BASE</code> directory. See + <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information on automatic recognition and + deployment of web applications. If not specified the default of + <code>conf/<engine_name>/<host_name></code> will be used.</p> + </td></tr><tr><td><code class="attributeName">createDirs</code></td><td> + <p>If set to true, Tomcat will attempt to create the directories defined + by the attributes <code>appBase</code> and <code>xmlBase</code> during + the startup phase. The default value is <code>true</code>. If set to + true, and directory creation fails, an error message will be printed out + but will not halt the startup sequence.</p> + </td></tr><tr><td><code class="attributeName">autoDeploy</code></td><td> + <p>This flag value indicates if Tomcat should check periodically for new + or updated web applications while Tomcat is running. If true, Tomcat + periodically checks the <code>appBase</code> and <code>xmlBase</code> + directories and deploys any new web applications or context XML + descriptors found. Updated web applications or context XML descriptors + will trigger a reload of the web application. The flag's value defaults + to true. See + <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information.</p> + </td></tr><tr><td><code class="attributeName">backgroundProcessorDelay</code></td><td> + <p>This value represents the delay in seconds between the + invocation of the backgroundProcess method on this host and + its child containers, including all contexts. + Child containers will not be invoked if their delay value is not + negative (which would mean they are using their own processing + thread). Setting this to a positive value will cause + a thread to be spawn. After waiting the specified amount of time, + the thread will invoke the backgroundProcess method on this host + and all its child containers. A host will use background processing to + perform live web application deployment related tasks. If not + specified, the default value for this attribute is -1, which means + the host will rely on the background processing thread of its parent + engine.</p> + </td></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Host</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><code class="attributeName">deployIgnore</code></td><td> + <p>A regular expression defining paths to ignore when + <code>autoDeploy</code> and <code>deployOnStartup</code> are set. This + allows you to keep your configuration in a version control system, for + example, and not deploy a .svn or CVS folder that happens to be in the + <code>appBase</code>.</p> + <p>This regular expression is relative to <code>appBase</code>. It is + also <em>anchored</em>, meaning the match is performed against the + entire file/directory name. So, <code>foo</code> matches only a file or + directory named <code>foo</code> but not <code>foo.war</code>, + <code>foobar</code>, or <code>myfooapp</code>. To match anything with + "foo", you could use <code>.*foo.*</code>.</p> + <p>See <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information.</p> + </td></tr><tr><td><code class="attributeName">deployOnStartup</code></td><td> + <p>This flag value indicates if web applications from this host should + be automatically deployed when Tomcat starts. The flag's value defaults + to true. See + <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information.</p> + </td></tr><tr><td><code class="attributeName">failCtxIfServletStartFails</code></td><td> + <p>Set to <code>true</code> to have each child contexts fail its startup + if any of its servlet that has load-on-startup >=0 fails its own + startup.</p> + <p>Each child context may override this attribute.</p> + <p>If not specified, the default value of <code>false</code> is + used.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>Usually the network name of this virtual host, as registered in your + <em>Domain Name Service</em> server. Regardless of the case used to + specify the host name, Tomcat will convert it to lower case internally. + One of the Hosts nested within an <a href="engine.html">Engine</a> MUST + have a name that matches the <code>defaultHost</code> setting for that + Engine. See <a href="#Host_Name_Aliases">Host Name Aliases</a> for + information on how to assign more than one network name to the same + virtual host. If the name takes the form of <code>*.domainname</code> + (e.g. <code>*.apache.org</code>) then it will be treated as a match for + any host in that domain unless a host that has an exactly matching name + is found.</p> + </td></tr><tr><td><code class="attributeName">startStopThreads</code></td><td> + <p>The number of threads this <strong>Host</strong> will use to start + child <a href="context.html">Context</a> elements in parallel. The same + thread pool will be used to deploy new + <a href="context.html">Context</a>s if automatic deployment is being + used. The special value of 0 will result in the value of + <code>Runtime.getRuntime().availableProcessors()</code> being used. + Negative values will result in + <code>Runtime.getRuntime().availableProcessors() + value</code> being + used unless this is less than 1 in which case 1 thread will be used. If + not specified, the default value of 1 will be used. If 1 thread is + used then rather than using an <code>ExecutorService</code> the current + thread will be used.</p> + </td></tr><tr><td><code class="attributeName">undeployOldVersions</code></td><td> + <p>This flag determines if Tomcat, as part of the auto deployment + process, will check for old, unused versions of web applications + deployed using parallel deployment and, if any are found, remove them. + This flag only applies if <code>autoDeploy</code> is true. If not + specified the default value of false will be used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Host</strong> is + <strong>org.apache.catalina.core.StandardHost</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">copyXML</code></td><td> + <p>Set to <code>true</code> if you want a context XML descriptor + embedded inside the application (located at + <code>/META-INF/context.xml</code>) to be copied to <code>xmlBase</code> + when the application is deployed. On subsequent starts, the copied + context XML descriptor will be used in preference to any context XML + descriptor embedded inside the application even if the descriptor + embedded inside the application is more recent. The flag's value + defaults to <code>false</code>. Note if <strong>deployXML</strong> + is <code>false</code>, this attribute will have no effect.</p> + </td></tr><tr><td><code class="attributeName">deployXML</code></td><td> + <p>Set to <code>false</code> if you want to disable parsing the context + XML descriptor embedded inside the application (located at + <code>/META-INF/context.xml</code>). Security conscious environments + should set this to <code>false</code> to prevent applications from + interacting with the container's configuration. The administrator will + then be responsible for providing an external context configuration + file, and putting it in the location defined by the + <strong>xmlBase</strong> attribute. If this flag is <code>false</code>, + a descriptor is located at <code>/META-INF/context.xml</code> and no + descriptor is present in <strong>xmlBase</strong> then the context will + fail to start in case the descriptor contains necessary configuration + for secure deployment (such as a RemoteAddrValve) which should not be + ignored. The flag's value defaults to <code>true</code> unless a + security manager is enabled when the default is <code>false</code>. + When running under a security manager this may be enabled on a per web + application basis by granting the + <code>org.apache.catalina.security.DeployXmlPermission</code> to the web + application. The Manager and Host Manager applications are granted this + permission by default so that they continue to work when running under a + security manager.</p> + </td></tr><tr><td><code class="attributeName">errorReportValveClass</code></td><td> + <p>Java class name of the error reporting valve which will be used + by this Host. The responsibility of this valve is to output error + reports. Setting this property allows to customize the look of the + error pages which will be generated by Tomcat. This class must + implement the + <code>org.apache.catalina.Valve</code> interface. If none is specified, + the value <code>org.apache.catalina.valves.ErrorReportValve</code> + will be used by default.</p> + </td></tr><tr><td><code class="attributeName">unpackWARs</code></td><td> + <p>Set to <code>true</code> if you want web applications that are + placed in the <code>appBase</code> directory as web application + archive (WAR) files to be unpacked into a corresponding disk directory + structure, <code>false</code> to run such web applications directly + from a WAR file. See + <a href="#Automatic_Application_Deployment">Automatic Application + Deployment</a> for more information.</p> + <p>Note: If Tomcat expands the WAR file then it will add a file + (<code>/META-INF/war-tracking</code>) to the unpacked directory + structure which it uses to detect changes in the WAR file while Tomcat + is not running. Any such change will trigger the deletion of the + expanded directory and the deployment of the updated WAR file when + Tomcat next starts.</p> + <p>Note: Running with this option set to <code>false</code> will incur + a performance penalty. To avoid a significant performance penalty, the + web application should be configured such that class scanning for + Servlet 3.0+ pluggability features is not required. Users may also wish + to consider the <strong>ExtractingRoot</strong> + <a href="resources.html">Resources</a> implementation.</p> + </td></tr><tr><td><code class="attributeName">workDir</code></td><td> + <p>Pathname to a scratch directory to be used by applications for + this Host. Each application will have its own sub directory with + temporary read-write use. Configuring a Context workDir will override + use of the Host workDir configuration. This directory will be made + visible to servlets in the web application by a servlet context + attribute (of type <code>java.io.File</code>) named + <code>javax.servlet.context.tempdir</code> as described in the + Servlet Specification. If not specified, a suitable directory + underneath <code>$CATALINA_BASE/work</code> will be provided.</p> + </td></tr></table> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>You can nest one or more <a href="context.html">Context</a> elements + inside this <strong>Host</strong> element, each representing a different web + application associated with this virtual host.</p> + + <p>You can nest at most one instance of the following utility components + by nesting a corresponding element inside your <strong>Host</strong> + element:</p> + <ul> + <li><a href="realm.html"><strong>Realm</strong></a> - + Configure a realm that will allow its + database of users, and their associated roles, to be shared across all + <a href="context.html">Contexts</a> nested inside this Host (unless + overridden by a <a href="realm.html">Realm</a> configuration + at a lower level).</li> + </ul> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="Logging">Logging</h4><div class="text"> + + <p>A host is associated with the + <code>org.apache.catalina.core.ContainerBase.[engine_name].[host_name]</code> + log category. Note that the brackets are part of the name, + don't omit them.</p> + + </div></div> + + + <div class="subsection"><h4 id="Access_Logs">Access Logs</h4><div class="text"> + + <p>When you run a web server, one of the output files normally generated + is an <em>access log</em>, which generates one line of information for + each request processed by the server, in a standard format. Catalina + includes an optional <a href="valve.html">Valve</a> implementation that + can create access logs in the same standard format created by web servers, + or in any number of custom formats.</p> + + <p>You can ask Catalina to create an access log for all requests + processed by an <a href="engine.html">Engine</a>, + <a href="host.html">Host</a>, or <a href="context.html">Context</a> + by nesting a <a href="valve.html">Valve</a> element like this:</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.valves.AccessLogValve" + prefix="localhost_access_log" suffix=".txt" + pattern="common"/> + ... +</Host></code></pre></div> + + <p>See <a href="valve.html#Access_Logging">Access Logging Valves</a> + for more information on the configuration attributes that are + supported.</p> + + </div></div> + + + <div class="subsection"><h4 id="Automatic_Application_Deployment">Automatic Application Deployment</h4><div class="text"> + + <p>If you are using the standard <strong>Host</strong> implementation with + default settings then applications in the <em>appBase</em> or with context + files in the <em>configBase</em> are automatically deployed when Tomcat + starts (the <code>deployOnStartup</code> property defaults to + <code>true</code>) and reloaded or redeployed (as appropriate) when a change + is detected while Tomcat is running (the <code>autoDeploy</code> attribute + also defaults to <code>true</code>).</p> + + <p><code>deployOnStartup</code> and <code>autoDeploy</code> trigger + execution of exactly the same code so the behaviour is very similar. + However, there is one key difference. When Tomcat starts it has no knowledge + of which files are the same, which have been changed and which are new. It + therefore treats all files as new. While Tomcat is running, it can + differentiate between unchanged, modified and new files. This leads to some + differences in behaviour between files being modified while Tomcat is + running and files being modified while Tomcat is stopped.</p> + + <p>When you use automatic deployment, related files (a web application may + have a context.xml file, a WAR and a directory) that exist in the + <strong>Host</strong>'s <em>appBase</em> and/or <em>configBase</em> + must conform to the expected <a href="context.html#Naming">naming + convention</a>. In short, this means files for the same web application must + share the same <em>base name</em>.</p> + + <p>The automatic deployment process identifies new and/or modified web + applications using the following search order:</p> + + <ol> + <li>Web applications with a context.xml file located in the Host's + <em>configBase</em>.</li> + <li>Web applications with a WAR file located in the Host's + <em>appBase</em> that have not already been identified during the scan for + context.xml files.</li> + <li>Web applications with a directory located in the Host's + <em>appBase</em> that have not already been identified during the scans + for context.xml and/or WAR files.</li> + </ol> + + <p>When <code>autoDeploy</code> is <code>true</code>, the automatic + deployment process will monitor the deployed web applications for changes. + Depending on exactly what changes, the web application will either be + re-deployed or reloaded. Re-deployment involves the creation of a new web + application and, if using the standard session manager, user sessions will + not be retained. Reloading uses the existing web application but re-parses + the web.xml and reloads any classes. If using the standard session manager, + user sessions will be persisted.</p> + + <p>Users may add to the files that the automatic deployment process monitors + for reloading (i.e. any change to one of these files triggers a reload of + the web application) by adding a <em>WatchedResources</em> element to the + context.xml file. See the + <a href="context.html#Nested_Components">Context</a> documentation for + further details.</p> + + <p>When using automatic deployment, the <code>docBase</code> defined by + an XML <a href="context.html">Context</a> file should be outside of the + <code>appBase</code> directory. If this is not the case, difficulties + may be experienced deploying the web application or the application may + be deployed twice. The <code>deployIgnore</code> attribute can be used + to avoid this situation.</p> + + <p>Note that if you are defining contexts explicitly in server.xml, you + should probably turn off automatic application deployment or specify + <code>deployIgnore</code> carefully. Otherwise, the web applications + will each be deployed twice, and that may cause problems for the + applications.</p> + + <p>There are many possible combinations of settings, new files, changed + files and deleted files. A separate page describes the + <a href="automatic-deployment.html">expected behaviour of the automatic + deployment process</a> in many of these scenarios.</p> + + </div></div> + + + <div class="subsection"><h4 id="Host_Name_Aliases">Host Name Aliases</h4><div class="text"> + + <p>In many server environments, Network Administrators have configured + more than one network name (in the <em>Domain Name Service</em> (DNS) + server), that resolve to the IP address of the same server. Normally, + each such network name would be configured as a separate + <strong>Host</strong> element in <code>conf/server.xml</code>, each + with its own set of web applications.</p> + + <p>However, in some circumstances, it is desirable that two or more + network names should resolve to the <strong>same</strong> virtual host, + running the same set of applications. A common use case for this + scenario is a corporate web site, where it is desirable that users + be able to utilize either <code>www.mycompany.com</code> or + <code>company.com</code> to access exactly the same content and + applications.</p> + + <p>This is accomplished by utilizing one or more <strong>Alias</strong> + elements nested inside your <strong>Host</strong> element. For + example:</p> +<div class="codeBox"><pre><code><Host name="www.mycompany.com" ...> + ... + <Alias>mycompany.com</Alias> + ... +</Host></code></pre></div> + + <p>In order for this strategy to be effective, all of the network names + involved must be registered in your DNS server to resolve to the + same computer that is running this instance of Catalina.</p> + + <p>Aliases may also use the wildcard form (<code>*.domainname</code>) + permitted for the <strong>name</strong> attribute of a + <strong>Host</strong>.</p> + + </div></div> + + + <div class="subsection"><h4 id="Lifecycle_Listeners">Lifecycle Listeners</h4><div class="text"> + + <p>If you have implemented a Java object that needs to know when this + <strong>Host</strong> is started or stopped, you can declare it by + nesting a <strong>Listener</strong> element inside this element. The + class name you specify must implement the + <code>org.apache.catalina.LifecycleListener</code> interface, and + it will be notified about the occurrence of the corresponding + lifecycle events. Configuration of such a listener looks like this:</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Listener className="com.mycompany.mypackage.MyListener" ... > + ... +</Host></code></pre></div> + + <p>Note that a Listener can have any number of additional properties + that may be configured from this element. Attribute names are matched + to corresponding JavaBean property names using the standard property + method naming patterns.</p> + + </div></div> + + + <div class="subsection"><h4 id="Request_Filters">Request Filters</h4><div class="text"> + + <p>You can ask Catalina to check the IP address, or host name, on every + incoming request directed to the surrounding + <a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or + <a href="context.html">Context</a> element. The remote address or name + will be checked against configured "accept" and/or "deny" + filters, which are defined using <code>java.util.regex</code> Regular + Expression syntax. Requests that come from locations that are + not accepted will be rejected with an HTTP "Forbidden" error. + Example filter declarations:</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.valves.RemoteHostValve" + allow=".*\.mycompany\.com|www\.yourcompany\.com"/> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + deny="192\.168\.1\.\d+"/> + ... +</Host></code></pre></div> + + <p>See <a href="valve.html#Remote_Address_Filter">Remote Address Filter</a> + and <a href="valve.html#Remote_Host_Filter">Remote Host Filter</a> for + more information about the configuration options that are supported.</p> + + </div></div> + + + <div class="subsection"><h4 id="Single_Sign_On">Single Sign On</h4><div class="text"> + + <p>In many environments, but particularly in portal environments, it + is desirable to have a user challenged to authenticate themselves only + once over a set of web applications deployed on a particular virtual + host. This can be accomplished by nesting an element like this inside + the Host element for this virtual host:</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Valve className="org.apache.catalina.authenticator.SingleSignOn"/> + ... +</Host></code></pre></div> + + <p>The Single Sign On facility operates according to the following rules: + </p> + <ul> + <li>All web applications configured for this virtual host must share the + same <a href="realm.html">Realm</a>. In practice, that means you can + nest the Realm element inside this Host element (or the surrounding + <a href="engine.html">Engine</a> element), but not inside a + <a href="context.html">Context</a> element for one of the involved + web applications.</li> + <li>As long as the user accesses only unprotected resources in any of the + web applications on this virtual host, they will not be challenged + to authenticate themselves.</li> + <li>As soon as the user accesses a protected resource in + <strong>any</strong> web application associated with this virtual + host, the user will be challenged to authenticate himself or herself, + using the login method defined for the web application currently + being accessed.</li> + <li>Once authenticated, the roles associated with this user will be + utilized for access control decisions across <strong>all</strong> + of the associated web applications, without challenging the user + to authenticate themselves to each application individually.</li> + <li>As soon as the user logs out of one web application (for example, + by invalidating the corresponding session if form + based login is used), the user's sessions in <strong>all</strong> + web applications will be invalidated. Any subsequent attempt to + access a protected resource in any application will require the + user to authenticate himself or herself again.</li> + <li>The Single Sign On feature utilizes HTTP cookies to transmit a token + that associates each request with the saved user identity, so it can + only be utilized in client environments that support cookies.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="User_Web_Applications">User Web Applications</h4><div class="text"> + + <p>Many web servers can automatically map a request URI starting with + a tilde character ("~") and a username to a directory (commonly named + <code>public_html</code>) in that user's home directory on the server. + You can accomplish the same thing in Catalina by using a special + <strong>Listener</strong> element like this (on a Unix system that + uses the <code>/etc/passwd</code> file to identify valid users):</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Listener className="org.apache.catalina.startup.UserConfig" + directoryName="public_html" + userClass="org.apache.catalina.startup.PasswdUserDatabase"/> + ... +</Host></code></pre></div> + + <p>On a server where <code>/etc/passwd</code> is not in use, you can + request Catalina to consider all directories found in a specified base + directory (such as <code>c:\Homes</code> in this example) to be + considered "user home" directories for the purposes of this directive:</p> + +<div class="codeBox"><pre><code><Host name="localhost" ...> + ... + <Listener className="org.apache.catalina.startup.UserConfig" + directoryName="public_html" + homeBase="c:\Homes" + userClass="org.apache.catalina.startup.HomesUserDatabase"/> + ... +</Host></code></pre></div> + + <p>If a user home directory has been set up for a user named + <code>craigmcc</code>, then its contents will be visible from a + client browser by making a request to a URL like:</p> + +<div class="codeBox"><pre><code>http://www.mycompany.com:8080/~craigmcc</code></pre></div> + + <p>Successful use of this feature requires recognition of the following + considerations:</p> + <ul> + <li>Each user web application will be deployed with characteristics + established by the global and host level default context settings.</li> + <li>It is legal to include more than one instance of this Listener + element. This would only be useful, however, in circumstances + where you wanted to configure more than one "homeBase" directory.</li> + <li>The operating system username under which Catalina is executed + MUST have read access to each user's web application directory, + and all of its contents.</li> + </ul> + + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/http.html b/src/tomcat/webapps/docs/config/http.html new file mode 100644 index 0000000000000000000000000000000000000000..a650200cf2caa3bda74ee597c606452396a4f79d --- /dev/null +++ b/src/tomcat/webapps/docs/config/http.html @@ -0,0 +1,1561 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The HTTP Connector</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/http"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The HTTP Connector</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li><li><a href="#Java_TCP_socket_attributes">Java TCP socket attributes</a></li><li><a href="#NIO_specific_configuration">NIO specific configuration</a></li><li><a href="#NIO2_specific_configuration">NIO2 specific configuration</a></li><li><a href="#APR/native_specific_configuration">APR/native specific configuration</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#HTTP/1.1_and_HTTP/1.0_Support">HTTP/1.1 and HTTP/1.0 Support</a></li><li><a href="#HTTP/2_Support">HTTP/2 Support</a></li><li><a href="#Proxy_Support">Proxy Support</a></li><li><a href="#SSL_Support">SSL Support</a></li><li><a href="#SSL_Support_-_SSLHostConfig">SSL Support - SSLHostConfig</a></li><li><a href="#SSL_Support_-_Certificate">SSL Support - Certificate</a></li><li><a href="#SSL_Support_-_Connector_-_NIO_and_NIO2">SSL Support - Connector - NIO and NIO2</a></li><li><a href="#SSL_Support_-_Connector_-_NIO_and_NIO2_(deprecated)">SSL Support - Connector - NIO and NIO2 (deprecated)</a></li><li><a href="#SSL_Support_-_Connector_-_APR/Native_(deprecated)">SSL Support - Connector - APR/Native (deprecated)</a></li><li><a href="#Connector_Comparison">Connector Comparison</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>HTTP Connector</strong> element represents a + <strong>Connector</strong> component that supports the HTTP/1.1 protocol. + It enables Catalina to function as a stand-alone web server, in addition + to its ability to execute servlets and JSP pages. A particular instance + of this component listens for connections on a specific TCP port number + on the server. One or more such <strong>Connectors</strong> can be + configured as part of a single <a href="service.html">Service</a>, each + forwarding to the associated <a href="engine.html">Engine</a> to perform + request processing and create the response.</p> + + <p>If you wish to configure the <strong>Connector</strong> that is used + for connections to web servers using the AJP protocol (such as the + <code>mod_jk 1.2.x</code> connector for Apache 1.3), please refer to the + <a href="ajp.html">AJP Connector</a> documentation.</p> + + <p>Each incoming request requires + a thread for the duration of that request. If more simultaneous requests + are received than can be handled by the currently available request + processing threads, additional threads will be created up to the + configured maximum (the value of the <code>maxThreads</code> attribute). + If still more simultaneous requests are received, they are stacked up + inside the server socket created by the <strong>Connector</strong>, up to + the configured maximum (the value of the <code>acceptCount</code> + attribute). Any further simultaneous requests will receive "connection + refused" errors, until resources are available to process them.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Connector</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allowTrace</code></td><td> + <p>A boolean value which can be used to enable or disable the TRACE + HTTP method. If not specified, this attribute is set to false.</p> + </td></tr><tr><td><code class="attributeName">asyncTimeout</code></td><td> + <p>The default timeout for asynchronous requests in milliseconds. If not + specified, this attribute is set to the Servlet specification default of + 30000 (30 seconds).</p> + </td></tr><tr><td><code class="attributeName">defaultSSLHostConfigName</code></td><td> + <p>The name of the default <strong>SSLHostConfig</strong> that will be + used for secure connections (if this connector is configured for secure + connections) if the client connection does not provide SNI or if the SNI + is provided but does not match any configured + <strong>SSLHostConfig</strong>. If not specified the default value of + <code>_default_</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">enableLookups</code></td><td> + <p>Set to <code>true</code> if you want calls to + <code>request.getRemoteHost()</code> to perform DNS lookups in + order to return the actual host name of the remote client. Set + to <code>false</code> to skip the DNS lookup and return the IP + address in String form instead (thereby improving performance). + By default, DNS lookups are disabled.</p> + </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td> + <p>The maximum number of headers in a request that are allowed by the + container. A request that contains more headers than the specified limit + will be rejected. A value of less than 0 means no limit. + If not specified, a default of 100 is used.</p> + </td></tr><tr><td><code class="attributeName">maxParameterCount</code></td><td> + <p>The maximum number of parameter and value pairs (GET plus POST) which + will be automatically parsed by the container. Parameter and value pairs + beyond this limit will be ignored. A value of less than 0 means no limit. + If not specified, a default of 10000 is used. Note that + <code>FailedRequestFilter</code> <a href="filter.html">filter</a> can be + used to reject requests that hit the limit.</p> + </td></tr><tr><td><code class="attributeName">maxPostSize</code></td><td> + <p>The maximum size in bytes of the POST which will be handled by + the container FORM URL parameter parsing. The limit can be disabled by + setting this attribute to a value less than zero. If not specified, this + attribute is set to 2097152 (2 megabytes). Note that the + <a href="filter.html#Failed_Request_Filter"><code>FailedRequestFilter</code></a> + can be used to reject requests that exceed this limit.</p> + </td></tr><tr><td><code class="attributeName">maxSavePostSize</code></td><td> + <p>The maximum size in bytes of the POST which will be saved/buffered by + the container during FORM or CLIENT-CERT authentication. For both types + of authentication, the POST will be saved/buffered before the user is + authenticated. For CLIENT-CERT authentication, the POST is buffered for + the duration of the SSL handshake and the buffer emptied when the request + is processed. For FORM authentication the POST is saved whilst the user + is re-directed to the login form and is retained until the user + successfully authenticates or the session associated with the + authentication request expires. The limit can be disabled by setting this + attribute to -1. Setting the attribute to zero will disable the saving of + POST data during authentication. If not specified, this attribute is set + to 4096 (4 kilobytes).</p> + </td></tr><tr><td><code class="attributeName">parseBodyMethods</code></td><td> + <p>A comma-separated list of HTTP methods for which request + bodies will be parsed for request parameters identically + to POST. This is useful in RESTful applications that want to + support POST-style semantics for PUT requests. + Note that any setting other than <code>POST</code> causes Tomcat + to behave in a way that goes against the intent of the servlet + specification. + The HTTP method TRACE is specifically forbidden here in accordance + with the HTTP specification. + The default is <code>POST</code></p> + </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td> + <p>The TCP port number on which this <strong>Connector</strong> + will create a server socket and await incoming connections. Your + operating system will allow only one server application to listen + to a particular port number on a particular IP address. If the special + value of 0 (zero) is used, then Tomcat will select a free port at random + to use for this connector. This is typically only useful in embedded and + testing applications.</p> + </td></tr><tr><td><code class="attributeName">protocol</code></td><td> + <p>Sets the protocol to handle incoming traffic. The default value is + <code>HTTP/1.1</code> which uses an auto-switching mechanism to select + either a Java NIO based connector or an APR/native based connector. + If the <code>PATH</code> (Windows) or <code>LD_LIBRARY_PATH</code> (on + most unix systems) environment variables contain the Tomcat native + library, and the <code>AprLifecycleListener</code> that is used to + initialize APR has its <code>useAprConnector</code> attribute set to + <code>true</code>, the APR/native connector will be used. If the native library + cannot be found or the attribute is not configured, the Java NIO based + connector will be used. Note that the APR/native connector has different + settings for HTTPS than the Java connectors.<br> + To use an explicit protocol rather than rely on the auto-switching + mechanism described above, the following values may be used:<br> + <code>org.apache.coyote.http11.Http11NioProtocol</code> - + non blocking Java NIO connector<br> + <code>org.apache.coyote.http11.Http11Nio2Protocol</code> - + non blocking Java NIO2 connector<br> + <code>org.apache.coyote.http11.Http11AprProtocol</code> - + the APR/native connector.<br> + Custom implementations may also be used.<br> + Take a look at our <a href="#Connector_Comparison">Connector + Comparison</a> chart. The configuration for both Java connectors is + identical, for http and https.<br> + For more information on the APR connector and APR specific SSL settings + please visit the <a href="../apr.html">APR documentation</a> + </p> + </td></tr><tr><td><code class="attributeName">proxyName</code></td><td> + <p>If this <strong>Connector</strong> is being used in a proxy + configuration, configure this attribute to specify the server name + to be returned for calls to <code>request.getServerName()</code>. + See <a href="#Proxy_Support">Proxy Support</a> for more + information.</p> + </td></tr><tr><td><code class="attributeName">proxyPort</code></td><td> + <p>If this <strong>Connector</strong> is being used in a proxy + configuration, configure this attribute to specify the server port + to be returned for calls to <code>request.getServerPort()</code>. + See <a href="#Proxy_Support">Proxy Support</a> for more + information.</p> + </td></tr><tr><td><code class="attributeName">redirectPort</code></td><td> + <p>If this <strong>Connector</strong> is supporting non-SSL + requests, and a request is received for which a matching + <code><security-constraint></code> requires SSL transport, + Catalina will automatically redirect the request to the port + number specified here.</p> + </td></tr><tr><td><code class="attributeName">scheme</code></td><td> + <p>Set this attribute to the name of the protocol you wish to have + returned by calls to <code>request.getScheme()</code>. For + example, you would set this attribute to "<code>https</code>" + for an SSL Connector. The default value is "<code>http</code>". + </p> + </td></tr><tr><td><code class="attributeName">secure</code></td><td> + <p>Set this attribute to <code>true</code> if you wish to have + calls to <code>request.isSecure()</code> to return <code>true</code> + for requests received by this Connector. You would want this on an + SSL Connector or a non SSL connector that is receiving data from a + SSL accelerator, like a crypto card, a SSL appliance or even a webserver. + The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">URIEncoding</code></td><td> + <p>This specifies the character encoding used to decode the URI bytes, + after %xx decoding the URL. If not specified, UTF-8 will be used unless + the <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system property</a> is set to <code>true</code> + in which case ISO-8859-1 will be used.</p> + </td></tr><tr><td><code class="attributeName">useBodyEncodingForURI</code></td><td> + <p>This specifies if the encoding specified in contentType should be used + for URI query parameters, instead of using the URIEncoding. This + setting is present for compatibility with Tomcat 4.1.x, where the + encoding specified in the contentType, or explicitly set using + Request.setCharacterEncoding method was also used for the parameters from + the URL. The default value is <code>false</code>. + </p> + <p><strong>Notes:</strong> 1) This setting is applied only to the + query string of a request. Unlike <code>URIEncoding</code> it does not + affect the path portion of a request URI. 2) If request character + encoding is not known (is not provided by a browser and is not set by + <code>SetCharacterEncodingFilter</code> or a similar filter using + Request.setCharacterEncoding method), the default encoding is always + "ISO-8859-1". The <code>URIEncoding</code> setting has no effect on + this default. + </p> + </td></tr><tr><td><code class="attributeName">useIPVHosts</code></td><td> + <p>Set this attribute to <code>true</code> to cause Tomcat to use + the IP address that the request was received on to determine the Host + to send the request to. The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">xpoweredBy</code></td><td> + <p>Set this attribute to <code>true</code> to cause Tomcat to advertise + support for the Servlet specification using the header recommended in the + specification. The default value is <code>false</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard HTTP connectors (NIO, NIO2 and APR/native) all support the + following attributes in addition to the common Connector attributes listed + above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">acceptCount</code></td><td> + <p>The maximum queue length for incoming connection requests when + all possible request processing threads are in use. Any requests + received when the queue is full will be refused. The default + value is 100.</p> + </td></tr><tr><td><code class="attributeName">acceptorThreadCount</code></td><td> + <p>The number of threads to be used to accept connections. Increase this + value on a multi CPU machine, although you would never really need more + than <code>2</code>. Also, with a lot of non keep alive connections, you + might want to increase this value as well. Default value is + <code>1</code>.</p> + </td></tr><tr><td><code class="attributeName">acceptorThreadPriority</code></td><td> + <p>The priority of the acceptor threads. The threads used to accept + new connections. The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means.</p> + </td></tr><tr><td><code class="attributeName">address</code></td><td> + <p>For servers with more than one IP address, this attribute specifies + which address will be used for listening on the specified port. By + default, the connector will listen all local addresses. Unless the JVM is + configured otherwise using system properties, the Java based connectors + (NIO, NIO2) will listen on both IPv4 and IPv6 addresses when configured + with either <code>0.0.0.0</code> or <code>::</code>. The APR/native + connector will only listen on IPv4 addresses if configured with + <code>0.0.0.0</code> and will listen on IPv6 addresses (and optionally + IPv4 addresses depending on the setting of <strong>ipv6onlyv6</strong>) if + configured with <code>::</code>.</p> + </td></tr><tr><td><code class="attributeName">allowHostHeaderMismatch</code></td><td> + <p>By default Tomcat will reject requests that specify a host in the + request line but specify a different host in the host header. This + chekc can be disabled by setting this attribute to <code>false</code>. If + not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">allowedTrailerHeaders</code></td><td> + <p>By default Tomcat will ignore all trailer headers when processing + chunked input. For a header to be processed, it must be added to this + comma-separated list of header names.</p> + </td></tr><tr><td><code class="attributeName">bindOnInit</code></td><td> + <p>Controls when the socket used by the connector is bound. By default it + is bound when the connector is initiated and unbound when the connector is + destroyed. If set to <code>false</code>, the socket will be bound when the + connector is started and unbound when it is stopped.</p> + </td></tr><tr><td><code class="attributeName">clientCertProvider</code></td><td> + <p>When client certificate information is presented in a form other than + instances of <code>java.security.cert.X509Certificate</code> it needs to + be converted before it can be used and this property controls which JSSE + provider is used to perform the conversion. For example it is used with + the <a href="ajp.html">AJP connectors</a>, the HTTP APR connector and + with the <a href="valve.html#SSL_Authenticator_Valve"> + org.apache.catalina.valves.SSLValve</a>. If not specified, the default + provider will be used.</p> + </td></tr><tr><td><code class="attributeName">compressibleMimeType</code></td><td> + <p>The value is a comma separated list of MIME types for which HTTP + compression may be used. + The default value is + <code> + text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml + </code>. + </p> + </td></tr><tr><td><code class="attributeName">compression</code></td><td> + <p>The <strong>Connector</strong> may use HTTP/1.1 GZIP compression in + an attempt to save server bandwidth. The acceptable values for the + parameter is "off" (disable compression), "on" (allow compression, which + causes text data to be compressed), "force" (forces compression in all + cases), or a numerical integer value (which is equivalent to "on", but + specifies the minimum amount of data before the output is compressed). If + the content-length is not known and compression is set to "on" or more + aggressive, the output will also be compressed. If not specified, this + attribute is set to "off".</p> + <p><em>Note</em>: There is a tradeoff between using compression (saving + your bandwidth) and using the sendfile feature (saving your CPU cycles). + If the connector supports the sendfile feature, e.g. the NIO connector, + using sendfile will take precedence over compression. The symptoms will + be that static files greater that 48 Kb will be sent uncompressed. + You can turn off sendfile by setting <code>useSendfile</code> attribute + of the connector, as documented below, or change the sendfile usage + threshold in the configuration of the + <a href="../default-servlet.html">DefaultServlet</a> in the default + <code>conf/web.xml</code> or in the <code>web.xml</code> of your web + application. + </p> + </td></tr><tr><td><code class="attributeName">compressionMinSize</code></td><td> + <p>If <strong>compression</strong> is set to "on" then this attribute + may be used to specify the minimum amount of data before the output is + compressed. If not specified, this attribute is defaults to "2048".</p> + </td></tr><tr><td><code class="attributeName">connectionLinger</code></td><td> + <p>The number of seconds during which the sockets used by this + <strong>Connector</strong> will linger when they are closed. The default + value is <code>-1</code> which disables socket linger.</p> + </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td> + <p>The number of milliseconds this <strong>Connector</strong> will wait, + after accepting a connection, for the request URI line to be + presented. Use a value of -1 to indicate no (i.e. infinite) timeout. + The default value is 60000 (i.e. 60 seconds) but note that the standard + server.xml that ships with Tomcat sets this to 20000 (i.e. 20 seconds). + Unless <strong>disableUploadTimeout</strong> is set to <code>false</code>, + this timeout will also be used when reading the request body (if any).</p> + </td></tr><tr><td><code class="attributeName">connectionUploadTimeout</code></td><td> + <p>Specifies the timeout, in milliseconds, to use while a data upload is + in progress. This only takes effect if + <strong>disableUploadTimeout</strong> is set to <code>false</code>. + </p> + </td></tr><tr><td><code class="attributeName">disableUploadTimeout</code></td><td> + <p>This flag allows the servlet container to use a different, usually + longer connection timeout during data upload. If not specified, this + attribute is set to <code>true</code> which disables this longer timeout. + </p> + </td></tr><tr><td><code class="attributeName">executor</code></td><td> + <p>A reference to the name in an <a href="executor.html">Executor</a> + element. If this attribute is set, and the named executor exists, the + connector will use the executor, and all the other thread attributes will + be ignored. Note that if a shared executor is not specified for a + connector then the connector will use a private, internal executor to + provide the thread pool.</p> + </td></tr><tr><td><code class="attributeName">executorTerminationTimeoutMillis</code></td><td> + <p>The time that the private internal executor will wait for request + processing threads to terminate before continuing with the process of + stopping the connector. If not set, the default is <code>5000</code> (5 + seconds).</p> + </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td> + <p>The number of milliseconds this <strong>Connector</strong> will wait + for another HTTP request before closing the connection. The default value + is to use the value that has been set for the + <strong>connectionTimeout</strong> attribute. + Use a value of -1 to indicate no (i.e. infinite) timeout.</p> + </td></tr><tr><td><code class="attributeName">maxConnections</code></td><td> + <p>The maximum number of connections that the server will accept and + process at any given time. When this number has been reached, the server + will accept, but not process, one further connection. This additional + connection be blocked until the number of connections being processed + falls below <strong>maxConnections</strong> at which point the server will + start accepting and processing new connections again. Note that once the + limit has been reached, the operating system may still accept connections + based on the <code>acceptCount</code> setting. The default value varies by + connector type. For NIO and NIO2 the default is <code>10000</code>. + For APR/native, the default is <code>8192</code>.</p> + <p>Note that for APR/native on Windows, the configured value will be + reduced to the highest multiple of 1024 that is less than or equal to + maxConnections. This is done for performance reasons.<br> + If set to a value of -1, the maxConnections feature is disabled + and connections are not counted.</p> + </td></tr><tr><td><code class="attributeName">maxCookieCount</code></td><td> + <p>The maximum number of cookies that are permitted for a request. A value + of less than zero means no limit. If not specified, a default value of 200 + will be used.</p> + </td></tr><tr><td><code class="attributeName">maxExtensionSize</code></td><td> + <p>Limits the total length of chunk extensions in chunked HTTP requests. + If the value is <code>-1</code>, no limit will be imposed. If not + specified, the default value of <code>8192</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">maxHttpHeaderSize</code></td><td> + <p>The maximum size of the request and response HTTP header, specified + in bytes. If not specified, this attribute is set to 8192 (8 KB).</p> + </td></tr><tr><td><code class="attributeName">maxKeepAliveRequests</code></td><td> + <p>The maximum number of HTTP requests which can be pipelined until + the connection is closed by the server. Setting this attribute to 1 will + disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and + pipelining. Setting this to -1 will allow an unlimited amount of + pipelined or keep-alive HTTP requests. + If not specified, this attribute is set to 100.</p> + </td></tr><tr><td><code class="attributeName">maxSwallowSize</code></td><td> + <p>The maximum number of request body bytes (excluding transfer encoding + overhead) that will be swallowed by Tomcat for an aborted upload. An + aborted upload is when Tomcat knows that the request body is going to be + ignored but the client still sends it. If Tomcat does not swallow the body + the client is unlikely to see the response. If not specified the default + of 2097152 (2 megabytes) will be used. A value of less than zero indicates + that no limit should be enforced.</p> + </td></tr><tr><td><code class="attributeName">maxThreads</code></td><td> + <p>The maximum number of request processing threads to be created + by this <strong>Connector</strong>, which therefore determines the + maximum number of simultaneous requests that can be handled. If + not specified, this attribute is set to 200. If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">maxTrailerSize</code></td><td> + <p>Limits the total length of trailing headers in the last chunk of + a chunked HTTP request. If the value is <code>-1</code>, no limit will be + imposed. If not specified, the default value of <code>8192</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">minSpareThreads</code></td><td> + <p>The minimum number of threads always kept running. If not specified, + the default of <code>10</code> is used. If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">noCompressionUserAgents</code></td><td> + <p>The value is a regular expression (using <code>java.util.regex</code>) + matching the <code>user-agent</code> header of HTTP clients for which + compression should not be used, + because these clients, although they do advertise support for the + feature, have a broken implementation. + The default value is an empty String (regexp matching disabled).</p> + </td></tr><tr><td><code class="attributeName">processorCache</code></td><td> + <p>The protocol handler caches Processor objects to speed up performance. + This setting dictates how many of these objects get cached. + <code>-1</code> means unlimited, default is <code>200</code>. If not using + Servlet 3.0 asynchronous processing, a good default is to use the same as + the maxThreads setting. If using Servlet 3.0 asynchronous processing, a + good default is to use the larger of maxThreads and the maximum number of + expected concurrent requests (synchronous and asynchronous).</p> + </td></tr><tr><td><code class="attributeName">rejectIllegalHeaderName</code></td><td> + <p>If an HTTP request is received that contains an illegal header name + (i.e. the header name is not a token) this setting determines if the + request will be rejected with a 400 response (<code>true</code>) or if the + illegal header be ignored (<code>false</code>). The default value is + <code>true</code> which will cause the request to be rejected.</p> + </td></tr><tr><td><code class="attributeName">restrictedUserAgents</code></td><td> + <p>The value is a regular expression (using <code>java.util.regex</code>) + matching the <code>user-agent</code> header of HTTP clients for which + HTTP/1.1 or HTTP/1.0 keep alive should not be used, even if the clients + advertise support for these features. + The default value is an empty String (regexp matching disabled).</p> + </td></tr><tr><td><code class="attributeName">server</code></td><td> + <p>Overrides the Server header for the http response. If set, the value + for this attribute overrides any Server header set by a web application. + If not set, any value specified by the application is used. If the + application does not specify a value then no Server header is set.</p> + </td></tr><tr><td><code class="attributeName">serverRemoveAppProvidedValues</code></td><td> + <p>If <code>true</code>, any Server header set by a web + application will be removed. Note that if <strong>server</strong> is set, + this attribute is effectively ignored. If not set, the default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">SSLEnabled</code></td><td> + <p>Use this attribute to enable SSL traffic on a connector. + To turn on SSL handshake/encryption/decryption on a connector + set this value to <code>true</code>. + The default value is <code>false</code>. + When turning this value <code>true</code> you will want to set the + <code>scheme</code> and the <code>secure</code> attributes as well + to pass the correct <code>request.getScheme()</code> and + <code>request.isSecure()</code> values to the servlets + See <a href="#SSL_Support">SSL Support</a> for more information. + </p> + </td></tr><tr><td><code class="attributeName">tcpNoDelay</code></td><td> + <p>If set to <code>true</code>, the TCP_NO_DELAY option will be + set on the server socket, which improves performance under most + circumstances. This is set to <code>true</code> by default.</p> + </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td> + <p>The priority of the request processing threads within the JVM. + The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means. If an executor is associated + with this connector, this attribute is ignored as the connector will + execute tasks using the executor rather than an internal thread pool. Note + that if an executor is configured any value set for this attribute will be + recorded correctly but it will be reported (e.g. via JMX) as + <code>-1</code> to make clear that it is not used.</p> + </td></tr><tr><td><code class="attributeName">throwOnFailure</code></td><td> + <p>If the Connector experiences an Exception during a Lifecycle transition + should the Exception be rethrown or logged? If not specified, the default + of <code>false</code> will be used. Note that the default can be changed + by the <code>org.apache.catalina.startup.EXIT_ON_INIT_FAILURE</code> + system property.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Java_TCP_socket_attributes">Java TCP socket attributes</h4><div class="text"> + + <p>The NIO and NIO2 implementation support the following Java TCP + socket attributes in addition to the common Connector and HTTP attributes + listed above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">socket.rxBufSize</code></td><td> + <p>(int)The socket receive buffer (SO_RCVBUF) size in bytes. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.txBufSize</code></td><td> + <p>(int)The socket send buffer (SO_SNDBUF) size in bytes. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.tcpNoDelay</code></td><td> + <p>(bool)This is equivalent to standard attribute + <strong>tcpNoDelay</strong>.</p> + </td></tr><tr><td><code class="attributeName">socket.soKeepAlive</code></td><td> + <p>(bool)Boolean value for the socket's keep alive setting + (SO_KEEPALIVE). JVM default used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.ooBInline</code></td><td> + <p>(bool)Boolean value for the socket OOBINLINE setting. JVM default + used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.soReuseAddress</code></td><td> + <p>(bool)Boolean value for the sockets reuse address option + (SO_REUSEADDR). JVM default used if not set.</p> + </td></tr><tr><td><code class="attributeName">socket.soLingerOn</code></td><td> + <p>(bool)Boolean value for the sockets so linger option (SO_LINGER). + A value for the standard attribute <strong>connectionLinger</strong> + that is >=0 is equivalent to setting this to <code>true</code>. + A value for the standard attribute <strong>connectionLinger</strong> + that is <0 is equivalent to setting this to <code>false</code>. + Both this attribute and <code>soLingerTime</code> must be set else the + JVM defaults will be used for both.</p> + </td></tr><tr><td><code class="attributeName">socket.soLingerTime</code></td><td> + <p>(int)Value in seconds for the sockets so linger option (SO_LINGER). + This is equivalent to standard attribute + <strong>connectionLinger</strong>. + Both this attribute and <code>soLingerOn</code> must be set else the + JVM defaults will be used for both.</p> + </td></tr><tr><td><code class="attributeName">socket.soTimeout</code></td><td> + <p>This is equivalent to standard attribute + <strong>connectionTimeout</strong>.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceConnectionTime</code></td><td> + <p>(int)The first value for the performance settings. See + <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>. + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceLatency</code></td><td> + <p>(int)The second value for the performance settings. See + <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>. + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.performanceBandwidth</code></td><td> + <p>(int)The third value for the performance settings. See + <a href="http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setPerformancePreferences(int,%20int,%20int)">Socket Performance Options</a>. + All three performance attributes must be set else the JVM defaults will + be used for all three.</p> + </td></tr><tr><td><code class="attributeName">socket.unlockTimeout</code></td><td> + <p>(int) The timeout for a socket unlock. When a connector is stopped, it will try to release the acceptor thread by opening a connector to itself. + The default value is <code>250</code> and the value is in milliseconds</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="NIO_specific_configuration">NIO specific configuration</h4><div class="text"> + + <p>The following attributes are specific to the NIO connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">pollerThreadCount</code></td><td> + <p>(int)The number of threads to be used to run for the polling events. + Default value is <code>1</code> per processor but not more than 2.<br> + When accepting a socket, the operating system holds a global lock. So the benefit of + going above 2 threads diminishes rapidly. Having more than one thread is for + system that need to accept connections very rapidly. However usually just + increasing <code>acceptCount</code> will solve that problem. + Increasing this value may also be beneficial when a large amount of send file + operations are going on. + </p> + </td></tr><tr><td><code class="attributeName">pollerThreadPriority</code></td><td> + <p>(int)The priority of the poller threads. + The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means.</p> + </td></tr><tr><td><code class="attributeName">selectorTimeout</code></td><td> + <p>(int)The time in milliseconds to timeout on a select() for the + poller. This value is important, since connection clean up is done on + the same thread, so do not set this value to an extremely high one. The + default value is <code>1000</code> milliseconds.</p> + </td></tr><tr><td><code class="attributeName">useSendfile</code></td><td> + <p>(bool)Use this attribute to enable or disable sendfile capability. + The default value is <code>true</code>. Note that the use of sendfile + will disable any compression that Tomcat may otherwise have performed on + the response.</p> + </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers. If <code>true</code> then + <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate + the buffers, if <code>false</code> then + <code>java.nio.ByteBuffer.allocate()</code> is used. The default value + is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Sun's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.directSslBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers for the SSL buffers. If <code>true</code> then + <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate + the buffers, if <code>false</code> then + <code>java.nio.ByteBuffer.allocate()</code> is used. The default value + is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Oracle's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a read ByteBuffer. This attribute controls the size of this buffer. By + default this read buffer is sized at <code>8192</code> bytes. For lower + concurrency, you can increase this to buffer more data. For an extreme + amount of keep alive connections, decrease this number or increase your + heap size.</p> + </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a write ByteBuffer. This attribute controls the size of this buffer. By + default this write buffer is sized at <code>8192</code> bytes. For low + concurrency you can increase this to buffer more response data. For an + extreme amount of keep alive connections, decrease this number or + increase your heap size.<br> + The default value here is pretty low, you should up it if you are not + dealing with tens of thousands concurrent connections.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td> + <p>(int)The NIO connector uses a class called NioChannel that holds + elements linked to a socket. To reduce garbage collection, the NIO + connector caches these channel objects. This value specifies the size of + this cache. The default value is <code>500</code>, and represents that + the cache will hold 500 NioChannel objects. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPoolSize</code></td><td> + <p>(int)The NioChannel pool can also be size based, not used object + based. The size is calculated as follows:<br> + NioChannel + <code>buffer size = read buffer size + write buffer size</code><br> + SecureNioChannel <code>buffer size = application read buffer size + + application write buffer size + network read buffer size + + network write buffer size</code><br> + The value is in bytes, the default value is <code>1024*1024*100</code> + (100MB).</p> + </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td> + <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.keyCache</code></td><td> + <p>(int)Tomcat will cache KeyAttachment objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.eventCache</code></td><td> + <p>(int)Tomcat will cache PollerEvent objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">selectorPool.maxSelectors</code></td><td> + <p>(int)The max selectors to be used in the pool, to reduce selector + contention. Use this option when the command line + <code>org.apache.tomcat.util.net.NioSelectorShared</code> value is set + to false. Default value is <code>200</code>.</p> + </td></tr><tr><td><code class="attributeName">selectorPool.maxSpareSelectors</code></td><td> + <p>(int)The max spare selectors to be used in the pool, to reduce + selector contention. When a selector is returned to the pool, the system + can decide to keep it or let it be GC'd. Use this option when the + command line <code>org.apache.tomcat.util.net.NioSelectorShared</code> + value is set to false. Default value is <code>-1</code> (unlimited).</p> + </td></tr><tr><td><code class="attributeName">command-line-options</code></td><td> + <p>The following command line options are available for the NIO + connector:<br> + <code>-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false</code> + - default is <code>true</code>. Set this value to <code>false</code> if you wish to + use a selector for each thread. When you set it to <code>false</code>, you can + control the size of the pool of selectors by using the + <strong>selectorPool.maxSelectors</strong> attribute.</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="NIO2_specific_configuration">NIO2 specific configuration</h4><div class="text"> + + <p>The following attributes are specific to the NIO2 connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">useSendfile</code></td><td> + <p>(bool)Use this attribute to enable or disable sendfile capability. + The default value is <code>true</code>. Note that the use of sendfile + will disable any compression that Tomcat may otherwise have performed on + the response.</p> + </td></tr><tr><td><code class="attributeName">socket.directBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers. If <code>true</code> then + <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate + the buffers, if <code>false</code> then + <code>java.nio.ByteBuffer.allocate()</code> is used. The default value + is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Sun's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.directSslBuffer</code></td><td> + <p>(bool)Boolean value, whether to use direct ByteBuffers or java mapped + ByteBuffers for the SSL buffers. If <code>true</code> then + <code>java.nio.ByteBuffer.allocateDirect()</code> is used to allocate + the buffers, if <code>false</code> then + <code>java.nio.ByteBuffer.allocate()</code> is used. The default value + is <code>false</code>.<br> + When you are using direct buffers, make sure you allocate the + appropriate amount of memory for the direct memory space. On Oracle's JDK + that would be something like <code>-XX:MaxDirectMemorySize=256m</code>. + </p> + </td></tr><tr><td><code class="attributeName">socket.appReadBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a read ByteBuffer. This attribute controls the size of this buffer. By + default this read buffer is sized at <code>8192</code> bytes. For lower + concurrency, you can increase this to buffer more data. For an extreme + amount of keep alive connections, decrease this number or increase your + heap size.</p> + </td></tr><tr><td><code class="attributeName">socket.appWriteBufSize</code></td><td> + <p>(int)Each connection that is opened up in Tomcat get associated with + a write ByteBuffer. This attribute controls the size of this buffer. By + default this write buffer is sized at <code>8192</code> bytes. For low + concurrency you can increase this to buffer more response data. For an + extreme amount of keep alive connections, decrease this number or + increase your heap size.<br> + The default value here is pretty low, you should up it if you are not + dealing with tens of thousands concurrent connections.</p> + </td></tr><tr><td><code class="attributeName">socket.bufferPool</code></td><td> + <p>(int)The NIO2 connector uses a class called Nio2Channel that holds + elements linked to a socket. To reduce garbage collection, the NIO2 + connector caches these channel objects. This value specifies the size of + this cache. The default value is <code>500</code>, and represents that + the cache will hold 500 Nio2Channel objects. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr><tr><td><code class="attributeName">socket.processorCache</code></td><td> + <p>(int)Tomcat will cache SocketProcessor objects to reduce garbage + collection. The integer value specifies how many objects to keep in the + cache at most. The default is <code>500</code>. Other values are + <code>-1</code> for unlimited cache and <code>0</code> for no cache.</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="APR/native_specific_configuration">APR/native specific configuration</h4><div class="text"> + + <p>The following attributes are specific to the APR/native connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">deferAccept</code></td><td> + <p>Sets the <code>TCP_DEFER_ACCEPT</code> flag on the listening socket + for this connector. The default value is <code>true</code> where + <code>TCP_DEFER_ACCEPT</code> is supported by the operating system, + otherwise it is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">ipv6v6only</code></td><td> + <p>If listening on an IPv6 address on a dual stack system, should the + connector only listen on the IPv6 address? If not specified the default + is <code>false</code> and the connector will listen on the IPv6 address + and the equivalent IPv4 address if present.</p> + </td></tr><tr><td><code class="attributeName">pollerThreadCount</code></td><td> + <p>Number of threads used to poll kept alive connections. On Windows the + default is chosen so that the sockets managed by each thread is + less than 1024. For Linux the default is 1. Changing the default on + Windows is likely to have a negative performance impact.</p> + </td></tr><tr><td><code class="attributeName">pollTime</code></td><td> + <p>Duration of a poll call in microseconds. Lowering this value will + slightly decrease latency of connections being kept alive in some cases, + but will use more CPU as more poll calls are being made. The default + value is 2000 (2ms).</p> + </td></tr><tr><td><code class="attributeName">sendfileSize</code></td><td> + <p>Amount of sockets that the poller responsible for sending static + files asynchronously can hold at a given time. Extra connections will be + closed right away without any data being sent (resulting in a zero + length file on the client side). Note that in most cases, sendfile is a + call that will return right away (being taken care of "synchronously" by + the kernel), and the sendfile poller will not be used, so the amount of + static files which can be sent concurrently is much larger than the + specified amount. The default value is 1024.</p> + </td></tr><tr><td><code class="attributeName">threadPriority</code></td><td> + <p>(int)The priority of the acceptor and poller threads. + The default value is <code>5</code> (the value of the + <code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc + for the <code>java.lang.Thread</code> class for more details on what + this priority means.</p> + </td></tr><tr><td><code class="attributeName">useSendfile</code></td><td> + <p>(bool)Use this attribute to enable or disable sendfile capability. + The default value is <code>true</code>. Note that the use of sendfile + will disable any compression that Tomcat may otherwise have performed on + the response.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>First implemented in Tomcat 9 and back-ported to 8.5, Tomcat now supports + Server Name Indication (SNI). This allows multiple SSL configurations to be + associated with a single secure connector with the configuration used for any + given connection determined by the host name requested by the client. To + facilitate this, the <strong>SSLHostConfig</strong> element was added which + can be used to define one of these configurations. Any number of + <strong>SSLHostConfig</strong> may be nested in a <strong>Connector</strong>. + At the same time, support was added for multiple certificates to be associated + with a single <strong>SSLHostConfig</strong>. Each SSL certificate is + therefore configured in a <strong>Certificate</strong> element with in an + <strong>SSLHostConfig</strong>. For further information, see the SSL Support + section below.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="HTTP/1.1_and_HTTP/1.0_Support">HTTP/1.1 and HTTP/1.0 Support</h4><div class="text"> + + <p>This <strong>Connector</strong> supports all of the required features + of the HTTP/1.1 protocol, as described in RFCs 7230-7235, including persistent + connections, pipelining, expectations and chunked encoding. If the client + supports only HTTP/1.0 or HTTP/0.9, the + <strong>Connector</strong> will gracefully fall back to supporting this + protocol as well. No special configuration is required to enable this + support. The <strong>Connector</strong> also supports HTTP/1.0 + keep-alive.</p> + + <p>RFC 7230 requires that HTTP servers always begin their responses with + the highest HTTP version that they claim to support. Therefore, this + <strong>Connector</strong> will always return <code>HTTP/1.1</code> at + the beginning of its responses.</p> + + </div></div> + + <div class="subsection"><h4 id="HTTP/2_Support">HTTP/2 Support</h4><div class="text"> + + <p>HTTP/2 is support is provided for TLS (h2), non-TLS via HTTP upgrade (h2c) + and direct HTTP/2 (h2c) connections. To enable HTTP/2 support for an HTTP + connector the following <strong>UpgradeProtocol</strong> element must be + nested within the <strong>Connector</strong> with a + <strong>className</strong> attribute of + <code>org.apache.coyote.http2.Http2Protocol</code>.</p> + +<div class="codeBox"><pre><code><Connector ... > + <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> +</Connector></code></pre></div> + + <p>Because Java 8's TLS implementation does not support ALPN (which is + required for HTTP/2 over TLS), you must be using an OpenSSL based TLS + implementation to enable HTTP/2 support. See the + <code>sslImplementationName</code> attribute of the + <strong>Connector</strong>.</p> + + <p>Additional configuration attributes are available. See the + <a href="http2.html">HTTP/2 Upgrade Protocol</a> documentation for details.</p> + + </div></div> + + <div class="subsection"><h4 id="Proxy_Support">Proxy Support</h4><div class="text"> + + <p>The <code>proxyName</code> and <code>proxyPort</code> attributes can + be used when Tomcat is run behind a proxy server. These attributes + modify the values returned to web applications that call the + <code>request.getServerName()</code> and <code>request.getServerPort()</code> + methods, which are often used to construct absolute URLs for redirects. + Without configuring these attributes, the values returned would reflect + the server name and port on which the connection from the proxy server + was received, rather than the server name and port to whom the client + directed the original request.</p> + + <p>For more information, see the + <a href="../proxy-howto.html">Proxy Support HOW-TO</a>.</p> + + </div></div> + + + <div class="subsection"><h4 id="SSL_Support">SSL Support</h4><div class="text"> + + <p>You can enable SSL support for a particular instance of this + <strong>Connector</strong> by setting the <code>SSLEnabled</code> attribute to + <code>true</code>.</p> + + <p>You will also need to set the <code>scheme</code> and <code>secure</code> + attributes to the values <code>https</code> and <code>true</code> + respectively, to pass correct information to the servlets.</p> + + <p>The NIO and NIO2 connectors use either the JSSE Java SSL implementation or + an OpenSSL implementation, whereas the APR/native connector uses OpenSSL only. + Prior to Tomcat 8.5, different configuration attributes were used for JSSE and + OpenSSL. From Tomcat 8.5 onwards, and as far as possible, common configuration + attributes are used for both JSSE and OpenSSL. Also if using the JSSE OpenSSL + implementation, configuration can be set using either the JSSE or APR + attributes (note: but not both types within the same configuration). This is + to aid simpler switching between connector implementations for SSL + connectors.</p> + + <p>Each secure connector must define at least one + <strong>SSLHostConfig</strong>. The names of the + <strong>SSLHostConfig</strong> elements must be unique and one of them must + match the <code>defaultSSLHostConfigName</code> attribute of the + <strong>Connector</strong>.</p> + + <p>Each <strong>SSLHostConfig</strong> must in turn define at least one + <strong>Certificate</strong>. The types of the <strong>Certificate</strong>s + must be unique.</p> + + <p>As of Tomcat 8.5, the majority of the SSL configuration attributes in the + <strong>Connector</strong> are deprecated. If specified, they will be used to + configure a <strong>SSLHostConfig</strong> and <strong>Certificate</strong> + for the <code>defaultSSLHostConfigName</code>. Note that if an explicit + <strong>SSLHostConfig</strong> element also exists for the + <code>defaultSSLHostConfigName</code> then that will be treated as a configuration + error. It is expected that Tomcat 10 will drop support for the SSL + configuration attributes in the <strong>Connector</strong>.</p> + + <p>For more information, see the + <a href="../ssl-howto.html">SSL Configuration HOW-TO</a>.</p> + + </div></div> + + <div class="subsection"><h4 id="SSL_Support_-_SSLHostConfig">SSL Support - SSLHostConfig</h4><div class="text"> + + <p></p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">certificateRevocationListFile</code></td><td> + <p>Name of the file that contains the concatenated certificate revocation + lists for the certificate authorities. The format is PEM-encoded. If not + defined, client certificates will not be checked against a certificate + revocation list (unless an OpenSSL based connector is used and + <strong>certificateRevocationPath</strong> is defined). Relative paths + will be resolved against <code>$CATALINA_BASE</code>. JSSE based + connectors may also specify a URL for this attribute.</p> + </td></tr><tr><td><code class="attributeName">certificateRevocationListPath</code></td><td> + <p>OpenSSL only.</p> + <p>Name of the directory that contains the certificate revocation lists + for the certificate authorities. The format is PEM-encoded. Relative paths + will be resolved against <code>$CATALINA_BASE</code>.</p> + </td></tr><tr><td><code class="attributeName">certificateVerification</code></td><td> + <p>Set to <code>required</code> if you want the SSL stack to require a + valid certificate chain from the client before accepting a connection. + Set to <code>optional</code> if you want the SSL stack to request a client + Certificate, but not fail if one isn't presented. Set to + <code>optionalNoCA</code> if you want client certificates to be optional + and you don't want Tomcat to check them against the list of trusted CAs. + If the TLS provider doesn't support this option (OpenSSL does, JSSE does + not) it is treated as if <code>optional</code> was specified. A + <code>none</code> value (which is the default) will not require a + certificate chain unless the client requests a resource protected by a + security constraint that uses <code>CLIENT-CERT</code> authentication.</p> + </td></tr><tr><td><code class="attributeName">certificateVerificationDepth</code></td><td> + <p>The maximum number of intermediate certificates that will be allowed + when validating client certificates. If not specified, the default value + of 10 will be used.</p> + </td></tr><tr><td><code class="attributeName">caCertificateFile</code></td><td> + <p>OpenSSL only.</p> + <p>Name of the file that contains the concatenated certificates for the + trusted certificate authorities. The format is PEM-encoded.</p> + </td></tr><tr><td><code class="attributeName">caCertificatePath</code></td><td> + <p>OpenSSL only.</p> + <p>Name of the directory that contains the certificates for the trusted + certificate authorities. The format is PEM-encoded.</p> + </td></tr><tr><td><code class="attributeName">ciphers</code></td><td> + <p>The ciphers to enable using the OpenSSL syntax. (See the OpenSSL + documentation for the list of ciphers supported and the syntax). + Alternatively, a comma separated list of ciphers using the standard + OpenSSL cipher names or the standard JSSE cipher names may be used.</p> + <p>When converting from OpenSSL syntax to JSSE ciphers for JSSE based + connectors, the behaviour of the OpenSSL syntax parsing is kept aligned + with the behaviour of the OpenSSL 1.1.0 development branch.</p> + <p>Only the ciphers that are supported by the SSL implementation will be + used.</p> + <p>If not specified, a default (using the OpenSSL notation) of + <code>HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA</code> will be + used.</p> + <p>Note that, by default, the order in which ciphers are defined is + treated as an order of preference. See <code>honorCipherOrder</code>.</p> + </td></tr><tr><td><code class="attributeName">disableCompression</code></td><td> + <p>OpenSSL only.</p> + <p>Configures if compression is disabled. The default is + <code>true</code>. If the OpenSSL version used does not support disabling + compression then the default for that OpenSSL version will be used.</p> + </td></tr><tr><td><code class="attributeName">disableSessionTickets</code></td><td> + <p>OpenSSL only.</p> + <p>Disables use of TLS session tickets (RFC 5077) if set to + <code>true</code>. Default is <code>false</code>. Note that when TLS + session tickets are in use, the full peer certificate chain will only be + available on the first connection. Subsequent connections (that use a + ticket to estrablish the TLS session) will only have the peer certificate, + not the full chain.</p> + </td></tr><tr><td><code class="attributeName">honorCipherOrder</code></td><td> + <p>Set to <code>true</code> to enforce the server's cipher order + (from the <code>ciphers</code> setting) instead of allowing + the client to choose the cipher. The default is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">hostName</code></td><td> + <p>The name of the SSL Host. This should either be the fully qualified + domain name (e.g. <code>tomcat.apache.org</code>) or a wild card domain + name (e.g. <code>*.apache.org</code>). If not specified, the default value + of <code>_default_</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">insecureRenegotiation</code></td><td> + <p>OpenSSL only.</p> + <p>Configures if insecure renegotiation is allowed. The default is + <code>false</code>. If the OpenSSL version used does not support + configuring if insecure renegotiation is allowed then the default for that + OpenSSL version will be used.</p> + </td></tr><tr><td><code class="attributeName">keyManagerAlgorithm</code></td><td> + <p>JSSE only.</p> + <p>The <code>KeyManager</code> algorithm to be used. This defaults to + <code>KeyManagerFactory.getDefaultAlgorithm()</code> which returns + <code>SunX509</code> for Sun JVMs. IBM JVMs return + <code>IbmX509</code>. For other vendors, consult the JVM + documentation for the default value.</p> + </td></tr><tr><td><code class="attributeName">protocols</code></td><td> + <p>The names of the protocols to support when communicating with clients. + This should be a list of any combination of the following: + </p> + <ul><li>SSLv2Hello</li><li>SSLv3</li><li>TLSv1</li><li>TLSv1.1</li> + <li>TLSv1.2</li><li>all</li></ul> + <p>Each token in the list can be prefixed with a plus sign ("+") + or a minus sign ("-"). A plus sign adds the protocol, a minus sign + removes it form the current list. The list is built starting from + an empty list.</p> + <p>The token <code>all</code> is an alias for + <code>SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2</code>.</p> + <p>Note that <code>SSLv2Hello</code> will be ignored for OpenSSL based + secure connectors. If more than one protocol is specified for an OpenSSL + based secure connector it will always support <code>SSLv2Hello</code>. If a + single protocol is specified it will not support + <code>SSLv2Hello</code>.</p> + <p>Note that <code>SSLv2</code> and <code>SSLv3</code> are inherently + unsafe.</p> + <p>If not specified, the default value of <code>all</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">revocationEnabled</code></td><td> + <p>JSSE only.</p> + <p>Should the JSSE provider enable certificate revocation checks? If + <strong>certificateRevocationListFile</strong> is set then this attribute + is ignored and revocation checks are always enabled. This attribute is + intended to enable revocation checks that have been configured for the + current JSSE provider via other means. If not specified, a default of + <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">sessionCacheSize</code></td><td> + <p>JSSE only.</p> + <p>The number of SSL sessions to maintain in the session cache. Use 0 to + specify an unlimited cache size. If not specified, a default of 0 is + used.</p> + </td></tr><tr><td><code class="attributeName">sessionTimeout</code></td><td> + <p>JSSE only.</p> + <p>The time, in seconds, after the creation of an SSL session that it will + timeout. Use 0 to specify an unlimited timeout. If not specified, a + default of 86400 (24 hours) is used.</p> + </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td> + <p>JSSE only.</p> + <p>The SSL protocol(s) to use (a single value may enable multiple + protocols - see the JVM documentation for details). If not specified, the + default is <code>TLS</code>. The permitted values may be obtained from the + JVM documentation for the allowed values for algorithm when creating an + <code>SSLContext</code> instance e.g. + <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SSLContext"> + Oracle Java 7</a>. Note: There is overlap between this attribute and + <code>protocols</code>.</p> + </td></tr><tr><td><code class="attributeName">trustManagerClassName</code></td><td> + <p>JSSE only.</p> + <p>The name of a custom trust manager class to use to validate client + certificates. The class must have a zero argument constructor and must + also implement <code>javax.net.ssl.X509TrustManager</code>. If this + attribute is set, the trust store attributes may be ignored.</p> + </td></tr><tr><td><code class="attributeName">truststoreAlgorithm</code></td><td> + <p>JSSE only.</p> + <p>The algorithm to use for truststore. If not specified, the default + value returned by + <code>javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">truststoreFile</code></td><td> + <p>JSSE only.</p> + <p>The trust store file to use to validate client certificates. The + default is the value of the <code>javax.net.ssl.trustStore</code> system + property. If neither this attribute nor the default system property is + set, no trust store will be configured. Relative paths + will be resolved against <code>$CATALINA_BASE</code>. A URL may also be + used for this attribute.</p> + </td></tr><tr><td><code class="attributeName">truststorePassword</code></td><td> + <p>JSSE only.</p> + <p>The password to access the trust store. The default is the value of the + <code>javax.net.ssl.trustStorePassword</code> system property. If that + property is null, no trust store password will be configured. If an + invalid trust store password is specified, a warning will be logged and an + attempt will be made to access the trust store without a password which + will skip validation of the trust store contents.</p> + </td></tr><tr><td><code class="attributeName">truststoreProvider</code></td><td> + <p>JSSE only.</p> + <p>The name of the truststore provider to be used for the server + certificate. The default is the value of the + <code>javax.net.ssl.trustStoreProvider</code> system property. If + that property is null, the value of <code>keystoreProvider</code> is used + as the default. If neither this attribute, the default system property nor + <code>keystoreProvider</code>is set, the list of registered providers is + traversed in preference order and the first provider that supports the + <code>truststoreType</code> is used. + </p> + </td></tr><tr><td><code class="attributeName">truststoreType</code></td><td> + <p>JSSE only.</p> + <p>The type of key store used for the trust store. The default is the + value of the <code>javax.net.ssl.trustStoreType</code> system property. If + that property is null, a single certificate has been configured for this + TLS virtual host and that certificate has a <code>keystoreType</code> that + is not <code>PKCS12</code> then the default will be the + <code>keystoreType</code> of the single certificate. If none of these + identify a default, the default will be <code>JKS</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="SSL_Support_-_Certificate">SSL Support - Certificate</h4><div class="text"> + + <p></p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">certificateFile</code></strong></td><td> + <p>Name of the file that contains the server certificate. The format is + PEM-encoded. Relative paths will be resolved against + <code>$CATALINA_BASE</code>.</p> + <p>In addition to the certificate, the file can also contain as optional + elements DH parameters and/or an EC curve name for ephemeral keys, as + generated by <code>openssl dhparam</code> and <code>openssl ecparam</code>, + respectively. The output of the respective OpenSSL command can simply + be concatenated to the certificate file.</p> + </td></tr><tr><td><code class="attributeName">certificateChainFile</code></td><td> + <p>Name of the file that contains the certificate chain associated with + the server certificate used. The format is + PEM-encoded. Relative paths will be resolved against + <code>$CATALINA_BASE</code>.</p> + <p>The certificate chain used for Tomcat should not include the server + certificate as its first element.</p> + <p>Note that when using more than one certificate for different types, + they all must use the same certificate chain.</p> + </td></tr><tr><td><code class="attributeName">certificateKeyAlias</code></td><td> + <p>JSSE only.</p> + <p>The alias used for the server key and certificate in the keystore. If + not specified, the first key read from the keystore will be used. The + order in which keys are read from the keystore is implementation + dependent. It may not be the case that keys are read from the keystore in + the same order as they were added. If more than one key is present in the + keystore it is strongly recommended that a keyAlias is configured to + ensure that the correct key is used.</p> + </td></tr><tr><td><code class="attributeName">certificateKeyFile</code></td><td> + <p>Name of the file that contains the server private key. The format is + PEM-encoded. The default value is the value of + <strong>certificateFile</strong> and in this case both certificate and + private key have to be in this file (NOT RECOMMENDED). Relative paths will + be resolved against <code>$CATALINA_BASE</code>.</p> + </td></tr><tr><td><code class="attributeName">certificateKeyPassword</code></td><td> + <p>The password used to access the private key associated with the server + certificate from the specified file.</p> + <p>If not specified, the default behaviour for JSSE is to use the + <strong>certificateKeystorePassword</strong>. For OpenSSL the default + behaviour is not to use a password.</p> + </td></tr><tr><td><code class="attributeName">certificateKeystoreFile</code></td><td> + <p>JSSE only.</p> + <p>The pathname of the keystore file where you have stored the server + certificate and key to be loaded. By default, the pathname is the file + <code>.keystore</code> in the operating system home directory of the user + that is running Tomcat. If your <code>keystoreType</code> doesn't need a + file use <code>""</code> (empty string) or <code>NONE</code> for this + parameter. Relative paths will be resolved against + <code>$CATALINA_BASE</code>. A URL may also be used for this attribute. + </p> + </td></tr><tr><td><code class="attributeName">certificateKeystorePassword</code></td><td> + <p>JSSE only.</p> + <p>The password to use to access the keystore containing the server's + private key and certificate. If not specified, a default of + <code>changeit</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">certificateKeystoreProvider</code></td><td> + <p>JSSE only.</p> + <p>The name of the keystore provider to be used for the server + certificate. If not specified, the value of the system property + <code>javax.net.ssl.keyStoreProvider</code> is used. If neither this + attribute nor the system property are set, the list of registered + providers is traversed in preference order and the first provider that + supports the <code>keystoreType</code> is used. + </p> + </td></tr><tr><td><code class="attributeName">certificateKeystoreType</code></td><td> + <p>JSSE only.</p> + <p>The type of keystore file to be used for the server certificate. + If not specified, the value of the system property + <code>javax.net.ssl.keyStoreType</code> is used. If neither this attribute + nor the system property are set, a default value of "<code>JKS</code>". is + used.</p> + </td></tr><tr><td><code class="attributeName">type</code></td><td> + <p>The type of certificate. This is used to identify the ciphers that are + compatible with the certificate. It must be one of <code>UNDEFINED</code>, + <code>RSA</code>, <code>DSS</code> or <code>EC</code>. If only one + <strong>Certificate</strong> is nested within a <code>SSLHostConfig</code> + then this attribute is not required and will default to + <code>UNDEFINED</code>. If multiple <strong>Certificate</strong>s are + nested within a <code>SSLHostConfig</code> then this attribute is required + and each <strong>Certificate</strong> must have a unique type.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="SSL_Support_-_Connector_-_NIO_and_NIO2">SSL Support - Connector - NIO and NIO2</h4><div class="text"> + + <p>When APR/native is enabled, the connectors will default to using OpenSSL through JSSE, + which may be more optimized than the JSSE Java implementation depending on the processor being used, + and can be complemented with many commercial accelerator components.</p> + + <p>The following NIO and NIO2 SSL configuration attributes are not specific to + a virtual host and, therefore, must be configured on the connector.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">sniParseLimit</code></td><td> + <p>In order to implement SNI support, Tomcat has to parse the first TLS + message received on a new TLS connection (the client hello) to extract the + requested server name. The message needs to be buffered so it can then be + passed to the JSSE implementation for normal TLS processing. In theory, + this first message could be very large although in practice it is + typically a few hundred bytes. This attribute sets the maximum message + size that Tomcat will buffer. If a message exceeds this size, the + connection will be configured as if no server name was indicated by the + client. If not specified a default of <code>65536</code> (64k) will be + used.</p> + </td></tr><tr><td><code class="attributeName">sslImplementationName</code></td><td> + <p>The class name of the SSL implementation to use. If not specified and + the tomcat-native library is not installed, the + default of <code>org.apache.tomcat.util.net.jsse.JSSEImplementation</code> + will be used which wraps JVM's default JSSE provider. Note that the + JVM can be configured to use a different JSSE provider as the default. + Tomcat also bundles a special SSL implementation for JSSE that is backed + by OpenSSL. To enable it, the native library should be enabled as if + intending to use the APR connector, and Tomcat will automatically enable it + and the default value of this attribute becomes + <code>org.apache.tomcat.util.net.openssl.OpenSSLImplementation</code>. + In that case, the attributes from either JSSE and OpenSSL + configuration styles can be used, as long as the two types are not mixed + (for example, it is not allowed to define use of a Java keystore and + specify a separate pem private key using the OpenSSL attribute).</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="SSL_Support_-_Connector_-_NIO_and_NIO2_(deprecated)">SSL Support - Connector - NIO and NIO2 (deprecated)</h4><div class="text"> + + <p>The following NIO and NIO2 SSL configuration attributes have been + deprecated in favor of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element. + </p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">algorithm</code></td><td> + <p>This is an alias for the <code>keyManagerAlgorithm</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">ciphers</code></td><td> + <p>This is an alias for the <code>ciphers</code> attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">clientAuth</code></td><td> + <p>This is an alias for the <code>certificateVerification</code> attribute + of the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">crlFile</code></td><td> + <p>This is an alias for the <code>certificateRevocationFile</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">keyAlias</code></td><td> + <p>This is an alias for the <code>certificateKeyAlias</code> attribute of + the first <a href="#SSL_Support_-_Certificate">Certificate</a> element + nested in the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">keyPass</code></td><td> + <p>This is an alias for the <code>certificateKeyPassword</code> attribute + of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element + nested in the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">keystoreFile</code></td><td> + <p>This is an alias for the <code>certificateKeystoreFile</code> attribute + of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element + nested in the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">keystorePass</code></td><td> + <p>This is an alias for the <code>certificateKeystorePassword</code> + attribute of the first + <a href="#SSL_Support_-_Certificate">Certificate</a> element nested in the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">keystoreProvider</code></td><td> + <p>This is an alias for the <code>certificateKeystoreProvider</code> + attribute of the first + <a href="#SSL_Support_-_Certificate">Certificate</a> element nested in the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">keystoreType</code></td><td> + <p>This is an alias for the <code>certificateKeystoreType</code> attribute + of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element + nested in the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">sessionCacheSize</code></td><td> + <p>This is an alias for the <code>sessionCacheSize</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">sessionTimeout</code></td><td> + <p>This is an alias for the <code>sessionTimeout</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">sslEnabledProtocols</code></td><td> + <p>This is an alias for the <code>protocols</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td> + <p>This is an alias for the <code>sslProtocol</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">trustManagerClassName</code></td><td> + <p>This is an alias for the <code>trustManagerClassName</code> attribute + of the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">trustMaxCertLength</code></td><td> + <p>This is an alias for the <code>certificateVerificationDepth</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">truststoreAlgorithm</code></td><td> + <p>This is an alias for the <code>truststoreAlgorithm</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">truststoreFile</code></td><td> + <p>This is an alias for the <code>truststoreFile</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">truststorePass</code></td><td> + <p>This is an alias for the <code>truststorePassword</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">truststoreProvider</code></td><td> + <p>This is an alias for the <code>truststoreProvider</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">truststoreType</code></td><td> + <p>This is an alias for the <code>truststoreType</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">useServerCipherSuitesOrder</code></td><td> + <p>This is an alias for the <code>honorCipherOrder</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="SSL_Support_-_Connector_-_APR/Native_(deprecated)">SSL Support - Connector - APR/Native (deprecated)</h4><div class="text"> + + <p>When APR/native is enabled, the HTTPS connector will use a socket poller + for keep-alive, increasing scalability of the server. It also uses OpenSSL, + which may be more optimized than JSSE depending on the processor being used, + and can be complemented with many commercial accelerator components. Unlike + the HTTP connector, the HTTPS connector cannot use sendfile to optimize static + file processing.</p> + + <p>The HTTPS APR/native connector has the same attributes than the HTTP + APR/native connector, but adds OpenSSL specific ones. For the full details on + using OpenSSL, please refer to OpenSSL documentations and the many books + available for it (see the <a href="http://www.openssl.org">Official OpenSSL + website</a>). The SSL specific attributes for the APR/native connector are: + </p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">SSLCACertificateFile</code></td><td> + <p>This is an alias for the <code>caCertificateFile</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLCACertificatePath</code></td><td> + <p>This is an alias for the <code>caCertificatePath</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLCARevocationFile</code></td><td> + <p>This is an alias for the <code>certificateRevocationFile</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLCARevocationPath</code></td><td> + <p>This is an alias for the <code>certificateRevocationPath</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><strong><code class="attributeName">SSLCertificateFile</code></strong></td><td> + <p>This is an alias for the <code>certificateFile</code> attribute of the + first <a href="#SSL_Support_-_Certificate">Certificate</a> element nested + in the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLCertificateKeyFile</code></td><td> + <p>This is an alias for the <code>certificateKeyFile</code> attribute of the + first <a href="#SSL_Support_-_Certificate">Certificate</a> element nested + in the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLCipherSuite</code></td><td> + <p>This is an alias for the <code>ciphers</code> attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLDisableCompression</code></td><td> + <p>This is an alias for the <code>disableCompression</code> attribute of + the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLHonorCipherOrder</code></td><td> + <p>This is an alias for the <code>honorCipherOrder</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLPassword</code></td><td> + <p>This is an alias for the <code>certificateKeyPassword</code> attribute + of the first <a href="#SSL_Support_-_Certificate">Certificate</a> element + nested in the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLProtocol</code></td><td> + <p>This is an alias for the <code>protocols</code> attribute of the + default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLVerifyClient</code></td><td> + <p>This is an alias for the <code>certificateVerification</code> attribute + of the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr><tr><td><code class="attributeName">SSLVerifyDepth</code></td><td> + <p>This is an alias for the <code>certificateVerificationDepth</code> + attribute of the default + <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> element.</p> + </td></tr><tr><td><code class="attributeName">SSLDisableSessionTickets</code></td><td> + <p>This is an alias for the <code>disableSessionTickets</code> attribute + of the default <a href="#SSL_Support_-_SSLHostConfig">SSLHostConfig</a> + element.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Connector_Comparison">Connector Comparison</h4><div class="text"> + + <p>Below is a small chart that shows how the connectors differ.</p> + + <table class="defaultTable" style="text-align: center;"> + <tr> + <th></th> + <th style="text-align: center;">Java Nio Connector<br>NIO</th> + <th style="text-align: center;">Java Nio2 Connector<br>NIO2</th> + <th style="text-align: center;">APR/native Connector<br>APR</th> + </tr> + <tr> + <th>Classname</th> + <td><code class="noHighlight">Http11NioProtocol</code></td> + <td><code class="noHighlight">Http11Nio2Protocol</code></td> + <td><code class="noHighlight">Http11AprProtocol</code></td> + </tr> + <tr> + <th>Tomcat Version</th> + <td>6.x onwards</td> + <td>8.x onwards</td> + <td>5.5.x onwards</td> + </tr> + <tr> + <th>Support Polling</th> + <td>YES</td> + <td>YES</td> + <td>YES</td> + </tr> + <tr> + <th>Polling Size</th> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + </tr> + <tr> + <th>Read Request Headers</th> + <td>Non Blocking</td> + <td>Non Blocking</td> + <td>Non Blocking</td> + </tr> + <tr> + <th>Read Request Body</th> + <td>Blocking</td> + <td>Blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Write Response Headers and Body</th> + <td>Blocking</td> + <td>Blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Wait for next Request</th> + <td>Non Blocking</td> + <td>Non Blocking</td> + <td>Non Blocking</td> + </tr> + <tr> + <th>SSL Support</th> + <td>Java SSL or OpenSSL</td> + <td>Java SSL or OpenSSL</td> + <td>OpenSSL</td> + </tr> + <tr> + <th>SSL Handshake</th> + <td>Non blocking</td> + <td>Non blocking</td> + <td>Blocking</td> + </tr> + <tr> + <th>Max Connections</th> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + <td><code class="noHighlight">maxConnections</code></td> + </tr> + </table> + + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/http2.html b/src/tomcat/webapps/docs/config/http2.html new file mode 100644 index 0000000000000000000000000000000000000000..365dc8a86c2388d2be42ba08e796c45dd03a9b78 --- /dev/null +++ b/src/tomcat/webapps/docs/config/http2.html @@ -0,0 +1,214 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The HTTP2 Upgrade Protocol</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/http2"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The HTTP2 Upgrade Protocol</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>HTTP Upgrade Protocol</strong> element represents an + <strong>Upgrade Protocol</strong> component that supports the HTTP/2 protocol. + An instance of this component must be associated with an existing + <a href="http.html">HTTP/1.1 Connector</a>.</p> + + <p>HTTP/2 connectors use non-blocking I/O, only utilising a container thread + from the thread pool when there is data to read and write. However, because + the Servlet API is fundamentally blocking, each HTTP/2 stream requires a + dedicated container thread for the duration of that stream.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Upgrade Protocol</strong> support the + following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>This must be <code>org.apache.coyote.http2.Http2Protocol</code>.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The HTTP/2 <strong>Upgrade Protocol</strong> implementation supports the + following attributes in addition to the common attributes listed above.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allowedTrailerHeaders</code></td><td> + <p>By default Tomcat will ignore all trailer headers when processing + HTTP/2 connections. For a header to be processed, it must be added to this + comma-separated list of header names.</p> + </td></tr><tr><td><code class="attributeName">compressibleMimeType</code></td><td> + <p>The value is a comma separated list of MIME types for which HTTP + compression may be used. + The default value is + <code> + text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml + </code>. + </p> + </td></tr><tr><td><code class="attributeName">compression</code></td><td> + <p>The HTTP/2 protocol may use compression in an attempt to save server + bandwidth. The acceptable values for the parameter is "off" (disable + compression), "on" (allow compression, which causes text data to be + compressed), "force" (forces compression in all cases), or a numerical + integer value (which is equivalent to "on", but specifies the minimum + amount of data before the output is compressed). If the content-length is + not known and compression is set to "on" or more aggressive, the output + will also be compressed. If not specified, this attribute is set to + "off".</p> + <p><em>Note</em>: There is a tradeoff between using compression (saving + your bandwidth) and using the sendfile feature (saving your CPU cycles). + If the connector supports the sendfile feature, e.g. the NIO2 connector, + using sendfile will take precedence over compression. The symptoms will + be that static files greater that 48 Kb will be sent uncompressed. + You can turn off sendfile by setting <code>useSendfile</code> attribute + of the protocol, as documented below, or change the sendfile usage + threshold in the configuration of the + <a href="../default-servlet.html">DefaultServlet</a> in the default + <code>conf/web.xml</code> or in the <code>web.xml</code> of your web + application. + </p> + </td></tr><tr><td><code class="attributeName">compressionMinSize</code></td><td> + <p>If <strong>compression</strong> is set to "on" then this attribute + may be used to specify the minimum amount of data before the output is + compressed. If not specified, this attribute is defaults to "2048".</p> + </td></tr><tr><td><code class="attributeName">initialWindowSize</code></td><td> + <p>Controls the initial size of the flow control window for streams that + Tomcat advertises to clients. If not specified, the default value of + <code>65535</code> is used.</p> + </td></tr><tr><td><code class="attributeName">keepAliveTimeout</code></td><td> + <p>The time, in milliseconds, that Tomcat will wait between HTTP/2 frames + before closing the connection. Negative values will be treated as an + infinite timeout. If not specified, a default value of <code>-1</code> + will be used.</p> + </td></tr><tr><td><code class="attributeName">maxConcurrentStreamExecution</code></td><td> + <p>The controls the maximum number of streams for any one connection that + can be allocated threads from the container thread pool. If more streams + are active than threads are available, those streams will have to wait + for a stream to become available. If not specified, the default value of + <code>200</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">maxConcurrentStreams</code></td><td> + <p>The controls the maximum number of active streams permitted for any one + connection. If a client attempts to open more active streams than this + limit, the stream will be reset with a <code>STREAM_REFUSED</code> error. + If not specified, the default value of <code>200</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">maxHeaderCount</code></td><td> + <p>The maximum number of headers in a request that is allowed by the + container. A request that contains more headers than the specified limit + will be rejected. A value of less than 0 means no limit. + If not specified, a default of 100 is used.</p> + </td></tr><tr><td><code class="attributeName">maxHeaderSize</code></td><td> + <p>The maximum total size for all headers in a request that is allowed by + the container. Total size for a header is calculated as the uncompressed + size of the header name in bytes, plus the uncompressed size of the header + value in bytes plus an HTTP/2 overhead of 3 bytes per header. A request + that contains a set of headers that requires more than the specified limit + will be rejected. A value of less than 0 means no limit. If not specified, + a default of 8192 is used.</p> + </td></tr><tr><td><code class="attributeName">maxTrailerCount</code></td><td> + <p>The maximum number of trailer headers in a request that is allowed by + the container. A request that contains more trailer headers than the + specified limit will be rejected. A value of less than 0 means no limit. + If not specified, a default of 100 is used.</p> + </td></tr><tr><td><code class="attributeName">maxTrailerSize</code></td><td> + <p>The maximum total size for all trailer headers in a request that is + allowed by the container. Total size for a header is calculated as the + uncompressed size of the header name in bytes, plus the uncompressed size + of the header value in bytes plus an HTTP/2 overhead of 3 bytes per + header. A request that contains a set of trailer headers that requires + more than the specified limit will be rejected. A value of less than 0 + means no limit. If not specified, a default of 8192 is used.</p> + </td></tr><tr><td><code class="attributeName">noCompressionUserAgents</code></td><td> + <p>The value is a regular expression (using <code>java.util.regex</code>) + matching the <code>user-agent</code> header of HTTP clients for which + compression should not be used, + because these clients, although they do advertise support for the + feature, have a broken implementation. + The default value is an empty String (regexp matching disabled).</p> + </td></tr><tr><td><code class="attributeName">readTimeout</code></td><td> + <p>The time, in milliseconds, that Tomcat will wait for additional data + when a partial HTTP/2 frame has been received. Negative values will be + treated as an infinite timeout. If not specified, a default value of + <code>10000</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">useSendfile</code></td><td> + <p>Use this boolean attribute to enable or disable sendfile capability. + The default value is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">writeTimeout</code></td><td> + <p>The time, in milliseconds, that Tomcat will wait to write additional + data when an HTTP/2 frame has been partially written. Negative values will + be treated as an infinite timeout. If not specified, a default value of + <code>10000</code> will be used.</p> + </td></tr></table> + + <p>The HTTP/2 upgrade protocol will also inherit the following limits from the + <a href="http.html">HTTP Connector</a> it is nested with:</p> + + <ul> + <li>maxCookieCount</li> + <li>maxParameterCount</li> + <li>maxPostSize</li> + <li>maxSavePostSize</li> + </ul> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>This component does not support any nested components.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>This component does not support any special features.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/index.html b/src/tomcat/webapps/docs/config/index.html new file mode 100644 index 0000000000000000000000000000000000000000..bd2cc7fada29153f9beb58c26d5ba18d8c7df72b --- /dev/null +++ b/src/tomcat/webapps/docs/config/index.html @@ -0,0 +1,107 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - Overview</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/index"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Overview</h2><h3 id="Overview">Overview</h3><div class="text"> + +<p>This manual contains reference information about all of the configuration +directives that can be included in a <code>conf/server.xml</code> file to +configure the behavior of the Tomcat Servlet/JSP container. It does not +attempt to describe which configuration directives should be used to perform +specific tasks - for that, see the various <em>HOW-TO</em> documents on the +main index page.</p> + +<p>Tomcat configuration files are formatted as schemaless XML; elements and +attributes are case-sensitive. Apache Ant-style variable substitution +is supported; a system property with the name <code>propname</code> may be +used in a configuration file using the syntax <code>${propname}</code>. All +system properties are available including those set using the <code>-D</code> +syntax, those automatically made available by the JVM and those configured in +the <code>$CATALINA_BASE/conf/catalina.properties</code> file. +</p> + +<p>The configuration element descriptions are organized into the following +major categories:</p> +<ul> +<li><strong>Top Level Elements</strong> - <code><Server></code> is the + root element of the entire configuration file, while + <code><Service></code> represents a group of Connectors that is + associated with an Engine.</li> +<li><strong>Connectors</strong> - Represent the interface between external + clients sending requests to (and receiving responses from) a particular + Service.</li> +<li><strong>Containers</strong> - Represent components whose function is to + process incoming requests, and create the corresponding responses. + An Engine handles all requests for a Service, a Host handles all requests + for a particular virtual host, and a Context handles all requests for a + specific web application.</li> +<li><strong>Nested Components</strong> - Represent elements that can be + nested inside the element for a Container. Some elements can be nested + inside any Container, while others can only be nested inside a + Context.</li> +</ul> + +<p>For each element, the corresponding documentation follows this general +outline:</p> +<ul> +<li><strong>Introduction</strong> - Overall description of this particular + component. There will be a corresponding Java <em>interface</em> (in + the <code>org.apache.catalina</code> package) that is implemented by one + or more standard implementations.</li> +<li><strong>Attributes</strong> - The set of attributes that are legal for + this element. Generally, this will be subdivided into <em>Common</em> + attributes that are supported by all implementations of the corresponding + Java interface, and <em>Standard Implementation</em> attributes that are + specific to a particular Java class that implements this interface. + The names of required attributes are <strong>bolded</strong>.</li> +<li><strong>Nested Components</strong> - Enumerates which of the <em>Nested + Components</em> can be legally nested within this element.</li> +<li><strong>Special Features</strong> - Describes the configuration of a large + variety of special features (specific to each element type) that are + supported by the standard implementation of this interface.</li> +</ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/jar-scan-filter.html b/src/tomcat/webapps/docs/config/jar-scan-filter.html new file mode 100644 index 0000000000000000000000000000000000000000..20e644f678a287a50a8eb9bb57e0e072cb4a4fbd --- /dev/null +++ b/src/tomcat/webapps/docs/config/jar-scan-filter.html @@ -0,0 +1,183 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Jar Scan Filter Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/jar-scan-filter"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Jar Scan Filter Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Jar Scan Filter</strong> element represents the component that + filters results from the <a href="jar-scanner.html">Jar Scanner</a> before + they are passed back to the application. It is typically used to skip the + scanning of JARs that are known not to be relevant to some or all types of + scan.</p> + + <p>A Jar Scan Filter element MAY be nested inside a + <a href="jar-scanner.html">Jar Scanner</a> component.</p> + + <p>For example you can specify additional jar files when scanning for pluggable + features:</p> +<div class="codeBox"><pre><code><Context> + ... + <JarScanner> + <JarScanFilter + pluggabilityScan="${tomcat.util.scan.StandardJarScanFilter.jarsToScan}, + my_pluggable_feature.jar"/> + </JarScanner> + ... +</Context></code></pre></div> + + <p>If a Jar Scan Filter element is not included, a default Jar Scan Filter + configuration will be created automatically, which is sufficient for most + requirements.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Jar Scan Filter</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.tomcat.JarScanFilter</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Jar Scan Filter</strong> is + <strong>org.apache.tomcat.util.scan.StandardJarScanFilter</strong>. + Additional attributes that it supports (in addition to the common attributes + listed above) are listed in the table.</p> + + <p>The values for <strong>pluggabilitySkip</strong>, + <strong>pluggabilityScan</strong>, <strong>tldSkip</strong>, + <strong>tldScan</strong> attributes are lists of file name pattern. The + patterns are separated by comma (','). The leading and trailing whitespace + characters in a pattern are ignored. The patterns are matched + case-sensitively. The following two special characters are supported:</p> + + <ul> + <li>'*' - means zero or more characters,</li> + <li>'?' - means one and only one character.</li> + </ul> + + <p>Note that excluding a JAR from the pluggability scan will prevent a + ServletContainerInitializer from being loaded from a web application JAR + (i.e. one located in <code>/WEB-INF/lib</code>) but it will not prevent + a ServletContainerInitializer from being loaded from the container (Tomcat). + To prevent a ServletContainerInitializer provided by container from being + loaded, use the <code>containerSciFilter</code> property of the + <a href="context.html">Context</a>.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">pluggabilitySkip</code></td><td> + <p>The comma separated list of JAR file name patterns + to skip when scanning for pluggable features introduced by Servlet 3.0 + specification. If not specified, the default is obtained from the + <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code> system + property.</p> + </td></tr><tr><td><code class="attributeName">pluggabilityScan</code></td><td> + <p>The comma separated list of JAR file name patterns + to scan when scanning for pluggable features introduced by Servlet 3.0 + specification. If not specified, the default is obtained from the + <code>tomcat.util.scan.StandardJarScanFilter.jarsToScan</code> system + property.</p> + </td></tr><tr><td><code class="attributeName">defaultPluggabilityScan</code></td><td> + <p>Controls if JARs are scanned or skipped by default when scanning + for the pluggable features. + If <code>true</code>, a JAR is scanned when its name either matches + none of <strong>pluggabilitySkip</strong> patterns or + any of <strong>pluggabilityScan</strong> patterns. + If <code>false</code>, a JAR is scanned when its name matches + any of <strong>pluggabilityScan</strong> patterns and + none of <strong>pluggabilitySkip</strong> patterns. + If not specified, the default value is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">tldSkip</code></td><td> + <p>The comma separated list of JAR file name patterns + to skip when scanning for tag libraries (TLDs). + If not specified, the default is obtained + from the <code>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</code> + system property.</p> + </td></tr><tr><td><code class="attributeName">tldScan</code></td><td> + <p>The comma separated list of JAR file name patterns + to scan when scanning for tag libraries (TLDs). + If not specified, the default is obtained + from the <code>tomcat.util.scan.StandardJarScanFilter.jarsToScan</code> + system property.</p> + </td></tr><tr><td><code class="attributeName">defaultTldScan</code></td><td> + <p>Controls if JARs are scanned or skipped by default when scanning + for TLDs. + If <code>true</code>, a JAR is scanned when its name either matches + none of <strong>tldSkip</strong> patterns or + any of <strong>tldScan</strong> patterns. + If <code>false</code>, a JAR is scanned when its name matches + any of <strong>tldScan</strong> patterns and + none of <strong>tldSkip</strong> patterns. + If not specified, the default value is <code>true</code>.</p> + </td></tr></table> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + <p>No components may be nested inside a <strong>Jar Scan Filter</strong> element. + </p> +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + <p>No special features are associated with a <strong>Jar Scan Filter</strong> + element.</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/jar-scanner.html b/src/tomcat/webapps/docs/config/jar-scanner.html new file mode 100644 index 0000000000000000000000000000000000000000..e8c4be827925197876a0cbe88b2092e1e98109b8 --- /dev/null +++ b/src/tomcat/webapps/docs/config/jar-scanner.html @@ -0,0 +1,141 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Jar Scanner Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/jar-scanner"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Jar Scanner Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Jar Scanner</strong> element represents the component that is + used to scan the web application for JAR files and directories of class files. + It is typically used during web application start to identify configuration + files such as TLDs or web-fragment.xml files that must be processed as part of + the web application initialisation.</p> + + <p>A Jar Scanner element MAY be nested inside a + <a href="context.html">Context</a> component.</p> + + <p>For example you can include the bootstrap classpath when scanning for jar + files:</p> +<div class="codeBox"><pre><code><Context> + ... + <JarScanner scanBootstrapClassPath="true"/> + ... +</Context></code></pre></div> + + <p>If a Jar Scanner element is not included, a default Jar Scanner configuration + will be created automatically, which is sufficient for most requirements.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Jar Scanner</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.tomcat.JarScanner</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Jar Scanner</strong> is + <strong>org.apache.tomcat.util.scan.StandardJarScanner</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">scanAllDirectories</code></td><td> + <p>If <code>true</code>, any directories found on the classpath will be + checked to see if they are expanded JAR files. + The default is <code>false</code>.</p> + <p>Tomcat determines if a directory is an expanded JAR file by looking + for a META-INF sub-directory. Only if the META-INF sub-directory exists, + the directory is assumed to be an expanded JAR file. Note that for scans + for matches to <code>@HandlesTypes</code> annotations, all directories + will be scanned irrespective of the presence or not of a META-INF + sub-directory.</p> + </td></tr><tr><td><code class="attributeName">scanAllFiles</code></td><td> + <p>If <code>true</code>, any files found on the classpath will be checked + to see if they are Jar files rather than relying on the file extension + being <code>.jar</code>. The default is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">scanClassPath</code></td><td> + <p>If <code>true</code>, the full web application classpath, including + the shared and common classloaders and the system classpath (but not the + bootstrap classpath) will be scanned for Jar files in addition to the web + application. The default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">scanBootstrapClassPath</code></td><td> + <p>If <strong>scanClassPath</strong> is <code>true</code> and this is + <code>true</code> the bootstrap classpath will also be scanned for Jar + files. The default is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">scanManifest</code></td><td> + <p>If <code>true</code>, the Manifest files of any JARs found will be + scanned for additional class path entries and those entries will be added + to the URLs to scan. The default is <code>true</code>.</p> + </td></tr></table> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + <p>Only a <a href="jar-scan-filter.html">Jar Scan Filter</a> may be nested + inside a <strong>Jar Scanner</strong> element.</p> +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + <p>No special features are associated with a <strong>Jar Scanner</strong> + element.</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/jaspic.html b/src/tomcat/webapps/docs/config/jaspic.html new file mode 100644 index 0000000000000000000000000000000000000000..289dbd15b0a731c0c413d9bbcb58f063201fe6c5 --- /dev/null +++ b/src/tomcat/webapps/docs/config/jaspic.html @@ -0,0 +1,191 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - JASPIC</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/jaspic"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JASPIC</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Static_configuration">Static configuration</a><ol><li><a href="#AuthConfigProvider">AuthConfigProvider</a></li><li><a href="#ServerAuthModule">ServerAuthModule</a></li></ol></li><li><a href="#Dynamic_configuration">Dynamic configuration</a></li><li><a href="#3rd_party_modules">3rd party modules</a><ol><li><a href="#Philip_Green_II's_module_for_Google_OAuth_2">Philip Green II's module for Google OAuth 2</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>Tomcat implements JASPIC 1.1 Maintenance Release B + (<a href="https://www.jcp.org/en/jsr/detail?id=196">JSR 196</a>). The + implementation is primarily intended to enable the integration of 3rd party + JASPIC authentication implementations with Tomcat.</p> + + <p>JASPIC may be configured dynamically by an application or statically via + the <code>$CATALINA_BASE/conf/jaspic-providers.xml</code> configuration file. + If present, a JASPIC configuration will over-ride any + <code><login-config></code> present in <code>web.xml</code>.</p> + +</div><h3 id="Static_configuration">Static configuration</h3><div class="text"> + + <div class="subsection"><h4 id="AuthConfigProvider">AuthConfigProvider</h4><div class="text"> + + <p>If the 3rd party implementation includes an + <code>AuthConfigProvider</code> then a web application can be configured to + use it by nesting the following inside the + <code><jaspic-providers></code> element in + <code>$CATALINA_BASE/conf/jaspic-providers.xml</code>.</p> +<div class="codeBox"><pre><code><provider name="any" + className="fully.qualified.implementation.class.Name" + layer="HttpServlet" + appContext="Catalina/localhost /contextPath" + description="any"> + <property name="see-provider-documentation" + value="see-provider-documentation" /> +</provider></code></pre></div> + + <p>The <code>name</code> and <code>description</code> attributes are not + used by Tomcat.</p> + + <p>The <code>className</code> attribute must be the fully qualified class + name of the <code>AuthConfigProvider</code>. The implementation may be + packaged with the web application or in Tomcat's + <code>$CATALINA_BASE/lib</code> directory.</p> + + <p>The <code>layer</code> attribute must be <code>HttpServlet</code>.</p> + + <p>The <code>appContext</code> attribute must be exactly the concatenation + of:</p> + <ul> + <li>The engine name</li> + <li>The forward slash character</li> + <li>The host name</li> + <li>A single space</li> + <li>The context path</li> + </ul> + + <p>If the <code>AuthConfigProvider</code> supports configuration via + properties these may be specified via <code><property></code> elements + nesting inside the <code><provide></code> element.</p> + + </div></div> + + <div class="subsection"><h4 id="ServerAuthModule">ServerAuthModule</h4><div class="text"> + + <p>If the 3rd party implementation only provides an + <code>ServerAuthModule</code> then it will be necessary to provide a number + of supporting classes. These may be a custom implementation or, + alternatively, Tomcat provides a simple wrapper implementation for + <code>ServerAuthModule</code>s. + </p> + + <p>Tomcat's wrapper for <code>ServerAuthModule</code> can be configured + by nesting the following inside the + <code><jaspic-providers></code> element in + <code>$CATALINA_BASE/conf/jaspic-providers.xml</code>.</p> +<div class="codeBox"><pre><code><provider name="any" + className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider" + layer="HttpServlet" + appContext="Catalina/localhost /contextPath" + description="any"> + <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1" + value="fully.qualified.implementation.class.Name" /> + <property name="see-provider-documentation" + value="see-provider-documentation" /> +</provider></code></pre></div> + + <p>The configuration is similar to the <code>AuthConfigProvider</code> in + the previous section but with some key differences.</p> + + <p>The <code>className</code> attribute must be + <code>org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider</code>.</p> + + <p>The <code>ServerAuthModule</code>(s) are specified via properties. The + property name must be + <code>org.apache.catalina.authenticator.jaspic.ServerAuthModule.n</code> + where <code>n</code> is the index of the module. The index must start at 1 + an increment in steps of 1 until all modules are defined. The value of the + property must be the fully qualified class name of the module.</p> + </div></div> + +</div><h3 id="Dynamic_configuration">Dynamic configuration</h3><div class="text"> + + <p>JASPIC modules and configuration can be packaged within a WAR file with the + web application. The web application can then register the required JASPIC + configuration when it starts using the standard JASPIC APIs.</p> + + <p>If parallel deployment is being used then dynamic configuration should not + be used. The JASPIC API assumes that a context path is unique for any given + host which is not the case when using parallel deployment. When using parallel + deployment, static JASPIC configuration should be used. This will require that + all versions of the application use the same JASPIC configuration.</p> + +</div><h3 id="3rd_party_modules">3rd party modules</h3><div class="text"> + + <p>This is not an exhaustive list. The Tomcat community welcomes contributions + that add to this section.</p> + + <div class="subsection"><h4 id="Philip_Green_II's_module_for_Google_OAuth_2">Philip Green II's module for Google OAuth 2</h4><div class="text"> + + <p>The source code for this module along with the + <a href="https://github.com/phillipgreenii/google-oauth-2.0-serverauthmodule">documentation</a> + which includes details of the necessary Google API configuration is + available on GitHub.</p> + + <p>A sample configuration for using this module with Tomcat would look like + this:</p> +<div class="codeBox"><pre><code><jaspic-providers xmlns="http://tomcat.apache.org/xml" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://tomcat.apache.org/xml jaspic-providers.xsd" + version="1.0"> + <provider name="google-oauth" + className="org.apache.catalina.authenticator.jaspic.SimpleAuthConfigProvider" + layer="HttpServlet" + appContext="Catalina/localhost /contextPath" + description="Google OAuth test"> + <property name="org.apache.catalina.authenticator.jaspic.ServerAuthModule.1" + value="com.idmworks.security.google.GoogleOAuthServerAuthModule" /> + <property name="oauth.clientid" + value="obtained-from-Google-console" /> + <property name="oauth.clientsecret" + value="obtained-from-Google-console" /> + <property name="ignore_missing_login_context" + value="true" /> + </provider> +</jaspic-providers></code></pre></div> + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/listeners.html b/src/tomcat/webapps/docs/config/listeners.html new file mode 100644 index 0000000000000000000000000000000000000000..bcdc43f3218a6507c858ab0d88b1ddbdaef0a983 --- /dev/null +++ b/src/tomcat/webapps/docs/config/listeners.html @@ -0,0 +1,534 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The LifeCycle Listener Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/listeners"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The LifeCycle Listener Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Standard_Implementations">Standard Implementations</a><ol><li><a href="#APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">APR Lifecycle Listener - org.apache.catalina.core.AprLifecycleListener</a></li><li><a href="#Global_Resources_Lifecycle_Listener_-_org.apache.catalina.mbeans.GlobalResourcesLifecycleListener">Global Resources Lifecycle Listener - org.apache.catalina.mbeans.GlobalResourcesLifecycleListener</a></li><li><a href="#JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener">JRE Memory Leak Prevention Listener - org.apache.catalina.core.JreMemoryLeakPreventionListener</a><ol><li><a href="#JreMemoryLeakPreventionListener_Examples">JreMemoryLeakPreventionListener Examples</a></li></ol></li><li><a href="#Security_Lifecycle_Listener_-_org.apache.catalina.security.SecurityListener">Security Lifecycle Listener - org.apache.catalina.security.SecurityListener</a></li><li><a href="#StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfig Lifecycle Listener - org.apache.catalina.storeconfig.StoreConfigLifecycleListener</a></li><li><a href="#ThreadLocal_Leak_Prevention_Listener_-_org.apache.catalina.core.ThreadLocalLeakPreventionListener">ThreadLocal Leak Prevention Listener - org.apache.catalina.core.ThreadLocalLeakPreventionListener</a></li><li><a href="#UserConfig_-_org.apache.catalina.startup.UserConfig">UserConfig - org.apache.catalina.startup.UserConfig</a></li><li><a href="#Version_Logging_Lifecycle_Listener_-_org.apache.catalina.startup.VersionLoggerListener">Version Logging Lifecycle Listener - org.apache.catalina.startup.VersionLoggerListener</a></li></ol></li><li><a href="#Additional_Implementations">Additional Implementations</a><ol><li><a href="#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener">JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>A <strong>Listener</strong> element defines a component that performs + actions when specific events occur, usually Tomcat starting or Tomcat + stopping.</p> + + <p>Listeners may be nested inside a <a href="server.html">Server</a>, + <a href="engine.html">Engine</a>, <a href="host.html">Host</a> or + <a href="context.html">Context</a>. Some Listeners are only intended to be + nested inside specific elements. These constraints are noted in the + documentation below.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Listener</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.LifecycleListener</code> + interface.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>No element may be nested inside a <strong>Listener</strong>.</p> + +</div><h3 id="Standard_Implementations">Standard Implementations</h3><div class="text"> + + <p>Unlike most Catalina components, there are several standard + <strong>Listener</strong> implementations available. As a result, + the <code>className</code> attribute MUST be used to select the + implementation you wish to use.</p> + + <div class="subsection"><h4 id="APR_Lifecycle_Listener_-_org.apache.catalina.core.AprLifecycleListener">APR Lifecycle Listener - org.apache.catalina.core.AprLifecycleListener</h4><div class="text"> + + <p>The <strong>APR Lifecycle Listener</strong> checks for the presence of + the APR/native library and loads the library if it is present. For more + information see the <a href="../apr.html">APR/native guide</a>.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>The following additional attributes are supported by the <strong>APR + Lifecycle Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">SSLEngine</code></td><td> + <p>Name of the SSLEngine to use. <code>off</code>: do not use SSL, + <code>on</code>: use SSL but no specific ENGINE.</p> + <p>The default value is <b>on</b>. This initializes the + native SSL engine, which must be enabled in the APR/native connector by + the use of the <code>SSLEnabled</code> attribute.</p> + <p>See the <a href="http://www.openssl.org/">Official OpenSSL website</a> + for more details on supported SSL hardware engines and manufacturers. + </p> + </td></tr><tr><td><code class="attributeName">SSLRandomSeed</code></td><td> + <p>Entropy source used to seed the SSLEngine's PRNG. The default value + is <code>builtin</code>. On development systems, you may want to set + this to <code>/dev/urandom</code> to allow quicker start times.</p> + </td></tr><tr><td><code class="attributeName">FIPSMode</code></td><td> + <p>Set to <code>on</code> to request that OpenSSL be in FIPS mode + (if OpenSSL is already in FIPS mode, it will remain in FIPS mode). + Set to <code>enter</code> to force OpenSSL to enter FIPS mode (an error + will occur if OpenSSL is already in FIPS mode). + Set to <code>require</code> to require that OpenSSL <i>already</i> be + in FIPS mode (an error will occur if OpenSSL is not already in FIPS + mode).</p> + <p>FIPS mode <em>requires you to have a FIPS-capable OpenSSL library which + you must build yourself</em>. + If this attribute is set to any of the above values, the <b>SSLEngine</b> + must be enabled as well.</p> + <p>The default value is <code>off</code>.</p> + </td></tr><tr><td><code class="attributeName">useAprConnector</code></td><td> + <p>This attribute controls the auto-selection of the connector + implementation. When the <strong>protocol</strong> is specified as + <code>HTTP/1.1</code> or <code>AJP/1.3</code> then if this attribute is + <code>true</code> the APR/native connector will be used but if this + attribute is false the NIO connector will be used.</p> + </td></tr><tr><td><code class="attributeName">useOpenSSL</code></td><td> + <p>This attribute controls the auto-selection of the OpenSSL JSSE + implementation. The default is <code>true</code> which will use OpenSSL + if the native library is available and a NIO or NIO2 connector is used.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Global_Resources_Lifecycle_Listener_-_org.apache.catalina.mbeans.GlobalResourcesLifecycleListener">Global Resources Lifecycle Listener - org.apache.catalina.mbeans.GlobalResourcesLifecycleListener</h4><div class="text"> + + <p>The <strong>Global Resources Lifecycle Listener</strong> initializes the + Global JNDI resources defined in server.xml as part of the <a href="globalresources.html">Global Resources</a> element. Without this + listener, none of the Global Resources will be available.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>No additional attributes are supported by the <strong>Global Resources + Lifecycle Listener</strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="JRE_Memory_Leak_Prevention_Listener_-_org.apache.catalina.core.JreMemoryLeakPreventionListener">JRE Memory Leak Prevention Listener - org.apache.catalina.core.JreMemoryLeakPreventionListener</h4><div class="text"> + + <p>The <strong>JRE Memory Leak Prevention Listener</strong> provides + work-arounds for known places where the Java Runtime environment uses + the context class loader to load a singleton as this will cause a memory + leak if a web application class loader happens to be the context class + loader at the time. The work-around is to initialise these singletons when + this listener starts as Tomcat's common class loader is the context class + loader at that time. It also provides work-arounds for known issues that + can result in locked JAR files.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>The following additional attributes are supported by the <strong>JRE + Memory Leak Prevention Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">AWTThreadProtection</code></td><td> + <p>Enables protection so that calls to + <code>java.awt.Toolkit.getDefaultToolkit()</code> triggered by a web + application do not result in a memory leak. + Defaults to <code>false</code> because an AWT thread is launched. This + protection is disabled if running on Java 9 onwards since the leak has + been fixed for Java 9 onwards.</p> + </td></tr><tr><td><code class="attributeName">classesToInitialize</code></td><td> + <p>List of comma-separated fully qualified class names to load and initialize + during the startup of this Listener. This allows to pre-load classes that are + known to provoke classloader leaks if they are loaded during a request + processing. Non-JRE classes may be referenced, like + <code>oracle.jdbc.driver.OracleTimeoutThreadPerVM</code>. + The default value is empty, but specific JRE classes are loaded by other leak + protection features managed by other attributes of this Listener.</p> + </td></tr><tr><td><code class="attributeName">driverManagerProtection</code></td><td> + <p>The first use of <code>java.sql.DriverManager</code> will trigger the + loading of JDBC Driver in the current class loader. The web + application level memory leak protection can take care of this in most + cases but triggering the loading here has fewer side-effects. The + default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">forkJoinCommonPoolProtection</code></td><td> + <p>Enables protection so the threads created for + <code>ForkJoinPool.commonPool()</code> do not result in a memory leak. + The protection is enabled by setting the + <code>java.util.concurrent.ForkJoinPool.common.threadFactory</code> + system property. If this property is set when Tomcat starts, Tomcat will + not over-ride it even if this protection is explicitly enabled. The + default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">gcDaemonProtection</code></td><td> + <p>Enables protection so that calls to + <code>sun.misc.GC.requestLatency(long)</code> triggered by a web + application do not result in a memory leak. Use of RMI is likely to + trigger a call to this method. A side effect of enabling this protection + is the creation of a thread named "GC Daemon". The protection uses + reflection to access internal Sun classes and may generate errors on + startup on non-Sun JVMs. The default is <code>true</code>. This + protection is disabled if running on Java 9 onwards since the leak has + been fixed for Java 9 onwards.</p> + </td></tr><tr><td><code class="attributeName">ldapPoolProtection</code></td><td> + <p>Enables protection so that the PoolCleaner thread started by + <code>com.sun.jndi.ldap.LdapPoolManager</code> does not result in a + memory leak. The thread is started the first time the + <code>LdapPoolManager</code> class is used if the system property + <code>com.sun.jndi.ldap.connect.pool.timeout</code> is set to a value + greater than 0. Without this protection, if a web application uses this + class the PoolCleaner thread will be configured with the thread's + context class loader set to the web application class loader which in + turn will trigger a memory leak on reload. Defaults to + <code>true</code>. This protection is disabled if running on Java 9 + onwards since the leak has been fixed for Java 9 onwards.</p> + </td></tr><tr><td><code class="attributeName">tokenPollerProtection</code></td><td> + <p>Enables protection so that any token poller thread initialized by + <code>sun.security.pkcs11.SunPKCS11.initToken()</code> does not + result in a memory leak. The thread is started depending on various + conditions as part of the initialization of the Java Cryptography + Architecture. Without the protection this can happen during Webapp + deployment when the MessageDigest for generating session IDs is + initialized. As a result the thread has the Webapp class loader as its + thread context class loader. Enabling the protection initializes JCA + early during Tomcat startup. Defaults to <code>true</code>. This + protection is disabled if running on Java 9 onwards since the leak has + been fixed for Java 9 onwards.</p> + </td></tr><tr><td><code class="attributeName">urlCacheProtection</code></td><td> + <p>Enables protection so that reading resources from JAR files using + <code>java.net.URLConnection</code>s does not result in the JAR file + being locked. Note that enabling this protection disables caching by + default for all resources obtained via + <code>java.net.URLConnection</code>s. Caching may be re-enabled on a + case by case basis as required. Defaults to <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">xmlParsingProtection</code></td><td> + <p>Enables protection so that parsing XML files within a web application + does not result in a memory leak. Note that memory profilers may not + display the GC root associated with this leak making it particularly + hard to diagnose. Defaults to <code>true</code>. This protection is + disabled if running on Java 9 onwards since the leak has been fixed for + Java 9 onwards.</p> + </td></tr></table> + + <div class="subsection"><h4 id="JreMemoryLeakPreventionListener_Examples">JreMemoryLeakPreventionListener Examples</h4><div class="text"> + + <p>The following is an example of how to configure the + <code>classesToInitialize</code> attribute of this listener.</p> + + <p>If this listener was configured in server.xml as:</p> + + <div class="codeBox"><pre><code> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" + classesToInitialize="oracle.jdbc.driver.OracleTimeoutThreadPerVM" /></code></pre></div> + + <p>then the <code>OracleTimeoutThreadPerVM</code> class would be loaded + and initialized during listener startup instead of during request + processing.</p> + + </div></div> + + </div></div> + + <div class="subsection"><h4 id="Security_Lifecycle_Listener_-_org.apache.catalina.security.SecurityListener">Security Lifecycle Listener - org.apache.catalina.security.SecurityListener</h4><div class="text"> + + <p>The <strong>Security Lifecycle Listener</strong> performs a number of + security checks when Tomcat starts and prevents Tomcat from starting if they + fail. The listener is not enabled by default. To enabled it uncomment the + listener in $CATALINA_BASE/conf/server.xml. If the operating system supports + umask then the line in $CATALINA_HOME/bin/catalina.sh that obtains the umask + also needs to be uncommented.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>The following additional attributes are supported by the <strong>Security + Lifecycle Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">checkedOsUsers</code></td><td> + <p>A comma separated list of OS users that must not be used to start + Tomcat. If not specified, the default value of <b>root</b> is used. To + disable this check, set the attribute to the empty string. Usernames + are checked in a case-insensitive manner.</p> + </td></tr><tr><td><code class="attributeName">minimumUmask</code></td><td> + <p>The least restrictive umask that must be configured before Tomcat + will start. If not specified, the default value of <b>0007</b> is used. + To disable this check, set the attribute to the empty string. The check + is not performed on Windows platforms.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfig Lifecycle Listener - org.apache.catalina.storeconfig.StoreConfigLifecycleListener</h4><div class="text"> + + <p>The <strong>StoreConfig Lifecycle Listener</strong> configures a + StoreConfig MBean that may be used to save the current server configuration + in server.xml or the current configuration for a web application in a + context.xml file.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>The following additional attributes are supported by the + <strong>StoreConfig Lifecycle Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">storeConfigClass</code></td><td> + <p>The name of the <code>IStoreConfig</code> implementation to use. If + not specified the default of + <code>org.apache.catalina.storeconfig.StoreConfig</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">storeRegistry</code></td><td> + <p>The URL of the configuration file that configures how the + <code>IStoreConfig</code> is to save the configuration. If not specified + the built in resource + <code>/org/apache/catalina/storeconfig/server-registry.xml</code> will + be used.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="ThreadLocal_Leak_Prevention_Listener_-_org.apache.catalina.core.ThreadLocalLeakPreventionListener">ThreadLocal Leak Prevention Listener - org.apache.catalina.core.ThreadLocalLeakPreventionListener</h4><div class="text"> + + <p>The <strong>ThreadLocal Leak Prevention Listener</strong> triggers the + renewal of threads in <a href="executor.html">Executor</a> pools when a + <a href="context.html">Context</a> is being stopped to avoid thread-local + related memory leaks. Active threads will be renewed one by one when they + come back to the pool after executing their task. The renewal happens + only for contexts that have their <code>renewThreadsWhenStoppingContext</code> + attribute set to <code>true</code>.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements.</p> + + <p>No additional attributes are supported by the <strong>ThreadLocal Leak + Prevention Listener</strong>.</p> + + </div></div> + + <div class="subsection"><h4 id="UserConfig_-_org.apache.catalina.startup.UserConfig">UserConfig - org.apache.catalina.startup.UserConfig</h4><div class="text"> + + <p>The <strong>UserConfig</strong> provides feature of User Web Applications. + User Web Applications map a request URI starting with a tilde character ("~") + and a username to a directory (commonly named public_html) in that user's + home directory on the server.</p> + + <p>See the <a href="host.html#User_Web_Applications">User Web Applications</a> + special feature on the <strong>Host</strong> element for more information.</p> + + <p>The following additional attributes are supported by the + <strong>UserConfig</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">directoryName</code></td><td> + <p>The directory name to be searched for within each user home directory. + The default is <code>public_html</code>.</p> + </td></tr><tr><td><code class="attributeName">userClass</code></td><td> + <p>The class name of the user database class. + There are currently two user database, the + <code>org.apache.catalina.startup.PasswdUserDatabase</code> is used on a + Unix system that uses the /etc/passwd file to identify valid users. + The <code>org.apache.catalina.startup.HomesUserDatabase</code> is used on + a server where /etc/passwd is not in use. HomesUserDatabase deploy all + directories found in a specified base directory.</p> + </td></tr><tr><td><code class="attributeName">homeBase</code></td><td> + <p>The base directory containing user home directories. This is effective + only when <code>org.apache.catalina.startup.HomesUserDatabase</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">allow</code></td><td> + <p>A regular expression defining user who deployment is allowed. If this + attribute is specified, the user to deploy must match for this pattern. + If this attribute is not specified, all users will be deployed unless the + user matches a deny pattern.</p> + </td></tr><tr><td><code class="attributeName">deny</code></td><td> + <p>A regular expression defining user who deployment is denied. If this + attribute is specified, the user to deploy must not match for this + pattern. If this attribute is not specified, deployment of user will be + governed by a allow attribute.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Version_Logging_Lifecycle_Listener_-_org.apache.catalina.startup.VersionLoggerListener">Version Logging Lifecycle Listener - org.apache.catalina.startup.VersionLoggerListener</h4><div class="text"> + + <p>The <strong>Version Logging Lifecycle Listener</strong> logs Tomcat, Java + and operating system information when Tomcat starts.</p> + + <p>This listener must only be nested within <a href="server.html">Server</a> + elements and should be the first listener defined.</p> + + <p>The following additional attributes are supported by the <strong>Version + Logging Lifecycle Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">logArgs</code></td><td> + <p>If <code>true</code>, the command line arguments passed to Java when + Tomcat started will be logged. If not specified, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">logEnv</code></td><td> + <p>If <code>true</code>, the current environment variables when Tomcat + starts will be logged. If not specified, the default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">logProps</code></td><td> + <p>If <code>true</code>, the current Java system properties will be + logged. If not specified, the default value of + <code>false</code> will be used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Additional_Implementations">Additional Implementations</h3><div class="text"> + + <div class="subsection"><h4 id="JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener">JMX Remote Lifecycle Listener - org.apache.catalina.mbeans.JmxRemoteLifecycleListener</h4><div class="text"> + + <p>This listener requires <code>catalina-jmx-remote.jar</code> to be placed + in <code>$CATALINA_HOME/lib</code>. This jar may be found in the extras + directory of the binary download area.</p> + + <p>The <strong>JMX Remote Lifecycle Listener</strong> fixes the ports used by + the JMX/RMI Server making things much simpler if you need to connect + jconsole or a similar tool to a remote Tomcat instance that is running + behind a firewall. Only these ports are configured via the listener. The + remainder of the configuration is via the standard system properties for + configuring JMX. For further information on configuring JMX see + <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html"> + Monitoring and Management Using JMX</a> included with the Java SDK + documentation.</p> + + <p>This listener must only be nested within a <a href="server.html">Server</a> + element.</p> + + <p>The following additional attributes are supported by the <strong>JMX Remote + Lifecycle Listener</strong>:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">rmiRegistryPortPlatform</code></strong></td><td> + <p>The port to be used by the JMX/RMI registry for the Platform MBeans. + This replaces the use of the + <code>com.sun.management.jmxremote.port</code> system property that + should not be set when using this listener.</p> + </td></tr><tr><td><strong><code class="attributeName">rmiServerPortPlatform</code></strong></td><td> + <p>The port to be used by the Platform JMX/RMI server.</p> + </td></tr><tr><td><code class="attributeName">rmiBindAddress</code></td><td> + <p>The address of the interface to be used by JMX/RMI server.</p> + </td></tr><tr><td><code class="attributeName">useLocalPorts</code></td><td> + <p>Should any clients using these ports be forced to use local ports to + connect to the JMX/RMI server. This is useful when tunnelling + connections over SSH or similar. Defaults to <code>false</code>.</p> + </td></tr></table> + + <h3>Using file-based Authentication and Authorisation</h3> + + <p>If this listener was configured in server.xml as:</p> + <div class="codeBox"><pre><code> <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" + rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /></code></pre></div> + <p>with the following system properties set (e.g. in setenv.sh):</p> + <div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password + -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access + -Dcom.sun.management.jmxremote.ssl=false</code></pre></div> + <p>$CATALINA_BASE/conf/jmxremote.password containing:</p> + <div class="codeBox"><pre><code>admin letmein</code></pre></div> + <p>$CATALINA_BASE/conf/jmxremote.access containing:</p> + <div class="codeBox"><pre><code>admin readwrite</code></pre></div> + <p>then opening ports 10001 (RMI Registry) and 10002 (JMX/RMI Server) in your + firewall would enable jconsole to connect to a Tomcat instance running + behind a firewall using a connection string of the form:</p> + <div class="codeBox"><pre><code>service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi</code></pre></div> + <p> + with a user name of <code>admin</code> and a password of + <code>letmein</code>. + </p> + + <h3>Using JAAS</h3> + + <p>If we use the following system properties instead:</p> + <div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.login.config=Tomcat + -Djava.security.auth.login.config=$CATALINA_BASE/conf/login.config + -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access + -Dcom.sun.management.jmxremote.ssl=false</code></pre></div> + <p>$CATALINA_BASE/conf/login.config containing your choice of JAAS LoginModule implementation, for example:</p> + <div class="codeBox"><pre><code> Tomcat { /* should match to the com.sun.management.jmxremote.login.config property */ + + /* for illustration purposes only */ + com.sun.security.auth.module.LdapLoginModule REQUIRED + userProvider="ldap://ldap-svr/ou=people,dc=example,dc=com" + userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))" + authzIdentity="admin" + debug=true; + };</code></pre></div> + <p>$CATALINA_BASE/conf/jmxremote.access containing:</p> + <div class="codeBox"><pre><code>admin readwrite</code></pre></div> + <p> + then we would need to provide LDAP credentials instead. + </p> + + <p><strong>Note that the examples above do not use SSL. JMX access should + be considered equivalent to administrative access and secured accordingly. + </strong></p> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/loader.html b/src/tomcat/webapps/docs/config/loader.html new file mode 100644 index 0000000000000000000000000000000000000000..8beff7c0010cb764cc15becafd1329c0ad9735c4 --- /dev/null +++ b/src/tomcat/webapps/docs/config/loader.html @@ -0,0 +1,161 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Loader Component</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/loader"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Loader Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Logging">Logging</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Loader</strong> element represents the <em>web + application class loader</em> that will be used to load Java + classes and resources for your web application. Such + a class loader must follow the requirements of the Servlet + Specification, and load classes from the following locations:</p> + <ul> + <li>From the <code>/WEB-INF/classes</code> directory inside your + web application.</li> + <li>From JAR files in the <code>/WEB-INF/lib</code> directory + inside your web application.</li> + <li>From resources made available by Catalina to all web + applications globally.</li> + </ul> + + <p>A Loader element MAY be nested inside a <a href="context.html">Context</a> + component. If it is not included, a default Loader configuration will be + created automatically, which is sufficient for most requirements.</p> + + <p>For a more in-depth description of the class loader hierarchy + that is implemented by Catalina, see <a href="../class-loader-howto.html">the ClassLoader HowTo</a>.</p> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Loader</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Loader</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><code class="attributeName">delegate</code></td><td> + <p>Set to <code>true</code> if you want the class loader to follow + the standard Java2 delegation model, and attempt to load classes from + parent class loaders <strong>before</strong> looking inside the web + application. Set to <code>false</code> (the default) to have the + class loader look inside the web application first, before asking + parent class loaders to find requested classes or resources.</p> + </td></tr><tr><td><code class="attributeName">reloadable</code></td><td> + <p>Set to <code>true</code> if you want Catalina to monitor classes in + <code>/WEB-INF/classes/</code> and <code>/WEB-INF/lib</code> for + changes, and automatically reload the web application if a change + is detected. This feature is very useful during application + development, but it requires significant runtime overhead and is + not recommended for use on deployed production applications. You + can use the <a href="../manager-howto.html">Manager</a> web + application, however, to trigger reloads of deployed applications + on demand.</p> + + <p><strong>NOTE</strong> - The value for this property will be + inherited from the <code>reloadable</code> attribute you set on + the surrounding <a href="context.html">Context</a> component, + and any value you explicitly set here will be replaced.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Loader</strong> is + <strong>org.apache.catalina.loader.WebappLoader</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">loaderClass</code></td><td> + <p>Java class name of the <code>java.lang.ClassLoader</code> + implementation class to use. Custom implementations must extend + <code>org.apache.catalina.loader.WebappClassLoaderBase</code>. + </p> + + <p>If not specified, the default value is + <code>org.apache.catalina.loader.ParallelWebappClassLoader</code>. The + default <strong>loaderClass</strong> is parallel capable, which + means that multiple threads may load difference classes in parallel. + A non-parallel capable <strong>loaderClass</strong> is available and can + be used by specifying + <code>org.apache.catalina.loader.WebappClassLoader</code>.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>No components may be nested inside a <strong>Loader</strong> element.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <div class="subsection"><h4 id="Logging">Logging</h4><div class="text"> + + <p>A loader is associated with the log category based on its classname.</p> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/manager.html b/src/tomcat/webapps/docs/config/manager.html new file mode 100644 index 0000000000000000000000000000000000000000..9ecefbb1aaf2865dca825fcab1a48df1f91f9049 --- /dev/null +++ b/src/tomcat/webapps/docs/config/manager.html @@ -0,0 +1,504 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Manager Component</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/manager"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Manager Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a><ol><li><a href="#Persistence_Across_Restarts">Persistence Across Restarts</a></li><li><a href="#Disable_Session_Persistence">Disable Session Persistence</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Manager</strong> element represents the <em>session + manager</em> that will be used to create and maintain HTTP sessions + as requested by the associated web application.</p> + + <p>A Manager element MAY be nested inside a + <a href="context.html">Context</a> component. If it is not included, + a default Manager configuration will be created automatically, which + is sufficient for most requirements, — see + <em>Standard Manager Implementation</em> below for the details + of this configuration.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Manager</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Manager</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><code class="attributeName">maxActiveSessions</code></td><td> + <p>The maximum number of active sessions that will be created by + this Manager, or <code>-1</code> (the default) for no limit.</p> + + <p>When the limit is reached, any attempt to create a new session + (e.g. with <code>HttpServletRequest.getSession()</code> call) + will fail with an <code>IllegalStateException</code>.</p> + </td></tr><tr><td><code class="attributeName">notifyAttributeListenerOnUnchangedValue</code></td><td> + <p>If an attribute is added to the session and that attribute is already + present in the session under the same name will any + <code>HttpSessionAttributeListener</code> be notified that the attribute + has been replaced. If not specified, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">notifyBindingListenerOnUnchangedValue</code></td><td> + <p>If an attribute is added to the session, that attribute is already + present in the session under the same name and the attribute implements + <code>HttpSessionBindingListener</code>, will the listener be notified + that the attribute has been unbound and bound again. If not specified, + the default value of <code>false</code> will be used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>Tomcat provides two standard implementations of <strong>Manager</strong> + for use — the default one stores active sessions, while the optional one + stores active sessions that have been swapped out (in addition to saving + sessions across a restart of Tomcat) in a storage location that is selected + via the use of an appropriate <strong>Store</strong> nested element.</p> + + <h3>Standard Manager Implementation</h3> + + <p>The standard implementation of <strong>Manager</strong> is + <strong>org.apache.catalina.session.StandardManager</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">pathname</code></td><td> + <p>Absolute or relative (to the work directory for this Context) + pathname of the file in which session state will be preserved + across application restarts, if possible. The default is + "SESSIONS.ser".<br>See + <a href="#Persistence_Across_Restarts">Persistence Across Restarts</a> + for more information. This persistence may be + disabled by setting this attribute to an empty string.</p> + </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td> + <p>Frequency of the session expiration, and related manager operations. + Manager operations will be done once for the specified amount of + backgroundProcess calls (i.e., the lower the amount, the more often the + checks will occur). The minimum value is 1, and the default value is 6. + </p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate session IDs. + If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the Manager + will use the platform default provider and the default algorithm. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the Manager + will use the platform default provider and the default algorithm. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + distributed. An attribute will only be distributed if its name matches + this pattern. If the pattern is zero length or <code>null</code>, all + attributes are eligible for distribution. The pattern is anchored so the + session attribute name must fully match the pattern. As an example, the + value <code>(userName|sessionHistory)</code> will only distribute the + two session attributes named <code>userName</code> and + <code>sessionHistory</code>. If not specified, the default value of + <code>null</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + distributed. An attribute will only be distributed if the implementation + class name of the value matches this pattern. If the pattern is zero + length or <code>null</code>, all attributes are eligible for + distribution. The pattern is anchored so the fully qualified class name + must fully match the pattern. If not specified, the default value of + <code>null</code> will be used unless a <code>SecurityManager</code> is + enabled in which case the default will be + <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p> + </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td> + <p>If <strong>sessionAttributeNameFilter</strong> or + <strong>sessionAttributeValueClassNameFilter</strong> blocks an + attribute, should this be logged at <code>WARN</code> level? If + <code>WARN</code> level logging is disabled then it will be logged at + <code>DEBUG</code>. The default value of this attribute is + <code>false</code> unless a <code>SecurityManager</code> is enabled in + which case the default will be <code>true</code>.</p> + </td></tr></table> + + <h3>Persistent Manager Implementation</h3> + + <p><strong>NOTE:</strong> You must set either the + <code>org.apache.catalina.session.StandardSession.ACTIVITY_CHECK</code> or + <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> + <a href="systemprops.html">system properties</a> to <code>true</code> for + the persistent manager to work correctly.</p> + + <p>The persistent implementation of <strong>Manager</strong> is + <strong>org.apache.catalina.session.PersistentManager</strong>. In + addition to the usual operations of creating and deleting sessions, a + <code>PersistentManager</code> has the capability to swap active (but + idle) sessions out to a persistent storage mechanism, as well as to save + all sessions across a normal restart of Tomcat. The actual persistent + storage mechanism used is selected by your choice of a + <strong>Store</strong> element nested inside the <strong>Manager</strong> + element - this is required for use of <code>PersistentManager</code>.</p> + + <p>This implementation of Manager supports the following attributes in + addition to the <a href="#Common_Attributes">Common Attributes</a> + described earlier.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>It has the same meaning as described in the + <a href="#Common_Attributes">Common Attributes</a> above. + You <strong>must</strong> specify + <code>org.apache.catalina.session.PersistentManager</code> to use + this manager implementation.</p> + </td></tr><tr><td><code class="attributeName">maxIdleBackup</code></td><td> + <p>The time interval (in seconds) since the last access to a session + before it is eligible for being persisted to the session store, or + <code>-1</code> to disable this feature. By default, this feature is + disabled.</p> + </td></tr><tr><td><code class="attributeName">maxIdleSwap</code></td><td> + <p>The maximum time a session may be idle before it is eligible to be + swapped to disk due to inactivity. Setting this to <code>-1</code> means + sessions should not be swapped out just because of inactivity. If this + feature is enabled, the time interval specified here should be equal to + or longer than the value specified for <code>maxIdleBackup</code>. By + default, this feature is disabled.</p> + </td></tr><tr><td><code class="attributeName">minIdleSwap</code></td><td> + <p>The minimum time in seconds a session must be idle before it is + eligible to be swapped to disk to keep the active session count below + maxActiveSessions. Setting to <code>-1</code> means sessions will not be + swapped out to keep the active session count down. If specified, this + value should be less than that specified by <code>maxIdleSwap</code>. + By default, this value is set to <code>-1</code>.</p> + </td></tr><tr><td><code class="attributeName">processExpiresFrequency</code></td><td> + <p>It is the same as described above for the + <code>org.apache.catalina.session.StandardManager</code> class. + </p> + </td></tr><tr><td><code class="attributeName">saveOnRestart</code></td><td> + <p>Should all sessions be persisted and reloaded when Tomcat is shut + down and restarted (or when this application is reloaded)? By default, + this attribute is set to <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>It is the same as described above for the + <code>org.apache.catalina.session.StandardManager</code> class. + </p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>It is the same as described above for the + <code>org.apache.catalina.session.StandardManager</code> class. + </p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>It is the same as described above for the + <code>org.apache.catalina.session.StandardManager</code> class. + </p> + </td></tr><tr><td><code class="attributeName">sessionAttributeNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + distributed. An attribute will only be distributed if its name matches + this pattern. If the pattern is zero length or <code>null</code>, all + attributes are eligible for distribution. The pattern is anchored so the + session attribute name must fully match the pattern. As an example, the + value <code>(userName|sessionHistory)</code> will only distribute the + two session attributes named <code>userName</code> and + <code>sessionHistory</code>. If not specified, the default value of + <code>null</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionAttributeValueClassNameFilter</code></td><td> + <p>A regular expression used to filter which session attributes will be + distributed. An attribute will only be distributed if the implementation + class name of the value matches this pattern. If the pattern is zero + length or <code>null</code>, all attributes are eligible for + distribution. The pattern is anchored so the fully qualified class name + must fully match the pattern. If not specified, the default value of + <code>null</code> will be used unless a <code>SecurityManager</code> is + enabled in which case the default will be + <code>java\\.lang\\.(?:Boolean|Integer|Long|Number|String)</code>.</p> + </td></tr><tr><td><code class="attributeName">warnOnSessionAttributeFilterFailure</code></td><td> + <p>If <strong>sessionAttributeNameFilter</strong> or + <strong>sessionAttributeValueClassNameFilter</strong> blocks an + attribute, should this be logged at <code>WARN</code> level? If + <code>WARN</code> level logging is disabled then it will be logged at + <code>DEBUG</code>. The default value of this attribute is + <code>false</code> unless a <code>SecurityManager</code> is enabled in + which case the default will be <code>true</code>.</p> + </td></tr></table> + + <p>In order to successfully use a PersistentManager, you must nest inside + it a <strong><Store></strong> element, as described below.</p> + + </div></div> + + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <h3>All Manager Implementations</h3> + + <p>All Manager implementations allow nesting of a + <strong><SessionIdGenerator></strong> element. It defines + the behavior of session id generation. All implementations + of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the + following attributes: + </p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td> + <p>The length of the session ID may be changed with the + <strong>sessionIdLength</strong> attribute. + </p> + </td></tr></table> + + <h3>Persistent Manager Implementation</h3> + + <p>If you are using the <em>Persistent Manager Implementation</em> + as described above, you <strong>MUST</strong> nest a + <strong><Store></strong> element inside, which defines the + characteristics of the persistent data storage. Two implementations + of the <code><Store></code> element are currently available, + with different characteristics, as described below.</p> + + <h5>File Based Store</h5> + + <p>The <em>File Based Store</em> implementation saves swapped out + sessions in individual files (named based on the session identifier) + in a configurable directory. Therefore, you are likely to encounter + scalability problems as the number of active sessions increases, and + this should primarily be considered a means to easily experiment.</p> + + <p>To configure this, add a <code><Store></code> nested inside + your <code><Manager></code> element with the following attributes: + </p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Store</code> interface. You + <strong>must</strong> specify + <code>org.apache.catalina.session.FileStore</code> + to use this implementation.</p> + </td></tr><tr><td><code class="attributeName">directory</code></td><td> + <p>Absolute or relative (to the temporary work directory for this web + application) pathname of the directory into which individual session + files are written. If not specified, the temporary work directory + assigned by the container is utilized.</p> + </td></tr></table> + + + <h5>JDBC Based Store</h5> + + <p>The <em>JDBC Based Store</em> implementation saves swapped out + sessions in individual rows of a preconfigured table in a database + that is accessed via a JDBC driver. With large numbers of swapped out + sessions, this implementation will exhibit improved performance over + the File Based Store described above.</p> + + <p>To configure this, add a <code><Store></code> nested inside + your <code><Manager></code> element with the following attributes: + </p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Store</code> interface. You + <strong>must</strong> specify + <code>org.apache.catalina.session.JDBCStore</code> + to use this implementation.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionName</code></strong></td><td> + <p>The user name that will be handed to the configured JDBC driver to + establish a connection to the database containing the session table.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionPassword</code></strong></td><td> + <p>The password that will be handed to the configured JDBC driver to + establish a connection to the database containing the session table.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionURL</code></strong></td><td> + <p>The connection URL that will be handed to the configured JDBC + driver to establish a connection to the database containing our + session table.</p> + </td></tr><tr><td><code class="attributeName">dataSourceName</code></td><td> + <p>Name of the JNDI resource for a JDBC DataSource-factory. If this option + is given and a valid JDBC resource can be found, it will be used and any + direct configuration of a JDBC connection via <code>connectionURL</code>, + <code>connectionName</code>, <code>connectionPassword</code> and + <code>driverName</code> will be ignored. Since this code uses prepared + statements, you might want to configure pooled prepared statements as + shown in <a href="../jndi-resources-howto.html">the JNDI resources + HOW-TO</a>.</p> + </td></tr><tr><td><strong><code class="attributeName">driverName</code></strong></td><td> + <p>Java class name of the JDBC driver to be used.</p> + </td></tr><tr><td><code class="attributeName">localDataSource</code></td><td> + <p>This allows the Store to use a DataSource defined for the Context + rather than a global DataSource. If not specified, the default is + <code>false</code>: use a global DataSource.</p> + </td></tr><tr><td><code class="attributeName">sessionAppCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains the Engine, Host, and Web Application Context name in the + format <code>/Engine/Host/Context</code>. If not specified the default + value of <code>app</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionDataCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains the serialized form of all session attributes for a swapped + out session. The column type must accept a binary object (typically called + a BLOB). If not specified the default value of <code>data</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">sessionIdCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains the session identifier of the swapped out session. The + column type must accept character string data of at least as many + characters as are contained in session identifiers created by Tomcat + (typically 32). If not specified the default value of <code>id</code> will + be used.</p> + </td></tr><tr><td><code class="attributeName">sessionLastAccessedCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains the <code>lastAccessedTime</code> property of this session. + The column type must accept a Java <code>long</code> (64 bits). If not + specified the default value of <code>maxinactive</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionMaxInactiveCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains the <code>maxInactiveInterval</code> property of this + session. The column type must accept a Java <code>integer</code> (32 + bits). If not specified, the default value of <code>maxinactive</code> + will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionTable</code></td><td> + <p>Name of the database table to be used for storing swapped out sessions. + This table must contain (at least) the database columns that are + configured by the other attributes of this element. If not specified the + default value of <code>tomcat$sessions</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">sessionValidCol</code></td><td> + <p>Name of the database column, contained in the specified session table, + that contains a flag indicating whether this swapped out session is still + valid or not. The column type must accept a single character. If not + specified the default value of <code>valid</code> will be used.</p> + </td></tr></table> + + <p>Before attempting to use the JDBC Based Store for the first time, + you must create the table that will be used to store swapped out sessions. + Detailed SQL commands vary depending on the database you are using, but + a script like this will generally be required:</p> + +<div class="codeBox"><pre><code>create table tomcat_sessions ( + session_id varchar(100) not null primary key, + valid_session char(1) not null, + max_inactive int not null, + last_access bigint not null, + app_name varchar(255), + session_data mediumblob, + KEY kapp_name(app_name) +);</code></pre></div> + + <p>Note: The SQL command above does not use the default names for either the + table or the columns so the JDBC Store would need to be configured to reflect + this.</p> + + <p>In order for the JDBC Based Store to successfully connect to your + database, the JDBC driver you configure must be visible to Tomcat's + internal class loader. Generally, that means you must place the JAR + file containing this driver into the <code>$CATALINA_HOME/lib</code> + directory.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + + <div class="subsection"><h4 id="Persistence_Across_Restarts">Persistence Across Restarts</h4><div class="text"> + + <p>Whenever Apache Tomcat is shut down normally and restarted, or when an + application reload is triggered, the standard Manager implementation + will attempt to serialize all currently active sessions to a disk + file located via the <code>pathname</code> attribute. All such saved + sessions will then be deserialized and activated (assuming they have + not expired in the mean time) when the application reload is completed.</p> + + <p>In order to successfully restore the state of session attributes, + all such attributes MUST implement the <code>java.io.Serializable</code> + interface. You MAY cause the Manager to enforce this restriction by + including the <code><distributable></code> element in your web + application deployment descriptor (<code>/WEB-INF/web.xml</code>).</p> + + <p>The persistence across restarts provided by the + <strong>StandardManager</strong> is a simpler implementation than that + provided by the <strong>PersistentManager</strong>. If robust, production + quality persistence across restarts is required then the + <strong>PersistentManager</strong> should be used with an appropriate + configuration.</p> + + </div></div> + + <div class="subsection"><h4 id="Disable_Session_Persistence">Disable Session Persistence</h4><div class="text"> + + <p>As documented above, every web application by default has + standard manager implementation configured, and it performs session + persistence across restarts. To disable this persistence feature, create + a <a href="context.html">Context</a> configuration file for your web + application and add the following element there:</p> + + <div class="codeBox"><pre><code><Manager pathname="" /></code></pre></div> + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/realm.html b/src/tomcat/webapps/docs/config/realm.html new file mode 100644 index 0000000000000000000000000000000000000000..ea827ba351e1b087fb54e732939ab546ac1c4419 --- /dev/null +++ b/src/tomcat/webapps/docs/config/realm.html @@ -0,0 +1,1004 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Realm Component</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/realm"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Realm Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#JDBC_Database_Realm_-_org.apache.catalina.realm.JDBCRealm">JDBC Database Realm - org.apache.catalina.realm.JDBCRealm</a></li><li><a href="#DataSource_Database_Realm_-_org.apache.catalina.realm.DataSourceRealm">DataSource Database Realm - org.apache.catalina.realm.DataSourceRealm</a></li><li><a href="#JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm">JNDI Directory Realm - org.apache.catalina.realm.JNDIRealm</a></li><li><a href="#UserDatabase_Realm_-_org.apache.catalina.realm.UserDatabaseRealm">UserDatabase Realm - org.apache.catalina.realm.UserDatabaseRealm</a></li><li><a href="#Memory_Based_Realm_-_org.apache.catalina.realm.MemoryRealm">Memory Based Realm - org.apache.catalina.realm.MemoryRealm</a></li><li><a href="#JAAS_Realm_-_org.apache.catalina.realm.JAASRealm">JAAS Realm - org.apache.catalina.realm.JAASRealm</a></li><li><a href="#Combined_Realm_-_org.apache.catalina.realm.CombinedRealm">Combined Realm - org.apache.catalina.realm.CombinedRealm</a></li><li><a href="#LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOut Realm - org.apache.catalina.realm.LockOutRealm</a></li><li><a href="#Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm - org.apache.catalina.realm.NullRealm</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>A <strong>Realm</strong> element represents a "database" of usernames, + passwords, and <em>roles</em> (similar to Unix <em>groups</em>) assigned + to those users. Different implementations of Realm allow Catalina to be + integrated into environments where such authentication information is already + being created and maintained, and then utilize that information to implement + <em>Container Managed Security</em> as described in the Servlet + Specification.</p> + + <p>A Catalina container (<a href="engine.html">Engine</a>, + <a href="host.html">Host</a>, or <a href="context.html">Context</a>) may + contain no more than one Realm element (although if supported by the Realm + this one Realm may itself contain multiple nested Realms). In addition, the + Realm associated with an Engine or a Host is automatically inherited by + lower-level containers unless the lower level container explicitly defines its + own Realm. If no Realm is configured for the Engine, an instance of the + <a href="#Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm</a> + will be configured for the Engine automatically.</p> + + <p>For more in-depth information about container managed security in web + applications, as well as more information on configuring and using the + standard realm component implementations, please see the + <a href="../realm-howto.html">Container-Managed Security Guide</a>. + </p> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Realm</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Realm</code> interface.</p> + </td></tr></table> + + <p>Unlike most Catalina components, there are several standard + <strong>Realm</strong> implementations available. As a result, + the <code>className</code> attribute MUST be used to select the + implementation you wish to use.</p> + + </div></div> + + + <div class="subsection"><h4 id="JDBC_Database_Realm_-_org.apache.catalina.realm.JDBCRealm">JDBC Database Realm - org.apache.catalina.realm.JDBCRealm</h4><div class="text"> + + <p>The <strong>JDBC Database Realm</strong> connects Tomcat to + a relational database, accessed through an appropriate JDBC driver, + to perform lookups of usernames, passwords, and their associated + roles. Because the lookup is done each time that it is required, + changes to the database will be immediately reflected in the + information used to authenticate new logins.</p> + + <p>A rich set of additional attributes lets you configure the required + connection to the underlying database, as well as the table and + column names used to retrieve the required information:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + <p>When this attribute has the value of <code>authOnly</code> or + <code>strictAuthOnly</code>, the <strong>roleNameCol</strong> and + <strong>userRoleTable</strong> attributes become optional. If those two + attributes are omitted, the user's roles will not be loaded by this + Realm.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionName</code></strong></td><td> + <p>The database username to use when establishing the JDBC + connection.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionPassword</code></strong></td><td> + <p>The database password to use when establishing the JDBC + connection.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionURL</code></strong></td><td> + <p>The connection URL to be passed to the JDBC driver when + establishing a database connection.</p> + </td></tr><tr><td><strong><code class="attributeName">driverName</code></strong></td><td> + <p>Fully qualified Java class name of the JDBC driver to be + used to connect to the authentication database.</p> + </td></tr><tr><td><code class="attributeName">roleNameCol</code></td><td> + <p>Name of the column, in the "user roles" table, which contains + a role name assigned to the corresponding user.</p> + <p>This attribute is <strong>required</strong> in majority of + configurations. See <strong>allRolesMode</strong> attribute for + a rare case when it can be omitted.</p> + </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td> + <p>When processing users authenticated via the GSS-API, this attribute + controls if any "@..." is removed from the end of the user + name. If not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><strong><code class="attributeName">userCredCol</code></strong></td><td> + <p>Name of the column, in the "users" table, which contains + the user's credentials (i.e. password). If a + <code>CredentialHandler</code> is specified, this component + will assume that the passwords have been encoded with the + specified algorithm. Otherwise, they will be assumed to be + in clear text.</p> + </td></tr><tr><td><strong><code class="attributeName">userNameCol</code></strong></td><td> + <p>Name of the column, in the "users" and "user roles" table, + that contains the user's username.</p> + </td></tr><tr><td><code class="attributeName">userRoleTable</code></td><td> + <p>Name of the "user roles" table, which must contain columns + named by the <code>userNameCol</code> and <code>roleNameCol</code> + attributes.</p> + <p>This attribute is <strong>required</strong> in majority of + configurations. See <strong>allRolesMode</strong> attribute for + a rare case when it can be omitted.</p> + </td></tr><tr><td><strong><code class="attributeName">userTable</code></strong></td><td> + <p>Name of the "users" table, which must contain columns named + by the <code>userNameCol</code> and <code>userCredCol</code> + attributes.</p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more + information on setting up container managed security using the + JDBC Database Realm component.</p> + + </div></div> + + + <div class="subsection"><h4 id="DataSource_Database_Realm_-_org.apache.catalina.realm.DataSourceRealm">DataSource Database Realm - org.apache.catalina.realm.DataSourceRealm</h4><div class="text"> + + <p>The <strong>DataSource Database Realm</strong> connects Tomcat to + a relational database, accessed through a JNDI named JDBC DataSource + to perform lookups of usernames, passwords, and their associated + roles. Because the lookup is done each time that it is required, + changes to the database will be immediately reflected in the + information used to authenticate new logins.</p> + + <p>The JDBC Realm uses a single db connection. This requires that + realm based authentication be synchronized, i.e. only one authentication + can be done at a time. This could be a bottleneck for applications + with high volumes of realm based authentications.</p> + + <p>The DataSource Database Realm supports simultaneous realm based + authentications and allows the underlying JDBC DataSource to + handle optimizations like database connection pooling.</p> + + <p>A rich set of additional attributes lets you configure the name + of the JNDI JDBC DataSource, as well as the table and + column names used to retrieve the required information:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + <p>When this attribute has the value of <code>authOnly</code> or + <code>strictAuthOnly</code>, the <strong>roleNameCol</strong> and + <strong>userRoleTable</strong> attributes become optional. If those two + attributes are omitted, the user's roles will not be loaded by this + Realm.</p> + </td></tr><tr><td><strong><code class="attributeName">dataSourceName</code></strong></td><td> + <p>The name of the JNDI JDBC DataSource for this Realm.</p> + </td></tr><tr><td><code class="attributeName">localDataSource</code></td><td> + <p>When the realm is nested inside a Context element, this allows the + realm to use a DataSource defined for the Context rather than a global + DataSource. If not specified, the default is <code>false</code>: use a + global DataSource.</p> + </td></tr><tr><td><code class="attributeName">roleNameCol</code></td><td> + <p>Name of the column, in the "user roles" table, which contains + a role name assigned to the corresponding user.</p> + <p>This attribute is <strong>required</strong> in majority of + configurations. See <strong>allRolesMode</strong> attribute for + a rare case when it can be omitted.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td> + <p>When processing users authenticated via the GSS-API, this attribute + controls if any "@..." is removed from the end of the user + name. If not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><strong><code class="attributeName">userCredCol</code></strong></td><td> + <p>Name of the column, in the "users" table, which contains + the user's credentials (i.e. password). If a + <code>CredentialHandler</code> is specified, this component + will assume that the passwords have been encoded with the + specified algorithm. Otherwise, they will be assumed to be + in clear text.</p> + </td></tr><tr><td><strong><code class="attributeName">userNameCol</code></strong></td><td> + <p>Name of the column, in the "users" and "user roles" table, + that contains the user's username.</p> + </td></tr><tr><td><code class="attributeName">userRoleTable</code></td><td> + <p>Name of the "user roles" table, which must contain columns + named by the <code>userNameCol</code> and <code>roleNameCol</code> + attributes.</p> + <p>This attribute is <strong>required</strong> in majority of + configurations. See <strong>allRolesMode</strong> attribute for + a rare case when it can be omitted.</p> + </td></tr><tr><td><strong><code class="attributeName">userTable</code></strong></td><td> + <p>Name of the "users" table, which must contain columns named + by the <code>userNameCol</code> and <code>userCredCol</code> + attributes.</p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>See the <a href="../realm-howto.html#DataSourceRealm"> + DataSource Realm HOW-TO</a> for more information on setting up container + managed security using the DataSource Database Realm component.</p> + + </div></div> + + + <div class="subsection"><h4 id="JNDI_Directory_Realm_-_org.apache.catalina.realm.JNDIRealm">JNDI Directory Realm - org.apache.catalina.realm.JNDIRealm</h4><div class="text"> + + <p>The <strong>JNDI Directory Realm</strong> connects Tomcat to + an LDAP Directory, accessed through an appropriate JNDI driver, + that stores usernames, passwords, and their associated + roles. Changes to the directory are immediately reflected in the + information used to authenticate new logins.</p> + + + <p>The directory realm supports a variety of approaches to using + LDAP for authentication:</p> + + <ul> + <li>The realm can either use a pattern to determine the + distinguished name (DN) of the user's directory entry, or search + the directory to locate that entry. + </li> + + <li>The realm can authenticate the user either by binding to the + directory with the DN of the user's entry and the password + presented by the user, or by retrieving the password from the + user's entry and performing a comparison locally. + </li> + + <li>Roles may be represented in the directory as explicit entries + found by a directory search (e.g. group entries of which the user + is a member), as the values of an attribute in the user's entry, + or both. + </li> + </ul> + + <p> A rich set of additional attributes lets you configure the + required behaviour as well as the connection to the underlying + directory and the element and attribute names used to retrieve + information from the directory:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">adCompat</code></td><td> + <p>Microsoft Active Directory often returns referrals. + When iterating over NamingEnumerations these lead to + PartialResultExceptions. If you want us to ignore those exceptions, + set this attribute to "true". Unfortunately there's no stable way + to detect, if the Exceptions really come from an AD referral. + The default value is "false".</p> + </td></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><code class="attributeName">alternateURL</code></td><td> + <p>If a socket connection cannot be made to the provider at + the <code>connectionURL</code> an attempt will be made to use the + <code>alternateURL</code>.</p> + </td></tr><tr><td><code class="attributeName">authentication</code></td><td> + <p>A string specifying the type of authentication to use. + "none", "simple", "strong" or a provider specific definition + can be used. If no value is given the providers default is used.</p> + </td></tr><tr><td><code class="attributeName">cipherSuites</code></td><td> + <p>Specify which cipher suites are allowed when trying to open + a secured connection using StartTLS. The allowed cipher suites + are specified by a comma separated list. The default is to use the + cipher suites of the JVM.</p> + </td></tr><tr><td><code class="attributeName">commonRole</code></td><td> + <p>A role name assigned to each successfully authenticated user in + addition to the roles retrieved from LDAP. If not specified, only + the roles retrieved via LDAP are used.</p> + </td></tr><tr><td><code class="attributeName">connectionName</code></td><td> + <p>The directory username to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the <code>userPassword</code> + property.</p> + </td></tr><tr><td><code class="attributeName">connectionPassword</code></td><td> + <p>The directory password to use when establishing a + connection to the directory for LDAP search operations. If not + specified an anonymous connection is made, which is often + sufficient unless you specify the <code>userPassword</code> + property.</p> + </td></tr><tr><td><code class="attributeName">connectionTimeout</code></td><td> + <p>The timeout in milliseconds to use when establishing the connection + to the LDAP directory. If not specified, a value of 5000 (5 seconds) is + used.</p> + </td></tr><tr><td><strong><code class="attributeName">connectionURL</code></strong></td><td> + <p>The connection URL to be passed to the JNDI driver when + establishing a connection to the directory.</p> + </td></tr><tr><td><code class="attributeName">contextFactory</code></td><td> + <p>Fully qualified Java class name of the factory class used + to acquire our JNDI <code>InitialContext</code>. By default, + assumes that the standard JNDI LDAP provider will be utilized.</p> + </td></tr><tr><td><code class="attributeName">derefAliases</code></td><td> + <p>A string specifying how aliases are to be dereferenced during + search operations. The allowed values are "always", "never", + "finding" and "searching". If not specified, "always" is used.</p> + </td></tr><tr><td><code class="attributeName">hostnameVerifierClassName</code></td><td> + <p>The name of the class to use for hostname verification when + using StartTLS for securing the connection to the ldap server. + The default constructor will be used to construct an instance of + the verifier class. The default is to accept only those hostnames, + that are valid according to the peer certificate of the ldap + server.</p> + </td></tr><tr><td><code class="attributeName">protocol</code></td><td> + <p>A string specifying the security protocol to use. If not given + the providers default is used.</p> + </td></tr><tr><td><code class="attributeName">readTimeout</code></td><td> + <p>The timeout, in milliseconds, to use when trying to read from a + connection to the directory. If not specified, the default of 5000 + (5 seconds) is used.</p> + </td></tr><tr><td><code class="attributeName">referrals</code></td><td> + <p>How do we handle JNDI referrals? Allowed values are + "ignore", "follow", or "throw" (see javax.naming.Context.REFERRAL + for more information). + Microsoft Active Directory often returns referrals. + If you need to follow them set referrals to "follow". + Caution: if your DNS is not part of AD, the LDAP client lib might try + to resolve your domain name in DNS to find another LDAP server.</p> + </td></tr><tr><td><code class="attributeName">roleBase</code></td><td> + <p>The base directory entry for performing role searches. If not + specified the top-level element in the directory context will be used. + If specified it may optionally include pattern replacements + "{0}".."{n}" corresponding to the name parts of the + user's distinguished name (as returned by + <code>javax.naming.Name.get()</code>).</p> + </td></tr><tr><td><code class="attributeName">roleName</code></td><td> + <p>The name of the attribute that contains role names in the + directory entries found by a role search. In addition you can + use the <code>userRoleName</code> property to specify the name + of an attribute, in the user's entry, containing additional + role names.</p> + <p>If <code>roleName</code> is not specified a role + search does not take place, and roles are taken only from the + user's entry.</p> + </td></tr><tr><td><code class="attributeName">roleNested</code></td><td> + <p>Set to <code>true</code> if you want to nest roles into roles. + When a role search is performed and the value of this property is + <code>true</code>, the search will be repeated recursively to find + all the roles that belong to the user either directly or indirectly. + If not specified, the default value of <code>false</code> is used.</p> + </td></tr><tr><td><code class="attributeName">roleSearch</code></td><td> + <p>The LDAP filter expression used for performing role + searches.</p> + + <p>Use <code>{0}</code> to substitute the distinguished name (DN) + of the user, and/or <code>{1}</code> to substitute the username, + and/or <code>{2}</code> for the value of an attribute from the + user's directory entry, of the authenticated user. + The name of the attribute that provides the value for <code>{2}</code> + is configured by the <code>userRoleAttribute</code> property.</p> + + <p>When <code>roleNested</code> property is <code>true</code>, + this filter expression will be also used to recursively search for + other roles, which indirectly belong to this user. To find the + roles that match the newly found role, the following values + are used: + <code>{0}</code> is substituted by the distinguished name of the newly + found role, and both <code>{1}</code> and <code>{2}</code> are + substituted by the name of the role (see the <code>roleName</code> + property). The <code>userRoleAttribute</code> property is not + applicable to this search.</p> + + <p>If this property is not specified, a role search does not take + place and roles are taken only from the attribute in the user's entry + specified by the <code>userRoleName</code> property.</p> + </td></tr><tr><td><code class="attributeName">roleSearchAsUser</code></td><td> + <p> When searching for user roles, should the search be performed as the + user currently being authenticated? If false, + <code>connectionName</code> and <code>connectionPassword</code> will be + used if specified, else an anonymous. If not specified, the default + value of <code>false</code> is used. Note that when accessing the + directory using delegated credentials, this attribute is always ignored + and the search is performed using the delegated credentials.</p> + </td></tr><tr><td><code class="attributeName">roleSubtree</code></td><td> + <p>Set to <code>true</code> if you want to search the entire + subtree of the element specified by the <code>roleBase</code> + property for role entries associated with the user. The + default value of <code>false</code> causes only the top level + to be searched.</p> + </td></tr><tr><td><code class="attributeName">sizeLimit</code></td><td> + <p>Specifies the maximum number of records to return when using the + <code>userSearch</code> attribute. If not specified, the default of + <code>0</code> is used which indicates no limit.</p> + </td></tr><tr><td><code class="attributeName">spnegoDelegationQop</code></td><td> + <p>When the JNDI Realm is used with the SPNEGO authenticator and + <code>useDelegatedCredential</code> is <code>true</code> this attribute + controls the QOP (Quality of Protection) that should be used for + the connection to the LDAP + server after authentication. This value is used to set the + <code>javax.security.sasl.qop</code> environment property for the LDAP + connection. This attribute should be a comma-separated list of values + selected from <code>auth-conf</code>, <code>auth-int</code> and + <code>auth</code>. See <a href="http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/Sasl.html#QOP" rel="nofollow">Java documentation</a> for more details.</p> + <p>The default value is <code>auth-conf</code>.</p> + </td></tr><tr><td><code class="attributeName">sslProtocol</code></td><td> + <p>Specifies which ssl protocol should be used, when connecting with + StartTLS. The default is to let the jre decide. If you need even more + control, you can specify the <code>SSLSocketFactory</code> to use.</p> + </td></tr><tr><td><code class="attributeName">sslSocketFactory</code></td><td> + <p>Specifies which <code>SSLSocketFactory</code> to use when connecting + to the ldap server using StartTLS. An instance of the class will be + constructed using the default constructor. If none class name is given + the default jre <code>SSLSocketFactory</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td> + <p>When processing users authenticated via the GSS-API, this attribute + controls if any "@..." is removed from the end of the user + name. If not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">timeLimit</code></td><td> + <p>Specifies the time (in milliseconds) to wait for records to be + returned when using the <code>userSearch</code> attribute. If not + specified, the default of <code>0</code> is used which indicates no + limit.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><code class="attributeName">useDelegatedCredential</code></td><td> + <p>When the JNDIRealm is used with the SPNEGO authenticator, delegated + credentials for the user may be available. If such credentials are + present, this attribute controls whether or not they are used to + connect to the directory. If not specified, the default value of + <code>true</code> is used.</p> + </td></tr><tr><td><code class="attributeName">userBase</code></td><td> + <p>The base element for user searches performed using the + <code>userSearch</code> expression. Not used if you are using + the <code>userPattern</code> expression.</p> + </td></tr><tr><td><code class="attributeName">userPassword</code></td><td> + <p>Name of the attribute in the user's entry containing the + user's password. If you specify this value, JNDIRealm will + bind to the directory using the values specified by + <code>connectionName</code> and + <code>connectionPassword</code> properties, and retrieve the + corresponding attribute for comparison to the value specified + by the user being authenticated. If you do + <strong>not</strong> specify this value, JNDIRealm will + attempt a simple bind to the directory using the DN of the + user's entry and the password presented by the user, with a + successful bind being interpreted as an authenticated + user.</p> + </td></tr><tr><td><code class="attributeName">userPattern</code></td><td> + <p>Pattern for the distinguished name (DN) of the user's + directory entry, with <code>{0}</code> marking where the + actual username should be inserted. You can use this property + instead of <code>userSearch</code>, <code>userSubtree</code> + and <code>userBase</code> when the distinguished name contains + the username and is otherwise the same for all users. Note that + when accessing the directory using delegated credentials, this + attribute is always ignored and <code>userSearch</code>, + <code>userSubtree</code> and <code>userBase</code> are always + used instead.</p> + </td></tr><tr><td><code class="attributeName">userRoleName</code></td><td> + <p>The name of an attribute in the user's directory entry + containing zero or more values for the names of roles assigned + to this user. In addition you can use the + <code>roleName</code> property to specify the name of an + attribute to be retrieved from individual role entries found + by searching the directory. If <code>userRoleName</code> is + not specified all the roles for a user derive from the role + search.</p> + </td></tr><tr><td><code class="attributeName">userRoleAttribute</code></td><td> + <p>The name of an attribute in the user's directory entry + containing the value that you wish to use when you search for + roles. This is especially useful for RFC 2307 where + the role memberUid can be the <code>uid</code> or the + <code>uidNumber</code> of the user. This value will be + marked as <code>{2}</code> in your role search filter expression. + This value will NOT be available for nested role searches.</p> + </td></tr><tr><td><code class="attributeName">userSearch</code></td><td> + <p>The LDAP filter expression to use when searching for a + user's directory entry, with <code>{0}</code> marking where + the actual username should be inserted. Use this property + (along with the <code>userBase</code> and + <code>userSubtree</code> properties) instead of + <code>userPattern</code> to search the directory for the + user's entry.</p> + </td></tr><tr><td><code class="attributeName">userSearchAsUser</code></td><td> + <p> When searching for a user's entry, should the search be performed as + the user currently being authenticated? If false, + <code>connectionName</code> and <code>connectionPassword</code> will be + used if specified, else an anonymous. If not specified, the default + value of <code>false</code> is used. Note that when accessing the + directory using delegated credentials, this attribute is always ignored + and the search is performed using the delegated credentials.</p> + </td></tr><tr><td><code class="attributeName">userSubtree</code></td><td> + <p>Set to <code>true</code> if you want to search the entire + subtree of the element specified by the <code>userBase</code> + property for the user's entry. The default value of + <code>false</code> causes only the top level to be searched. + Not used if you are using the <code>userPattern</code> + expression.</p> + </td></tr><tr><td><code class="attributeName">useStartTls</code></td><td> + <p>Set to <code>true</code> if you want to use StartTLS for securing + the connection to the ldap server. The default value is <code>false</code>. + </p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more + information on setting up container managed security using the + JNDI Directory Realm component.</p> + + </div></div> + + + <div class="subsection"><h4 id="UserDatabase_Realm_-_org.apache.catalina.realm.UserDatabaseRealm">UserDatabase Realm - org.apache.catalina.realm.UserDatabaseRealm</h4><div class="text"> + + <p>The <strong>UserDatabase Realm</strong> is a Realm implementation + that is based on a UserDatabase resource made available through the global + JNDI resources configured for this Tomcat instance.</p> + + <p>The UserDatabase Realm implementation supports the following + additional attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><strong><code class="attributeName">resourceName</code></strong></td><td> + <p>The name of the global <code>UserDatabase</code> resource + that this realm will use for user, password and role information.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>See the + <a href="../realm-howto.html">Container-Managed Security Guide</a> for more + information on setting up container managed security using the UserDatabase + Realm component and the + <a href="../jndi-resources-howto.html">JNDI resources how-to</a> for more + information on how to configure a UserDatabase resource.</p> + + </div></div> + + + <div class="subsection"><h4 id="Memory_Based_Realm_-_org.apache.catalina.realm.MemoryRealm">Memory Based Realm - org.apache.catalina.realm.MemoryRealm</h4><div class="text"> + + <p>The <strong>Memory Based Realm</strong> is a simple Realm implementation + that reads user information from an XML format, and represents it as a + collection of Java objects in memory. This implementation is intended + solely to get up and running with container managed security - it is NOT + intended for production use. As such, there are no mechanisms for + updating the in-memory collection of users when the content of the + underlying data file is changed.</p> + + <p>The Memory Based Realm implementation supports the following + additional attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><code class="attributeName">pathname</code></td><td> + <p>URL, absolute path or relative path (to $CATALINA_BASE) for the XML + file containing our user information. See below for details on the + XML element format required. If no pathname is specified, the + default value is <code>conf/tomcat-users.xml</code>.</p> + </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td> + <p>When processing users authenticated via the GSS-API, this attribute + controls if any "@..." is removed from the end of the user + name. If not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>The XML document referenced by the <code>pathname</code> attribute must + conform to the following requirements:</p> + <ul> + <li>The root (outer) element must be <code><tomcat-users></code>. + </li> + <li>Each authorized user must be represented by a single XML element + <code><user></code>, nested inside the root element.</li> + <li>Each <code><user></code> element must have the following + attributes: + <ul> + <li><strong>username</strong> - Username of this user (must be unique + within this file).<br> + For compatibility, it is allowed to use <strong>name</strong> as an + alternative name for this attribute.</li> + <li><strong>password</strong> - Password of this user (in + clear text).</li> + <li><strong>roles</strong> - Comma-delimited list of the role names + assigned to this user.</li> + </ul></li> + </ul> + + <p>See the <a href="../realm-howto.html">Container-Managed Security Guide</a> for more + information on setting up container managed security using the + Memory Based Realm component.</p> + + </div></div> + + + <div class="subsection"><h4 id="JAAS_Realm_-_org.apache.catalina.realm.JAASRealm">JAAS Realm - org.apache.catalina.realm.JAASRealm</h4><div class="text"> + + <p><strong>JAASRealm</strong> is an implementation of the Tomcat + <code>Realm</code> interface that authenticates users through the Java + Authentication & Authorization Service (JAAS) framework which is now + provided as part of the standard J2SE API.</p> + + <p>Using JAASRealm gives the developer the ability to combine practically + any conceivable security realm with Tomcat's CMA.</p> + + <p>JAASRealm is prototype for Tomcat of the JAAS-based J2EE authentication + framework for J2EE v1.4, based on the <a href="http://www.jcp.org/en/jsr/detail?id=196">JCP Specification Request + 196</a> to enhance container-managed security and promote 'pluggable' + authentication mechanisms whose implementations would be + container-independent.</p> + + <p>Based on the JAAS login module and principal + (see <code>javax.security.auth.spi.LoginModule</code> and + <code>javax.security.Principal</code>), you can develop your own security + mechanism or wrap another third-party mechanism for integration with the CMA + as implemented by Tomcat.</p> + + <p>The JAAS Realm implementation supports the following additional + attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><strong><code class="attributeName">appName</code></strong></td><td> + <p>The name of the application as configured in your login configuration + file + (<a href="http://docs.oracle.com/javase/1.4.2/docs/guide/security/jaas/tutorials/LoginConfigFile.html">JAAS LoginConfig</a>).</p> + </td></tr><tr><td><strong><code class="attributeName">userClassNames</code></strong></td><td> + <p>A comma-separated list of the names of the classes that you have made + for your user <code>Principals</code>.</p> + </td></tr><tr><td><code class="attributeName">configFile</code></td><td> + <p>The name of a JAAS configuration file to use with this Realm. It will + be searched for using <code>ClassLoader#getResource(String)</code> so it + is possible for the configuration to be bundled within a web + application. If not specified, the default JVM global JAAS configuration + will be used.</p> + </td></tr><tr><td><code class="attributeName">roleClassNames</code></td><td> + <p>A comma-separated list of the names of the classes that you have made + for your role <code>Principals</code>.</p> + </td></tr><tr><td><code class="attributeName">stripRealmForGss</code></td><td> + <p>When processing users authenticated via the GSS-API, this attribute + controls if any "@..." is removed from the end of the user + name. If not specified, the default is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr><tr><td><code class="attributeName">useContextClassLoader</code></td><td> + <p>Instructs JAASRealm to use the context class loader for loading the + user-specified <code>LoginModule</code> class and associated + <code>Principal</code> classes. The default value is <code>true</code>, + which is backwards-compatible with the way Tomcat 5 works. To load + classes using the container's classloader, specify + <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">X509UsernameRetrieverClassName</code></td><td> + <p>When using X509 client certificates, this specifies the class name + that will be used to retrieve the user name from the certificate. + The class must implement the + <code>org.apache.catalina.realm.X509UsernameRetriever</code> + interface. The default is to use the certificate's SubjectDN + as the username.</p> + </td></tr></table> + + <p>See the <a href="../realm-howto.html">Container-Managed Security + Guide</a> for more information on setting up container managed security + using the JAAS Realm component.</p> + + </div></div> + + + <div class="subsection"><h4 id="Combined_Realm_-_org.apache.catalina.realm.CombinedRealm">Combined Realm - org.apache.catalina.realm.CombinedRealm</h4><div class="text"> + + <p><strong>CombinedRealm</strong> is an implementation of the Tomcat + <code>Realm</code> interface that authenticates users through one or more + sub-Realms.</p> + + <p>Using CombinedRealm gives the developer the ability to combine multiple + Realms of the same or different types. This can be used to authenticate + against different sources, provide fall back in case one Realm fails or for + any other purpose that requires multiple Realms.</p> + + <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the + <code>Realm</code> element that defines the CombinedRealm. Authentication + will be attempted against each <code>Realm</code> in the order they are + listed. Authentication against any Realm will be sufficient to authenticate + the user.</p> + + <p>See the <a href="../realm-howto.html">Container-Managed Security + Guide</a> for more information on setting up container managed security + using the CombinedRealm component.</p> + + <p>The CombinedRealm implementation supports the following additional + attributes.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr></table> + </div></div> + + + <div class="subsection"><h4 id="LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOut Realm - org.apache.catalina.realm.LockOutRealm</h4><div class="text"> + + <p><strong>LockOutRealm</strong> is an implementation of the Tomcat + <code>Realm</code> interface that extends the CombinedRealm to provide lock + out functionality to provide a user lock out mechanism if there are too many + failed authentication attempts in a given period of time.</p> + + <p>To ensure correct operation, there is a reasonable degree of + synchronization in this Realm.</p> + + <p>This Realm does not require modification to the underlying Realms or the + associated user storage mechanisms. It achieves this by recording all failed + logins, including those for users that do not exist. To prevent a DOS by + deliberating making requests with invalid users (and hence causing this + cache to grow) the size of the list of users that have failed authentication + is limited.</p> + + <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the + <code>Realm</code> element that defines the LockOutRealm. Authentication + will be attempted against each <code>Realm</code> in the order they are + listed. Authentication against any Realm will be sufficient to authenticate + the user.</p> + + <p>The LockOutRealm implementation supports the following additional + attributes.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allRolesMode</code></td><td> + <p>This attribute controls how the special role name <code>*</code> is + handled when processing authorization constraints in web.xml. By + default, the specification compliant value of <code>strict</code> is + used which means that the user must be assigned one of the roles defined + in web.xml. The alternative values are <code>authOnly</code> which means + that the user must be authenticated but no check is made for assigned + roles and <code>strictAuthOnly</code> which means that the user must be + authenticated and no check will be made for assigned roles unless roles + are defined in web.xml in which case the user must be assigned at least + one of those roles.</p> + </td></tr><tr><td><code class="attributeName">cacheRemovalWarningTime</code></td><td> + <p>If a failed user is removed from the cache because the cache is too + big before it has been in the cache for at least this period of time (in + seconds) a warning message will be logged. Defaults to 3600 (1 hour).</p> + </td></tr><tr><td><code class="attributeName">cacheSize</code></td><td> + <p>Number of users that have failed authentication to keep in cache. Over + time the cache will grow to this size and may not shrink. Defaults to + 1000.</p> + </td></tr><tr><td><code class="attributeName">failureCount</code></td><td> + <p>The number of times in a row a user has to fail authentication to be + locked out. Defaults to 5.</p> + </td></tr><tr><td><code class="attributeName">lockOutTime</code></td><td> + <p>The time (in seconds) a user is locked out for after too many + authentication failures. Defaults to 300 (5 minutes). Further + authentication failures during the lock out time will cause the lock out + timer to reset to zero, effectively extending the lock out time. Valid + authentication attempts during the lock out period will not succeed but + will also not reset the lock out time.</p> + </td></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr></table> + + <p>See the <a href="../realm-howto.html">Container-Managed Security + Guide</a> for more information on setting up container managed security + using the LockOutRealm component.</p> + + </div></div> + + <div class="subsection"><h4 id="Null_Realm_-_org.apache.catalina.realm.NullRealm">Null Realm - org.apache.catalina.realm.NullRealm</h4><div class="text"> + + <p><strong>NullRealm</strong> is a minimal implementation of the Tomcat + <code>Realm</code> interface that always returns null when an attempt is + made to validate a user name and associated credentials. It is intended to + be used as a default Realm implementation when no other Realm is + specified.</p> + + <p>The NullRealm implementation supports the following additional + attributes.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">transportGuaranteeRedirectStatus</code></td><td> + <p>The HTTP status code to use when the container needs to issue an HTTP + redirect to meet the requirements of a configured transport + guarantee. The provided status code is not validated. If not + specified, the default value of <code>302</code> is used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>You can nest the following components by nesting the corresponding element + inside your <strong>Realm</strong> element:</p> + <ul> + <li><strong>CombinedRealm Implementation</strong> - If you are using the + <em>CombinedRealm Implementation</em> or a Realm + that extends the CombinedRealm, e.g. the LockOutRealm, one or more + <strong><Realm></strong> elements may be nested inside it.</li> + <li><a href="credentialhandler.html"><strong>CredentialHandler</strong></a> - + You may nest at most one instance of this element inside a Realm. This + configures the credential handler that will be used to validate provided + credentials with those stored by the Realm. If not specified a default + <em>MessageDigestCredentialHandler</em> will be configured.</li> + </ul> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>See <a href="host.html">Single Sign On</a> for information about + configuring Single Sign On support for a virtual host.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/resources.html b/src/tomcat/webapps/docs/config/resources.html new file mode 100644 index 0000000000000000000000000000000000000000..85908f49e4f65c691abbb5838baf6ed35bad0afe --- /dev/null +++ b/src/tomcat/webapps/docs/config/resources.html @@ -0,0 +1,320 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Resources Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/resources"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Resources Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>Resources</strong> element represents all the resources + available to the web application. This includes classes, JAR files, HTML, JSPs + and any other files that contribute to the web application. Implementations + are provided to use directories, JAR files and WARs as the source of these + resources and the resources implementation may be extended to provide support + for files stored in other forms such as in a database or a versioned + repository.</p> + + <p>Resources are cached by default.</p> + + <p><strong>Note: Running a webapp with non-filesystem based + Resources implementations is only possible when the webapp does not + rely on direct filesystem access to its own resources, and uses the methods + in the ServletContext interface to access them.</strong></p> + + <p>A Resources element MAY be nested inside a + <a href="context.html">Context</a> component. If it is not included, + a default filesystem based Resources will be created automatically, + which is sufficient for most requirements.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Resources</strong> support the following + attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">allowLinking</code></td><td> + <p>If the value of this flag is <code>true</code>, symlinks will be + allowed inside the web application, pointing to resources inside or + outside the web application base path. If not specified, the default + value of the flag is <code>false</code>.</p> + <p><b>NOTE: This flag MUST NOT be set to true on the Windows platform + (or any other OS which does not have a case sensitive filesystem), + as it will disable case sensitivity checks, allowing JSP source code + disclosure, among other security problems.</b></p> + </td></tr><tr><td><code class="attributeName">cacheMaxSize</code></td><td> + <p>The maximum size of the static resource cache in kilobytes. + If not specified, the default value is <code>10240</code> + (10 megabytes). This value may be changed while the web application is + running (e.g. via JMX). If the cache is using more memory than the new + limit the cache will attempt to reduce in size over time to meet the + new limit. If necessary, <strong>cacheObjectMaxSize</strong> will be + reduced to ensure that it is no larger than + <code>cacheMaxSize/20</code>.</p> + </td></tr><tr><td><code class="attributeName">cacheObjectMaxSize</code></td><td> + <p>Maximum size of the static resource that will be placed in the cache. + If not specified, the default value is <code>512</code> + (512 kilobytes). If this value is greater than + <code>cacheMaxSize/20</code> it will be reduced to + <code>cacheMaxSize/20</code>. This value may be changed while the web + application is running (e.g. via JMX).</p> + </td></tr><tr><td><code class="attributeName">cacheTtl</code></td><td> + <p>The amount of time in milliseconds between the revalidation of cache + entries. If not specified, the default value is <code>5000</code> (5 + seconds). This value may be changed while the web application is running + (e.g. via JMX). When a resource is cached it will inherit the TTL in + force at the time it was cached and retain that TTL until the resource + is evicted from the cache regardless of any subsequent changes that may + be made to this attribute.</p> + </td></tr><tr><td><code class="attributeName">cachingAllowed</code></td><td> + <p>If the value of this flag is <code>true</code>, the cache for static + resources will be used. If not specified, the default value + of the flag is <code>true</code>. This value may be changed while the + web application is running (e.g. via JMX). When the cache is disabled + any resources currently in the cache are cleared from the cache.</p> + </td></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.WebResourceRoot</code> + interface. If not specified, the standard value (defined below) will be + used.</p> + </td></tr><tr><td><code class="attributeName">trackLockedFiles</code></td><td> + <p>Controls whether the track locked files feature is enabled. If + enabled, all calls to methods that return objects that lock a file and + need to be closed to release that lock (e.g. + <code>ServletContext.getResourceAsStream()</code>) will perform a number + of additional tasks.</p> + <ul> + <li>The stack trace at the point where the method was called will be + recorded and associated with the returned object.</li> + <li>The returned object will be wrapped so that the point where + close() (or equivalent) is called to release the resources can be + detected. Tracking of the object will cease once the resources have + been released.</li> + <li>All remaining locked resources on web application shutdown will be + logged and then closed.</li> + </ul> + <p>If not specified, the default value of <code>false</code> will be + used.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <h3>Standard Root Implementation</h3> + + <p>The standard implementation of <strong>Resources</strong> is + <strong>org.apache.catalina.webresources.StandardRoot</strong>. It does not + support any additional attributes.</p> + + <h3>Extracting Root Implementation</h3> + + <p>The extracting implementation of <strong>Resources</strong> is + <strong>org.apache.catalina.webresources.ExtractingRoot</strong>. It does not + support any additional attributes.</p> + + <p>When deploying web applications as packed WAR files, the extracting root + will extract any JAR files from <code>/WEB-INF/lib</code> to a + <code>application-jars</code> directory located in the web + application's working directory. These extracted JARs will be removed + when the web application stops.</p> + + <p>Extracting JAR files from a packed WAR may provide a performance + improvement, particularly at web application start when JAR scanning is + required by the application.</p> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>A web application's main resources are defined by the + <strong>docBase</strong> defined for the <a href="context.html">Context</a>. + Additional resources may be made available to the web application by defining + one or more nested components.</p> + + <h3>PreResources</h3> + + <p>PreResources are searched before the main resources. They will be searched + in the order they are defined. To configure PreResources, nest a + <PreResources> element inside the <Resources> element with the + following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">base</code></strong></td><td> + <p>Identifies where the resources to be used are located. This attribute + is required by the <code>org.apache.catalina.WebResourceSet</code> + implementations provided by Tomcat and should specify the absolute path to + the file, directory or JAR where the resources are located. Custom + implementations may not require it.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.WebResourceSet</code> interface. + Tomcat provides three standard implementations: + <code>org.apache.catalina.webresources.DirResourceSet</code>, + <code>org.apache.catalina.webresources.FileResourceSet</code> and + <code>org.apache.catalina.webresources.JarResourceSet</code>. Custom + implementations may also be used. + </p> + </td></tr><tr><td><code class="attributeName">internalPath</code></td><td> + <p>Identifies the path within the <strong>base</strong> where the + resources are to be found. This is typically only used with JAR files when + the resources are not located at the root of the JAR as is the case with + resource JARs. This attribute is required by the + <code>org.apache.catalina.WebResourceSet</code> implementations provided + by Tomcat and must start with '/'. Custom implementations may not require + it. If not specified, the default value '/' will be used.</p> + </td></tr><tr><td><code class="attributeName">readOnly</code></td><td> + <p>If <code>true</code>, resources within this resource set may not be + deleted, created or modified. For instance of + <code>org.apache.catalina.webresources.JarResourceSet</code>, this + attribute is hard-coded to <code>true</code> and may not be changed. For + instances of <code>org.apache.catalina.webresources.DirResourceSet</code> + and <code>org.apache.catalina.webresources.FileResourceSet</code> the + default value of this attribute is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">webAppMount</code></td><td> + <p>Identifies the path within the web application that these resources + will be made available. For the + <code>org.apache.catalina.WebResourceSet</code> implementations provided + by Tomcat, this attribute is required and must start with '/'. Custom + implementations may not require it. If not specified, the default value of + '/' will be used.</p> + </td></tr></table> + + <h3>JAR resources</h3> + + <p>JarResources are searched after the main resources but before the + PostResources. They will be searched in the order they are defined. To + configure JarResources, nest a <JarResources> element inside the + <Resources> element. The configuration attributes are the same as for + <strong>PreResources</strong>. + </p> + + <p>During web application start, the JAR scanning process checks scanned JARs + for content under <code>/META-INF/resources</code>. Where found, this static + content is added to the JarResources. + </p> + + <h3>Post-resources</h3> + + <p>PostResources are searched after the resource JARs. They will be searched + in the order they are defined. To configure PostResources, nest a + <PostResources> element inside the <Resources> element. The + configuration attributes are the same as for <strong>PreResources</strong>. + </p> + + <h3>Ordering</h3> + + <p>In addition to the sets of resources described above, the standard + implementation also maintains ClassResources which represent the classes + contained in the JAR files mapped to <code>/WEB-INF/classes</code>. This + allows other components to search for classes with a single call rather than + one call to search <code>/WEB-INF/classes</code> followed by another to search + the JARs in <code>/WEB-INF/lib</code>. The ClassResources are populated + from the JARs mapped to <code>/WEB-INF/lib</code> when the web application + starts.</p> + + <p>Therefore, the complete search order is:</p> + <ul> + <li>PreResources</li> + <li>MainResources</li> + <li>ClassResources</li> + <li>JarResources</li> + <li>PostResources</li> + </ul> + + <p>The population of ClassResources and JarResources at web application start + means that care needs to be taken to add JAR based resources correctly to + obtain the desired behaviour. Consider the following example:</p> + + <div class="codeBox"><pre><code><Resources> + <PostResources base="D:\Projects\external\classes" + className="org.apache.catalina.webresources.DirResourceSet" + webAppMount="/WEB-INF/classes"/> + <PostResources base="D:\Projects\lib\library1.jar" + className="org.apache.catalina.webresources.FileResourceSet" + webAppMount="/WEB-INF/lib/library1.jar"/> +</Resources></code></pre></div> + + <p>Since both resources are PostResources, it might be expected that + <code>D:\Projects\external\classes</code> will be searched for classes before + <code>D:\Projects\lib\library1.jar</code>. However, by adding the JAR using a + <code>FileResourceSet</code>, the JAR is mapped to <code>/WEB-INF/lib</code> + and will be processed at application start along with the other JARs in + <code>/WEB-INF/lib</code>. The classes from the JAR file will be added to the + ClassResources which means they will be searched before the classes from + <code>D:\Projects\external\classes</code>. If the desired behaviour is that + <code>D:\Projects\external\classes</code> is searched before + <code>D:\Projects\lib\library1.jar</code> then a slightly different + configuration is required:</p> + + <div class="codeBox"><pre><code><Resources> + <PostResources base="D:\Projects\external\classes" + className="org.apache.catalina.webresources.DirResourceSet" + webAppMount="/WEB-INF/classes"/> + <PostResources base="D:\Projects\lib\library1.jar" + className="org.apache.catalina.webresources.JarResourceSet" + webAppMount="/WEB-INF/classes"/> +</Resources></code></pre></div> + + <p>In short, the JAR file should be added as a <code>JarResourceSet</code> + mapped to <code>/WEB-INF/classes</code> rather than using a + <code>FileResourceSet</code> mapped to <code>/WEB-INF/lib</code>. + </p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>No special features are associated with a <strong>Resources</strong> + element.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/server.html b/src/tomcat/webapps/docs/config/server.html new file mode 100644 index 0000000000000000000000000000000000000000..a67732c79b72a8c48b222a9844fc5232ff00d804 --- /dev/null +++ b/src/tomcat/webapps/docs/config/server.html @@ -0,0 +1,123 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Server Component</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/server"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Server Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>A <strong>Server</strong> element represents the entire Catalina + servlet container. Therefore, it must be the single outermost element + in the <code>conf/server.xml</code> configuration file. Its attributes + represent the characteristics of the servlet container as a whole.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Server</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Server</code> interface. + If no class name is specified, the standard implementation will + be used.</p> + </td></tr><tr><td><code class="attributeName">address</code></td><td> + <p>The TCP/IP address on which this server waits for a shutdown + command. If no address is specified, <code>localhost</code> is used.</p> + </td></tr><tr><td><strong><code class="attributeName">port</code></strong></td><td> + <p>The TCP/IP port number on which this server waits for a shutdown + command. Set to <code>-1</code> to disable the shutdown port.</p> + <p>Note: Disabling the shutdown port works well when Tomcat is started + using <a href="http://commons.apache.org/daemon/">Apache Commons Daemon</a> + (running as a service on Windows or with jsvc on un*xes). It cannot be + used when running Tomcat with the standard shell scripts though, as it + will prevent shutdown.bat|.sh and catalina.bat|.sh from stopping it + gracefully.</p> + </td></tr><tr><td><strong><code class="attributeName">shutdown</code></strong></td><td> + <p>The command string that must be received via a TCP/IP connection + to the specified port number, in order to shut down Tomcat.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Server</strong> is + <strong>org.apache.catalina.core.StandardServer</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>The following components may be nested inside a <strong>Server</strong> + element:</p> + <ul> + <li><a href="service.html"><strong>Service</strong></a> - + One or more service element.</li> + <li><a href="globalresources.html"><strong>GlobalNamingResources</strong></a> - + Configure the JNDI global resources for the server.</li> + </ul> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>There are no special features associated with a <strong>Server</strong>. + </p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/service.html b/src/tomcat/webapps/docs/config/service.html new file mode 100644 index 0000000000000000000000000000000000000000..4e6d553b93656d641adf350d627d90460e18db01 --- /dev/null +++ b/src/tomcat/webapps/docs/config/service.html @@ -0,0 +1,110 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Service Component</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/service"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Service Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li><li><a href="#Nested_Components">Nested Components</a></li><li><a href="#Special_Features">Special Features</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>A <strong>Service</strong> element represents the combination of one or + more <strong>Connector</strong> components that share a single + <a href="engine.html">Engine</a> component for processing incoming + requests. One or more <strong>Service</strong> elements may be nested + inside a <a href="server.html">Server</a> element.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>Service</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.Service</code> interface. + If no class name is specified, the standard implementation will + be used.</p> + </td></tr><tr><td><strong><code class="attributeName">name</code></strong></td><td> + <p>The display name of this <strong>Service</strong>, which will + be included in log messages if you utilize standard Catalina + components. The name of each <strong>Service</strong> that is + associated with a particular <a href="server.html">Server</a> + must be unique.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>The standard implementation of <strong>Service</strong> is + <strong>org.apache.catalina.core.StandardService</strong>. + It supports the following additional attributes (in addition to the + common attributes listed above):</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + + </div></div> + +</div><h3 id="Nested_Components">Nested Components</h3><div class="text"> + + <p>The only components that may be nested inside a <strong>Service</strong> + element are one or more <strong>Connector</strong> elements, + followed by exactly one <a href="engine.html">Engine</a> element.</p> + +</div><h3 id="Special_Features">Special Features</h3><div class="text"> + + <p>There are no special features associated with a <strong>Service</strong>. + </p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/sessionidgenerator.html b/src/tomcat/webapps/docs/config/sessionidgenerator.html new file mode 100644 index 0000000000000000000000000000000000000000..9f76df71d3b2daf58486d85c26d682a912884c1b --- /dev/null +++ b/src/tomcat/webapps/docs/config/sessionidgenerator.html @@ -0,0 +1,131 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The SessionIdGenerator Component</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/sessionidgenerator"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The SessionIdGenerator Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Standard_Implementation">Standard Implementation</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>SessionIdGenerator</strong> element represents the <em>session + id generator</em> that will be used to create session ids used by + web application HTTP sessions.</p> + + <p>A SessionIdGenerator element MAY be nested inside a + <a href="manager.html">Manager</a> component. If it is not included, + a default SessionIdGenerator configuration will be created automatically, which + is sufficient for most requirements, — see + <em>Standard SessionIdGenerator Implementation</em> below for the details + of this configuration.</p> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + + <p>All implementations of <strong>SessionIdGenerator</strong> + support the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">className</code></td><td> + <p>Java class name of the implementation to use. This class must + implement the <code>org.apache.catalina.SessionIdGenerator</code> interface. + If not specified, the standard value (defined below) will be used.</p> + </td></tr><tr><td><code class="attributeName">jvmRoute</code></td><td> + <p>A routing identifier for this Tomcat instance. It will be added + to the session id to allow for stateless stickyness routing by + load balancers. The details on how the <code>jvmRoute</code> + will be included in the id are implementation dependent. + See <a href="#Standard_Implementation">Standard Implementation</a> + for the default behavior.</p> + + <p><strong>NOTE</strong> - The value for this property is inherited + automatically from the <code>jvmRoute</code> attribute of the + <a href="engine.html">Engine</a> element.</p> + </td></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td> + <p>The length of session ids created by this SessionIdGenerator. + The details on how the <code>sessionIdLength</code> + influences the session id length are implementation dependent. + See <a href="#Standard_Implementation">Standard Implementation</a> + for the default behavior.</p> + </td></tr></table> + + </div></div> + + + <div class="subsection"><h4 id="Standard_Implementation">Standard Implementation</h4><div class="text"> + + <p>Tomcat provides a standard implementations of <strong>SessionIdGenerator</strong> + for use.</p> + + <h3>Standard SessionIdGenerator Implementation</h3> + + <p>The standard implementation of <strong>SessionIdGenerator</strong> is + <strong>org.apache.catalina.util.StandardSessionIdGenerator</strong>. + It supports the following attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">jvmRoute</code></td><td> + <p>A routing identifier for this Tomcat instance. It will be added + to the end of the session id separated by a ".".</p> + </td></tr><tr><td><code class="attributeName">sessionIdLength</code></td><td> + <p>The length of session ids created by this SessionIdGenerator. + More precisely the session id length is twice the value of + <code>sessionIdLength</code> plus the length of the trailing + <code>jvmRoute</code> if given. The factor 2 is because + the session id is constructed using <code>sessionIdLength</code> + random bytes, each byte being encoded in two hex characters + in the actual id. The default value is 16.</p> + </td></tr></table> + + </div></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/systemprops.html b/src/tomcat/webapps/docs/config/systemprops.html new file mode 100644 index 0000000000000000000000000000000000000000..6b338f8fa689930425f3e5d596f30b4a6819c7b3 --- /dev/null +++ b/src/tomcat/webapps/docs/config/systemprops.html @@ -0,0 +1,549 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - System Properties</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/systemprops"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>System Properties</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Property_replacements">Property replacements</a></li><li><a href="#Clustering">Clustering</a></li><li><a href="#Expression_Language">Expression Language</a></li><li><a href="#Jasper">Jasper</a></li><li><a href="#Security">Security</a></li><li><a href="#Specifications">Specifications</a></li><li><a href="#Sessions">Sessions</a></li><li><a href="#Logging">Logging</a></li><li><a href="#JAR_Scanning">JAR Scanning</a></li><li><a href="#Websockets">Websockets</a></li><li><a href="#Other">Other</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p>The following sections list the system properties that may be set to modify + the default Tomcat behaviour.</p> +</div><h3 id="Property_replacements">Property replacements</h3><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.tomcat.util.digester. PROPERTY_SOURCE</code></td><td> + <p>Set this to a fully qualified name of a class that implements + <code>org.apache.tomcat.util.IntrospectionUtils.PropertySource</code>. + Required to have a public constructor with no arguments.</p> + <p>Use this to add a property source, that will be invoked when <code>${parameter}</code> + denoted parameters are found in the XML files that Tomcat parses.</p> + <p>Property replacement from the specified property source on the JVM + system properties can also be done using the + <code>REPLACE_SYSTEM_PROPERTIES</code> system property.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.digester. REPLACE_SYSTEM_PROPERTIES</code></td><td> + <p>Set this boolean system property to <code>true</code> to cause + property replacement from the digester property source on the JVM + system properties.</p> + </td></tr></table> + +</div><h3 id="Clustering">Clustering</h3><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.catalina. tribes.dns_lookups</code></td><td> + <p>If <code>true</code>, the clustering module will attempt to use DNS to + resolve any host names provided in the cluster configuration.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr></table> + +</div><h3 id="Expression_Language">Expression Language</h3><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.el.BeanELResolver. CACHE_SIZE</code></td><td> + <p>The number of javax.el.BeanELResolver.BeanProperties objects that will + be cached by the EL Parser.</p> + <p>If not specified, the default of <code>1000</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.el.ExpressionBuilder. CACHE_SIZE</code></td><td> + <p>The number of parsed EL expressions that will be cached by the EL + Parser.</p> + <p>If not specified, the default of <code>5000</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.el.parser. COERCE_TO_ZERO</code></td><td> + <p>If <code>true</code>, when coercing <code>null</code>s to objects of + type Number, Character or Boolean the result will be <code>0</code> for + Number and Character types and <code>false</code> for Boolean as required + by the EL 2.2 and earlier specifications. If this property is + <code>false</code> the result of the coercion will be <code>null</code> as + required by the EL 3.0 specification.</p> + <p>If not specified, the default value of <code>false</code> will be + used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.el.parser. SKIP_IDENTIFIER_CHECK</code></td><td> + <p>If <code>true</code>, when parsing expressions, identifiers will not be + checked to ensure that they conform to the Java Language Specification for + Java identifiers.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr></table> +</div><h3 id="Jasper">Jasper</h3><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.POOL_TAGS_WITH_EXTENDS</code></td><td> + <p>By default, JSPs that use their own base class via the extends + attribute of the page directive, will have Tag pooling disabled since + Jasper cannot guarantee that the necessary initialisation will have taken + place. This can have a negative impact on performance. Providing the + alternative base class calls _jspInit() from Servlet.init(), setting this + property to <code>true</code> will enable pooling with an alternative base + class. If the alternative base class does not call _jspInit() and this + property is <code>true</code>, NPEs will occur when attempting to use + tags.</p> + <p>If not specified, the default value of <code>false</code> will be used. + </p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.STRICT_GET_PROPERTY</code></td><td> + <p>If <code>true</code>, the requirement to have the object referenced in + <code>jsp:getProperty</code> action to be previously "introduced" + to the JSP processor, as specified in the chapter JSP.5.3 of JSP 2.0 and + later specifications, is enforced.</p> + <p>If not specified, the specification compliant default of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.VAR_EXPRESSIONFACTORY</code></td><td> + <p>The name of the variable to use for the expression language expression + factory.</p> + <p>If not specified, the default value of <code>_el_expressionfactory</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Generator.VAR_INSTANCEMANAGER</code></td><td> + <p>The name of the variable to use for the instance manager factory.</p> + <p>If not specified, the default value of <code>_jsp_instancemanager</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.compiler. Parser.STRICT_WHITESPACE</code></td><td> + <p>If <code>false</code> the requirements for whitespace before an + attribute name will be relaxed so that the lack of whitespace will not + cause an error.</p> + <p>If not specified, the specification compliant default of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. BodyContentImpl.BUFFER_SIZE</code></td><td> + <p>The size (in characters) to use when creating a tag buffer.</p> + <p>If not specified, the default value of + <code>org.apache.jasper.Constants.DEFAULT_TAG_BUFFER_SIZE</code> (512) + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. BodyContentImpl.LIMIT_BUFFER</code></td><td> + <p>If <code>true</code>, any tag buffer that expands beyond + <code>org.apache.jasper.runtime.BodyContentImpl.BUFFER_SIZE</code> will be + destroyed and a new buffer created.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. JspFactoryImpl.USE_POOL</code></td><td> + <p>If <code>true</code>, a ThreadLocal <code>PageContext</code> pool will + be used.</p> + <p>If not specified, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.runtime. JspFactoryImpl.POOL_SIZE</code></td><td> + <p>The size of the ThreadLocal <code>PageContext</code>.</p> + <p>If not specified, the default value of <code>8</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_SERVLET_BASE</code></td><td> + <p>The base class of the Servlets generated from the JSPs.</p> + <p>If not specified, the default value of + <code>org.apache.jasper.runtime.HttpJspBase</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. SERVICE_METHOD_NAME</code></td><td> + <p>The name of the service method called by the base class.</p> + <p>If not specified, the default value of <code>_jspService</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. SERVLET_CLASSPATH</code></td><td> + <p>The name of the ServletContext attribute that provides the classpath + for the JSP.</p> + <p>If not specified, the default value of + <code>org.apache.catalina.jsp_classpath</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_FILE</code></td><td> + <p>The name of the request attribute for <code><jsp-file></code> + element of a servlet definition. If present on a request, this overrides + the value returned by <code>request.getServletPath()</code> to select the + JSP page to be executed.</p> + <p>If not specified, the default value of + <code>org.apache.catalina.jsp_file</code> will be used.</p> + <p><strong>Deprecated:</strong> This will be removed in Tomcat 9.0.x + onwards. It is replaced by the use of the jspFile servlet initialisation + parameter</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. PRECOMPILE</code></td><td> + <p>The name of the query parameter that causes the JSP engine to just + pregenerate the servlet but not invoke it.</p> + <p>If not specified, the default value of <code>jsp_precompile</code> + will be used, as defined by JSP specification (JSP.11.4.2).</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. JSP_PACKAGE_NAME</code></td><td> + <p>The default package name for compiled jsp pages.</p> + <p>If not specified, the default value of <code>org.apache.jsp</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. TAG_FILE_PACKAGE_NAME</code></td><td> + <p>The default package name for tag handlers generated from tag files.</p> + <p>If not specified, the default value of <code>org.apache.jsp.tag</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. ALT_DD_ATTR</code></td><td> + <p>The servlet context attribute under which the alternate deployment + descriptor for this web application is stored.</p> + <p>If not specified, the default value of + <code>org.apache.catalina.deploy.alt_dd</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. TEMP_VARIABLE_NAME_PREFIX</code></td><td> + <p>Prefix to use for generated temporary variable names.</p> + <p>If not specified, the default value of <code>_jspx_temp</code> + will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.jasper.Constants. USE_INSTANCE_MANAGER_FOR_TAGS</code></td><td> + <p>If <code>true</code>, the instance manager is used to obtain tag + handler instances.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr></table> + +</div><h3 id="Security">Security</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.catalina.connector. RECYCLE_FACADES</code></td><td> + <p>If this is <code>true</code> or if a security manager is in use a new + facade object will be created for each request.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.connector. CoyoteAdapter.ALLOW_BACKSLASH</code></td><td> + <p>If this is <code>true</code> the '\' character will be permitted as a + path delimiter.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.buf. UDecoder.ALLOW_ENCODED_SLASH</code></td><td> + <p>If this is <code>true</code> '%2F' and '%5C' will be permitted as path + delimiters.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr></table> + +</div><h3 id="Specifications">Specifications</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.catalina. STRICT_SERVLET_COMPLIANCE</code></td><td> + <p>The default value of this system property is <code>false</code>.</p> + <p>If this is <code>true</code> the default values will be changed for:</p> + <ul> + <li><code>org.apache.catalina.core.<br>ApplicationContext.GET_RESOURCE_REQUIRE_SLASH</code></li> + <li><code>org.apache.catalina.core.<br>ApplicationDispatcher.WRAP_SAME_OBJECT</code></li> + <li><code>org.apache.catalina.core.<br>StandardHostValve.ACCESS_SESSION</code></li> + <li><code>org.apache.catalina.session.<br>StandardSession.ACTIVITY_CHECK</code></li> + <li><code>org.apache.catalina.session.<br>StandardSession.LAST_ACCESS_AT_START</code></li> + <li><code>org.apache.tomcat.util.http.<br>ServerCookie.STRICT_NAMING</code></li> + <li>The <code>URIEncoding</code> attribute of any + <a href="http.html">HTTP connector</a> or + <a href="ajp.html">AJP connector</a> element.</li> + <li>The <code>resourceOnlyServlets</code> attribute of any + <a href="context.html">Context</a> element.</li> + <li>The <code>tldValidation</code> attribute of any + <a href="context.html">Context</a> element.</li> + <li>The <code>useRelativeRedirects</code> attribute of any + <a href="context.html">Context</a> element.</li> + <li>The <code>xmlNamespaceAware</code> attribute of any + <a href="context.html">Context</a> element.</li> + <li>The <code>xmlValidation</code> attribute of any + <a href="context.html">Context</a> element.</li> + </ul> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.connector. Response.ENFORCE_ENCODING_IN_GET_WRITER</code></td><td> + <p>If this is <code>true</code> then + a call to <code>Response.getWriter()</code> if no character encoding + has been specified will result in subsequent calls to + <code>Response.getCharacterEncoding()</code> returning + <code>ISO-8859-1</code> and the <code>Content-Type</code> response header + will include a <code>charset=ISO-8859-1</code> component. (SRV.15.2.22.1)</p> + <p>If not specified, the default specification compliant value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.core.ApplicationContext .GET_RESOURCE_REQUIRE_SLASH</code></td><td> + <p>If this is <code>true</code> then the path passed to + <code>ServletContext.getResource()</code> or + <code>ServletContext.getResourceAsStream()</code> must start with + "/". If <code>false</code>, code like + <code>getResource("myfolder/myresource.txt")</code> will work as Tomcat + will prepend "/" to the provided path.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.core. ApplicationDispatcher.WRAP_SAME_OBJECT</code></td><td> + <p>If this is <code>true</code> then any wrapped request or response + object passed to an application dispatcher will be checked to ensure that + it has wrapped the original request or response.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.websocket. STRICT_SPEC_COMPLIANCE</code></td><td> + <p>The default value of this system property is <code>false</code>.</p> + <p>If this is <code>true</code> the default values will be changed for:</p> + <ul> + <li><code>org.apache.tomcat.websocket.server#isEnforceNoAddAfterHandshake</code> + (default changes from <code>false</code> to <code>true</code>)</li> + </ul> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.http. ServerCookie.STRICT_NAMING</code></td><td> + <p> If this is <code>true</code> then the requirements of the Servlet specification + that Cookie names must adhere to RFC2109 will be enforced. If this is + <code>false</code> the naming rules specified in RFC6265 (allow the leading "$") + will be used.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr></table> + +</div><h3 id="Sessions">Sessions</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.catalina.authenticator. Constants.SSO_SESSION_COOKIE_NAME</code></td><td> + <p>An alternative name for the single sign on session cookie. Defaults to + <code>JSESSIONIDSSO</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.core. StandardHostValve.ACCESS_SESSION</code></td><td> + <p>If this is <code>true</code>, every request that is associated with a + session will cause the session's last accessed time to be updated + regardless of whether or not the request explicitly accesses the session.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.session. StandardSession.ACTIVITY_CHECK</code></td><td> + <p>If this is <code>true</code>, Tomcat will track the number of active + requests for each session. When determining if a session is valid, any + session with at least one active request will always be considered valid.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.session. StandardSession.LAST_ACCESS_AT_START</code></td><td> + <p>If this is <code>true</code>, the last accessed time for sessions will + be calculated from the beginning of the previous request. If + <code>false</code>, the last accessed time for sessions will be calculated + from the end of the previous request. This also affects how the idle time + is calculated.</p> + <p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set to + <code>true</code>, the default of this setting will be <code>true</code>, + else the default value will be <code>false</code>.</p> + </td></tr></table> + +</div><h3 id="Logging">Logging</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.juli.formatter</code></td><td> + <p>If no logging configuration file is specified and no logging configuration class is specified + using the <code>java.util.logging.config.class</code> and <code>java.util.logging.config.file</code> + properties the default logging framework <code>org.apache.juli</code> will use the default + <code>java.util.logging.SimpleFormatter</code> for all console output. + To simply override the console output formatter, one can use the described property. Example: + <code>-Dorg.apache.juli.formatter=org.apache.juli.OneLineFormatter</code></p> + </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncMaxRecordCount</code></td><td> + <p>The maximum number of log records that the JULI AsyncFileHandler will queue in memory. + New records are added to the queue and get asynchronously removed from the queue + and written to the files by a single writer thread. + When the queue is full and a new record is being logged + the log record will be handled based on the <code>org.apache.juli.AsyncOverflowDropType</code> setting.</p> + <p>The default value is <code>10000</code> records. + This number represents the global number of records, not on a per handler basis. + </p> + </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncOverflowDropType</code></td><td> + <p>When the queue of log records of the JULI AsyncFileHandler is full, + new log records are handled according to the following setting: + </p> + <ul> + <li><code>1</code> - the newest record in the queue will be dropped and not logged</li> + <li><code>2</code> - the oldest record in the queue will be dropped and not logged</li> + <li><code>3</code> - suspend the logging thread until older records got written to the log file and the queue is no longer full. + This is the only setting that ensures that no messages get lost.</li> + <li><code>4</code> - drop the current log record</li> + </ul> + <p>The default value is <code>1</code> (drop the newest record in the queue).</p> + </td></tr><tr><td><code class="propertyName">org.apache.juli. AsyncLoggerPollInterval</code></td><td> + <p>The poll interval in milliseconds for the asynchronous logger thread. + If the log queue is empty, the async thread will issue a poll(poll interval) + in order to not wake up too often.</p> + <p>The default value is <code>1000</code> milliseconds.</p> + </td></tr><tr><td><code class="propertyName">org.apache.juli.logging. UserDataHelper.CONFIG</code></td><td> + <p>The type of logging to use for errors generated by invalid input data. + The options are: <code>DEBUG_ALL</code>, <code>INFO_THEN_DEBUG</code>, + <code>INFO_ALL</code> and <code>NONE</code>. When + <code>INFO_THEN_DEBUG</code> is used, the period for which errors are + logged at DEBUG rather than INFO is controlled by the system property + <code>org.apache.juli.logging.UserDataHelper.SUPPRESSION_TIME</code>. + </p> + <p>The default value is <code>INFO_THEN_DEBUG</code>.</p> + <p>The errors currently logged using this system are:</p> + <ul> + <li>invalid cookies;</li> + <li>invalid parameters;</li> + <li>too many headers, too many parameters (hitting + <code>maxHeaderCount</code> or <code>maxParameterCount</code> limits + of a <a href="http.html">connector</a>).</li> + </ul> + <p>Other errors triggered by invalid input data may be added to this + system in later versions.</p> + </td></tr><tr><td><code class="propertyName">org.apache.juli.logging. UserDataHelper.SUPPRESSION_TIME</code></td><td> + <p>When using <code>INFO_THEN_DEBUG</code> for + <code>org.apache.juli.logging.UserDataHelper.CONFIG</code> this system + property controls how long messages are logged at DEBUG after a message + has been logged at INFO. Once this period has elapsed, the next message + will be logged at INFO followed by a new suppression period where + messages are logged at DEBUG and so on. The value is measured + in seconds.</p> + <p>A value of <code>0</code> is equivalent to using <code>INFO_ALL</code> + for <code>org.apache.juli.logging.UserDataHelper.CONFIG</code>.</p> + <p>A negative value means an infinite suppression period.</p> + <p>The default value is <code>86400</code> (24 hours).</p> + </td></tr></table> + +</div><h3 id="JAR_Scanning">JAR Scanning</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">tomcat.util.scan. StandardJarScanFilter.jarsToSkip</code></td><td> + <p>A list of comma-separated file name patters that is used as the default + value for <code>pluggabilitySkip</code> and <code>tldSkip</code> + attributes of the standard + <a href="jar-scan-filter.html">JarScanFilter</a> implementation.</p> + <p>The coded default is empty, however the system property is set in + a default Tomcat installation via the + <code>$CATALINA_BASE/conf/catalina.properties</code> file.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.scan. StandardJarScanFilter.jarsToScan</code></td><td> + <p>A list of comma-separated file name patters that is used as the default + value for <code>pluggabilityScan</code> and <code>tldScan</code> + attributes of the standard + <a href="jar-scan-filter.html">JarScanFilter</a> implementation.</p> + <p>The coded default is empty, however the system property is set in + a default Tomcat installation via the + <code>$CATALINA_BASE/conf/catalina.properties</code> file.</p> + </td></tr></table> + +</div><h3 id="Websockets">Websockets</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.ALLOW_UNSUPPORTED_EXTENSIONS</code></td><td> + <p>If <code>true</code>, allow unknown extensions to be declared by + the user.</p> + <p>The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DEFAULT_ORIGIN_HEADER_VALUE</code></td><td> + <p>Default value of the origin header that will be sent by the client + during the upgrade handshake.</p> + <p>The default is null so that no origin header is sent.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DEFAULT_PROCESS_PERIOD</code></td><td> + <p>The number of periodic ticks between periodic processing which + involves in particular session expiration checks.</p> + <p>The default value is <code>10</code> which corresponds to 10 + seconds.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.DISABLE_BUILTIN_EXTENSIONS</code></td><td> + <p>If <code>true</code>, disable all built-in extensions provided by the + server, such as message compression.</p> + <p>The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat. websocket.STREAMS_DROP_EMPTY_MESSAGES</code></td><td> + <p>If <code>true</code>, streams provided to the user (writer and output + stream) will not send an empty message when flushing and there is no + data to flush, or when it is closed without having been used (for + example if an error occurs).</p> + <p>The default value is <code>false</code>.</p> + </td></tr></table> + +</div><h3 id="Other">Other</h3><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">catalina.useNaming</code></td><td> + <p>If this is <code>false</code> it will override the + <code>useNaming</code> attribute for all <a href="context.html"> + Context</a> elements.</p> + </td></tr><tr><td><code class="propertyName">javax.sql.DataSource.Factory</code></td><td> + <p>The class name of the factory to use to create resources of type + <code>javax.sql.DataSource</code>. If not specified the default of + <code>org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory</code> is used + which is a package renamed (to avoid conflicts) copy of + <a href="http://commons.apache.org/dbcp">Apache Commons DBCP</a>.</p> + </td></tr><tr><td><code class="propertyName">javax.mail.Session.Factory</code></td><td> + <p>The class name of the factory to use to create resources of type + <code>javax.mail.Session</code>. If not specified the default of + <code>org.apache.naming.factory.MailSessionFactory</code> is used.</p> + </td></tr><tr><td><code class="propertyName">jvmRoute</code></td><td> + <p>Provides a default value for the <code>jvmRoute</code> attribute of the + <a href="engine.html">Engine</a> element. It does not override the value + configured on the <a href="engine.html">Engine</a> element.</p> + </td></tr><tr><td><code class="propertyName">catalina.config</code></td><td> + <p>The location from which to load the catalina.properties configuration + file. This may be an absolute URL, a relative (to the current working + directory) URL or an alternative file name in which case Tomcat will + attempt to load the file from the default location of + <code>$CATALINA_BASE/conf/</code>.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.byte.enabled</code></td><td> + <p>If <code>true</code>, the String cache is enabled for + <code>ByteChunk</code>.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.char.enabled</code></td><td> + <p>If <code>true</code>, the String cache is enabled for + <code>CharChunk</code>.</p> + <p>If not specified, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.trainThreshold</code></td><td> + <p>The number of times <code>toString()</code> must be called before the + cache is activated.</p> + <p>If not specified, the default value of <code>20000</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.cacheSize</code></td><td> + <p>The size of the String cache.</p> + <p>If not specified, the default value of <code>200</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util.buf.UriUtil. WAR_SEPARATOR</code></td><td> + <p>The character to use to separate the WAR file and WAR content parts of + a WAR URL using the custom WAR scheme provided by Tomcat. This is + equivalent to how <code>!</code> is used in JAR URLs.</p> + <p>If not specified, the default value of <code>*</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">tomcat.util.buf.StringCache.maxStringSize</code></td><td> + <p>The maximum length of String that will be cached.</p> + <p>If not specified, the default value of <code>128</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util. http.FastHttpDateFormat.CACHE_SIZE</code></td><td> + <p>The size of the cache to use parsed and formatted date value.</p> + <p>If not specified, the default value of <code>1000</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.tomcat.util. net.NioSelectorShared</code></td><td> + <p>If <code>true</code>, use a shared selector for servlet write/read.</p> + <p>If not specified, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. EXIT_ON_INIT_FAILURE</code></td><td> + <p>If <code>true</code>, the server will exit if an exception happens + during the server initialization phase. To support this feature, this + system property is used as the default for the + <strong>throwOnFailure</strong> attribute of a Connector.</p> + <p>If not specified, the default value of <code>false</code> will be + used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. RealmRuleSet.MAX_NESTED_REALM_LEVELS</code></td><td> + <p>The CombinedRealm allows nested Realms. This property controls the + maximum permitted number of levels of nesting.</p> + <p>If not specified, the default value of <code>3</code> will be used.</p> + </td></tr><tr><td><code class="propertyName">org.apache.catalina.startup. CredentialHandlerRuleSet.MAX_NESTED_LEVELS</code></td><td> + <p>The NestedCredentialHandler allows nested CredentialHandlers. This + property controls the maximum permitted number of levels of nesting.</p> + <p>If not specified, the default value of <code>3</code> will be used.</p> + </td></tr></table> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/config/valve.html b/src/tomcat/webapps/docs/config/valve.html new file mode 100644 index 0000000000000000000000000000000000000000..5fa91c9eac21f315b3ce8d4a80609bebb573d3e0 --- /dev/null +++ b/src/tomcat/webapps/docs/config/valve.html @@ -0,0 +1,1714 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 Configuration Reference (9.0.6) - The Valve Component</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/config/valve"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9 Configuration Reference</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Config Ref. Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Top Level Elements</h2><ul><li><a href="server.html">Server</a></li><li><a href="service.html">Service</a></li></ul></div><div><h2>Executors</h2><ul><li><a href="executor.html">Executor</a></li></ul></div><div><h2>Connectors</h2><ul><li><a href="http.html">HTTP/1.1</a></li><li><a href="http2.html">HTTP/2</a></li><li><a href="ajp.html">AJP</a></li></ul></div><div><h2>Containers</h2><ul><li><a href="context.html">Context</a></li><li><a href="engine.html">Engine</a></li><li><a href="host.html">Host</a></li><li><a href="cluster.html">Cluster</a></li></ul></div><div><h2>Nested Components</h2><ul><li><a href="cookie-processor.html">CookieProcessor</a></li><li><a href="credentialhandler.html">CredentialHandler</a></li><li><a href="globalresources.html">Global Resources</a></li><li><a href="jar-scanner.html">JarScanner</a></li><li><a href="jar-scan-filter.html">JarScanFilter</a></li><li><a href="listeners.html">Listeners</a></li><li><a href="loader.html">Loader</a></li><li><a href="manager.html">Manager</a></li><li><a href="realm.html">Realm</a></li><li><a href="resources.html">Resources</a></li><li><a href="sessionidgenerator.html">SessionIdGenerator</a></li><li><a href="valve.html">Valve</a></li></ul></div><div><h2>Cluster Elements</h2><ul><li><a href="cluster.html">Cluster</a></li><li><a href="cluster-manager.html">Manager</a></li><li><a href="cluster-channel.html">Channel</a></li><li><a href="cluster-membership.html">Channel/Membership</a></li><li><a href="cluster-sender.html">Channel/Sender</a></li><li><a href="cluster-receiver.html">Channel/Receiver</a></li><li><a href="cluster-interceptor.html">Channel/Interceptor</a></li><li><a href="cluster-valve.html">Valve</a></li><li><a href="cluster-deployer.html">Deployer</a></li><li><a href="cluster-listener.html">ClusterListener</a></li></ul></div><div><h2>web.xml</h2><ul><li><a href="filter.html">Filter</a></li></ul></div><div><h2>Other</h2><ul><li><a href="systemprops.html">System properties</a></li><li><a href="jaspic.html">JASPIC</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Valve Component</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Access_Logging">Access Logging</a><ol><li><a href="#Access_Log_Valve">Access Log Valve</a><ol><li><a href="#Access_Log_Valve/Introduction">Introduction</a></li><li><a href="#Access_Log_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Extended_Access_Log_Valve">Extended Access Log Valve</a><ol><li><a href="#Extended_Access_Log_Valve/Introduction">Introduction</a></li><li><a href="#Extended_Access_Log_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Access_Control">Access Control</a><ol><li><a href="#Remote_Address_Valve">Remote Address Valve</a><ol><li><a href="#Remote_Address_Valve/Introduction">Introduction</a></li><li><a href="#Remote_Address_Valve/Attributes">Attributes</a></li><li><a href="#Remote_Address_Valve/Example_localhost">Example 1</a></li><li><a href="#Remote_Address_Valve/Example_localhost_port">Example 2</a></li><li><a href="#Remote_Address_Valve/Example_port_auth">Example 3</a></li></ol></li><li><a href="#Remote_Host_Valve">Remote Host Valve</a><ol><li><a href="#Remote_Host_Valve/Introduction">Introduction</a></li><li><a href="#Remote_Host_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Proxies_Support">Proxies Support</a><ol><li><a href="#Load_Balancer_Draining_Valve">Load Balancer Draining Valve</a><ol><li><a href="#Load_Balancer_Draining_Valve/Introduction">Introduction</a></li><li><a href="#Load_Balancer_Draining_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Remote_IP_Valve">Remote IP Valve</a><ol><li><a href="#Remote_IP_Valve/Introduction">Introduction</a></li><li><a href="#Remote_IP_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SSL_Valve">SSL Valve</a><ol><li><a href="#SSL_Valve/Introduction">Introduction</a></li><li><a href="#SSL_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Single_Sign_On_Valve">Single Sign On Valve</a><ol><li><a href="#Single_Sign_On_Valve/Introduction">Introduction</a></li><li><a href="#Single_Sign_On_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Authentication">Authentication</a><ol><li><a href="#Basic_Authenticator_Valve">Basic Authenticator Valve</a><ol><li><a href="#Basic_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Basic_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Digest_Authenticator_Valve">Digest Authenticator Valve</a><ol><li><a href="#Digest_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Digest_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Form_Authenticator_Valve">Form Authenticator Valve</a><ol><li><a href="#Form_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#Form_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SSL_Authenticator_Valve">SSL Authenticator Valve</a><ol><li><a href="#SSL_Authenticator_Valve/Introduction">Introduction</a></li><li><a href="#SSL_Authenticator_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#SPNEGO_Valve">SPNEGO Valve</a><ol><li><a href="#SPNEGO_Valve/Introduction">Introduction</a></li><li><a href="#SPNEGO_Valve/Attributes">Attributes</a></li></ol></li></ol></li><li><a href="#Error_Report_Valve">Error Report Valve</a><ol><li><a href="#Error_Report_Valve/Introduction">Introduction</a></li><li><a href="#Error_Report_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Crawler_Session_Manager_Valve">Crawler Session Manager Valve</a><ol><li><a href="#Crawler_Session_Manager_Valve/Introduction">Introduction</a></li><li><a href="#Crawler_Session_Manager_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Stuck_Thread_Detection_Valve">Stuck Thread Detection Valve</a><ol><li><a href="#Stuck_Thread_Detection_Valve/Introduction">Introduction</a></li><li><a href="#Stuck_Thread_Detection_Valve/Attributes">Attributes</a></li></ol></li><li><a href="#Semaphore_Valve">Semaphore Valve</a><ol><li><a href="#Semaphore_Valve/Introduction">Introduction</a></li><li><a href="#Semaphore_Valve/Attributes">Attributes</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>A <strong>Valve</strong> element represents a component that will be + inserted into the request processing pipeline for the associated + Catalina container (<a href="engine.html">Engine</a>, + <a href="host.html">Host</a>, or <a href="context.html">Context</a>). + Individual Valves have distinct processing capabilities, and are + described individually below.</p> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +</div><h3 id="Access_Logging">Access Logging</h3><div class="text"> + +<p>Access logging is performed by valves that implement +<strong>org.apache.catalina.AccessLog</strong> interface.</p> + +<div class="subsection"><h4 id="Access_Log_Valve">Access Log Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Access_Log_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Access Log Valve</strong> creates log files in the + same format as those created by standard web servers. These logs + can later be analyzed by standard log analysis tools to track page + hit counts, user session activity, and so on. This <code>Valve</code> + uses self-contained logic to write its log files, which can be + automatically rolled over at midnight each day. (The essential + requirement for access logging is to handle a large continuous + stream of data with low overhead. This <code>Valve</code> does not + use Apache Commons Logging, thus avoiding additional overhead and + potentially complex configuration).</p> + + <p>This <code>Valve</code> may be associated with any Catalina container + (<code>Context</code>, <code>Host</code>, or <code>Engine</code>), and + will record ALL requests processed by that container.</p> + + <p>Some requests may be handled by Tomcat before they are passed to a + container. These include redirects from /foo to /foo/ and the rejection of + invalid requests. Where Tomcat can identify the <code>Context</code> that + would have handled the request, the request/response will be logged in the + <code>AccessLog</code>(s) associated <code>Context</code>, <code>Host</code> + and <code>Engine</code>. Where Tomcat cannot identify the + <code>Context</code> that would have handled the request, e.g. in cases + where the URL is invalid, Tomcat will look first in the <code>Engine</code>, + then the default <code>Host</code> for the <code>Engine</code> and finally + the ROOT (or default) <code>Context</code> for the default <code>Host</code> + for an <code>AccessLog</code> implementation. Tomcat will use the first + <code>AccessLog</code> implementation found to log those requests that are + rejected before they are passed to a container.</p> + + <p>The output file will be placed in the directory given by the + <code>directory</code> attribute. The name of the file is composed + by concatenation of the configured <code>prefix</code>, timestamp and + <code>suffix</code>. The format of the timestamp in the file name can be + set using the <code>fileDateFormat</code> attribute. This timestamp will + be omitted if the file rotation is switched off by setting + <code>rotatable</code> to <code>false</code>.</p> + + <p><strong>Warning:</strong> If multiple AccessLogValve instances + are used, they should be configured to use different output files.</p> + + <p>If sendfile is used, the response bytes will be written asynchronously + in a separate thread and the access log valve will not know how many bytes + were actually written. In this case, the number of bytes that was passed to + the sendfile thread for writing will be recorded in the access log valve. + </p> + </div></div> + + <div class="subsection"><h4 id="Access_Log_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Access Log Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.AccessLogValve</strong> to use the + default access log valve.</p> + </td></tr><tr><td><code class="attributeName">directory</code></td><td> + <p>Absolute or relative pathname of a directory in which log files + created by this valve will be placed. If a relative path is + specified, it is interpreted as relative to $CATALINA_BASE. If + no directory attribute is specified, the default value is "logs" + (relative to $CATALINA_BASE).</p> + </td></tr><tr><td><code class="attributeName">prefix</code></td><td> + <p>The prefix added to the start of each log file's name. If not + specified, the default value is "access_log".</p> + </td></tr><tr><td><code class="attributeName">suffix</code></td><td> + <p>The suffix added to the end of each log file's name. If not + specified, the default value is "" (a zero-length string), + meaning that no suffix will be added.</p> + </td></tr><tr><td><code class="attributeName">fileDateFormat</code></td><td> + <p>Allows a customized timestamp in the access log file name. + The file is rotated whenever the formatted timestamp changes. + The default value is <code>.yyyy-MM-dd</code>. + If you wish to rotate every hour, then set this value + to <code>.yyyy-MM-dd.HH</code>. + The date format will always be localized + using the locale <code>en_US</code>. + </p> + </td></tr><tr><td><code class="attributeName">rotatable</code></td><td> + <p>Flag to determine if log rotation should occur. + If set to <code>false</code>, then this file is never rotated and + <code>fileDateFormat</code> is ignored. + Default value: <code>true</code> + </p> + </td></tr><tr><td><code class="attributeName">renameOnRotate</code></td><td> + <p>By default for a rotatable log the active access log file name + will contain the current timestamp in <code>fileDateFormat</code>. + During rotation the file is closed and a new file with the next + timestamp in the name is created and used. When setting + <code>renameOnRotate</code> to <code>true</code>, the timestamp + is no longer part of the active log file name. Only during rotation + the file is closed and then renamed to include the timestamp. + This is similar to the behavior of most log frameworks when + doing time based rotation. + Default value: <code>false</code> + </p> + </td></tr><tr><td><code class="attributeName">pattern</code></td><td> + <p>A formatting layout identifying the various information fields + from the request and response to be logged, or the word + <code>common</code> or <code>combined</code> to select a + standard format. See below for more information on configuring + this attribute.</p> + </td></tr><tr><td><code class="attributeName">encoding</code></td><td> + <p>Character set used to write the log file. An empty string means + to use the system default character set. Default value: use the + system default character set. + </p> + </td></tr><tr><td><code class="attributeName">locale</code></td><td> + <p>The locale used to format timestamps in the access log + lines. Any timestamps configured using an + explicit SimpleDateFormat pattern (<code>%{xxx}t</code>) + are formatted in this locale. By default the + default locale of the Java process is used. Switching the + locale after the AccessLogValve is initialized is not supported. + Any timestamps using the common log format + (<code>CLF</code>) are always formatted in the locale + <code>en_US</code>. + </p> + </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td> + <p>Set to <code>true</code> to check for the existence of request + attributes (typically set by the RemoteIpValve and similar) that should + be used to override the values returned by the request for remote + address, remote host, server port and protocol. If the attributes are + not set, or this attribute is set to <code>false</code> then the values + from the request will be used. If not set, the default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">conditionIf</code></td><td> + <p>Turns on conditional logging. If set, requests will be + logged only if <code>ServletRequest.getAttribute()</code> is + not null. For example, if this value is set to + <code>important</code>, then a particular request will only be logged + if <code>ServletRequest.getAttribute("important") != null</code>. + The use of Filters is an easy way to set/unset the attribute + in the ServletRequest on many different requests. + </p> + </td></tr><tr><td><code class="attributeName">conditionUnless</code></td><td> + <p>Turns on conditional logging. If set, requests will be + logged only if <code>ServletRequest.getAttribute()</code> is + null. For example, if this value is set to + <code>junk</code>, then a particular request will only be logged + if <code>ServletRequest.getAttribute("junk") == null</code>. + The use of Filters is an easy way to set/unset the attribute + in the ServletRequest on many different requests. + </p> + </td></tr><tr><td><code class="attributeName">condition</code></td><td> + <p>The same as <code>conditionUnless</code>. This attribute is + provided for backwards compatibility. + </p> + </td></tr><tr><td><code class="attributeName">buffered</code></td><td> + <p>Flag to determine if logging will be buffered. + If set to <code>false</code>, then access logging will be written after each + request. Default value: <code>true</code> + </p> + </td></tr><tr><td><code class="attributeName">maxLogMessageBufferSize</code></td><td> + <p>Log message buffers are usually recycled and re-used. To prevent + excessive memory usage, if a buffer grows beyond this size it will be + discarded. The default is <code>256</code> characters. This should be + set to larger than the typical access log message size.</p> + </td></tr><tr><td><code class="attributeName">resolveHosts</code></td><td> + <p>This attribute is no longer supported. Use the connector + attribute <code>enableLookups</code> instead.</p> + <p>If you have <code>enableLookups</code> on the connector set to + <code>true</code> and want to ignore it, use <b>%a</b> instead of + <b>%h</b> in the value of <code>pattern</code>.</p> + </td></tr></table> + + <p>Values for the <code>pattern</code> attribute are made up of literal + text strings, combined with pattern identifiers prefixed by the "%" + character to cause replacement by the corresponding variable value from + the current request and response. The following pattern codes are + supported:</p> + <ul> + <li><b>%a</b> - Remote IP address</li> + <li><b>%A</b> - Local IP address</li> + <li><b>%b</b> - Bytes sent, excluding HTTP headers, or '-' if zero</li> + <li><b>%B</b> - Bytes sent, excluding HTTP headers</li> + <li><b>%h</b> - Remote host name (or IP address if + <code>enableLookups</code> for the connector is false)</li> + <li><b>%H</b> - Request protocol</li> + <li><b>%l</b> - Remote logical username from identd (always returns + '-')</li> + <li><b>%m</b> - Request method (GET, POST, etc.)</li> + <li><b>%p</b> - Local port on which this request was received. + See also <code>%{xxx}p</code> below.</li> + <li><b>%q</b> - Query string (prepended with a '?' if it exists)</li> + <li><b>%r</b> - First line of the request (method and request URI)</li> + <li><b>%s</b> - HTTP status code of the response</li> + <li><b>%S</b> - User session ID</li> + <li><b>%t</b> - Date and time, in Common Log Format</li> + <li><b>%u</b> - Remote user that was authenticated (if any), else '-'</li> + <li><b>%U</b> - Requested URL path</li> + <li><b>%v</b> - Local server name</li> + <li><b>%D</b> - Time taken to process the request, in millis</li> + <li><b>%T</b> - Time taken to process the request, in seconds</li> + <li><b>%F</b> - Time taken to commit the response, in millis</li> + <li><b>%I</b> - Current request thread name (can compare later with stacktraces)</li> + <li><b>%X</b> - Connection status when response is completed: + <ul> + <li><code>X</code> = Connection aborted before the response completed.</li> + <li><code>+</code> = Connection may be kept alive after the response is sent.</li> + <li><code>-</code> = Connection will be closed after the response is sent.</li> + </ul> + </li> + </ul> + + <p> + There is also support to write information incoming or outgoing + headers, cookies, session or request attributes and special + timestamp formats. + It is modeled after the + <a href="http://httpd.apache.org/">Apache HTTP Server</a> log configuration + syntax. Each of them can be used multiple times with different <code>xxx</code> keys: + </p> + <ul> + <li><b><code>%{xxx}i</code></b> write value of incoming header with name <code>xxx</code></li> + <li><b><code>%{xxx}o</code></b> write value of outgoing header with name <code>xxx</code></li> + <li><b><code>%{xxx}c</code></b> write value of cookie with name <code>xxx</code></li> + <li><b><code>%{xxx}r</code></b> write value of ServletRequest attribute with name <code>xxx</code></li> + <li><b><code>%{xxx}s</code></b> write value of HttpSession attribute with name <code>xxx</code></li> + <li><b><code>%{xxx}p</code></b> write local (server) port (<code>xxx==local</code>) or + remote (client) port (<code>xxx=remote</code>)</li> + <li><b><code>%{xxx}t</code></b> write timestamp at the end of the request formatted using the + enhanced SimpleDateFormat pattern <code>xxx</code></li> + </ul> + + <p>All formats supported by SimpleDateFormat are allowed in <code>%{xxx}t</code>. + In addition the following extensions have been added:</p> + <ul> + <li><b><code>sec</code></b> - number of seconds since the epoch</li> + <li><b><code>msec</code></b> - number of milliseconds since the epoch</li> + <li><b><code>msec_frac</code></b> - millisecond fraction</li> + </ul> + <p>These formats cannot be mixed with SimpleDateFormat formats in the same format + token.</p> + + <p>Furthermore one can define whether to log the timestamp for the request start + time or the response finish time:</p> + <ul> + <li><b><code>begin</code></b> or prefix <b><code>begin:</code></b> chooses + the request start time</li> + <li><b><code>end</code></b> or prefix <b><code>end:</code></b> chooses + the response finish time</li> + </ul> + <p>By adding multiple <code>%{xxx}t</code> tokens to the pattern, one can + also log both timestamps.</p> + + <p>The shorthand pattern <code>pattern="common"</code> + corresponds to the Common Log Format defined by + <strong>'%h %l %u %t "%r" %s %b'</strong>.</p> + + <p>The shorthand pattern <code>pattern="combined"</code> + appends the values of the <code>Referer</code> and <code>User-Agent</code> + headers, each in double quotes, to the <code>common</code> pattern.</p> + + <p>When Tomcat is operating behind a reverse proxy, the client information + logged by the Access Log Valve may represent the reverse proxy, the browser + or some combination of the two depending on the configuration of Tomcat and + the reverse proxy. For Tomcat configuration options see + <a href="#Proxies_Support">Proxies Support</a> and the + <a href="../proxy-howto.html">Proxy How-To</a>. For reverse proxies that + use mod_jk, see the <a href="http://tomcat.apache.org/connectors-doc/generic_howto/proxy.html">generic + proxy</a> documentation. For other reverse proxies, consult their + documentation.</p> + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="Extended_Access_Log_Valve">Extended Access Log Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Extended_Access_Log_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Extended Access Log Valve</strong> extends the + <a href="#Access_Log_Valve">Access Log Valve</a> class, and so + uses the same self-contained logging logic. This means it + implements many of the same file handling attributes. The main + difference to the standard <code>AccessLogValve</code> is that + <code>ExtendedAccessLogValve</code> creates log files which + conform to the Working Draft for the + <a href="http://www.w3.org/TR/WD-logfile.html">Extended Log File Format</a> + defined by the W3C.</p> + + </div></div> + + <div class="subsection"><h4 id="Extended_Access_Log_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Extended Access Log Valve</strong> supports all + configuration attributes of the standard + <a href="#Access_Log_Valve">Access Log Valve.</a> Only the + values used for <code>className</code> and <code>pattern</code> differ.</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.ExtendedAccessLogValve</strong> to + use the extended access log valve.</p> + </td></tr><tr><td><code class="attributeName">pattern</code></td><td> + <p>A formatting layout identifying the various information fields + from the request and response to be logged. + See below for more information on configuring this attribute.</p> + </td></tr></table> + + <p>Values for the <code>pattern</code> attribute are made up of + format tokens. Some of the tokens need an additional prefix. Possible + prefixes are <code>c</code> for "client", <code>s</code> for "server", + <code>cs</code> for "client to server", <code>sc</code> for + "server to client" or <code>x</code> for "application specific". + Furthermore some tokens are completed by an additional selector. + See the <a href="http://www.w3.org/TR/WD-logfile.html">W3C specification</a> + for more information about the format.</p> + + <p>The following format tokens are supported:</p> + <ul> + <li><b>bytes</b> - Bytes sent, excluding HTTP headers, or '-' if zero</li> + <li><b>c-dns</b> - Remote host name (or IP address if + <code>enableLookups</code> for the connector is false)</li> + <li><b>c-ip</b> - Remote IP address</li> + <li><b>cs-method</b> - Request method (GET, POST, etc.)</li> + <li><b>cs-uri</b> - Request URI</li> + <li><b>cs-uri-query</b> - Query string (prepended with a '?' if it exists)</li> + <li><b>cs-uri-stem</b> - Requested URL path</li> + <li><b>date</b> - The date in yyyy-mm-dd format for GMT</li> + <li><b>s-dns</b> - Local host name</li> + <li><b>s-ip</b> - Local IP address</li> + <li><b>sc-status</b> - HTTP status code of the response</li> + <li><b>time</b> - Time the request was served in HH:mm:ss format for GMT</li> + <li><b>time-taken</b> - Time (in seconds as floating point) taken to serve the request</li> + <li><b>x-threadname</b> - Current request thread name (can compare later with stacktraces)</li> + </ul> + + <p>For any of the <code>x-H(XXX)</code> the following method will be called from the + HttpServletRequest object:</p> + <ul> + <li><b><code>x-H(authType)</code></b>: getAuthType </li> + <li><b><code>x-H(characterEncoding)</code></b>: getCharacterEncoding </li> + <li><b><code>x-H(contentLength)</code></b>: getContentLength </li> + <li><b><code>x-H(locale)</code></b>: getLocale</li> + <li><b><code>x-H(protocol)</code></b>: getProtocol </li> + <li><b><code>x-H(remoteUser)</code></b>: getRemoteUser</li> + <li><b><code>x-H(requestedSessionId)</code></b>: getRequestedSessionId</li> + <li><b><code>x-H(requestedSessionIdFromCookie)</code></b>: + isRequestedSessionIdFromCookie </li> + <li><b><code>x-H(requestedSessionIdValid)</code></b>: + isRequestedSessionIdValid</li> + <li><b><code>x-H(scheme)</code></b>: getScheme</li> + <li><b><code>x-H(secure)</code></b>: isSecure</li> + </ul> + + <p> + There is also support to write information about headers + cookies, context, request or session attributes and request + parameters. + </p> + <ul> + <li><b><code>cs(XXX)</code></b> for incoming request headers with name XXX</li> + <li><b><code>sc(XXX)</code></b> for outgoing response headers with name XXX</li> + <li><b><code>x-A(XXX)</code></b> for the servlet context attribute with name XXX</li> + <li><b><code>x-C(XXX)</code></b> for the first cookie with name XXX</li> + <li><b><code>x-O(XXX)</code></b> for a concatenation of all outgoing response headers with name XXX</li> + <li><b><code>x-P(XXX)</code></b> for the URL encoded (using UTF-8) request parameter with name XXX</li> + <li><b><code>x-R(XXX)</code></b> for the request attribute with name XXX</li> + <li><b><code>x-S(XXX)</code></b> for the session attribute with name XXX</li> + </ul> + + </div></div> + +</div></div> + +</div><h3 id="Access_Control">Access Control</h3><div class="text"> + + +<div class="subsection"><h4 id="Remote_Address_Valve">Remote Address Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Remote_Address_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Remote Address Valve</strong> allows you to compare the + IP address of the client that submitted this request against one or more + <em>regular expressions</em>, and either allow the request to continue + or refuse to process the request from this client. A Remote Address + Valve can be associated with any Catalina container + (<a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or + <a href="context.html">Context</a>), and must accept any request + presented to this container for processing before it will be passed on.</p> + + <p>The syntax for <em>regular expressions</em> is different than that for + 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code> + package. Please consult the Java documentation for details of the + expressions supported.</p> + + <p>Optionally one can append the server connector port separated with a + semicolon (";") to allow different expressions for each connector.</p> + + <p>The behavior when a request is refused can be changed + to not deny but instead set an invalid <code>authentication</code> + header. This is useful in combination with the context attribute + <code>preemptiveAuthentication="true"</code>.</p> + + <p><strong>Note:</strong> There is a caveat when using this valve with + IPv6 addresses. Format of the IP address that this valve is processing + depends on the API that was used to obtain it. If the address was obtained + from Java socket using Inet6Address class, its format will be + <code>x:x:x:x:x:x:x:x</code>. That is, the IP address for localhost + will be <code>0:0:0:0:0:0:0:1</code> instead of the more widely used + <code>::1</code>. Consult your access logs for the actual value.</p> + + <p>See also: <a href="#Remote_Host_Valve">Remote Host Valve</a>, + <a href="#Remote_IP_Valve">Remote IP Valve</a>.</p> + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Remote Address Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.RemoteAddrValve</strong>.</p> + </td></tr><tr><td><code class="attributeName">allow</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's IP address is compared to. If this attribute + is specified, the remote address MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote address matches a <code>deny</code> + pattern.</p> + </td></tr><tr><td><code class="attributeName">deny</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's IP address is compared to. If this attribute + is specified, the remote address MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the <code>allow</code> attribute.</p> + </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>. For example, + it can be set to the value <code>404</code>.</p> + </td></tr><tr><td><code class="attributeName">addConnectorPort</code></td><td> + <p>Append the server connector port to the client IP address separated + with a semicolon (";"). If this is set to <code>true</code>, the + expressions configured with <code>allow</code> and + <code>deny</code> is compared against <code>ADDRESS;PORT</code> + where <code>ADDRESS</code> is the client IP address and + <code>PORT</code> is the Tomcat connector port which received the + request. The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">invalidAuthenticationWhenDeny</code></td><td> + <p>When a request should be denied, do not deny but instead + set an invalid <code>authentication</code> header. This only works + if the context has the attribute <code>preemptiveAuthentication="true"</code> + set. An already existing <code>authentication</code> header will not be + overwritten. In effect this will trigger authentication instead of deny + even if the application does not have a security constraint configured.</p> + <p>This can be combined with <code>addConnectorPort</code> to trigger authentication + depending on the client and the connector that is used to access an application.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Valve/Example_localhost">Example 1</h4><div class="text"> + <p>To allow access only for the clients connecting from localhost:</p> + <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/></code></pre></div> + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Valve/Example_localhost_port">Example 2</h4><div class="text"> + <p>To allow unrestricted access for the clients connecting from localhost + but for all other clients only to port 8443:</p> + <div class="codeBox"><pre><code><Valve className="org.apache.catalina.valves.RemoteAddrValve" + addConnectorPort="true" + allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/></code></pre></div> + </div></div> + + <div class="subsection"><h4 id="Remote_Address_Valve/Example_port_auth">Example 3</h4><div class="text"> + <p>To allow unrestricted access to port 8009, but trigger basic + authentication if the application is accessed on another port:</p> +<div class="codeBox"><pre><code><Context> + ... + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + addConnectorPort="true" + invalidAuthenticationWhenDeny="true" + allow=".*;8009"/> + <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> + ... +</Context></code></pre></div> + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="Remote_Host_Valve">Remote Host Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Remote_Host_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Remote Host Valve</strong> allows you to compare the + hostname of the client that submitted this request against one or more + <em>regular expressions</em>, and either allow the request to continue + or refuse to process the request from this client. A Remote Host + Valve can be associated with any Catalina container + (<a href="engine.html">Engine</a>, <a href="host.html">Host</a>, or + <a href="context.html">Context</a>), and must accept any request + presented to this container for processing before it will be passed on.</p> + + <p>The syntax for <em>regular expressions</em> is different than that for + 'standard' wildcard matching. Tomcat uses the <code>java.util.regex</code> + package. Please consult the Java documentation for details of the + expressions supported.</p> + + <p>Optionally one can append the server connector port separated with a + semicolon (";") to allow different expressions for each connector.</p> + + <p>The behavior when a request is refused can be changed + to not deny but instead set an invalid <code>authentication</code> + header. This is useful in combination with the context attribute + <code>preemptiveAuthentication="true"</code>.</p> + + <p><strong>Note:</strong> This filter processes the value returned by + method <code>ServletRequest.getRemoteHost()</code>. To allow the method + to return proper host names, you have to enable "DNS lookups" feature on + a <strong>Connector</strong>.</p> + + <p>See also: <a href="#Remote_Address_Valve">Remote Address Valve</a>, + <a href="http.html">HTTP Connector</a> configuration.</p> + </div></div> + + <div class="subsection"><h4 id="Remote_Host_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Remote Host Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.RemoteHostValve</strong>.</p> + </td></tr><tr><td><code class="attributeName">allow</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST match for this request to be + accepted. If this attribute is not specified, all requests will be + accepted UNLESS the remote hostname matches a <code>deny</code> + pattern.</p> + </td></tr><tr><td><code class="attributeName">deny</code></td><td> + <p>A regular expression (using <code>java.util.regex</code>) that the + remote client's hostname is compared to. If this attribute + is specified, the remote hostname MUST NOT match for this request to be + accepted. If this attribute is not specified, request acceptance is + governed solely by the <code>allow</code> attribute.</p> + </td></tr><tr><td><code class="attributeName">denyStatus</code></td><td> + <p>HTTP response status code that is used when rejecting denied + request. The default value is <code>403</code>. For example, + it can be set to the value <code>404</code>.</p> + </td></tr><tr><td><code class="attributeName">addConnectorPort</code></td><td> + <p>Append the server connector port to the client hostname separated + with a semicolon (";"). If this is set to <code>true</code>, the + expressions configured with <code>allow</code> and + <code>deny</code> is compared against <code>HOSTNAME;PORT</code> + where <code>HOSTNAME</code> is the client hostname and + <code>PORT</code> is the Tomcat connector port which received the + request. The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">invalidAuthenticationWhenDeny</code></td><td> + <p>When a request should be denied, do not deny but instead + set an invalid <code>authentication</code> header. This only works + if the context has the attribute <code>preemptiveAuthentication="true"</code> + set. An already existing <code>authentication</code> header will not be + overwritten. In effect this will trigger authentication instead of deny + even if the application does not have a security constraint configured.</p> + <p>This can be combined with <code>addConnectorPort</code> to trigger authentication + depending on the client and the connector that is used to access an application.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +</div><h3 id="Proxies_Support">Proxies Support</h3><div class="text"> + <div class="subsection"><h4 id="Load_Balancer_Draining_Valve">Load Balancer Draining Valve</h4><div class="text"> + <div class="subsection"><h4 id="Load_Balancer_Draining_Valve/Introduction">Introduction</h4><div class="text"> + <p> + When using mod_jk or mod_proxy_ajp, the client's session id is used to + determine which back-end server will be used to serve the request. If the + target node is being "drained" (in mod_jk, this is the <i>DISABLED</i> + state; in mod_proxy_ajp, this is the <i>Drain (N)</i> state), requests + for expired sessions can actually cause the draining node to fail to + drain. + </p> + <p> + Unfortunately, AJP-based load-balancers cannot prove whether the + client-provided session id is valid or not and therefore will send any + requests for a session that appears to be targeted to that node to the + disabled (or "draining") node, causing the "draining" process to take + longer than necessary. + </p> + <p> + This Valve detects requests for invalid sessions, strips the session + information from the request, and redirects back to the same URL, where + the load-balancer should choose a different (active) node to handle the + request. This will accelerate the "draining" process for the disabled + node(s). + </p> + + <p> + The activation state of the node is sent by the load-balancer in the + request, so no state change on the node being disabled is necessary. Simply + configure this Valve in your valve pipeline and it will take action when + the activation state is set to "disabled". + </p> + + <p> + You should take care to register this Valve earlier in the Valve pipeline + than any authentication Valves, because this Valve should be able to + redirect a request before any authentication Valve saves a request to a + protected resource. If this happens, a new session will be created and + the draining process will stall because a new, valid session will be + established. + </p> + </div></div> + + <div class="subsection"><h4 id="Load_Balancer_Draining_Valve/Attributes">Attributes</h4><div class="text"> + <p>The <strong>Load Balancer Draining Valve</strong> supports the + following configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.LoadBalancerDrainingValve</strong>. + </p> + </td></tr><tr><td><code class="attributeName">redirectStatusCode</code></td><td> + <p>Allows setting a custom redirect code to be used when the client + is redirected to be re-balanced by the load-balancer. The default is + 307 TEMPORARY_REDIRECT.</p> + </td></tr><tr><td><code class="attributeName">ignoreCookieName</code></td><td> + <p>When used with <code>ignoreCookieValue</code>, a client can present + this cookie (and accompanying value) that will cause this Valve to + do nothing. This will allow you to probe your <i>disabled</i> node + before re-enabling it to make sure that it is working as expected.</p> + </td></tr><tr><td><code class="attributeName">ignoreCookieValue</code></td><td> + <p>When used with <code>ignoreCookieName</code>, a client can present + a cookie (and accompanying value) that will cause this Valve to + do nothing. This will allow you to probe your <i>disabled</i> node + before re-enabling it to make sure that it is working as expected.</p> + </td></tr></table> + </div></div> + </div></div> + +<div class="subsection"><h4 id="Remote_IP_Valve">Remote IP Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Remote_IP_Valve/Introduction">Introduction</h4><div class="text"> + + <p>Tomcat port of + <a href="http://httpd.apache.org/docs/trunk/mod/mod_remoteip.html">mod_remoteip</a>, + this valve replaces the apparent client remote IP address and hostname for + the request with the IP address list presented by a proxy or a load balancer + via a request headers (e.g. "X-Forwarded-For").</p> + + <p>Another feature of this valve is to replace the apparent scheme + (http/https), server port and <code>request.secure</code> with the scheme presented + by a proxy or a load balancer via a request header + (e.g. "X-Forwarded-Proto").</p> + + <p>This Valve may be used at the <code>Engine</code>, <code>Host</code> or + <code>Context</code> level as required. Normally, this Valve would be used + at the <code>Engine</code> level.</p> + + <p>If used in conjunction with Remote Address/Host valves then this valve + should be defined first to ensure that the correct client IP address is + presented to the Remote Address/Host valves.</p> + + <p><strong>Note:</strong> By default this valve has no effect on the + values that are written into access log. The original values are restored + when request processing leaves the valve and that always happens earlier + than access logging. To pass the remote address, remote host, server port + and protocol values set by this valve to the access log, + they are put into request attributes. Publishing these values here + is enabled by default, but <code>AccessLogValve</code> should be explicitly + configured to use them. See documentation for + <code>requestAttributesEnabled</code> attribute of + <code>AccessLogValve</code>.</p> + + <p>The names of request attributes that are set by this valve + and can be used by access logging are the following:</p> + + <ul> + <li><code>org.apache.catalina.AccessLog.RemoteAddr</code></li> + <li><code>org.apache.catalina.AccessLog.RemoteHost</code></li> + <li><code>org.apache.catalina.AccessLog.Protocol</code></li> + <li><code>org.apache.catalina.AccessLog.ServerPort</code></li> + <li><code>org.apache.tomcat.remoteAddr</code></li> + </ul> + + </div></div> + + <div class="subsection"><h4 id="Remote_IP_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Remote IP Valve</strong> supports the + following configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.RemoteIpValve</strong>.</p> + </td></tr><tr><td><code class="attributeName">remoteIpHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the list of + traversed IP addresses starting from the requesting client. If not + specified, the default of <code>x-forwarded-for</code> is used.</p> + </td></tr><tr><td><code class="attributeName">internalProxies</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that a + proxy's IP address must match to be considered an internal proxy. + Internal proxies that appear in the <strong>remoteIpHeader</strong> will + be trusted and will not appear in the <strong>proxiesHeader</strong> + value. If not specified the default value of <code> + 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3} + </code> will be used.</p> + </td></tr><tr><td><code class="attributeName">proxiesHeader</code></td><td> + <p>Name of the HTTP header created by this valve to hold the list of + proxies that have been processed in the incoming + <strong>remoteIpHeader</strong>. If not specified, the default of + <code>x-forwarded-by</code> is used.</p> + </td></tr><tr><td><code class="attributeName">requestAttributesEnabled</code></td><td> + <p>Set to <code>true</code> to set the request attributes used by + AccessLog implementations to override the values returned by the + request for remote address, remote host, server port and protocol. + Request attributes are also used to enable the forwarded remote address + to be displayed on the status page of the Manager web application. + If not set, the default value of <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">trustedProxies</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that a + proxy's IP address must match to be considered an trusted proxy. + Trusted proxies that appear in the <strong>remoteIpHeader</strong> will + be trusted and will appear in the <strong>proxiesHeader</strong> value. + If not specified, no proxies will be trusted.</p> + </td></tr><tr><td><code class="attributeName">protocolHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the protocol + used by the client to connect to the proxy. If not specified, the + default of <code>null</code> is used.</p> + </td></tr><tr><td><code class="attributeName">portHeader</code></td><td> + <p>Name of the HTTP Header read by this valve that holds the port + used by the client to connect to the proxy. If not specified, the + default of <code>null</code> is used.</p> + </td></tr><tr><td><code class="attributeName">protocolHeaderHttpsValue</code></td><td> + <p>Value of the <strong>protocolHeader</strong> to indicate that it is + an HTTPS request. If not specified, the default of <code>https</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">httpServerPort</code></td><td> + <p>Value returned by <code>ServletRequest.getServerPort()</code> + when the <strong>protocolHeader</strong> indicates <code>http</code> + protocol and no <strong>portHeader</strong> is present. If not + specified, the default of <code>80</code> is used.</p> + </td></tr><tr><td><code class="attributeName">httpsServerPort</code></td><td> + <p>Value returned by <code>ServletRequest.getServerPort()</code> + when the <strong>protocolHeader</strong> indicates <code>https</code> + protocol and no <strong>portHeader</strong> is present. If not + specified, the default of <code>443</code> is used.</p> + </td></tr><tr><td><code class="attributeName">changeLocalPort</code></td><td> + <p>If <code>true</code>, the value returned by + <code>ServletRequest.getLocalPort()</code> and + <code>ServletRequest.getServerPort()</code> is modified by the this + valve. If not specified, the default of <code>false</code> is used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="SSL_Valve">SSL Valve</h4><div class="text"> + + <div class="subsection"><h4 id="SSL_Valve/Introduction">Introduction</h4><div class="text"> + + <p>When using mod_proxy_http, the client SSL information is not included in + the protocol (unlike mod_jk and mod_proxy_ajp). To make the client SSL + information available to Tomcat, some additional configuration is required. + In httpd, mod_headers is used to add the SSL information as HTTP headers. In + Tomcat, this valve is used to read the information from the HTTP headers and + insert it into the request.</p> + + <p>Note: Ensure that the headers are always set by httpd for all requests to + prevent a client spoofing SSL information by sending fake headers.</p> + + <p>To configure httpd to set the necessary headers, add the following:</p> +<div class="codeBox"><pre><code><IfModule ssl_module> + RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s" + RequestHeader set SSL_CIPHER "%{SSL_CIPHER}s" + RequestHeader set SSL_SESSION_ID "%{SSL_SESSION_ID}s" + RequestHeader set SSL_CIPHER_USEKEYSIZE "%{SSL_CIPHER_USEKEYSIZE}s" +</IfModule></code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="SSL_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>SSL Valve</strong> supports the following configuration + attribute:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.SSLValve</strong>. + </p> + </td></tr><tr><td><code class="attributeName">sslClientCertHeader</code></td><td> + <p>Allows setting a custom name for the ssl_client_cert header. + If not specified, the default of <code>ssl_client_cert</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">sslCipherHeader</code></td><td> + <p>Allows setting a custom name for the ssl_cipher header. + If not specified, the default of <code>ssl_cipher</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">sslSessionIdHeader</code></td><td> + <p>Allows setting a custom name for the ssl_session_id header. + If not specified, the default of <code>ssl_session_id</code> is + used.</p> + </td></tr><tr><td><code class="attributeName">sslCipherUserKeySizeHeader</code></td><td> + <p>Allows setting a custom name for the ssl_cipher_usekeysize header. + If not specified, the default of <code>ssl_cipher_usekeysize</code> is + used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +</div><h3 id="Single_Sign_On_Valve">Single Sign On Valve</h3><div class="text"> + + <div class="subsection"><h4 id="Single_Sign_On_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <em>Single Sign On Valve</em> is utilized when you wish to give users + the ability to sign on to any one of the web applications associated with + your virtual host, and then have their identity recognized by all other + web applications on the same virtual host.</p> + + <p>See the <a href="host.html#Single_Sign_On">Single Sign On</a> special + feature on the <strong>Host</strong> element for more information.</p> + + </div></div> + + + <div class="subsection"><h4 id="Single_Sign_On_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Single Sign On</strong> Valve supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.SingleSignOn</strong>.</p> + </td></tr><tr><td><code class="attributeName">requireReauthentication</code></td><td> + <p>Default false. Flag to determine whether each request needs to be + reauthenticated to the security <strong>Realm</strong>. If "true", this + Valve uses cached security credentials (username and password) to + reauthenticate to the <strong>Realm</strong> each request associated + with an SSO session. If "false", the Valve can itself authenticate + requests based on the presence of a valid SSO cookie, without + rechecking with the <strong>Realm</strong>.</p> + </td></tr><tr><td><code class="attributeName">cookieDomain</code></td><td> + <p>Sets the host domain to be used for sso cookies.</p> + </td></tr></table> + + </div></div> + + +</div><h3 id="Authentication">Authentication</h3><div class="text"> + +<p>The valves in this section implement +<strong>org.apache.catalina.Authenticator</strong> interface.</p> + +<div class="subsection"><h4 id="Basic_Authenticator_Valve">Basic Authenticator Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Basic_Authenticator_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Basic Authenticator Valve</strong> is automatically added to + any <a href="context.html">Context</a> that is configured to use BASIC + authentication.</p> + + <p>If any non-default settings are required, the valve may be configured + within <a href="context.html">Context</a> element with the required + values.</p> + + </div></div> + + <div class="subsection"><h4 id="Basic_Authenticator_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Basic Authenticator Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td> + <p>Should a session always be used once a user is authenticated? This + may offer some performance benefits since the session can then be used + to cache the authenticated Principal, hence removing the need to + authenticate the user via the Realm on every request. This may be of + help for combinations such as BASIC authentication used with the + JNDIRealm or DataSourceRealms. However there will also be the + performance cost of creating and GC'ing the session. If not set, the + default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">cache</code></td><td> + <p>Should we cache authenticated Principals if the request is part of an + HTTP session? If not specified, the default value of <code>true</code> + will be used.</p> + </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td> + <p>Controls if the session ID is changed if a session exists at the + point where users are authenticated. This is to prevent session fixation + attacks. If not set, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">charset</code></td><td> + <p>Controls if the <code>WWW-Authenticate</code> HTTP header includes a + <code>charset</code> authentication parameter as per RFC 7617. The only + permitted options are <code>null</code>, the empty string and + <code>UTF-8</code>. If <code>UTF-8</code> is specified then the + <code>charset</code> authentication parameter will be sent with that + value and the provided user name and optional password will be converted + from bytes to characters using UTF-8. Otherwise, no <code>charset</code> + authentication parameter will be sent and the provided user name and + optional password will be converted from bytes to characters using + ISO-8859-1. The default value is <code>null</code></p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.BasicAuthenticator</strong>.</p> + </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers but will also cause secured pages to be + cached by proxies which will almost certainly be a security issue. + <code>securePagesWithPragma</code> offers an alternative, secure, + workaround for browser caching issues. If not set, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers by using + <code>Cache-Control: private</code> rather than the default of + <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>. + If not set, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the platform + default provider and the default algorithm will be used. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate SSO session + IDs. If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate SSO + session IDs. If an invalid algorithm and/or provider is specified, the + platform default provider and the default algorithm will be used. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td> + <p>Name of the Java class of the + <code>javax.security.auth.callback.CallbackHandler</code> implementation + which should be used by JASPIC. If none is specified the default + <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="Digest_Authenticator_Valve">Digest Authenticator Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Digest_Authenticator_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Digest Authenticator Valve</strong> is automatically added to + any <a href="context.html">Context</a> that is configured to use DIGEST + authentication.</p> + + <p>If any non-default settings are required, the valve may be configured + within <a href="context.html">Context</a> element with the required + values.</p> + + </div></div> + + <div class="subsection"><h4 id="Digest_Authenticator_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Digest Authenticator Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td> + <p>Should a session always be used once a user is authenticated? This + may offer some performance benefits since the session can then be used + to cache the authenticated Principal, hence removing the need to + authenticate the user via the Realm on every request. This may be of + help for combinations such as BASIC authentication used with the + JNDIRealm or DataSourceRealms. However there will also be the + performance cost of creating and GC'ing the session. If not set, the + default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">cache</code></td><td> + <p>Should we cache authenticated Principals if the request is part of an + HTTP session? If not specified, the default value of <code>false</code> + will be used.</p> + </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td> + <p>Controls if the session ID is changed if a session exists at the + point where users are authenticated. This is to prevent session fixation + attacks. If not set, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.DigestAuthenticator</strong>.</p> + </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers but will also cause secured pages to be + cached by proxies which will almost certainly be a security issue. + <code>securePagesWithPragma</code> offers an alternative, secure, + workaround for browser caching issues. If not set, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">key</code></td><td> + <p>The secret key used by digest authentication. If not set, a secure + random value is generated. This should normally only be set when it is + necessary to keep key values constant either across server restarts + and/or across a cluster.</p> + </td></tr><tr><td><code class="attributeName">nonceCacheSize</code></td><td> + <p>To protect against replay attacks, the DIGEST authenticator tracks + server nonce and nonce count values. This attribute controls the size + of that cache. If not specified, the default value of 1000 is used.</p> + </td></tr><tr><td><code class="attributeName">nonceCountWindowSize</code></td><td> + <p>Client requests may be processed out of order which in turn means + that the nonce count values may be processed out of order. To prevent + authentication failures when nonce counts are presented out of order + the authenticator tracks a window of nonce count values. This attribute + controls how big that window is. If not specified, the default value of + 100 is used.</p> + </td></tr><tr><td><code class="attributeName">nonceValidity</code></td><td> + <p>The time, in milliseconds, that a server generated nonce will be + considered valid for use in authentication. If not specified, the + default value of 300000 (5 minutes) will be used.</p> + </td></tr><tr><td><code class="attributeName">opaque</code></td><td> + <p>The opaque server string used by digest authentication. If not set, a + random value is generated. This should normally only be set when it is + necessary to keep opaque values constant either across server restarts + and/or across a cluster.</p> + </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers by using + <code>Cache-Control: private</code> rather than the default of + <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>. + If not set, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the platform + default provider and the default algorithm will be used. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate SSO session + IDs. If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate SSO + session IDs. If an invalid algorithm and/or provider is specified, the + platform default provider and the default algorithm will be used. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">validateUri</code></td><td> + <p>Should the URI be validated as required by RFC2617? If not specified, + the default value of <code>true</code> will be used. This should + normally only be set when Tomcat is located behind a reverse proxy and + the proxy is modifying the URI passed to Tomcat such that DIGEST + authentication always fails.</p> + </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td> + <p>Name of the Java class of the + <code>javax.security.auth.callback.CallbackHandler</code> implementation + which should be used by JASPIC. If none is specified the default + <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="Form_Authenticator_Valve">Form Authenticator Valve</h4><div class="text"> + + <div class="subsection"><h4 id="Form_Authenticator_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Form Authenticator Valve</strong> is automatically added to + any <a href="context.html">Context</a> that is configured to use FORM + authentication.</p> + + <p>If any non-default settings are required, the valve may be configured + within <a href="context.html">Context</a> element with the required + values.</p> + + </div></div> + + <div class="subsection"><h4 id="Form_Authenticator_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Form Authenticator Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td> + <p>Controls if the session ID is changed if a session exists at the + point where users are authenticated. This is to prevent session fixation + attacks. If not set, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">characterEncoding</code></td><td> + <p>Character encoding to use to read the username and password parameters + from the request. If not set, the encoding of the request body will be + used.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.FormAuthenticator</strong>.</p> + </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers but will also cause secured pages to be + cached by proxies which will almost certainly be a security issue. + <code>securePagesWithPragma</code> offers an alternative, secure, + workaround for browser caching issues. If not set, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">landingPage</code></td><td> + <p>Controls the behavior of the FORM authentication process if the + process is misused, for example by directly requesting the login page + or delaying logging in for so long that the session expires. If this + attribute is set, rather than returning an error response code, Tomcat + will redirect the user to the specified landing page if the login form + is submitted with valid credentials. For the login to be processed, the + landing page must be a protected resource (i.e. one that requires + authentication). If the landing page does not require authentication + then the user will not be logged in and will be prompted for their + credentials again when they access a protected page.</p> + </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers by using + <code>Cache-Control: private</code> rather than the default of + <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>. + If not set, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the platform + default provider and the default algorithm will be used. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate SSO session + IDs. If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate SSO + session IDs. If an invalid algorithm and/or provider is specified, the + platform default provider and the default algorithm will be used. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td> + <p>Name of the Java class of the + <code>javax.security.auth.callback.CallbackHandler</code> implementation + which should be used by JASPIC. If none is specified the default + <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="SSL_Authenticator_Valve">SSL Authenticator Valve</h4><div class="text"> + + <div class="subsection"><h4 id="SSL_Authenticator_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>SSL Authenticator Valve</strong> is automatically added to + any <a href="context.html">Context</a> that is configured to use SSL + authentication.</p> + + <p>If any non-default settings are required, the valve may be configured + within <a href="context.html">Context</a> element with the required + values.</p> + + </div></div> + + <div class="subsection"><h4 id="SSL_Authenticator_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>SSL Authenticator Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">cache</code></td><td> + <p>Should we cache authenticated Principals if the request is part of an + HTTP session? If not specified, the default value of <code>true</code> + will be used.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.SSLAuthenticator</strong>.</p> + </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td> + <p>Controls if the session ID is changed if a session exists at the + point where users are authenticated. This is to prevent session fixation + attacks. If not set, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers but will also cause secured pages to be + cached by proxies which will almost certainly be a security issue. + <code>securePagesWithPragma</code> offers an alternative, secure, + workaround for browser caching issues. If not set, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers by using + <code>Cache-Control: private</code> rather than the default of + <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>. + If not set, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the platform + default provider and the default algorithm will be used. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate SSO session + IDs. If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate SSO + session IDs. If an invalid algorithm and/or provider is specified, the + platform default provider and the default algorithm will be used. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td> + <p>Name of the Java class of the + <code>javax.security.auth.callback.CallbackHandler</code> implementation + which should be used by JASPIC. If none is specified the default + <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +<div class="subsection"><h4 id="SPNEGO_Valve">SPNEGO Valve</h4><div class="text"> + + <div class="subsection"><h4 id="SPNEGO_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>SPNEGO Authenticator Valve</strong> is automatically added to + any <a href="context.html">Context</a> that is configured to use SPNEGO + authentication.</p> + + <p>If any non-default settings are required, the valve may be configured + within <a href="context.html">Context</a> element with the required + values.</p> + + </div></div> + + <div class="subsection"><h4 id="SPNEGO_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>SPNEGO Authenticator Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">applyJava8u40Fix</code></td><td> + <p>A fix introduced in Java 8 update 40 ( + <a href="https://bugs.openjdk.java.net/browse/JDK-8048194">JDK-8048194</a>) + onwards broke SPNEGO authentication for IE with Tomcat running on + Windows 2008 R2 servers. This option enables a work-around that allows + SPNEGO authentication to continue working. The work-around should not + impact other configurations so it is enabled by default. If necessary, + the workaround can be disabled by setting this attribute to + <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">alwaysUseSession</code></td><td> + <p>Should a session always be used once a user is authenticated? This + may offer some performance benefits since the session can then be used + to cache the authenticated Principal, hence removing the need to + authenticate the user on every request. This will also help with clients + that assume that the server will cache the authenticated user. However + there will also be the performance cost of creating and GC'ing the + session. For an alternative solution see + <code>noKeepAliveUserAgents</code>. If not set, the default value of + <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">cache</code></td><td> + <p>Should we cache authenticated Principals if the request is part of an + HTTP session? If not specified, the default value of <code>true</code> + will be used.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.authenticator.SpnegoAuthenticator</strong>. + </p> + </td></tr><tr><td><code class="attributeName">changeSessionIdOnAuthentication</code></td><td> + <p>Controls if the session ID is changed if a session exists at the + point where users are authenticated. This is to prevent session fixation + attacks. If not set, the default value of <code>true</code> will be + used.</p> + </td></tr><tr><td><code class="attributeName">disableProxyCaching</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers but will also cause secured pages to be + cached by proxies which will almost certainly be a security issue. + <code>securePagesWithPragma</code> offers an alternative, secure, + workaround for browser caching issues. If not set, the default value of + <code>true</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">loginConfigName</code></td><td> + <p>The name of the JAAS login configuration to be used to login as the + service. If not specified, the default of + <code>com.sun.security.jgss.krb5.accept</code> is used.</p> + </td></tr><tr><td><code class="attributeName">noKeepAliveUserAgents</code></td><td> + <p>Some clients (not most browsers) expect the server to cache the + authenticated user information for a connection and do not resend the + credentials with every request. Tomcat will not do this unless an HTTP + session is available. A session will be available if either the + application creates one or if <code>alwaysUseSession</code> is enabled + for this Authenticator.</p> + <p>As an alternative to creating a session, this attribute may be used + to define the user agents for which HTTP keep-alive is disabled. This + means that a connection will only used for a single request and hence + there is no ability to cache authenticated user information per + connection. There will be a performance cost in disabling HTTP + keep-alive.</p> + <p>The attribute should be a regular expression that matches the entire + user-agent string, e.g. <code>.*Chrome.*</code>. If not specified, no + regular expression will be defined and no user agents will have HTTP + keep-alive disabled.</p> + </td></tr><tr><td><code class="attributeName">securePagesWithPragma</code></td><td> + <p>Controls the caching of pages that are protected by security + constraints. Setting this to <code>false</code> may help work around + caching issues in some browsers by using + <code>Cache-Control: private</code> rather than the default of + <code>Pragma: No-cache</code> and <code>Cache-control: No-cache</code>. + If not set, the default value of <code>false</code> will be used.</p> + </td></tr><tr><td><code class="attributeName">secureRandomAlgorithm</code></td><td> + <p>Name of the algorithm to use to create the + <code>java.security.SecureRandom</code> instances that generate session + IDs. If an invalid algorithm and/or provider is specified, the platform + default provider and the default algorithm will be used. If not + specified, the default algorithm of SHA1PRNG will be used. If the + default algorithm is not supported, the platform default will be used. + To specify that the platform default should be used, do not set the + secureRandomProvider attribute and set this attribute to the empty + string.</p> + </td></tr><tr><td><code class="attributeName">secureRandomClass</code></td><td> + <p>Name of the Java class that extends + <code>java.security.SecureRandom</code> to use to generate SSO session + IDs. If not specified, the default value is + <code>java.security.SecureRandom</code>.</p> + </td></tr><tr><td><code class="attributeName">secureRandomProvider</code></td><td> + <p>Name of the provider to use to create the + <code>java.security.SecureRandom</code> instances that generate SSO + session IDs. If an invalid algorithm and/or provider is specified, the + platform default provider and the default algorithm will be used. If not + specified, the platform default provider will be used.</p> + </td></tr><tr><td><code class="attributeName">storeDelegatedCredential</code></td><td> + <p>Controls if the user' delegated credential will be stored in + the user Principal. If available, the delegated credential will be + available to applications (e.g. for onward authentication to external + services) via the <code>org.apache.catalina.realm.GSS_CREDENTIAL</code> + request attribute. If not set, the default value of <code>true</code> + will be used.</p> + </td></tr><tr><td><code class="attributeName">jaspicCallbackHandlerClass</code></td><td> + <p>Name of the Java class of the + <code>javax.security.auth.callback.CallbackHandler</code> implementation + which should be used by JASPIC. If none is specified the default + <code>org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div></div> + + +</div><h3 id="Error_Report_Valve">Error Report Valve</h3><div class="text"> + + <div class="subsection"><h4 id="Error_Report_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Error Report Valve</strong> is a simple error handler + for HTTP status codes that will generate and return HTML error pages. It can + also be configured to return pre-defined static HTML pages for specific + status codes and/or exception types.</p> + + <p><strong>NOTE:</strong> Disabling both showServerInfo and showReport will + only return the HTTP status code and remove all CSS from the default + response.</p> + + </div></div> + + <div class="subsection"><h4 id="Error_Report_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Error Report Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.ErrorReportValve</strong> to use the + default error report valve.</p> + </td></tr><tr><td><code class="attributeName">errorCode.nnn</code></td><td> + <p>The location of the UTF-8 encoded HTML file to return for the HTTP + error code represented by <code>nnn</code>. For example, + <code>errorCode.404</code> specifies the file to return for an HTTP 404 + error. The location may be relative or absolule. If relative, it must be + relative to <code>$CATALINA_BASE</code>. The special value of + <code>errorCode.0</code> may be used to define a default error page to + be used if no error page is defined for a status code. If no matching + error page is found, the default <strong>Error Report Valve</strong> + response will be returned.</p> + </td></tr><tr><td><code class="attributeName">exceptionType.fullyQualifiedClassName</code></td><td> + <p>The location of the UTF-8 encoded HTML file to return if an error has + occurred and the <code>javax.servlet.error.exception</code> request + attribute has been set to an instance of + <code>fullyQualifiedClassName</code> or a sub-class of it. For example, + <code>errorCode.java.io.IOException</code> specifies the file to return + for an <code>IOException</code>. The location may be relative or + absolule. If relative, it must be relative to + <code>$CATALINA_BASE</code>. If no matching error page is found, the + default <strong>Error Report Valve</strong> response will be + returned.</p> + </td></tr><tr><td><code class="attributeName">showReport</code></td><td> + <p>Flag to determine if the error report is presented when an error + occurs. If set to <code>false</code>, then the error report is not in + the HTML response. + Default value: <code>true</code> + </p> + </td></tr><tr><td><code class="attributeName">showServerInfo</code></td><td> + <p>Flag to determine if server information is presented when an error + occurs. If set to <code>false</code>, then the server version is not + returned in the HTML response. + Default value: <code>true</code> + </p> + </td></tr></table> + + </div></div> + +</div><h3 id="Crawler_Session_Manager_Valve">Crawler Session Manager Valve</h3><div class="text"> + + <div class="subsection"><h4 id="Crawler_Session_Manager_Valve/Introduction">Introduction</h4><div class="text"> + + <p>Web crawlers can trigger the creation of many thousands of sessions as + they crawl a site which may result in significant memory consumption. This + Valve ensures that crawlers are associated with a single session - just like + normal users - regardless of whether or not they provide a session token + with their requests.</p> + + <p>This Valve may be used at the <code>Engine</code>, <code>Host</code> or + <code>Context</code> level as required. Normally, this Valve would be used + at the <code>Engine</code> level.</p> + + <p>If used in conjunction with Remote IP valve then the Remote IP valve + should be defined before this valve to ensure that the correct client IP + address is presented to this valve.</p> + + </div></div> + + <div class="subsection"><h4 id="Crawler_Session_Manager_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Crawler Session Manager Valve</strong> supports the + following configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.CrawlerSessionManagerValve</strong>. + </p> + </td></tr><tr><td><code class="attributeName">crawlerIps</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that client + IP is matched against to determine if a request is from a web crawler. + By default such regular expression is not set.</p> + </td></tr><tr><td><code class="attributeName">crawlerUserAgents</code></td><td> + <p>Regular expression (using <code>java.util.regex</code>) that the user + agent HTTP request header is matched against to determine if a request + is from a web crawler. If not set, the default of + <code>.*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*</code> is used.</p> + </td></tr><tr><td><code class="attributeName">sessionInactiveInterval</code></td><td> + <p>The minimum time in seconds that the Crawler Session Manager Valve + should keep the mapping of client IP to session ID in memory without any + activity from the client. The client IP / session cache will be + periodically purged of mappings that have been inactive for longer than + this interval. If not specified the default value of <code>60</code> + will be used.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Stuck_Thread_Detection_Valve">Stuck Thread Detection Valve</h3><div class="text"> + + <div class="subsection"><h4 id="Stuck_Thread_Detection_Valve/Introduction">Introduction</h4><div class="text"> + + <p>This valve allows to detect requests that take a long time to process, + which might indicate that the thread that is processing it is stuck. + Additionally it can optionally interrupt such threads to try and unblock + them.</p> + <p>When such a request is detected, the current stack trace of its thread is + written to Tomcat log with a WARN level.</p> + <p>The IDs and names of the stuck threads are available through JMX in the + <code>stuckThreadIds</code> and <code>stuckThreadNames</code> attributes. + The IDs can be used with the standard Threading JVM MBean + (<code>java.lang:type=Threading</code>) to retrieve other information + about each stuck thread.</p> + + </div></div> + + <div class="subsection"><h4 id="Stuck_Thread_Detection_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Stuck Thread Detection Valve</strong> supports the + following configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.StuckThreadDetectionValve</strong>. + </p> + </td></tr><tr><td><code class="attributeName">threshold</code></td><td> + <p>Minimum duration in seconds after which a thread is considered stuck. + Default is 600 seconds. If set to 0, the detection is disabled.</p> + <p>Note: since the detection (and optional interruption) is done in the + background thread of the Container (Engine, Host or Context) declaring + this Valve, the threshold should be higher than the + <code>backgroundProcessorDelay</code> of this Container.</p> + </td></tr><tr><td><code class="attributeName">interruptThreadThreshold</code></td><td> + <p>Minimum duration in seconds after which a stuck thread should be + interrupted to attempt to "free" it.</p> + <p>Note that there's no guarantee that the thread will get unstuck. + This usually works well for threads stuck on I/O or locks, but is + probably useless in case of infinite loops.</p> + <p>Default is -1 which disables the feature. To enable it, the value + must be greater or equal to <code>threshold</code>.</p> + </td></tr></table> + + </div></div> + +</div><h3 id="Semaphore_Valve">Semaphore Valve</h3><div class="text"> + + <div class="subsection"><h4 id="Semaphore_Valve/Introduction">Introduction</h4><div class="text"> + + <p>The <strong>Semaphore Valve</strong> is able to limit the number of + concurrent request processing threads.</p> + <p><strong>org.apache.catalina.valves.SemaphoreValve</strong> provides + methods which may be overridden by a subclass to customize behavior:</p> + <ul> + <li><b><code>controlConcurrency</code></b> may be overridden to add + conditions;</li> + <li><b><code>permitDenied</code></b> may be overridden to add error handling + when a permit isn't granted.</li> + </ul> + + </div></div> + + <div class="subsection"><h4 id="Semaphore_Valve/Attributes">Attributes</h4><div class="text"> + + <p>The <strong>Semaphore Valve</strong> supports the following + configuration attributes:</p> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">block</code></td><td> + <p>Flag to determine if a thread is blocked until a permit is available. + The default value is <strong>true</strong>.</p> + </td></tr><tr><td><strong><code class="attributeName">className</code></strong></td><td> + <p>Java class name of the implementation to use. This MUST be set to + <strong>org.apache.catalina.valves.SemaphoreValve</strong>.</p> + </td></tr><tr><td><code class="attributeName">concurrency</code></td><td> + <p>Concurrency level of the semaphore. The default value is + <strong>10</strong>.</p> + </td></tr><tr><td><code class="attributeName">fairness</code></td><td> + <p>Fairness of the semaphore. The default value is + <strong>false</strong>.</p> + </td></tr><tr><td><code class="attributeName">interruptible</code></td><td> + <p>Flag to determine if a thread may be interrupted until a permit is + available. The default value is <strong>false</strong>.</p> + </td></tr></table> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/connectors.html b/src/tomcat/webapps/docs/connectors.html new file mode 100644 index 0000000000000000000000000000000000000000..c0cd1aa47a22a7e58cf8a9196bde9151945729b8 --- /dev/null +++ b/src/tomcat/webapps/docs/connectors.html @@ -0,0 +1,86 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Connectors How To</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/connectors"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Connectors How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#HTTP">HTTP</a></li><li><a href="#AJP">AJP</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>Choosing a connector to use with Tomcat can be difficult. This page will +list the connectors which are supported with this Tomcat release, and will +hopefully help you make the right choice according to your needs.</p> + +</div><h3 id="HTTP">HTTP</h3><div class="text"> + +<p>The HTTP connector is setup by default with Tomcat, and is ready to use. This +connector features the lowest latency and best overall performance.</p> + +<p>For clustering, a HTTP load balancer <b>with support for web sessions stickiness</b> +must be installed to direct the traffic to the Tomcat servers. Tomcat supports mod_proxy +(on Apache HTTP Server 2.x, and included by default in Apache HTTP Server 2.2) as the load balancer. +It should be noted that the performance of HTTP proxying is usually lower than the +performance of AJP, so AJP clustering is often preferable.</p> + +</div><h3 id="AJP">AJP</h3><div class="text"> + +<p>When using a single server, the performance when using a native webserver in +front of the Tomcat instance is most of the time significantly worse than a +standalone Tomcat with its default HTTP connector, even if a large part of the web +application is made of static files. If integration with the native webserver is +needed for any reason, an AJP connector will provide faster performance than +proxied HTTP. AJP clustering is the most efficient from the Tomcat perspective. +It is otherwise functionally equivalent to HTTP clustering.</p> + +<p>The native connectors supported with this Tomcat release are:</p> +<ul> +<li>JK 1.2.x with any of the supported servers</li> +<li>mod_proxy on Apache HTTP Server 2.x (included by default in Apache HTTP Server 2.2), +with AJP enabled</li> +</ul> + +<p><b>Other native connectors supporting AJP may work, but are no longer supported.</b></p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/default-servlet.html b/src/tomcat/webapps/docs/default-servlet.html new file mode 100644 index 0000000000000000000000000000000000000000..35f9c533e6d598a251af56074e9cee41fcea9b51 --- /dev/null +++ b/src/tomcat/webapps/docs/default-servlet.html @@ -0,0 +1,316 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Default Servlet Reference</title><meta name="author" content="Tim Funk"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/default-servlet"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Default Servlet Reference</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#what">What is the DefaultServlet</a></li><li><a href="#where">Where is it declared?</a></li><li><a href="#change">What can I change?</a></li><li><a href="#dir">How do I customize directory listings?</a></li><li><a href="#secure">How do I secure directory listings?</a></li></ul> +</div><h3 id="what">What is the DefaultServlet</h3><div class="text"> +<p> +The default servlet is the servlet which serves static resources as well +as serves the directory listings (if directory listings are enabled). +</p> +</div><h3 id="where">Where is it declared?</h3><div class="text"> +<p> +It is declared globally in <i>$CATALINA_BASE/conf/web.xml</i>. +By default here is it's declaration: +</p> +<div class="codeBox"><pre><code> <servlet> + <servlet-name>default</servlet-name> + <servlet-class> + org.apache.catalina.servlets.DefaultServlet + </servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + <init-param> + <param-name>listings</param-name> + <param-value>false</param-value> + </init-param> + <load-on-startup>1</load-on-startup> + </servlet> + +... + + <servlet-mapping> + <servlet-name>default</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping></code></pre></div> + +<p>So by default, the default servlet is loaded at webapp startup and directory +listings are disabled and debugging is turned off.</p> + +<p>If you need to change the DefaultServlet settings for an application you can +override the default configuration by re-defining the DefaultServlet in +<code>/WEB-INF/web.xml</code>. However, this will cause problems if you attempt +to deploy the application on another container as the DefaultServlet class will +not be recognised. You can work-around this problem by using the Tomact specific +<code>/WEB-INF/tomcat-web.xml</code> deployment descriptor. The format is +identical to <code>/WEB-INF/web.xml</code>. It will override any default +settings but not those in <code>/WEB-INF/web.xml</code>. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.</p> +</div><h3 id="change">What can I change?</h3><div class="text"> +<p> + The DefaultServlet allows the following initParamters: +</p> + +<table class="defaultTable"><tr><th style="width: 15%;"> + Property + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="propertyName">debug</code></td><td> + Debugging level. It is not very useful unless you are a tomcat + developer. As + of this writing, useful values are 0, 1, 11, 1000. [0] + </td></tr><tr><td><code class="propertyName">listings</code></td><td> + If no welcome file is present, can a directory listing be + shown? + value may be <b>true</b> or <b>false</b> [false] + <br> + Welcome files are part of the servlet api. + <br> + <b>WARNING:</b> Listings of directories containing many entries are + expensive. Multiple requests for large directory listings can consume + significant proportions of server resources. + </td></tr><tr><td><code class="propertyName">precompressed</code></td><td> + If a precompressed version of a file exists (a file with <code>.br</code> + or <code>.gz</code> appended to the file name located alongside the + original file), Tomcat will serve the precompressed file if the user + agent supports the matching content encoding (br or gzip) and this + option is enabled. [false] + <br> + The precompressed file with the with <code>.br</code> or <code>.gz</code> + extension will be accessible if requested directly so if the original + resource is protected with a security constraint, the precompressed + versions must be similarly protected. + <br> + It is also possible to configure the list of precompressed formats. + The syntax is comma separated list of + <code>[content-encoding]=[file-extension]</code> pairs. For example: + <code>br=.br,gzip=.gz,bzip2=.bz2</code>. If multiple formats are + specified, the client supports more than one and the client does not + express a preference, the order of the list of formats will be treated + as the server preference order and used to select the format returned. + </td></tr><tr><td><code class="propertyName">readmeFile</code></td><td> + If a directory listing is presented, a readme file may also + be presented with the listing. This file is inserted as is + so it may contain HTML. + </td></tr><tr><td><code class="propertyName">globalXsltFile</code></td><td> + If you wish to customize your directory listing, you + can use an XSL transformation. This value is a relative file name (to + either $CATALINA_BASE/conf/ or $CATALINA_HOME/conf/) which will be used + for all directory listings. This can be overridden per context and/or + per directory. See <strong>contextXsltFile</strong> and + <strong>localXsltFile</strong> below. The format of the xml is shown + below. + </td></tr><tr><td><code class="propertyName">contextXsltFile</code></td><td> + You may also customize your directory listing by context by + configuring <code>contextXsltFile</code>. This must be a context + relative path (e.g.: <code>/path/to/context.xslt</code>) to a file with + a <code>.xsl</code> or <code>.xslt</code> extension. This overrides + <code>globalXsltFile</code>. If this value is present but a file does + not exist, then <code>globalXsltFile</code> will be used. If + <code>globalXsltFile</code> does not exist, then the default + directory listing will be shown. + </td></tr><tr><td><code class="propertyName">localXsltFile</code></td><td> + You may also customize your directory listing by directory by + configuring <code>localXsltFile</code>. This must be a file in the + directory where the listing will take place to with a + <code>.xsl</code> or <code>.xslt</code> extension. This overrides + <code>globalXsltFile</code> and <code>contextXsltFile</code>. If this + value is present but a file does not exist, then + <code>contextXsltFile</code> will be used. If + <code>contextXsltFile</code> does not exist, then + <code>globalXsltFile</code> will be used. If + <code>globalXsltFile</code> does not exist, then the default + directory listing will be shown. + </td></tr><tr><td><code class="propertyName">input</code></td><td> + Input buffer size (in bytes) when reading + resources to be served. [2048] + </td></tr><tr><td><code class="propertyName">output</code></td><td> + Output buffer size (in bytes) when writing + resources to be served. [2048] + </td></tr><tr><td><code class="propertyName">readonly</code></td><td> + Is this context "read only", so HTTP commands like PUT and + DELETE are rejected? [true] + </td></tr><tr><td><code class="propertyName">fileEncoding</code></td><td> + File encoding to be used when reading static resources. + [platform default] + </td></tr><tr><td><code class="propertyName">useBomIfPresent</code></td><td> + If a static file contains a byte order mark (BOM), should this be used + to determine the file encoding in preference to fileEncoding. [true] + </td></tr><tr><td><code class="propertyName">sendfileSize</code></td><td> + If the connector used supports sendfile, this represents the minimal + file size in KB for which sendfile will be used. Use a negative value + to always disable sendfile. [48] + </td></tr><tr><td><code class="propertyName">useAcceptRanges</code></td><td> + If true, the Accept-Ranges header will be set when appropriate for the + response. [true] + </td></tr><tr><td><code class="propertyName">showServerInfo</code></td><td> + Should server information be presented in the response sent to clients + when directory listing is enabled. [true] + </td></tr></table> +</div><h3 id="dir">How do I customize directory listings?</h3><div class="text"> +<p>You can override DefaultServlet with you own implementation and use that +in your web.xml declaration. If you +can understand what was just said, we will assume you can read the code +to DefaultServlet servlet and make the appropriate adjustments. (If not, +then that method isn't for you) +</p> +<p> +You can use either <code>localXsltFile</code> or +<code>globalXsltFile</code> and DefaultServlet will create +an xml document and run it through an xsl transformation based +on the values provided in <code>localXsltFile</code> and +<code>globalXsltFile</code>. <code>localXsltFile</code> is first +checked, followed by <code>globalXsltFile</code>, then default +behaviors takes place. +</p> + +<p> +Format: +</p> +<div class="codeBox"><pre><code> <listing> + <entries> + <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> + fileName1 + </entry> + <entry type='file|dir' urlPath='aPath' size='###' date='gmt date'> + fileName2 + </entry> + ... + </entries> + <readme></readme> + </listing></code></pre></div> +<ul> + <li>size will be missing if <code>type='dir'</code></li> + <li>Readme is a CDATA entry</li> +</ul> + +<p> + The following is a sample xsl file which mimics the default tomcat behavior: +</p> +<div class="codeBox"><pre><code><?xml version="1.0" encoding="UTF-8"?> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="3.0"> + + <xsl:output method="html" html-version="5.0" + encoding="UTF-8" indent="no" + doctype-system="about:legacy-compat"/> + + <xsl:template match="listing"> + <html> + <head> + <title> + Sample Directory Listing For + <xsl:value-of select="@directory"/> + </title> + <style> + h1 {color : white;background-color : #0086b2;} + h3 {color : white;background-color : #0086b2;} + body {font-family : sans-serif,Arial,Tahoma; + color : black;background-color : white;} + b {color : white;background-color : #0086b2;} + a {color : black;} HR{color : #0086b2;} + table td { padding: 5px; } + </style> + </head> + <body> + <h1>Sample Directory Listing For + <xsl:value-of select="@directory"/> + </h1> + <hr style="height: 1px;" /> + <table style="width: 100%;"> + <tr> + <th style="text-align: left;">Filename</th> + <th style="text-align: center;">Size</th> + <th style="text-align: right;">Last Modified</th> + </tr> + <xsl:apply-templates select="entries"/> + </table> + <xsl:apply-templates select="readme"/> + <hr style="height: 1px;" /> + <h3>Apache Tomcat/<version-major-minor/></h3> + </body> + </html> + </xsl:template> + + + <xsl:template match="entries"> + <xsl:apply-templates select="entry"/> + </xsl:template> + + <xsl:template match="readme"> + <hr style="height: 1px;" /> + <pre><xsl:apply-templates/></pre> + </xsl:template> + + <xsl:template match="entry"> + <tr> + <td style="text-align: left;"> + <xsl:variable name="urlPath" select="@urlPath"/> + <a href="{$urlPath}"> + <pre><xsl:apply-templates/></pre> + </a> + </td> + <td style="text-align: right;"> + <pre><xsl:value-of select="@size"/></pre> + </td> + <td style="text-align: right;"> + <pre><xsl:value-of select="@date"/></pre> + </td> + </tr> + </xsl:template> + +</xsl:stylesheet></code></pre></div> + +</div><h3 id="secure">How do I secure directory listings?</h3><div class="text"> +Use web.xml in each individual webapp. See the security section of the +Servlet specification. + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/deployer-howto.html b/src/tomcat/webapps/docs/deployer-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..f03d324ae9c7d7c4e72befda9ec9fe65e36ca252 --- /dev/null +++ b/src/tomcat/webapps/docs/deployer-howto.html @@ -0,0 +1,351 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Tomcat Web Application Deployment</title><meta name="author" content="Allistair Crossley"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/deployer-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Web Application Deployment</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#A_word_on_Contexts">A word on Contexts</a></li><li><a href="#Deployment_on_Tomcat_startup">Deployment on Tomcat startup</a></li><li><a href="#Deploying_on_a_running_Tomcat_server">Deploying on a running Tomcat server</a></li><li><a href="#Deploying_using_the_Tomcat_Manager">Deploying using the Tomcat Manager</a></li><li><a href="#Deploying_using_the_Client_Deployer_Package">Deploying using the Client Deployer Package</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + Deployment is the term used for the process of installing a web + application (either a 3rd party WAR or your own custom web application) + into the Tomcat server. + </p> + <p> + Web application deployment may be accomplished in a number of ways + within the Tomcat server. + </p> + <ul> + <li>Statically; the web application is setup before Tomcat is started</li> + <li> + Dynamically; by directly manipulating already deployed web + applications (relying on <em>auto-deployment</em> + feature) or remotely by using the Tomcat Manager web + application + </li> + </ul> + <p> + The <a href="manager-howto.html">Tomcat Manager</a> is a web + application that can be used interactively (via HTML GUI) or + programmatically (via URL-based API) to deploy and manage web + applications. + </p> + <p> + There are a number of ways to perform deployment that rely on + the Manager web application. Apache Tomcat provides tasks + for Apache Ant build tool. + <a href="http://tomcat.apache.org/maven-plugin.html">Apache Tomcat Maven Plugin</a> + project provides integration with Apache Maven. + There is also a tool called the Client Deployer, which can be + used from a command line and provides additional functionality + such as compiling and validating web applications as well as + packaging web application into web application resource (WAR) + files. + </p> + </div><h3 id="Installation">Installation</h3><div class="text"> + <p> + There is no installation required for static deployment of web + applications as this is provided out of the box by Tomcat. Nor is any + installation required for deployment functions with the Tomcat Manager, + although some configuration is required as detailed in the + <a href="manager-howto.html">Tomcat Manager manual</a>. + An installation is however required if you wish + to use the Tomcat Client Deployer (TCD). + </p> + <p> + The TCD is not packaged with the Tomcat core + distribution, and must therefore be downloaded separately from + the Downloads area. The download is usually labelled + <i>apache-tomcat-9.0.x-deployer</i>. + </p> + <p> + TCD has prerequisites of Apache Ant 1.6.2+ and a Java installation. + Your environment should define an ANT_HOME environment value pointing to + the root of your Ant installation, and a JAVA_HOME value pointing to + your Java installation. Additionally, you should ensure Ant's ant + command, and the Java javac compiler command run from the command shell + that your operating system provides. + </p> + <ol> + <li>Download the TCD distribution</li> + <li> + The TCD package need not be extracted into any existing Tomcat + installation, it can be extracted to any location. + </li> + <li>Read Using the <a href="#Deploying_using_the_Client_Deployer_Package"> + Tomcat Client Deployer</a></li> + </ol> + </div><h3 id="A_word_on_Contexts">A word on Contexts</h3><div class="text"> + <p> + In talking about deployment of web applications, the concept of a + <i>Context</i> is required to be understood. A Context is what Tomcat + calls a web application. + </p> + <p> + In order to configure a Context within Tomcat a <i>Context Descriptor</i> + is required. A Context Descriptor is simply an XML file that contains + Tomcat related configuration for a Context, e.g naming resources or + session manager configuration. In earlier versions of + Tomcat the content of a Context Descriptor configuration was often stored within + Tomcat's primary configuration file <i>server.xml</i> but this is now + discouraged (although it currently still works). + </p> + <p> + Context Descriptors not only help Tomcat to know how to configure + Contexts but other tools such as the Tomcat Manager and TCD often use + these Context Descriptors to perform their roles properly. + </p> + <p> + The locations for Context Descriptors are: + </p> + <ol> + <li>$CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml</li> + <li>$CATALINA_BASE/webapps/[webappname]/META-INF/context.xml</li> + </ol> + <p> + Files in (1) are named [webappname].xml but files in (2) are named + context.xml. If a Context Descriptor is not provided for a Context, + Tomcat configures the Context using default values. + </p> + </div><h3 id="Deployment_on_Tomcat_startup">Deployment on Tomcat startup</h3><div class="text"> + <p> + If you are not interested in using the Tomcat Manager, or TCD, + then you'll need to deploy your web applications + statically to Tomcat, followed by a Tomcat startup. The location you + deploy web applications to for this type of deployment is called the + <code>appBase</code> which is specified per Host. You either copy a + so-called <i>exploded web application</i>, i.e non-compressed, to this + location, or a compressed web application resource .WAR file. + </p> + <p> + The web applications present in the location specified by the Host's + (default Host is "localhost") <code>appBase</code> attribute (default + appBase is "$CATALINA_BASE/webapps") will be deployed on Tomcat startup + only if the Host's <code>deployOnStartup</code> attribute is "true". + </p> + <p> + The following deployment sequence will occur on Tomcat startup in that + case: + </p> + <ol> + <li>Any Context Descriptors will be deployed first.</li> + <li> + Exploded web applications not referenced by any Context + Descriptor will then be deployed. If they have an associated + .WAR file in the appBase and it is newer than the exploded web application, + the exploded directory will be removed and the webapp will be + redeployed from the .WAR + </li> + <li>.WAR files will be deployed</li> + </ol> + </div><h3 id="Deploying_on_a_running_Tomcat_server">Deploying on a running Tomcat server</h3><div class="text"> + <p> + It is possible to deploy web applications to a running Tomcat server. + </p> + <p> + If the Host <code>autoDeploy</code> attribute is "true", the Host will + attempt to deploy and update web applications dynamically, as needed, + for example if a new .WAR is dropped into the <code>appBase</code>. + For this to work, the Host needs to have background processing + enabled which is the default configuration. + </p> + + <p> + <code>autoDeploy</code> set to "true" and a running Tomcat allows for: + </p> + <ul> + <li>Deployment of .WAR files copied into the Host <code>appBase</code>.</li> + <li> + Deployment of exploded web applications which are + copied into the Host <code>appBase</code>. + </li> + <li> + Re-deployment of a web application which has already been deployed from + a .WAR when the new .WAR is provided. In this case the exploded + web application is removed, and the .WAR is expanded again. + Note that the explosion will not occur if the Host is configured + so that .WARs are not exploded with a <code>unpackWARs</code> + attribute set to "false", in which case the web application + will be simply redeployed as a compressed archive. + </li> + <li> + Re-loading of a web application if the /WEB-INF/web.xml file (or + any other resource defined as a WatchedResource) is updated. + </li> + <li> + Re-deployment of a web application if the Context Descriptor + file from which the web application has been deployed is + updated. + </li> + <li> + Re-deployment of dependent web applications if the global or + per-host Context Descriptor file used by the web application is + updated. + </li> + <li> + Re-deployment of a web application if a Context Descriptor file (with a + filename corresponding to the Context path of the previously deployed + web application) is added to the + <code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> + directory. + </li> + <li> + Undeployment of a web application if its document base (docBase) + is deleted. Note that on Windows, this assumes that anti-locking + features (see Context configuration) are enabled, otherwise it is not + possible to delete the resources of a running web application. + </li> + </ul> + <p> + Note that web application reloading can also be configured in the loader, in which + case loaded classes will be tracked for changes. + </p> + </div><h3 id="Deploying_using_the_Tomcat_Manager">Deploying using the Tomcat Manager</h3><div class="text"> + <p> + The Tomcat Manager is covered in its <a href="manager-howto.html">own manual page</a>. + </p> + </div><h3 id="Deploying_using_the_Client_Deployer_Package">Deploying using the Client Deployer Package</h3><div class="text"> + <p> + Finally, deployment of web application may be achieved using the + Tomcat Client Deployer. This is a package which can be used to + validate, compile, compress to .WAR, and deploy web applications to + production or development Tomcat servers. It should be noted that this feature + uses the Tomcat Manager and as such the target Tomcat server should be + running. + </p> + + <p> + It is assumed the user will be familiar with Apache Ant for using the TCD. + Apache Ant is a scripted build tool. The TCD comes pre-packaged with a + build script to use. Only a modest understanding of Apache Ant is + required (installation as listed earlier in this page, and familiarity + with using the operating system command shell and configuring + environment variables). + </p> + + <p> + The TCD includes Ant tasks, the Jasper page compiler for JSP compilation + before deployment, as well as a task which + validates the web application Context Descriptor. The validator task (class + <code>org.apache.catalina.ant.ValidatorTask</code>) allows only one parameter: + the base path of an exploded web application. + </p> + + <p> + The TCD uses an exploded web application as input (see the list of the + properties used below). A web application that is programmatically + deployed with the deployer may include a Context Descriptor in + <code>/META-INF/context.xml</code>. + </p> + + <p> + The TCD includes a ready-to-use Ant script, with the following targets: + </p> + <ul> + <li> + <code>compile</code> (default): Compile and validate the web + application. This can be used standalone, and does not need a running + Tomcat server. The compiled application will only run on the associated + <em>Tomcat X.Y.Z</em> server release, and is not guaranteed to work + on another Tomcat release, as the code generated by Jasper depends on its runtime + component. It should also be noted that this target will also compile + automatically any Java source file located in the + <code>/WEB-INF/classes</code> folder of the web application.</li> + <li> + <code>deploy</code>: Deploy a web application (compiled or not) to + a Tomcat server. + </li> + <li><code>undeploy</code>: Undeploy a web application</li> + <li><code>start</code>: Start web application</li> + <li><code>reload</code>: Reload web application</li> + <li><code>stop</code>: Stop web application</li> + </ul> + + <p> + In order for the deployment to be configured, create a file + called <code>deployer.properties</code> in the TCD installation + directory root. In this file, add the following name=value pairs per + line: + </p> + + <p> + Additionally, you will need to ensure that a user has been + setup for the target Tomcat Manager (which TCD uses) otherwise the TCD + will not authenticate with the Tomcat Manager and the deployment will + fail. To do this, see the Tomcat Manager page. + </p> + + <ul> + <li> + <code>build</code>: The build folder used will be, by default, + <code>${build}/webapp/${path}</code> (<code>${build}</code>, by + default, points to <code>${basedir}/build</code>). After the end + of the execution of the <code>compile</code> target, the web + application .WAR will be located at + <code>${build}/webapp/${path}.war</code>. + </li> + <li> + <code>webapp</code>: The directory containing the exploded web application + which will be compiled and validated. By default, the folder is + <code>myapp</code>. + </li> + <li> + <code>path</code>: Deployed context path of the web application, + by default <code>/myapp</code>. + </li> + <li> + <code>url</code>: Absolute URL to the Tomcat Manager web application of a + running Tomcat server, which will be used to deploy and undeploy the + web application. By default, the deployer will attempt to access + a Tomcat instance running on localhost, at + <code>http://localhost:8080/manager/text</code>. + </li> + <li> + <code>username</code>: Tomcat Manager username (user should have a role of + manager-script) + </li> + <li><code>password</code>: Tomcat Manager password.</li> + </ul> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/developers.html b/src/tomcat/webapps/docs/developers.html new file mode 100644 index 0000000000000000000000000000000000000000..e703ffb54ea5ece7c5772b8d610c8934f7ef1f41 --- /dev/null +++ b/src/tomcat/webapps/docs/developers.html @@ -0,0 +1,89 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Tomcat Developers</title><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/developers"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Developers</h2><h3 id="Active_Developers">Active Developers</h3><div class="text"> + + <p> + The list indicates the developers' main areas of interest. Feel free to + add to the list :) The developers email addresses are + <code>[login]@apache.org</code>. Please <strong>do not</strong> contact + developers directly for any support issues (please post to the + tomcat-users mailing list instead, or one of the other support + resources; some organizations and individual consultants also offer + for pay Tomcat support, as listed on the + <a href="http://wiki.apache.org/tomcat/SupportAndTraining">support and + training</a> page on the Tomcat Wiki). + </p> + + <ul> + <li>Bill Barker (billbarker): Connectors</li> + <li>Costin Manolache (costin): Catalina, Connectors</li> + <li>Filip Hanik (fhanik): Clustering, Release Manager</li> + <li>Jean-Frederic Clere (jfclere): Connectors</li> + <li>Jim Jagielski (jim): Connectors</li> + <li>Konstantin Kolinko (kkolinko): Catalina</li> + <li>Mark Thomas (markt): CGI, SSI, WebDAV, bug fixing</li> + <li>Mladen Turk (mturk): Connectors</li> + <li>Peter Rossbach (pero): Catalina, Clustering, JMX</li> + <li>Rainer Jung (rjung): Catalina, Clustering, Connectors</li> + <li>Remy Maucherat (remm): Catalina, Connectors, Docs</li> + <li>Tim Funk (funkman): Catalina, Docs</li> + <li>Tim Whittington (timw): Connectors</li> + </ul> + + </div><h3 id="Retired_Developers">Retired Developers</h3><div class="text"> + + <ul> + <li>Amy Roh (amyroh): Catalina</li> + <li>Glenn Nielsen (glenn): Catalina, Connectors</li> + <li>Henri Gomez (hgomez): Connectors</li> + <li>Jan Luehe (luehe): Jasper</li> + <li>Jean-Francois Arcand (jfarcand): Catalina</li> + <li>Kin-Man Chung (kinman): Jasper</li> + <li>Yoav Shapira (yoavs): Docs, JMX, Catalina, balancer</li> + </ul> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/elapi/index.html b/src/tomcat/webapps/docs/elapi/index.html new file mode 100644 index 0000000000000000000000000000000000000000..3c3acfd000d34298564e3da0d287ebf6d3a4c3c8 --- /dev/null +++ b/src/tomcat/webapps/docs/elapi/index.html @@ -0,0 +1,34 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8" /> + <title>API docs</title> +</head> + +<body> + +The EL Javadoc is not installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +<a href="http://tomcat.apache.org/tomcat-9.0-doc/"> +documentation bundle</a>. + +</body> +</html> diff --git a/src/tomcat/webapps/docs/extras.html b/src/tomcat/webapps/docs/extras.html new file mode 100644 index 0000000000000000000000000000000000000000..c5ec2db0c86cd1ebeee1f3997ec70f8bf62ae403 --- /dev/null +++ b/src/tomcat/webapps/docs/extras.html @@ -0,0 +1,128 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Additional Components</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/extras"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Additional Components</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Downloading">Downloading</a></li><li><a href="#Building">Building</a></li><li><a href="#Components_list">Components list</a><ol><li><a href="#Full_commons-logging_implementation">Full commons-logging implementation</a></li><li><a href="#Web_Services_support_(JSR_109)">Web Services support (JSR 109)</a></li><li><a href="#JMX_Remote_Lifecycle_Listener">JMX Remote Lifecycle Listener</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + A number of additional components may be used with Apache Tomcat. These + components may be built by users should they need them or they can be + downloaded from one of the mirrors. + </p> + + </div><h3 id="Downloading">Downloading</h3><div class="text"> + <p> + To download the extras components open the + <a href="http://tomcat.apache.org/download-90.cgi">Tomcat download page</a> + and select "Browse" from the Quick Navigation Links. The extras components + can be found in bin/extras. + </p> + </div><h3 id="Building">Building</h3><div class="text"> + + <p> + The additional components are built using the <code>extras</code> target + of the standard Tomcat Ant script which is present in the source bundle of + Tomcat. + </p> + + <p>The build process is the following:</p> + + <ul> + <li>Follow the <a href="building.html">build instructions</a> to build a + Tomcat binary from the source bundle (note: it will be used by the build + process of the additional components, but does not need to be actually + used later on)</li> + <li>Execute the command <code>ant extras</code> to run the build + script</li> + <li>The additional components JARs will be placed in the + <code>output/extras</code> folder</li> + <li>Refer to the documentation below about the usage of these JARs</li> + </ul> + + </div><h3 id="Components_list">Components list</h3><div class="text"> + + <div class="subsection"><h4 id="Full_commons-logging_implementation">Full commons-logging implementation</h4><div class="text"> + + <p> + Tomcat uses a package renamed commons-logging API implementation which is + hardcoded to use the java.util.logging API. The commons-logging additional + component builds a full fledged package renamed commons-logging + implementation which can be used to replace the implementation provided with + Tomcat. See the <a href="logging.html">logging</a> page for usage + instructions. + </p> + + </div></div> + + <div class="subsection"><h4 id="Web_Services_support_(JSR_109)">Web Services support (JSR 109)</h4><div class="text"> + + <p> + Tomcat provides factories for JSR 109 which may be used to resolve web + services references. Place the generated catalina-ws.jar as well as + jaxrpc.jar and wsdl4j.jar (or another implementation of JSR 109) in the + Tomcat lib folder. + </p> + + <p> + Users should be aware that wsdl4j.jar is licensed under CPL 1.0 and not the + Apache License version 2.0. + </p> + + </div></div> + + <div class="subsection"><h4 id="JMX_Remote_Lifecycle_Listener">JMX Remote Lifecycle Listener</h4><div class="text"> + + <p> + The JMX protocol requires the JMX server (Tomcat in this instance) to listen + on two network ports. One of these ports can be fixed via configuration but + the second is selected randomly. This makes it difficult to use JMX through + a firewall. The JMX Remote Lifecycle Listener allows both ports to be fixed, + simplifying the process of connecting to JMX through a firewall. See the <a href="config/listeners.html">listeners</a> page for usage instructions. + </p> + + </div></div> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-admin-apps.html b/src/tomcat/webapps/docs/funcspecs/fs-admin-apps.html new file mode 100644 index 0000000000000000000000000000000000000000..1e8c20f1554f478557a09269bc4b72c655dcdd51 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-admin-apps.html @@ -0,0 +1,299 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Administrative Apps - Overall Requirements</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-admin-apps"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Administrative Apps - Overall Requirements</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a><ol><li><a href="#Introduction">Introduction</a></li><li><a href="#External_Specifications">External Specifications</a></li><li><a href="#Implementation_Requirements">Implementation Requirements</a></li></ol></li><li><a href="#Dependencies">Dependencies</a><ol><li><a href="#Environmental_Dependencies">Environmental Dependencies</a></li><li><a href="#Container_Dependencies">Container Dependencies</a></li><li><a href="#External_Technologies">External Technologies</a></li></ol></li><li><a href="#Functionality">Functionality</a><ol><li><a href="#Properties_of_Administered_Objects">Properties of Administered Objects</a></li><li><a href="#Supported_Administrative_Operations">Supported Administrative Operations</a></li><li><a href="#Access_Method_Specific_Requirements">Access Method Specific Requirements</a></li></ol></li><li><a href="#Testable_Assertions">Testable Assertions</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + + + <div class="subsection"><h4 id="Introduction">Introduction</h4><div class="text"> + + <p>The purpose of this specification is to define high level requirements + for administrative applications that can be used to manage the operation + of a running Tomcat container. A variety of <em>Access Methods</em> + to the supported administrative functionality shall be supported, to + meet varying requirements:</p> + <ul> + <li><em>As A Scriptable Web Application</em> - The existing + <code>Manager</code> web application provides a simple HTTP-based + interface for managing Tomcat through commands that are expressed + entirely through a request URI. This is useful in environments + where you wish to script administrative commands with tools that + can generate HTTP transactions.</li> + <li><em>As An HTML-Based Web Application</em> - Use an HTML presentation + to provide a GUI-like user interface for humans to interact with the + administrative capabilities.</li> + <li><em>As SOAP-Based Web Services</em> - The operational commands to + administer Tomcat are made available as web services that utilize + SOAP message formats.</li> + <li><em>As Java Management Extensions (JMX) Commands</em> - The operational + commands to administer Tomcat are made available through JMX APIs, + for integration into management consoles that utilize them.</li> + <li><em>Other Remote Access APIs</em> - Other remote access APIs, such + as JINI, RMI, and CORBA can also be utilized to access administrative + capabilities.</li> + </ul> + + <p>Underlying all of the access methods described above, it is assumed + that the actual operations are performed either directly on the + corresponding Catalina components (such as calling the + <code>Deployer.deploy()</code> method to deploy a new web application), + or through a "business logic" layer that can be shared across all of the + access methods. This approach minimizes the cost of adding new + administrative capabilities later -- it is only necessary to add the + corresponding business logic function, and then write adapters to it for + all desired access methods.</p> + + <p>The current status of this functional specification is + <strong>PROPOSED</strong>. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.</p> + + </div></div> + + + <div class="subsection"><h4 id="External_Specifications">External Specifications</h4><div class="text"> + + <p>The implementation of this functionality depends on the following + external specifications:</p> + <ul> + <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/idl"> + Java IDL</a> (for CORBA, included in the JDK)</li> + <li><a href="http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html"> + Java Management Extensions</a></li> + <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/rmi"> + Remote Method Invocation</a> (Included in the JDK)</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Implementation_Requirements">Implementation Requirements</h4><div class="text"> + + <p>The implementation of this functionality shall conform to the + following requirements:</p> + <ul> + <li>To the maximum extent feasible, all administrative functions, + and the access methods that support them, shall run portably + on all platforms where Tomcat itself runs.</li> + <li>In a default Tomcat distribution, all administrative capabilities + shall be disabled. It shall be necessary for a system + administrator to specifically enable the desired access methods + (such as by adding a username/password with a specific role to + the Tomcat user's database.</li> + <li>Administrative functions shall be realized as direct calls to + corresponding Catalina APIs, or through a business logic layer + that is independent of the access method used to initiate it.</li> + <li>The common business logic components shall be implemented in + package <code>org.apache.catalina.admin</code>.</li> + <li>The common business logic components shall be built as part of the + standard Catalina build process, and made visible in the + Catalina class loader.</li> + <li>The Java components required for each access method shall be + implemented in subpackages of <code>org.apache.catalina.admin</code>. + </li> + <li>The build scripts should treat each access method as optional, + so that it will be built only if the corresponding required + APIs are present at build time.</li> + <li>It shall be possible to save the configured state of the running + Tomcat container such that this state can be reproduced when the + container is shut down and restarted.</li> + <li>Administrative commands to start up and shut down the overall + Tomcat container are <strong>out of scope</strong> for the + purposes of these applications. It is assumed that other + (usually platform-specific) mechanisms will be used for container + startup and shutdown.</li> + </ul> + + </div></div> + + +</div><h3 id="Dependencies">Dependencies</h3><div class="text"> + + + <div class="subsection"><h4 id="Environmental_Dependencies">Environmental Dependencies</h4><div class="text"> + + <p>The following environmental dependencies must be met in order for + administrative applications to operate correctly:</p> + <ul> + <li>For access methods that require creation of server sockets, the + appropriate ports must be configured and available.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Container_Dependencies">Container Dependencies</h4><div class="text"> + + <p>Correct operation of administrative applications depends on the + following specific features of the surrounding container:</p> + <ul> + <li>To the maximum extent feasible, Catalina components that offer + direct administrative APIs and property setters shall support + "live" changes to their operation, without requiring a container + restart.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="External_Technologies">External Technologies</h4><div class="text"> + + <p>The availability of the following technologies can be assumed + for the implementation and operation of the various access methods + and the corresponding administrative business logic:<br> + <strong>FIXME</strong> - This list below is totally outdated, but nobody + cares about the administrative app anymore. It is removed and unsupported + since Tomcat 6.0.</p> + <ul> + <li><a href="http://www.oracle.com/technetwork/java/javase/overview/index.html"> + Java Standard Edition</a> (Version 1.2 or later)</li> + <li><a href="http://www.jcp.org/jsr/detail/154.jsp">Servlet 2.4</a> + (supported natively by Tomcat 5)</li> + <li><a href="http://www.jcp.org/jsr/detail/152.jsp">JavaServer Pages 2.0</a> + (supported natively by Tomcat 5)</li> + <li><a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">JavaServer Pages Standard Tag Library 1.0 (Jakarta Taglibs-Standard 1.0.3)</a></li> + <li><a href="http://struts.apache.org/">Struts Framework</a> + (Version 1.0) - MVC Framework for Web Applications</li> + <li><strong>TO BE DETERMINED</strong> - Application for hosting SOAP + based web services</li> + </ul> + + </div></div> + + +</div><h3 id="Functionality">Functionality</h3><div class="text"> + + + <div class="subsection"><h4 id="Properties_of_Administered_Objects">Properties of Administered Objects</h4><div class="text"> + + <p>Functional requirements for administrative applications are specified + in terms of <em>Administered Objects</em>, whose definitions and detailed + properties are listed <a href="fs-admin-objects.html">here</a>. In general, + Administered Objects correspond to components in the Catalina architecture, + but these objects are defined separately here for the following reasons:</p> + <ul> + <li>It is possible that the administrative applications do not expose + every possible configurable facet of the underlying components.</li> + <li>In some cases, an Administered Object (from the perspective of an + administrative operation) is realized by more than one Catalina + component, at a finer-grained level of detail.</li> + <li>It is necessary to represent the configuration information for a + component separately from the component itself (for instance, in + order to store that configuration information for later use).</li> + <li>It is necessary to represent configuration information (such as + a Default Context) when there is no corresponding component instance. + </li> + <li>Administered Objects, when realized as Java classes, will include + methods for administrative operations that have no correspondence + to operations performed by the corresponding actual components.</li> + </ul> + + <p>It is assumed that the reader is familiar with the overall component + architecture of Catalina. For further information, see the corresponding + Developer Documentation. To distinguish names that are used as both + <em>Administered Objects</em> and <code>Components</code>, different + font presentations are utilized. Default values for many properties + are listed in [square brackets].</p> + + </div></div> + + + <div class="subsection"><h4 id="Supported_Administrative_Operations">Supported Administrative Operations</h4><div class="text"> + + <p>The administrative operations that are available are described in terms + of the corresponding Administered Objects (as defined above), in a manner + that is independent of the access method by which these operations are + requested. In general, such operations are relevant only in the context + of a particular Administered Object (and will most likely be realized as + method calls on the corresponding Administered Object classes), so they + are organized based on the currently "focused" administered object. + The available Supported Operations are documented + <a href="fs-admin-opers.html">here</a>.</p> + + </div></div> + + + <div class="subsection"><h4 id="Access_Method_Specific_Requirements">Access Method Specific Requirements</h4><div class="text"> + + <h5>Scriptable Web Application</h5> + + <p>An appropriate subset of the administrative operations described above + shall be implemented as commands that can be performed by the "Manager" + web application. <strong>FIXME</strong> - Enumerate them.</p> + + <p>In addition, this web application shall conform to the following + requirements:</p> + <ul> + <li>All request URIs shall be protected by security constraints that + require a security role to be assigned for processing.</li> + <li>The default user database shall <strong>not</strong> contain any + user that has been assigned a security role.</li> + </ul> + + <h5>HTML-Based Web Application</h5> + + <p>The entire suite of administrative operations described above shall be + made available through a web application designed for human interaction. + In addition, this web application shall conform to the following + requirements:</p> + <ul> + <li>Must be implemented using servlet, JSP, and MVC framework technologies + described under "External Technologies", above.</li> + <li>Prompts and error messages must be internationalizable to multiple + languages.</li> + <li>Rendered HTML must be compatible with Netscape Navigator (version 4.7 + or later) and Internet Explorer (version 5.0 or later).</li> + </ul> + + </div></div> + + +</div><h3 id="Testable_Assertions">Testable Assertions</h3><div class="text"> + + <p><strong>FIXME</strong> - Complete this section.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-admin-objects.html b/src/tomcat/webapps/docs/funcspecs/fs-admin-objects.html new file mode 100644 index 0000000000000000000000000000000000000000..4e38c89775b096db5c0ab2a0c1c69e45229906b6 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-admin-objects.html @@ -0,0 +1,450 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Administrative Apps - Administered Objects</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-admin-objects"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Administrative Apps - Administered Objects</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Administered_Objects_Overview">Administered Objects Overview</a></li><li><a href="#Access_Logger">Access Logger</a></li><li><a href="#Connector">Connector</a></li><li><a href="#Context">Context</a></li><li><a href="#Default_Context">Default Context</a></li><li><a href="#Default_Deployment_Descriptor">Default Deployment Descriptor</a></li><li><a href="#Engine">Engine</a></li><li><a href="#Environment_Entry">Environment Entry</a></li><li><a href="#Host">Host</a></li><li><a href="#JDBC_Resource">JDBC Resource</a></li><li><a href="#Loader">Loader</a></li><li><a href="#Manager">Manager</a></li><li><a href="#Realm">Realm</a></li><li><a href="#Request_Filter">Request Filter</a></li><li><a href="#Server">Server</a></li><li><a href="#Service">Service</a></li></ul> +</div><h3 id="Administered_Objects_Overview">Administered Objects Overview</h3><div class="text"> + +<p>This document defines the <em>Administered Objects</em> that represent +the internal architectural components of the Catalina servlet container. +Associated with each is a set of <a href="fs-admin-opers.html">Supported +Operations</a> that can be performed when the administrative application is +"focused" on a particular configurable object.</p> + +<p>The following Administered Objects are defined:</p> +<ul> +<li><a href="#Access_Logger">Access Logger</a></li> +<li><a href="#Connector">Connector</a></li> +<li><a href="#Context">Context</a></li> +<li><a href="#Default_Context">Default Context</a></li> +<li><a href="#Default_Deployment_Descriptor">Default Deployment Descriptor</a></li> +<li><a href="#Engine">Engine</a></li> +<li><a href="#Environment_Entry">Environment Entry</a></li> +<li><a href="#Host">Host</a></li> +<li><a href="#JDBC_Resource">JDBC Resource</a></li> +<li><a href="#Loader">Loader</a></li> +<li><a href="#Manager">Manager</a></li> +<li><a href="#Realm">Realm</a></li> +<li><a href="#Request_Filter">Request Filter</a></li> +<li><a href="#Server">Server</a></li> +<li><a href="#Service">Service</a></li> +</ul> + +</div><h3 id="Access_Logger">Access Logger</h3><div class="text"> + + <p>An <em>Access Logger</em> is an optional <code>Valve</code> that can + create request access logs in the same formats as those provided by + web servers. Such access logs are useful input to hit count and user + access tracking analysis programs. An Access Logger can be attached to + an <em>Engine</em>, a <em>Host</em>, a <em>Context</em>, or a <em>Default + Context</em>.</p> + + <p>The standard component implementing an <em>Access Logger</em> is + <code>org.apache.catalina.valves.AccessLogValve</code>. It supports the + following configurable properties:</p> + <ul> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>directory</code> - Absolute or relative (to $CATALINA_BASE) path + of the directory into which access log files are created. + [logs].</li> + <li><code>pattern</code> - Pattern string defining the fields to be + included in the access log output, or "common" for the standard + access log pattern. See + <code>org.apache.catalina.valves.AccessLogValve</code> for more + information. [common]</li> + <li><code>prefix</code> - Prefix added to the beginning of each log file + name created by this access logger.</li> + <li><code>resolveHosts</code> - Should IP addresses be resolved to host + names in the log? [false]</li> + <li><code>suffix</code> - Suffix added to the end of each log file name + created by this access logger.</li> + </ul> + +</div><h3 id="Connector">Connector</h3><div class="text"> + + <p>A <em>Connector</em> is the representation of a communications endpoint + by which requests are received from (and responses returned to) a Tomcat + client. The administrative applications shall support those connectors + that are commonly utilized in Tomcat installations, as described in detail + below.</p> + + <p>For standalone use, the standard connector supporting the HTTP/1.1 + protocol is <code>org.apache.catalina.connectors.http.HttpConnector</code>. + It supports the following configurable properties:</p> + <ul> + <li><code>acceptCount</code> - The maximum queue length of incoming + connections that have not yet been accepted. [10]</li> + <li><code>address</code> - For servers with more than one IP address, the + address upon which this connector should listen. [All Addresses]</li> + <li><code>bufferSize</code> - Default input buffer size (in bytes) for + requests created by this Connector. [2048]</li> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>enableLookups</code> - Should we perform DNS lookups on remote + IP addresses when <code>request.getRemoteHost()</code> is called? + [false]</li> + <li><code>maxProcessors</code> - The maximum number of processor threads + supported by this connector. [20]</li> + <li><code>minProcessors</code> - The minimum number of processor threads + to be created at container startup. [5]</li> + <li><code>port</code> - TCP/IP port number on which this Connector should + listen for incoming requests. [8080]</li> + <li><code>proxyName</code> - Host name to be returned when an application + calls <code>request.getServerName()</code>. [Value of Host: header]</li> + <li><code>proxyPort</code> - Port number to be returned when an application + calls <code>request.getServerPort()</code>. [Same as <code>port</code>] + </li> + </ul> + +</div><h3 id="Context">Context</h3><div class="text"> + + <p>A <em>Context</em> is the representation of an individual web application, + which is associated with a corresponding <em>Host</em>. Note that the + administrable properties of a <em>Context</em> do <strong>not</strong> + include any settings from inside the web application deployment descriptor + for that application.</p> + + <p>The standard component implementing a <em>Context</em> is + <code>org.apache.catalina.core.StandardContext</code>. It supports the + following configurable properties:</p> + <ul> + <li><code>cookies</code> - Should be use cookies for session identifier + communication? [true]</li> + <li><code>crossContext</code> - Should calls to + <code>ServletContext.getServletContext()</code> return the actual + context responsible for the specified path? [false]</li> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>docBase</code> - The absolute or relative (to the + <code>appBase</code> of our owning <em>Host</em>) pathname of a + directory containing an unpacked web application, or of a web + application archive (WAR) file.</li> + <li><code>override</code> - Should settings in this <em>Context</em> + override corresponding settings in the <em>Default Context</em>? + [false]</li> + <li><code>path</code> - Context path for this web application, or an empty + string for the root application of a <em>Host</em>. [Inferred from + directory or WAR file name]</li> + <li><code>reloadable</code> - Should Tomcat monitor classes in the + <code>/WEB-INF/classes</code> directory for changes, and reload the + application if they occur? [false]</li> + <li><code>useNaming</code> - Should Tomcat provide a JNDI naming context, + containing preconfigured entries and resources, corresponding to the + requirements of the Java2 Enterprise Edition specification? [true]</li> + <li><code>workDir</code> - Absolute pathname of a scratch directory that is + provided to this web application. [Automatically assigned relative to + $CATALINA_BASE/work]</li> + </ul> + + <p>Each <em>Context</em> is owned by a parent <em>Host</em>, and is + associated with:</p> + <ul> + <li>An optional <em>Access Logger</em> that logs all requests processed + by this web application.</li> + <li>Zero or more <em>Environment Entries</em> representing environment + entries for the JNDI naming context associated with a web + application.</li> + <li>Zero or more <em>JDBC Resources</em> representing database connection + pools associated with a web application.</li> + <li>A <em>Loader</em> representing the web application class loader used + by this web application.</li> + <li>A <em>Manager</em> representing the session manager used by this + web application.</li> + <li>An optional <em>Realm</em> used to provide authentication and access + control information for this web application.</li> + <li>Zero or more <em>Request Filters</em> used to limit access to this + web application based on remote host name or IP address.</li> + </ul> + +</div><h3 id="Default_Context">Default Context</h3><div class="text"> + + <p>A <em>Default Context</em> represents a subset of the configurable + properties of a <em>Context</em>, and is used to set defaults for those + properties when web applications are automatically deployed. A <em>Default + Context</em> object can be associated with an <em>Engine</em> or a + <em>Host</em>. The following configurable properties are supported:</p> + <ul> + <li><code>cookies</code> - Should be use cookies for session identifier + communication? [true]</li> + <li><code>crossContext</code> - Should calls to + <code>ServletContext.getServletContext()</code> return the actual + context responsible for the specified path? [false]</li> + <li><code>reloadable</code> - Should Tomcat monitor classes in the + <code>/WEB-INF/classes</code> directory for changes, and reload the + application if they occur? [false]</li> + <li><code>useNaming</code> - Should Tomcat provide a JNDI naming context, + containing preconfigured entries and resources, corresponding to the + requirements of the Java2 Enterprise Edition specification? [true]</li> + </ul> + + <p>Each <em>Default Context</em> is owned by a parent <em>Engine</em> or + <em>Host</em>, and is associated with:</p> + <ul> + <li>Zero or more <em>Environment Entries</em> representing environment + entries for the JNDI naming context associated with a web + application.</li> + <li>Zero or more <em>JDBC Resources</em> representing database connection + pools associated with a web application.</li> + <li>An optional <em>Loader</em> representing default configuration + properties for the Loader component of deployed web applications.</li> + <li>An optional <em>Manager</em> representing default configuration + properties for the Manager component of deployed web applications.</li> + </ul> + +</div><h3 id="Default_Deployment_Descriptor">Default Deployment Descriptor</h3><div class="text"> + + <p>Default web application characteristics are configured in a special + deployment descriptor named <code>$CATALINA_BASE/conf/web.xml</code>. This + section describes the configurable components that may be stored there.</p> + + <p><strong>FIXME</strong> - Complete the description of default servlets, + default mappings, default MIME types, and so on.</p> + +</div><h3 id="Engine">Engine</h3><div class="text"> + + <p>An <em>Engine</em> is the representation of the entire Catalina + servlet container, and processes all requests for all of the associated + virtual hosts and web applications.</p> + + <p>The standard component implementing an <em>Engine</em> is + <code>org.apache.catalina.core.StandardEngine</code>. It supports the + following configurable properties:</p> + <ul> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>defaultHost</code> - Name of the <em>Host</em> to which requests + will be directed if the requested host is unknown. [localhost]</li> + <li><code>name</code> - Logical name of this engine. [Tomcat Stand-Alone] + </li> + </ul> + + <p>Each <em>Engine</em> is owned by a parent <em>Service</em>, and is + associated with:</p> + <ul> + <li>An optional <em>Access Logger</em> that logs all requests processed + by the entire container.</li> + <li>A <em>Default Context</em>, representing default properties of a + <em>Context</em> for automatically deployed applications for all + associated <em>Hosts</em> (unless overridden by a subordinate + component).</li> + <li>One or more <em>Hosts</em> representing individual virtual hosts + supported by this container.</li> + <li>A <em>Realm</em> used to provide authentication and access control + information for all virtual hosts and web applications (unless + overridden by a subordinate component).</li> + <li>Zero or more <em>Request Filters</em> used to limit access to the + entire container based on remote host name or IP address.</li> + </ul> + +</div><h3 id="Environment_Entry">Environment Entry</h3><div class="text"> + + <p>An <em>Environment Entry</em> is the representation of a + <code><env-entry></code> element from a web application deployment + descriptor. It will cause the creation of a corresponding entry in the + JNDI naming context provided to the corresponding <em>Context</em>. The + following configurable properties are supported:</p> + <ul> + <li><code>description</code> - Description of this environment entry.</li> + <li><code>name</code> - Environment entry name (relative to the + <code>java:comp/env</code> context)</li> + <li><code>type</code> - Environment entry type (must be one of the fully + qualified Java classes listed in the servlet spec).</li> + <li><code>value</code> - Environment entry value (must be convertible from + String to the specified <code>type</code>.</li> + </ul> + +</div><h3 id="Host">Host</h3><div class="text"> + + <p>A <em>Host</em> is the representation of an individual virtual host, + which has a unique set of associated web applications.</p> + + <p>The standard component implementing a <em>Host</em> is + <code>org.apache.catalina.core.StandardHost</code>. It supports the + following configurable properties:</p> + <ul> + <li><code>aliases</code> - Zero or more DNS names that are also associated + with this host (for example, a particular host might be named + <code>www.mycompany.com</code> with an alias <code>company.com</code>). + </li> + <li><code>appBase</code> - Absolute or relative (to $CATALINA_BASE) path + to a directory from which web applications will be automatically + deployed.</li> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>name</code> - DNS Name of the virtual host represented by this + object.</li> + <li><code>unpackWARs</code> - Should web application archive files + deployed by this virtual host be unpacked first? [true]</li> + </ul> + + <p>Each <em>Host</em> is owned by a parent <em>Engine</em>, and is + associated with:</p> + <ul> + <li>An optional <em>Access Logger</em> that logs all requests processed + by this virtual host.</li> + <li>One or more <em>Contexts</em> representing the web applications + operating on this <em>Host</em>.</li> + <li>A <em>Default Context</em> representing default <em>Context</em> + properties for web applications that are automatically deployed + by this <em>Host</em>.</li> + <li>A optional <em>Realm</em> used to provide authentication and access + control information for all web applications associated with this + virtual host (unless overridden by a subordinate component).</li> + </ul> + + <p><strong>FIXME</strong> - Should we support configuration of the + User Web Applications functionality?</p> + +</div><h3 id="JDBC_Resource">JDBC Resource</h3><div class="text"> + + <p>A <em>JDBC Resources</em> represents a database connection pool (i.e. + an implementation of <code>javax.sql.DataSource</code> that will be + configured and made available in the JNDI naming context associated with + a web application.</p> + + <p><strong>FIXME</strong> - properties of this administered object</p> + +</div><h3 id="Loader">Loader</h3><div class="text"> + + <p>A <em>Loader</em> represents a web application class loader that will + be utilized to provide class loading services for a particular + <em>Context</em>.</p> + + <p>The standard component implementing a <em>Loader</em> is + <code>org.apache.catalina.loader.WebappLoader</code>. It supports + the following configurable properties:</p> + <ul> + <li><code>reloadable</code> - Should this class loader check for modified + classes and initiate automatic reloads? [Set automatically from the + <code>reloadable</code> property of the corresponding <em>Context</em>] + </li> + </ul> + + <p>Each <em>Loader</em> is owned by a parent <em>Context</em>.</p> + +</div><h3 id="Manager">Manager</h3><div class="text"> + + <p>A <em>Manager</em> represents a session manager that will be associated + with a particular web application. <strong>FIXME</strong> - Add support + for advanced session managers and their associated Stores.</p> + + <p>The standard component implementing a <em>Manager</em> is + <code>org.apache.catalina.session.StandardManager</code>. It supports + the following configurable properties:</p> + <ul> + <li><code>maxActiveSessions</code> - The maximum number of active sessions + that are allowed, or -1 for no limit. [-1]</li> + </ul> + + <p>Each <em>Manager</em> is owned by a parent <em>Context</em>.</p> + +</div><h3 id="Realm">Realm</h3><div class="text"> + + <p>A <em>Realm</em> represents a "database" of information about authorized + users, their passwords, and the security roles assigned to them. This will + be used by the container in the implementation of container-managed security + in accordance with the Servlet Specification. Several alternative + implementations are supported.</p> + + <p><code>org.apache.catalina.realm.MemoryRealm</code> initializes its user + information from a simple XML file at startup time. If changes are made + to the information in this file, the corresponding web applications using + it must be restarted for the changes to take effect. It supports the + following configurable properties:</p> + <ul> + <li><code>debug</code> - Debugging detail level. [0]</li> + <li><code>pathname</code> - Absolute or relative (to $CATALINA_BASE) path to + the XML file containing our user information. [conf/tomcat-users.xml] + </li> + </ul> + + <p><code>org.apache.catalina.realm.JDBCRealm</code> uses a relational + database (accessed via JDBC APIs) to contain the user information. Changes + in the contents of this database take effect immediately; however, the roles + assigned to a particular user are calculated only when the user initially + logs on (and not per request). The following configurable properties + are supported:</p> + <ul> + <li><code>connectionName</code> - Database username to use when establishing + a JDBC connection.</li> + <li><code>connectionPassword</code> - Database password to use when + establishing a JDBC connection.</li> + <li><code>connectionURL</code> - Connection URL to use when establishing + a JDBC connection.</li> + <li><code>driverName</code> - Fully qualified Java class name of the JDBC + driver to be utilized.</li> + <li><code>roleNameCol</code> - Name of the column, in the User Roles table, + which contains the role name.</li> + <li><code>userCredCol</code> - Name of the column, in the Users table, + which contains the password (encrypted or unencrypted).</li> + <li><code>userNameCol</code> - Name of the column, in both the Users and + User Roles tables, that contains the username.</li> + <li><code>userRoleTable</code> - Name of the User Roles table, which contains + one row per security role assigned to a particular user. This table must + contain the columns specified by the <code>userNameCol</code> and + <code>roleNameCol</code> properties.</li> + <li><code>userTable</code> - Name of the Users table, which contains one row + per authorized user. This table must contain the columns specified by + the <code>userNameCol</code> and <code>userCredCol</code> properties. + </li> + </ul> + + <p><strong>FIXME</strong> - Should we provide mechanisms to edit the contents + of a "tomcat-users.xml" file through the admin applications?</p> + + <p>Each <em>Realm</em> is owned by a parent <em>Engine</em>, <em>Host</em>, + or <em>Context</em>.</p> + +</div><h3 id="Request_Filter">Request Filter</h3><div class="text"> + + <p><strong>FIXME</strong> - complete this entry</p> + +</div><h3 id="Server">Server</h3><div class="text"> + + <p><strong>FIXME</strong> - complete this entry</p> + +</div><h3 id="Service">Service</h3><div class="text"> + + <p><strong>FIXME</strong> - complete this entry</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-admin-opers.html b/src/tomcat/webapps/docs/funcspecs/fs-admin-opers.html new file mode 100644 index 0000000000000000000000000000000000000000..c12d5cc22ed02c9e80d5dd09fd6cb282985d3b93 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-admin-opers.html @@ -0,0 +1,309 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Administrative Apps - Supported Operations</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-admin-opers"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Administrative Apps - Supported Operations</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Supported_Operations_Overview">Supported Operations Overview</a></li><li><a href="#Access_Logger">Access Logger</a></li><li><a href="#Connector">Connector</a></li><li><a href="#Context">Context</a></li><li><a href="#Default_Context">Default Context</a></li><li><a href="#Engine">Engine</a></li><li><a href="#Environment_Entry">Environment Entry</a></li><li><a href="#Host">Host</a></li><li><a href="#JDBC_Resource">JDBC Resource</a></li><li><a href="#Loader">Loader</a></li><li><a href="#Manager">Manager</a></li><li><a href="#Realm">Realm</a></li><li><a href="#Request_Filter">Request Filter</a></li><li><a href="#Server">Server</a></li><li><a href="#Service">Service</a></li></ul> +</div><h3 id="Supported_Operations_Overview">Supported Operations Overview</h3><div class="text"> + +<p>This document defines the <em>Supported Operations</em> that may +be performed against the <a href="fs-admin-objects.html">Administered +Objects</a> that are supported by Tomcat administrative applications. +Not all operations are required to be available through every administrative +application that is implemented. However, if a given operation is available, +it should operate consistently with the descriptions found here.</p> + +<p>Supported Operations are described for the following Administered +Objects:</p> +<ul> +<li><a href="#Access_Logger">Access Logger</a></li> +<li><a href="#Connector">Connector</a></li> +<li><a href="#Context">Context</a></li> +<li><a href="#Default_Context">Default Context</a></li> +<li><a href="#Engine">Engine</a></li> +<li><a href="#Environment_Entry">Environment Entry</a></li> +<li><a href="#Host">Host</a></li> +<li><a href="#JDBC_Resource">JDBC Resource</a></li> +<li><a href="#Loader">Loader</a></li> +<li><a href="#Manager">Manager</a></li> +<li><a href="#Realm">Realm</a></li> +<li><a href="#Request_Filter">Request Filter</a></li> +<li><a href="#Server">Server</a></li> +<li><a href="#Service">Service</a></li> +</ul> + +</div><h3 id="Access_Logger">Access Logger</h3><div class="text"> + + <p>From the perspective of a particular <em>Access Logger</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Engine</em>, <em>Host</em>, or + <em>Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Connector">Connector</h3><div class="text"> + + <p>From the perspective of a particular <em>Connector</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Service</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Context">Context</h3><div class="text"> + + <p>From the perspective of a particular <em>Context</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Host</em>.</li> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Access Logger</em> associated + with this object.</li> + <li>Edit the configurable properties of the associated <em>Access + Logger</em>.</li> + <li>Remove the associated <em>Access Logger</em>.</li> + <li>Create and configure a new <em>Environment Entry</em> associated + with this object.</li> + <li>Select and edit the configurable properties of an associated + <em>Environment Entry</em>.</li> + <li>Remove an associated <em>Environment Entry</em>.</li> + <li>Create and configure a new <em>JDBC Resource</em> associated + with this object.</li> + <li>Select and edit the configurable properties of an associated + <em>JDBC Resource</em>.</li> + <li>Remove an associated <em>JDBC Resource</em>.</li> + <li>Create and configure a new <em>Loader</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Loader</em>.</li> + <li>Remove the associated <em>Loader</em>.</li> + <li>Create and configure a new <em>Manager</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Manager</em>.</li> + <li>Remove the associated <em>Manager</em>.</li> + <li>Create and configure a new <em>Realm</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Realm</em>.</li> + <li>Remove the associated <em>Realm</em>.</li> + <li>Create and configure a new <em>Request Filter</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an + associated <em>Request Filter</em></li> + <li>Remove an associated <em>Request Filter</em>.</li> + </ul> + +</div><h3 id="Default_Context">Default Context</h3><div class="text"> + + <p>From the perspective of a particular <em>Default Context</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Engine</em> or <em>Host</em>.</li> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Environment Entry</em> associated + with this object.</li> + <li>Select and edit the configurable properties of an associated + <em>Environment Entry</em>.</li> + <li>Remove an associated <em>Environment Entry</em>.</li> + <li>Create and configure a new <em>JDBC Resource</em> associated + with this object.</li> + <li>Select and edit the configurable properties of an associated + <em>JDBC Resource</em>.</li> + <li>Remove an associated <em>JDBC Resource</em>.</li> + </ul> + +</div><h3 id="Engine">Engine</h3><div class="text"> + + <p>From the perspective of a particular <em>Engine</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Service</em>.</li> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Access Logger</em> associated + with this object.</li> + <li>Edit the configurable properties of the associated <em>Access + Logger</em>.</li> + <li>Remove the associated <em>Access Logger</em>.</li> + <li>Create and configure a new <em>Default Context</em> associated + with this object.</li> + <li>Edit the configurable properties of the associated <em>Default + Context</em>.</li> + <li>Remove the associated <em>Default Context</em>.</li> + <li>Create and configure a new <em>Host</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an + associated <em>Host</em>.</li> + <li>Remove an associated <em>Host</em>.</li> + <li>Create and configure a new <em>Realm</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Realm</em>.</li> + <li>Remove the associated <em>Realm</em>.</li> + <li>Create and configure a new <em>Request Filter</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an + associated <em>Request Filter</em></li> + <li>Remove an associated <em>Request Filter</em>.</li> + </ul> + +</div><h3 id="Environment_Entry">Environment Entry</h3><div class="text"> + + <p>From the perspective of a particular <em>Environment Entry</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Context</em> or <em>Default Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Host">Host</h3><div class="text"> + + <p>From the perspective of a particular <em>Host</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Engine</em>.</li> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Access Logger</em> associated + with this object.</li> + <li>Edit the configurable properties of the associated <em>Access + Logger</em>.</li> + <li>Remove the associated <em>Access Logger</em>.</li> + <li>Create and configure a new <em>Context</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an associated + <em>Context</em>.</li> + <li>Remove an associated <em>Context</em>.</li> + <li>Create and configure a new <em>Default Context</em> associated + with this object.</li> + <li>Edit the configurable properties of the associated <em>Default + Context</em>.</li> + <li>Remove the associated <em>Default Context</em>.</li> + <li>Create and configure a new <em>Realm</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Realm</em>.</li> + <li>Remove the associated <em>Realm</em>.</li> + <li>Create and configure a new <em>Request Filter</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an + associated <em>Request Filter</em></li> + <li>Remove an associated <em>Request Filter</em>.</li> + </ul> + +</div><h3 id="JDBC_Resource">JDBC Resource</h3><div class="text"> + + <p>From the perspective of a particular <em>JDBC Resource</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Context</em> or <em>Default Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Loader">Loader</h3><div class="text"> + + <p>From the perspective of a particular <em>Loader</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Manager">Manager</h3><div class="text"> + + <p>From the perspective of a particular <em>Manager</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Realm">Realm</h3><div class="text"> + + <p>From the perspective of a particular <em>Realm</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Engine</em>, <em>Host</em>, or + <em>Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Request_Filter">Request Filter</h3><div class="text"> + + <p>From the perspective of a particular <em>Request Filter</em>, it shall + be possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Engine</em>, <em>Host</em>, or + <em>Context</em>.</li> + <li>Edit the configurable properties of this object.</li> + </ul> + +</div><h3 id="Server">Server</h3><div class="text"> + + <p>From the perspective of the overall <em>Server</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Service</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an associated + <em>Service</em>.</li> + </ul> + +</div><h3 id="Service">Service</h3><div class="text"> + + <p>From the perspective of a particular <em>Service</em>, it shall be + possible to perform the following administrative operations:</p> + <ul> + <li>Navigate to the owning <em>Server</em>.</li> + <li>Edit the configurable properties of this object.</li> + <li>Create and configure a new <em>Connector</em> associated with + this object.</li> + <li>Select and edit the configurable properties of an associated + <em>Connector</em>.</li> + <li>Remove an associated <em>Connector</em>.</li> + <li>Create and configure a new <em>Engine</em> associated with + this object.</li> + <li>Edit the configurable properties of the associated <em>Engine</em>.</li> + <li>Remove the associated <em>Engine</em>.</li> + </ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-default.html b/src/tomcat/webapps/docs/funcspecs/fs-default.html new file mode 100644 index 0000000000000000000000000000000000000000..3fb6ac05188dc091375d724348d6203dd7e59999 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-default.html @@ -0,0 +1,270 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Default Servlet</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-default"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Default Servlet</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a><ol><li><a href="#Introduction">Introduction</a></li><li><a href="#External_Specifications">External Specifications</a></li><li><a href="#Implementation_Requirements">Implementation Requirements</a></li></ol></li><li><a href="#Dependencies">Dependencies</a><ol><li><a href="#Environmental_Dependencies">Environmental Dependencies</a></li><li><a href="#Container_Dependencies">Container Dependencies</a></li></ol></li><li><a href="#Functionality">Functionality</a><ol><li><a href="#Initialization_Functionality">Initialization Functionality</a></li><li><a href="#Per-Request_Functionality">Per-Request Functionality</a></li><li><a href="#Finalization_Functionality">Finalization Functionality</a></li></ol></li><li><a href="#Testable_Assertions">Testable Assertions</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + + + <div class="subsection"><h4 id="Introduction">Introduction</h4><div class="text"> + + <p>The purpose of the <strong>Default Servlet</strong> is to serve + static resources of a web application in response to client requests. + As the name implies, it is generally configured as the "default" + servlet for a web application, by being mapped to a URL pattern "/".</p> + + </div></div> + + + <div class="subsection"><h4 id="External_Specifications">External Specifications</h4><div class="text"> + + <p>The following external specifications have provisions which + partially define the correct behavior of the default servlet:</p> + <ul> + <li><a href="http://jcp.org/aboutJava/communityprocess/final/jsr340/index.html"> + Servlet Specification</a> (Version 4.0)</li> + <li><a href="http://www.rfc-editor.org/rfc/rfc2046.txt">Multipurpose + Internet Mail Extensions (MIME) Part Two: Media Types</a></li> + <li><a href="http://www.rfc-editor.org/rfc/rfc2616.txt">Hypertext + Transfer Protocol – HTTP/1.1</a></li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Implementation_Requirements">Implementation Requirements</h4><div class="text"> + + <p>The implementation of this functionality shall conform to the + following requirements:</p> + <ul> + <li>Must be implemented as a servlet.</li> + <li>Must support configurable parameters for debugging detail level, + input buffer size, output buffer size, whether or not to produce + directory listings when no welcome file is present, and whether or not + modifications are supported via DELETE and PUT.</li> + <li>Log debugging and operational messages (suitably internationalized) + via the <code>getServletContext().log()</code> method.</li> + </ul> + + </div></div> + + +</div><h3 id="Dependencies">Dependencies</h3><div class="text"> + + + <div class="subsection"><h4 id="Environmental_Dependencies">Environmental Dependencies</h4><div class="text"> + + <p>The following environmental dependencies must be met in order for + the default servlet to operate correctly:</p> + <ul> + <li>The default servlet must be registered in the application deployment + descriptor (or the default deployment descriptor in file + <code>$CATALINA_BASE/conf/web.xml</code>) using a "default servlet" + servlet mapping, signified by URL pattern "/".</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Container_Dependencies">Container Dependencies</h4><div class="text"> + + <p>Correct operation of the default servlet depends on the following + specific features of the surrounding container:</p> + <ul> + <li>The container shall provide a servlet context attribute that + lists the welcome file names that have been defined for this + web application.</li> + <li>The container shall provide a servlet context attribute that + contains a <code>javax.naming.directory.DirContext</code> + implementation representing the static resources of this + web application.</li> + </ul> + + </div></div> + + +</div><h3 id="Functionality">Functionality</h3><div class="text"> + + + <div class="subsection"><h4 id="Initialization_Functionality">Initialization Functionality</h4><div class="text"> + + <p>The following processing must be performed when the <code>init()</code> + method of the default servlet is called:</p> + <ul> + <li>Process and sanity check configuration parameters.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Per-Request_Functionality">Per-Request Functionality</h4><div class="text"> + + + <p>For all HTTP request methods, the resource path is determined from + the path information provided to this request, either as request attribute + <code>javax.servlet.include.path_info</code> (for a request dispatcher + access to a static resource) or by calling + <code>request.getPathInfo()</code> directly.</p> + + <p>On each HTTP DELETE request processed by this servlet, the following + processing shall be performed:</p> + <ul> + <li>If modifications to the static resources are not allowed (set by a + configuration parameter), return HTTP status 403 (forbidden).</li> + <li>If an attempt is made to delete a resource from <code>/META-INF</code> + or <code>/WEB-INF</code>, return HTTP status 403 (forbidden).</li> + <li>If the requested resource does not exist, return HTTP status 404 + (not found)</li> + <li>Unbind the resource from the directory context containing the + static resources for this web application. If successful, return + HTTP status 204 (no content). Otherwise, return HTTP status 405 + (method not allowed).</li> + </ul> + + + <p>On each HTTP GET request processed by this servlet, the following + processing shall be performed:</p> + <ul> + <li>If the request is for a resource under <code>/META-INF</code> or + <code>/WEB-INF</code>, return HTTP status 404 (not found).</li> + <li>If the requested resource does not exist, return HTTP status 404 + (not found).</li> + <li>If the requested resource is not a directory, but the resource + path ends in "/" or "\", return HTTP status 404 (not found).</li> + <li>If the requested resource is a directory: + <ul> + <li>If the request path does not end with "/", redirect to a + corresponding path with "/" appended so that relative references + in welcome files are resolved correctly.</li> + <li>If one of the specified welcome files exists, redirect to the + path for that welcome file so that it will be served explicitly. + </li> + </ul></li> + <li>If the request being processed contains an <code>If-Range</code> + header, perform the processing described in the HTTP/1.1 specification + to determine whether the client's information is up to date.</li> + <li>Determine the content type of the response, by looking up the + corresponding MIME type in our servlet context.</li> + <li>If the requested resource is a directory: + <ul> + <li>If directory listings are suppressed, return HTTP status 404 + (not found).</li> + <li>Set the content type to <code>text/html</code>.</li> + </ul></li> + <li>Determine the range(s) to be returned, based on the existence of + any <code>If-Range</code> and <code>Range</code> headers.</li> + <li>If the requested resource is a directory, include an <code>ETag</code> + header in the response, with the value calculated based on the content + of the directory.</li> + <li>Include a <code>Last-Modified</code> header in the response documenting + the date/time that the resource was last modified.</li> + <li>Unless we are processing a HEAD request, include the appropriate + content (or content ranges) in the response.</li> + </ul> + + <p>On each HTTP HEAD request processed by this servlet, the following + processing shall be performed:</p> + <ul> + <li>Processed identically to an HTTP GET request, except that the data + content is not transmitted after the headers.</li> + </ul> + + <p>On each HTTP POST request processed by this servlet, the following + processing shall be performed:</p> + <ul> + <li>Processed identically to an HTTP GET request.</li> + </ul> + + + <p>On each HTTP PUT request processed by this servlet, the following + processing shall be performed:</p> + <ul> + <li>If modifications to the static resources are not allowed (set by a + configuration parameter), return HTTP status 403 (forbidden).</li> + <li>If an attempt is made to delete a resource from <code>/META-INF</code> + or <code>/WEB-INF</code>, return HTTP status 403 (forbidden).</li> + <li>Create a new resource from the body of this request.</li> + <li>Bind or rebind the specified path to the new resource (depending on + whether it currently exists or not). Return HTTP status as follows: + <ul> + <li>If binding was unsuccessful, return HTTP status 409 (conflict). + </li> + <li>If binding was successful and the resource did not previously + exist, return HTTP status 201 (created).</li> + <li>If binding was successful and the resource previously existed, + return HTTP status 204 (no content).</li> + </ul></li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Finalization_Functionality">Finalization Functionality</h4><div class="text"> + + <p>No specific processing is required when the <code>destroy()</code> + method is called:</p> + + </div></div> + + +</div><h3 id="Testable_Assertions">Testable Assertions</h3><div class="text"> + + <p>In addition to the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of the default servlet:</p> + <ul> + <li>Requests for resources that do not exist in the web application must + return HTTP status 404 (not found).</li> + <li>The default servlet must operate identically for web applications that + are run out of a WAR file directly, or from an unpacked directory + structure.</li> + <li>If the web application is running out of an unpacked directory + structure, the default servlet must recognize cases where the resource + has been updated through external means.</li> + </ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-jdbc-realm.html b/src/tomcat/webapps/docs/funcspecs/fs-jdbc-realm.html new file mode 100644 index 0000000000000000000000000000000000000000..aec6f90839e0b2a6ec6caa02ca95ae1c256ba0c1 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-jdbc-realm.html @@ -0,0 +1,266 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - JDBCRealm</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-jdbc-realm"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JDBCRealm</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a><ol><li><a href="#Introduction">Introduction</a></li><li><a href="#External_Specifications">External Specifications</a></li><li><a href="#Implementation_Requirements">Implementation Requirements</a></li></ol></li><li><a href="#Dependencies">Dependencies</a><ol><li><a href="#Environmental_Dependencies">Environmental Dependencies</a></li><li><a href="#Container_Dependencies">Container Dependencies</a></li></ol></li><li><a href="#Functionality">Functionality</a><ol><li><a href="#Overview_of_Operation">Overview of Operation</a></li><li><a href="#Detailed_Functional_Requirements">Detailed Functional Requirements</a></li></ol></li><li><a href="#Testable_Assertions">Testable Assertions</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + + + <div class="subsection"><h4 id="Introduction">Introduction</h4><div class="text"> + + <p>The purpose of the <strong>JDBCRealm</strong> implementation is to + provide a mechanism by which Tomcat can acquire information needed + to authenticate web application users, and define their security roles, + from a relational database accessed via JDBC APIs. For integration + with Catalina, the resulting class(es) must implement the + <code>org.apache.catalina.Realm</code> interface.</p> + + <p>This specification reflects a combination of functionality that is + already present in the <code>org.apache.catalina.realm.JDBCRealm</code> + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + <em>[Current]</em> and <em>[Requested]</em> to distinguish them.</p> + + <p>The current status of this functional specification is + <strong>PROPOSED</strong>. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.</p> + + </div></div> + + + <div class="subsection"><h4 id="External_Specifications">External Specifications</h4><div class="text"> + + <p>The implementation of this functionality depends on the following + external specifications:</p> + <ul> + <li><a href="http://www.oracle.com/technetwork/java/javase/jdbc/index.html"> + Java Database Connectivity</a> (version 2.0 or later)</li> + <li><a href="http://www.oracle.com/technetwork/java/javase/jdbc/index.html"> + Java Database Connectivity Optional Package</a> (version 2.0 or later)</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Implementation_Requirements">Implementation Requirements</h4><div class="text"> + + <p>The implementation of this functionality shall conform to the + following requirements:</p> + <ul> + <li>Be realized in one or more implementation classes.</li> + <li>Implement the <code>org.apache.catalina.Realm</code> interface. + [Current]</li> + <li>Implement the <code>org.apache.catalina.Lifecycle</code> + interface. [Current]</li> + <li>Subclass the <code>org.apache.catalina.realm.RealmBase</code> + base class.</li> + <li>Live in the <code>org.apache.catalina.realm</code> package. + [Current]</li> + <li>Support a configurable debugging detail level. [Current]</li> + <li>Log debugging and operational messages (suitably internationalized) + via the <code>getContainer().log()</code> method. [Current]</li> + </ul> + + </div></div> + + +</div><h3 id="Dependencies">Dependencies</h3><div class="text"> + + + <div class="subsection"><h4 id="Environmental_Dependencies">Environmental Dependencies</h4><div class="text"> + + <p>The following environmental dependencies must be met in order for + JDBCRealm to operate correctly:</p> + <ul> + <li>The desire to utilize JDBCRealm must be registered in + <code>$CATALINA_BASE/conf/server.xml</code>, in a + <code><Realm></code> element that is nested inside a + corresponding <code><Engine></code>, <code><Host></code>, + or <code><Context></code> element.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Container_Dependencies">Container Dependencies</h4><div class="text"> + + <p>Correct operation of JDBCRealm depends on the following + specific features of the surrounding container:</p> + <ul> + <li>Interactions with <code>JDBCRealm</code> will be initiated by + the appropriate <code>Authenticator</code> implementation, based + on the login method that is selected.</li> + <li><code>JDBCRealm</code> must have the JDBC standard API classes + available to it. For a JDK 1.2 or later container, these APIs + are included in the standard platform.</li> + <li>When connection pooling is implemented, <code>JDBCRealm</code> + must have the JDBC Optional Package (version 2.0 or later) APIs + available to it. This library is available as a separate + download (and will be included in Tomcat binary distributions).</li> + </ul> + + </div></div> + + +</div><h3 id="Functionality">Functionality</h3><div class="text"> + + + <div class="subsection"><h4 id="Overview_of_Operation">Overview of Operation</h4><div class="text"> + + <p>The main purpose of <code>JDBCRealm</code> is to allow Catalina to + authenticate users, and look up the corresponding security roles, from + the information found in a relational database accessed via JDBC APIs. + For maximum flexibility, the details of how this is done (for example, + the names of the required tables and columns) should be configurable.</p> + + <p>Each time that Catalina needs to authenticate a user, it will call + the <code>authenticate()</code> method of this Realm implementation, + passing the username and password that were specified by the user. If + we find the user in the database (and match on the password), we accumulate + all of the security roles that are defined for this user, and create a + new <code>GenericPrincipal</code> object to be returned. If the user + is not authenticated, we return <code>null</code> instead. The + <code>GenericUser</code> object caches the set of security roles that + were owned by this user at the time of authentication, so that calls to + <code>isUserInRole()</code> can be answered without going back to the + database every time.</p> + + </div></div> + + + <div class="subsection"><h4 id="Detailed_Functional_Requirements">Detailed Functional Requirements</h4><div class="text"> + + + <h3>Configurable Properties</h3> + + <p>The implementation shall support the following properties + that can be configured with JavaBeans property setters:</p> + <ul> + <li>Configuration parameters defining the JDBC driver to use, the + database connection URL to be accessed, and the username/password + to use for logging in. [Current]</li> + <li>Configuration parameters describing the connection pool to be + created to support simultaneous authentications. [Requested]</li> + <li>Name of the tables to be searched for users and roles. [Current]</li> + <li>Name of the columns to be used for usernames, passwords, and + role names. [Current]</li> + </ul> + + <h3>Lifecycle Functionality</h3> + + <p>The following processing must be performed when the <code>start()</code> + method is called:</p> + <ul> + <li>Establish a connection to the configured database, using the + configured username and password. [Current]</li> + <li>Configure and establish a connection pool of connections to the + database. [Requested]</li> + </ul> + + <p>The following processing must be performed when the <code>stop()</code> + method is called:</p> + <ul> + <li>Close any opened connections to the database.</li> + </ul> + + + <h3>Method authenticate() Functionality</h3> + + <p>When <code>authenticate()</code> is called, the following processing + is required:</p> + <ul> + <li>Acquire the one and only connection [Current] or acquire a connection + from the connection pool [Requested].</li> + <li>Select the one and only row from the user's table for this user, + and retrieve the corresponding password column. If zero rows (or + more than one row) are found, return <code>null</code>.</li> + <li>Authenticate the user by comparing the (possibly encrypted) password + value that was received against the password presented by the user. + If there is no match, return <code>null</code>.</li> + <li>Acquire a <code>List</code> of the security roles assigned to the + authenticated user by selecting from the roles table.</li> + <li>Construct a new instance of class + <code>org.apache.catalina.realm.GenericPrincipal</code>, passing as + constructor arguments: this realm instance, the authenticated + username, and a <code>List</code> of the security roles associated + with this user.</li> + <li><strong>WARNING</strong> - Do not attempt to cache and reuse previous + <code>GenericPrincipal</code> objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.</li> + <li>Return the newly constructed <code>GenericPrincipal</code>.</li> + </ul> + + + <h3>Method hasRole() Functionality</h3> + + <p>When <code>hasRole()</code> is called, the following processing + is required:</p> + <ul> + <li>The <code>principal</code> that is passed as an argument SHOULD + be one that we returned (instanceof class + <code>org.apache.catalina.realm.GenericPrincipal</code>, with a + <code>realm</code> property that is equal to our instance.</li> + <li>If the passed <code>principal</code> meets these criteria, check + the specified role against the list returned by + <code>getRoles()</code>, and return <code>true</code> if the + specified role is included; otherwise, return <code>false</code>.</li> + <li>If the passed <code>principal</code> does not meet these criteria, + return <code>false</code>.</li> + </ul> + + </div></div> + +</div><h3 id="Testable_Assertions">Testable Assertions</h3><div class="text"> + + <p>In addition to the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of <code>JDBCRealm</code>:</p> + <ul> + </ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-jndi-realm.html b/src/tomcat/webapps/docs/funcspecs/fs-jndi-realm.html new file mode 100644 index 0000000000000000000000000000000000000000..5de9f0613325af75660c3066199efa663c9798c4 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-jndi-realm.html @@ -0,0 +1,417 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - JNDIRealm</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-jndi-realm"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JNDIRealm</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a><ol><li><a href="#Introduction">Introduction</a></li><li><a href="#External_Specifications">External Specifications</a></li><li><a href="#Implementation_Requirements">Implementation Requirements</a></li></ol></li><li><a href="#Dependencies">Dependencies</a><ol><li><a href="#Environmental_Dependencies">Environmental Dependencies</a></li><li><a href="#Container_Dependencies">Container Dependencies</a></li></ol></li><li><a href="#Functionality">Functionality</a><ol><li><a href="#Operational_Modes">Operational Modes</a></li><li><a href="#Administrator_Login_Mode_Functionality">Administrator Login Mode Functionality</a></li><li><a href="#Username_Login_Mode_Functionality">Username Login Mode Functionality</a></li></ol></li><li><a href="#Testable_Assertions">Testable Assertions</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + + + <div class="subsection"><h4 id="Introduction">Introduction</h4><div class="text"> + + <p>The purpose of the <strong>JNDIRealm</strong> implementation is to + provide a mechanism by which Tomcat can acquire information needed + to authenticate web application users, and define their security roles, + from a directory server or other service accessed via JNDI APIs. For + integration with Catalina, this class must implement the + <code>org.apache.catalina.Realm</code> interface.</p> + + <p>This specification reflects a combination of functionality that is + already present in the <code>org.apache.catalina.realm.JNDIRealm</code> + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + <em>[Current]</em> and <em>[Requested]</em> to distinguish them.</p> + + <p>The current status of this functional specification is + <strong>PROPOSED</strong>. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.</p> + + <p>The code in the current version of <code>JNDIRealm</code>, and the + ideas expressed in this functional specification, are the results of + contributions from many individuals, including (alphabetically):</p> + <ul> + <li>Holman, John <j.g.holman@qmw.ac.uk></li> + <li>Lockhart, Ellen <elockhart@home.com></li> + <li>McClanahan, Craig <craigmcc@apache.org></li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="External_Specifications">External Specifications</h4><div class="text"> + + <p>The implementation of this functionality depends on the following + external specifications:</p> + <ul> + <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html"> + Java Naming and Directory Interface</a> (version 1.2.1 or later)</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Implementation_Requirements">Implementation Requirements</h4><div class="text"> + + <p>The implementation of this functionality shall conform to the + following requirements:</p> + <ul> + <li>Be realized in one or more implementation classes.</li> + <li>Implement the <code>org.apache.catalina.Realm</code> interface. + [Current]</li> + <li>Implement the <code>org.apache.catalina.Lifecycle</code> + interface. [Current]</li> + <li>Subclass the <code>org.apache.catalina.realm.RealmBase</code> + base class.</li> + <li>Live in the <code>org.apache.catalina.realm</code> package. + [Current]</li> + <li>Support a configurable debugging detail level. [Current]</li> + <li>Log debugging and operational messages (suitably internationalized) + via the <code>getContainer().log()</code> method. [Current]</li> + </ul> + + </div></div> + + +</div><h3 id="Dependencies">Dependencies</h3><div class="text"> + + + <div class="subsection"><h4 id="Environmental_Dependencies">Environmental Dependencies</h4><div class="text"> + + <p>The following environmental dependencies must be met in order for + JNDIRealm to operate correctly:</p> + <ul> + <li>The desire to utilize JNDIRealm must be registered in + <code>$CATALINA_BASE/conf/server.xml</code>, in a + <code><Realm></code> element that is nested inside a + corresponding <code><Engine></code>, <code><Host></code>, + or <code><Context></code> element.</li> + <li>If the <em>Administrator Login</em> operational mode is selected, + the configured administrator username and password must be configured + in the corresponding directory server.</li> + <li>If the <em>Username Login</em> operational mode is selected, + the corresponding directory server must be configured to accept + logins with the username and password that will be passed to + <code>JNDIRealm</code> by the appropriate <code>Authenticator</code>. + </li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Container_Dependencies">Container Dependencies</h4><div class="text"> + + <p>Correct operation of JNDIRealm depends on the following + specific features of the surrounding container:</p> + <ul> + <li>Interactions with <code>JNDIRealm</code> will be initiated by + the appropriate <code>Authenticator</code> implementation, based + on the login method that is selected.</li> + </ul> + + </div></div> + + +</div><h3 id="Functionality">Functionality</h3><div class="text"> + + + <div class="subsection"><h4 id="Operational_Modes">Operational Modes</h4><div class="text"> + + <p>The completed <code>JNDIRealm</code> must support two major operational + modes in order to support all of the required use cases. For the purposes + of this document, the modes are called <em>administrator login</em> and + <em>Username Login</em>. They are described further in the following + paragraphs.</p> + + <p>For <em>Administrator Login</em> mode, <code>JNDIRealm</code> will be + configured to establish one or more connections (using a connection pool) + to an appropriate directory server, using JNDI APIs, under a "system + administrator" username and password. This is similar to the approach + normally used to configure <code>JDBCRealm</code> to access authentication + and access control information in a database. It is assumed that the + system administrator username and password that are configured provide + sufficient privileges within the directory server to read (but not modify) + the username, password, and assigned roles for each valid user of the + web application associated with this <code>Realm</code>. The password + can be stored in cleartext, or in one of the digested modes supported by + the <code>org.apache.catalina.realm.RealmBase</code> base class.</p> + + <p>For <em>Username Login</em> mode, <code>JNDIRealm</code> does not + normally remain connected to the directory server. Instead, whenever a + user is to be authenticated, a connection to the directory server + (using the username and password received from the authenticator) is + attempted. If this connection is successful, the user is assumed to be + successfully authenticated. This connection is then utilized to read + the corresponding security roles associated with this user, and the + connection is then broken.</p> + + <p><strong>NOTE</strong> - <em>Username Login</em> mode cannot be used + if you have selected login method <code>DIGEST</code> in your web + application deployment descriptor (<code>web.xml</code>) file. This + restriction exists because the cleartext password is never available + to the container, so it is not possible to bind to the directory server + using the user's username and password.</p> + + <p>Because these operational modes work so differently, the functionality + for each mode will be described separately. Whether or not both modes + are actually supported by a single class (versus a class per mode) is + an implementation detail left to the designer.</p> + + <p><strong>NOTE</strong> - The current implementation only implements + part of the <em>Administrator Lookup</em> mode requirements. It does + not support the <em>Username Lookup</em> mode at all, at this point.</p> + + </div></div> + + + <div class="subsection"><h4 id="Administrator_Login_Mode_Functionality">Administrator Login Mode Functionality</h4><div class="text"> + + + <h3>Configurable Properties</h3> + + <p>The implementation shall support the following properties + that can be configured with JavaBeans property setters:</p> + <ul> + <li><code>connectionURL</code> - URL of the directory server we will + be contacting.</li> + <li><code>contextFactory</code> - Fully qualified class name of the JNDI + context factory used to retrieve our InitialContext. + [com.sun.jndi.ldap.LdapCtxFactory]</li> + <li>Additional configuration properties required to establish the + appropriate connection. [Requested]</li> + <li>Connection pool configuration properties. [Requested]</li> + <li>Configuration properties defining how a particular user is + authenticated. The following capabilities should be supported: + <ul> + <li>Substitute the specified username into a string. [Requested]</li> + <li>Retrieve the distinguished name (DN) of an authorized user via an + LDAP search string with a replacement placeholder for the + username, and comparison of the password to a configurable + attribute retrieved from the search result. [Current]</li> + </ul></li> + <li>Configuration properties defining how the roles associated with a + particular authenticated user can be retrieved. The following + approaches should be supported: + <ul> + <li>Retrieve a specified attribute (possibly multi-valued) + from an LDAP search expression, + with a replacement placeholder for the DN of the user. + [Current]</li> + <li>Retrieve a set of role names that are defined implicitly (by + selecting principals that match a search pattern) rather than + explicitly (by finding a particular attribute value). + [Requested]</li> + </ul></li> + </ul> + + <h3>Lifecycle Functionality</h3> + + <p>The following processing must be performed when the <code>start()</code> + method is called:</p> + <ul> + <li>Establish a connection to the configured directory server, using the + configured system administrator username and password. [Current]</li> + <li>Configure and establish a connection pool of connections to the + directory server. [Requested]</li> + </ul> + + <p>The following processing must be performed when the <code>stop()</code> + method is called:</p> + <ul> + <li>Close any opened connections to the directory server.</li> + </ul> + + + <h3>Method authenticate() Functionality</h3> + + <p>When <code>authenticate()</code> is called, the following processing + is required:</p> + <ul> + <li>Acquire the one and only connection [Current] or acquire a connection + from the connection pool [Requested].</li> + <li>Authenticate the user by retrieving the user's Distinguished Name, + based on the specified username and password.</li> + <li>If the user was not authenticated, release the allocated connection + and return <code>null</code>.</li> + <li>Acquire a <code>List</code> of the security roles assigned to the + authenticated user.</li> + <li>Construct a new instance of class + <code>org.apache.catalina.realm.GenericPrincipal</code>, passing as + constructor arguments: this realm instance, the authenticated + username, and a <code>List</code> of the security roles associated + with this user.</li> + <li><strong>WARNING</strong> - Do not attempt to cache and reuse previous + <code>GenericPrincipal</code> objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.</li> + <li>Return the newly constructed <code>GenericPrincipal</code>.</li> + </ul> + + + <h3>Method hasRole() Functionality</h3> + + <p>When <code>hasRole()</code> is called, the following processing + is required:</p> + <ul> + <li>The <code>principal</code> that is passed as an argument SHOULD + be one that we returned (instanceof class + <code>org.apache.catalina.realm.GenericPrincipal</code>, with a + <code>realm</code> property that is equal to our instance.</li> + <li>If the passed <code>principal</code> meets these criteria, check + the specified role against the list returned by + <code>getRoles()</code>, and return <code>true</code> if the + specified role is included; otherwise, return <code>false</code>.</li> + <li>If the passed <code>principal</code> does not meet these criteria, + return <code>false</code>.</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Username_Login_Mode_Functionality">Username Login Mode Functionality</h4><div class="text"> + + <h3>Configurable Properties</h3> + + <p>The implementation shall support the following properties + that can be configured with JavaBeans property setters:</p> + <ul> + <li><code>connectionURL</code> - URL of the directory server we will + be contacting.</li> + <li><code>contextFactory</code> - Fully qualified class name of the JNDI + context factory used to retrieve our InitialContext. + [com.sun.jndi.ldap.LdapCtxFactory]</li> + <li>Additional configuration properties required to establish the + appropriate connection. [Requested]</li> + <li>Connection pool configuration properties. [Requested]</li> + <li>Configuration properties defining if and how a user might be looked + up before binding to the directory server. The following approaches + should be supported: + <ul> + <li>No previous lookup is required - username specified by the user + is the same as that used to authenticate to the directory + server.</li> + <li>Substitute the specified username into a string.</li> + <li>Search the directory server based on configured criteria to + retrieve the distinguished name of the user, then attempt to + bind with that distinguished name.</li> + </ul></li> + <li>Configuration properties defining how the roles associated with a + particular authenticated user can be retrieved. The following + approaches should be supported: + <ul> + <li>Retrieve a specified attribute (possibly multi-valued) + from an LDAP search expression, + with a replacement placeholder for the DN of the user. + [Current]</li> + </ul></li> + </ul> + + <h3>Lifecycle Functionality</h3> + + <p>The following processing must be performed when the <code>start()</code> + method is called:</p> + <ul> + <li>None required.</li> + </ul> + + <p>The following processing must be performed when the <code>stop()</code> + method is called:</p> + <ul> + <li>None required.</li> + </ul> + + + <h3>Method authenticate() Functionality</h3> + + <p>When <code>authenticate()</code> is called, the following processing + is required:</p> + <ul> + <li>Attempt to bind to the directory server, using the username and + password provided by the user.</li> + <li>If the user was not authenticated, release the allocated connection + and return <code>null</code>.</li> + <li>Acquire a <code>List</code> of the security roles assigned to the + authenticated user.</li> + <li>Construct a new instance of class + <code>org.apache.catalina.realm.GenericPrincipal</code>, passing as + constructor arguments: this realm instance, the authenticated + username, and a <code>List</code> of the security roles associated + with this user.</li> + <li><strong>WARNING</strong> - Do not attempt to cache and reuse previous + <code>GenericPrincipal</code> objects for a particular user, because + the information in the directory server might have changed since the + last time this user was authenticated.</li> + <li>Return the newly constructed <code>GenericPrincipal</code>.</li> + </ul> + + + <h3>Method hasRole() Functionality</h3> + + <p>When <code>hasRole()</code> is called, the following processing + is required:</p> + <ul> + <li>The <code>principal</code> that is passed as an argument SHOULD + be one that we returned (instanceof class + <code>org.apache.catalina.realm.GenericPrincipal</code>, with a + <code>realm</code> property that is equal to our instance.</li> + <li>If the passed <code>principal</code> meets these criteria, check + the specified role against the list returned by + <code>getRoles()</code>, and return <code>true</code> if the + specified role is included; otherwise, return <code>false</code>.</li> + <li>If the passed <code>principal</code> does not meet these criteria, + return <code>false</code>.</li> + </ul> + + </div></div> + +</div><h3 id="Testable_Assertions">Testable Assertions</h3><div class="text"> + + <p>In addition to the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of <code>JNDIRealm</code>:</p> + <ul> + </ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/fs-memory-realm.html b/src/tomcat/webapps/docs/funcspecs/fs-memory-realm.html new file mode 100644 index 0000000000000000000000000000000000000000..8c0fe01354b32ecc4e1cabd3b71e9b1b6efd249d --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/fs-memory-realm.html @@ -0,0 +1,253 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - MemoryRealm</title><meta name="author" content="Craig McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/fs-memory-realm"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>MemoryRealm</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a><ol><li><a href="#Introduction">Introduction</a></li><li><a href="#External_Specifications">External Specifications</a></li><li><a href="#Implementation_Requirements">Implementation Requirements</a></li></ol></li><li><a href="#Dependencies">Dependencies</a><ol><li><a href="#Environmental_Dependencies">Environmental Dependencies</a></li><li><a href="#Container_Dependencies">Container Dependencies</a></li></ol></li><li><a href="#Functionality">Functionality</a><ol><li><a href="#Overview_of_Operation">Overview of Operation</a></li><li><a href="#Detailed_Functional_Requirements">Detailed Functional Requirements</a></li></ol></li><li><a href="#Testable_Assertions">Testable Assertions</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> + + + <div class="subsection"><h4 id="Introduction">Introduction</h4><div class="text"> + + <p>The purpose of the <strong>MemoryRealm</strong> implementation is to + provide a mechanism by which Tomcat can acquire information needed + to authenticate web application users, and define their security roles, + from a simple text-based configuration file in XML format. This is + intended to simplify the initial installation and operation of Tomcat, + without the complexity of configuring a database or directory server + based Realm. It is not intended for production use.</p> + + <p>This specification reflects a combination of functionality that is + already present in the <code>org.apache.catalina.realm.MemoryRealm</code> + class, as well as requirements for enhancements that have been + discussed. Where appropriate, requirements statements are marked + <em>[Current]</em> and <em>[Requested]</em> to distinguish them.</p> + + <p>The current status of this functional specification is + <strong>PROPOSED</strong>. It has not yet been discussed and + agreed to on the TOMCAT-DEV mailing list.</p> + + </div></div> + + + <div class="subsection"><h4 id="External_Specifications">External Specifications</h4><div class="text"> + + <p>The implementation of this functionality depends on the following + external specifications:</p> + <ul> + <li>None</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Implementation_Requirements">Implementation Requirements</h4><div class="text"> + + <p>The implementation of this functionality shall conform to the + following requirements:</p> + <ul> + <li>Be realized in one or more implementation classes.</li> + <li>Implement the <code>org.apache.catalina.Realm</code> interface. + [Current]</li> + <li>Implement the <code>org.apache.catalina.Lifecycle</code> + interface. [Current]</li> + <li>Subclass the <code>org.apache.catalina.realm.RealmBase</code> + base class.</li> + <li>Live in the <code>org.apache.catalina.realm</code> package. + [Current]</li> + <li>Support a configurable debugging detail level. [Current]</li> + <li>Log debugging and operational messages (suitably internationalized) + via the <code>getContainer().log()</code> method. [Current]</li> + </ul> + + </div></div> + + +</div><h3 id="Dependencies">Dependencies</h3><div class="text"> + + + <div class="subsection"><h4 id="Environmental_Dependencies">Environmental Dependencies</h4><div class="text"> + + <p>The following environmental dependencies must be met in order for + MemoryRealm to operate correctly:</p> + <ul> + <li>The desire to utilize MemoryRealm must be registered in + <code>$CATALINA_BASE/conf/server.xml</code>, in a + <code><Realm></code> element that is nested inside a + corresponding <code><Engine></code>, <code><Host></code>, + or <code><Context></code> element. (This is already + included in the default <code>server.xml</code> file.)</li> + </ul> + + </div></div> + + + <div class="subsection"><h4 id="Container_Dependencies">Container Dependencies</h4><div class="text"> + + <p>Correct operation of MemoryRealm depends on the following + specific features of the surrounding container:</p> + <ul> + <li>Interactions with <code>MemoryRealm</code> will be initiated by + the appropriate <code>Authenticator</code> implementation, based + on the login method that is selected.</li> + <li><code>MemoryRealm</code> must have an XML parser compatible with + the JAXP/1.1 APIs available to it. This is normally accomplished + by placing the corresponding JAR files in directory + <code>$CATALINA_HOME/lib</code>.</li> + </ul> + + </div></div> + + +</div><h3 id="Functionality">Functionality</h3><div class="text"> + + + <div class="subsection"><h4 id="Overview_of_Operation">Overview of Operation</h4><div class="text"> + + <p>The main purpose of <code>MemoryRealm</code> is to allow Catalina to + authenticate users, and look up the corresponding security roles, from + the information found in an XML-format configuration file. The format + of this file is described below. When a <code>MemoryRealm</code> + instance is started, it will read the contents of this XML file and create + an "in memory database" of all the valid users and their associated + security roles.</p> + + <p>Each time that Catalina needs to authenticate a user, it will call + the <code>authenticate()</code> method of this Realm implementation, + passing the username and password that were specified by the user. If + we find the user in the database (and match on the password), we accumulate + all of the security roles that are defined for this user, and create a + new <code>GenericPrincipal</code> object to be returned. If the user + is not authenticated, we return <code>null</code> instead. The + <code>GenericUser</code> object caches the set of security roles that + were owned by this user at the time of authentication, so that calls to + <code>isUserInRole()</code> can be answered without going back to the + database every time.</p> + + </div></div> + + + <div class="subsection"><h4 id="Detailed_Functional_Requirements">Detailed Functional Requirements</h4><div class="text"> + + + <h3>Configurable Properties</h3> + + <p>The implementation shall support the following properties + that can be configured with JavaBeans property setters:</p> + <ul> + <li>Configurable debugging detail level.</li> + <li>Configurable file pathname (absolute or relative to + <code>$CATALINA_BASE</code> of the XML file containing our + defined users. [<code>conf/tomcat-users.xml</code>].</li> + </ul> + + <h3>Lifecycle Functionality</h3> + + <p>The following processing must be performed when the <code>start()</code> + method is called:</p> + <ul> + <li>Open and parse the specified XML file.</li> + <li>Create an in-memory database representation of the XML file + contents.</li> + <li><strong>NOTE</strong> - There is no requirement to recognize + subsequent changes to the contents of the XML file.</li> + </ul> + + <p>The following processing must be performed when the <code>stop()</code> + method is called:</p> + <ul> + <li>Release object references to the in-memory database representation.</li> + </ul> + + + <h3>Method authenticate() Functionality</h3> + + <p>When <code>authenticate()</code> is called, the following processing + is required:</p> + <ul> + <li>Select the one and only "user" instance from the in-memory database, + based on matching the specified username. If there is no such + instance, return <code>null</code>.</li> + <li>Authenticate the user by comparing the (possibly encrypted) password + value that was received against the password presented by the user. + If there is no match, return <code>null</code>.</li> + <li>Construct a new instance of class + <code>org.apache.catalina.realm.GenericPrincipal</code> (if not + already using this as the internal database representation) that + contains the authenticated username and a <code>List</code> of the + security roles associated with this user.</li> + <li>Return the newly constructed <code>GenericPrincipal</code>.</li> + </ul> + + + <h3>Method hasRole() Functionality</h3> + + <p>When <code>hasRole()</code> is called, the following processing + is required:</p> + <ul> + <li>The <code>principal</code> that is passed as an argument SHOULD + be one that we returned (instanceof class + <code>org.apache.catalina.realm.GenericPrincipal</code>, with a + <code>realm</code> property that is equal to our instance.</li> + <li>If the passed <code>principal</code> meets these criteria, check + the specified role against the list returned by + <code>getRoles()</code>, and return <code>true</code> if the + specified role is included; otherwise, return <code>false</code>.</li> + <li>If the passed <code>principal</code> does not meet these criteria, + return <code>false</code>.</li> + </ul> + + </div></div> + +</div><h3 id="Testable_Assertions">Testable Assertions</h3><div class="text"> + + <p>In addition to the assertions implied by the functionality requirements + listed above, the following additional assertions shall be tested to + validate the behavior of <code>MemoryRealm</code>:</p> + <ul> + </ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/index.html b/src/tomcat/webapps/docs/funcspecs/index.html new file mode 100644 index 0000000000000000000000000000000000000000..4b63635502ae1412198504a9874de02519e540cf --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/index.html @@ -0,0 +1,80 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Table of Contents</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/index"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Table of Contents</h2><h3 id="Catalina_Functional_Specifications">Catalina Functional Specifications</h3><div class="text"> + +<p>This documentation area includes <em>functional specifications</em> for +many features supported by the <strong>Catalina</strong> servlet container +portion of Tomcat. In most cases, these features are not documented in the +underlying Servlet or JSP specifications, so a definition of the expected +correct behavior is important both to implementors of those features, and to +test writers trying to decide what to test.</p> + +<p>The functional specifications are divided into the following categories +in the menu (to the left):</p> +<ul> +<li><em>Administrative Apps</em> - Overall requirements for supporting an + ability to configure and operate a Tomcat installation through tools, + as well as detailed requirements for the tools themselves.</li> +<li><em>Internal Servlets</em> - Requirements for Catalina features that are + implemented as internal, container-managed, servlets.</li> +<li><em>Realm Implementations</em> - Requirements for the implementations of + the <code>org.apache.catalina.Realm</code> interface (providing access to + collections of users, passwords and roles) that are included in the + standard Tomcat distribution.</li> +</ul> + +<p><em>NOTE</em> - In some cases, the contents of these functional specs has +been "reverse engineered" from existing implementations. This exercise is +still useful, because it provides an introduction to <strong>what</strong> +Catalina does, without being as concerned with <strong>how</strong> this is +accomplished.</p> + +<p><strong>TODO</strong> - Obviously, this area has a long ways to go before +it is complete. Contributions are welcome!</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/funcspecs/mbean-names.html b/src/tomcat/webapps/docs/funcspecs/mbean-names.html new file mode 100644 index 0000000000000000000000000000000000000000..0c1610f0ff410c36ffda74bb1ce12712403cb5f0 --- /dev/null +++ b/src/tomcat/webapps/docs/funcspecs/mbean-names.html @@ -0,0 +1,701 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Catalina Functional Specifications (9.0.6) - Tomcat MBean Names</title><meta name="author" content="Craig McClanahan"><meta name="author" content="Amy Roh"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/funcspecs/mbean-names"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Catalina Functional Specifications</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="index.html">Functional Specs</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>Administrative Apps</h2><ul><li><a href="fs-admin-apps.html">Overall Requirements</a></li><li><a href="mbean-names.html">Tomcat MBean Names</a></li><li><a href="fs-admin-objects.html">Administered Objects</a></li><li><a href="fs-admin-opers.html">Supported Operations</a></li></ul></div><div><h2>Internal Servlets</h2><ul><li><a href="fs-default.html">Default Servlet</a></li></ul></div><div><h2>Realm Implementations</h2><ul><li><a href="fs-jdbc-realm.html">JDBC Realm</a></li><li><a href="fs-jndi-realm.html">JNDI Realm</a></li><li><a href="fs-memory-realm.html">Memory Realm</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat MBean Names</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Background">Background</a></li><li><a href="#Catalina_Object_Hierarchy">Catalina Object Hierarchy</a></li><li><a href="#MBean_Groups_and_Names">MBean Groups and Names</a></li><li><a href="#JSR-88_Cross_Reference">JSR-88 Cross Reference</a></li></ul> +</div><h3 id="Background">Background</h3><div class="text"> + + <p>We will be using <em>JMX MBeans</em> as the technology for + implementing manageability of Tomcat.</p> + + <p>One of the key concepts of JMX is that each management bean has a unique + name in the MBeanServer's registry, and that management applications can + utilize these names to retrieve the MBean of interest to them for a + particular management operation. This document proposes a naming convention + for MBeans that allows easy calculation of the name for a particular MBean. + For background information on JMX MBean names, see the <em>Java Management + Extensions Instrumentation and Agent Specification</em>, version 1.0, + section 6. In particular, we will be discussing the String Representation of + <code>ObjectName</code> instances.</p> + +</div><h3 id="Catalina_Object_Hierarchy">Catalina Object Hierarchy</h3><div class="text"> + +<p>Tomcat's servlet container implementation, called Catalina, can be +represented as a hierarchy of objects that contain references to each other. +The object hierarchy can be represented as a tree, or (isomorphically) based +on the nesting of configuration elements in the <code>conf/server.xml</code> +file that is traditionally used to configure Tomcat stand-alone.</p> + +<p>The valid component nestings for Catalina are depicted in the following +table, with columns that contain the following values:</p> +<ul> +<li><em>Pattern</em> - Nesting pattern of XML elements (in the + <code>conf/server.xml</code> file) used to configure this component.</li> +<li><em>Cardinality</em> - Minimum and maximum number of occurrences of + this element at this nesting position, which also corresponds to the + minimum and maximum number of Catalina components.</li> +<li><em>Identifier</em> - Name of the JavaBeans property of this component + that represents the unique identifier (within the nested hierarchy), + if any.</li> +<li><em>MBean ObjectName</em> - The portion of the MBean object name that + appears <strong>after</strong> the domain name. For now, it should be + assumed that all of these MBeans appear in the default JMX domain.</li> +</ul> + +<p>In the <em>MBean ObjectName</em> descriptions, several types of symbolic +expressions are utilized to define variable text that is replaced by +corresponding values:</p> +<ul> +<li><em>${GROUP}</em> - One of the standard MBean names of the specified + "group" category. For example, the expression <code>${REALM}</code> + represents the values like <code>JDBCRealm</code> and <code>JAASRealm</code> + that identify the various MBeans for possible <code>Realm</code> components.</li> +<li><em>${name}</em> - Replaced by the value of property <code>name</code> + from the current component.</li> +<li><em>${parent.name}</em> - Replaced by the value of property + <code>name</code> from a parent of the current component, with the + parent's type identified by <em>parent</em>.</li> +<li><em>${###}</em> - An arbitrary numeric identifier that preserves + order but has no other particular meaning. In general, the server will + assign numeric values to existing instances with large gaps into which + new items can be configured if desired.</li> +</ul> + +<table class="defaultTable"> + + <tr> + <th>Pattern</th> + <th>Cardinality</th> + <th>Identifier</th> + <th>MBean ObjectName</th> + </tr> + + <tr> + <td>Server</td> + <td style="text-align: center;">1..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${SERVER}</code></td> + </tr> + + <tr> + <td>Server / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}</code></td> + </tr> + + <tr> + <td>Server / Service</td> + <td style="text-align: center;">1..n</td> + <td style="text-align: center;"><code class="noHighlight">name</code></td> + <td><code class="noHighlight">type=${SERVICE}, name=${name}</code></td> + </tr> + + <tr> + <td>Server / Service / Connector</td> + <td style="text-align: center;">1..n</td> + <td style="text-align: center;"><code class="noHighlight">address, port</code></td> + <td><code class="noHighlight">type=${CONNECTOR}, service=${service}, port=${port}, + address=${address}</code></td> + </tr> + + <tr> + <td>Server / Service / Connector / Factory</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td>(Only defined explicitly for an SSL connector, but can be treated + as part of the connector component)</td> + </tr> + + <tr> + <td>Server / Service / Connector / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}, service=${service}, + port=${connector.port}, address=${connector.address}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine</td> + <td style="text-align: center;">1..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${ENGINE}, service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host</td> + <td style="text-align: center;">1..n</td> + <td style="text-align: center;"><code class="noHighlight">name</code></td> + <td><code class="noHighlight">type=${HOST}, host=${name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context</td> + <td style="text-align: center;">1..n</td> + <td style="text-align: center;"><code class="noHighlight">path</code></td> + <td><code class="noHighlight">type=${CONTEXT}, context=${name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}, context=${context.name}, + host=${host.name}, service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Loader</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LOADER}, context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Manager</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${MANAGER}, context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Realm</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${REALM}, context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Resources</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${RESOURCES}, context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Valve</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${VALVE}, sequence=${###}, context=${context.name}, + host=${host.name}, service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / Wrapper</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">j2eeType=Servlet,name=${name}, + WebModule=//${host.name}/${context.name}, + J2EEApplication=${context.J2EEApplication}, + J2EEServer=${context.J2EEServer}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / WrapperLifecycle</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${WRAPPER-LIFECYCLE}, sequence=${###}, + context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Context / WrapperListener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${WRAPPER-LISTENER}, sequence=${###}, + context=${context.name}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Realm</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${REALM}, host=${host.name}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Host / Valve</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${VALVE}, sequence=${###}, + host=${host.name}, service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}</code> + (<strong>FIXME</strong> - disambiguate from Server / Service / + Listener)</td> + </tr> + + <tr> + <td>Server / Service / Engine / Realm</td> + <td style="text-align: center;">0..1</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${REALM}, service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Engine / Valve</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${VALVE}, sequence=${###}, + service=${service.name}</code></td> + </tr> + + <tr> + <td>Server / Service / Listener</td> + <td style="text-align: center;">0..n</td> + <td style="text-align: center;">(none)</td> + <td><code class="noHighlight">type=${LISTENER}, sequence=${###}</code> + (<strong>FIXME</strong> - disambiguate from Server / Service / + Engine / Listener)</td> + </tr> + +</table> + +</div><h3 id="MBean_Groups_and_Names">MBean Groups and Names</h3><div class="text"> + +<p>The following MBean names shall be defined in the resource file +<code>/org/apache/catalina/mbeans/mbeans-descriptors.xml</code> (and +therefore available for use within the Administration/Configuration +web application for Tomcat):</p> + +<table class="defaultTable"> + + <tr> + <th>MBean Name</th> + <th>Group Name</th> + <th>Catalina Interface</th> + <th>Implementation Class</th> + </tr> + + <tr> + <td><code class="noHighlight">AccessLogValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.AccessLogValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">BasicAuthenticator</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.authenticator.BasicAuthenticator</code></td> + </tr> + + <tr> + <td><code class="noHighlight">CertificatesValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.CertificatesValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ContextConfig</code></td> + <td style="text-align: center;"><code class="noHighlight">LISTENER</code></td> + <td><code class="noHighlight">org.apache.catalina.LifecycleListener</code></td> + <td><code class="noHighlight">org.apache.catalina.startup.ContextConfig</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ContextEnvironment</code></td> + <td style="text-align: center;"><code class="noHighlight">RESOURCES</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextEnvironment</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextEnvironment</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ContextResource</code></td> + <td style="text-align: center;"><code class="noHighlight">RESOURCES</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextResource</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextResource</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ContextResourceLink</code></td> + <td style="text-align: center;"><code class="noHighlight">RESOURCES</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextResourceLink</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.ContextResourceLink</code></td> + </tr> + + <tr> + <td><code class="noHighlight">CoyoteConnector</code></td> + <td style="text-align: center;"><code class="noHighlight">CONNECTOR</code></td> + <td><code class="noHighlight">org.apache.catalina.Connector</code></td> + <td><code class="noHighlight">org.apache.coyote.tomcat4.CoyoteConnector</code></td> + </tr> + + <tr> + <td><code class="noHighlight">DigestAuthenticator</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.authenticator.DigestAuthenticator</code></td> + </tr> + + <tr> + <td><code class="noHighlight">EngineConfig</code></td> + <td style="text-align: center;"><code class="noHighlight">LISTENER</code></td> + <td><code class="noHighlight">org.apache.catalina.LifecycleListener</code></td> + <td><code class="noHighlight">org.apache.catalina.startup.EngineConfig</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ErrorReportValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.ErrorReportValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">ErrorDispatcherValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.ErrorDispatcherValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">FormAuthenticator</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.authenticator.FormAuthenticator</code></td> + </tr> + + <tr> + <td><code class="noHighlight">Group</code></td> + <td style="text-align: center;"><code class="noHighlight">GROUP</code></td> + <td><code class="noHighlight">org.apache.catalina.Group</code></td> + <td><code class="noHighlight">org.apache.catalina.Group</code></td> + </tr> + + <tr> + <td><code class="noHighlight">HostConfig</code></td> + <td style="text-align: center;"><code class="noHighlight">LISTENER</code></td> + <td><code class="noHighlight">org.apache.catalina.LifecycleListener</code></td> + <td><code class="noHighlight">org.apache.catalina.startup.HostConfig</code></td> + </tr> + + <tr> + <td><code class="noHighlight">HttpConnector10</code></td> + <td style="text-align: center;"><code class="noHighlight">CONNECTOR</code></td> + <td><code class="noHighlight">org.apache.catalina.Connector</code></td> + <td><code class="noHighlight">org.apache.catalina.connector.http10.HttpConnector</code></td> + </tr> + + <tr> + <td><code class="noHighlight">HttpConnector11</code></td> + <td style="text-align: center;"><code class="noHighlight">CONNECTOR</code></td> + <td><code class="noHighlight">org.apache.catalina.Connector</code></td> + <td><code class="noHighlight">org.apache.catalina.connector.http.HttpConnector</code></td> + </tr> + + <tr> + <td><code class="noHighlight">JAASRealm</code></td> + <td style="text-align: center;"><code class="noHighlight">REALM</code></td> + <td><code class="noHighlight">org.apache.catalina.Realm</code></td> + <td><code class="noHighlight">org.apache.catalina.realm.JAASRealm</code></td> + </tr> + + <tr> + <td><code class="noHighlight">JDBCRealm</code></td> + <td style="text-align: center;"><code class="noHighlight">REALM</code></td> + <td><code class="noHighlight">org.apache.catalina.Realm</code></td> + <td><code class="noHighlight">org.apache.catalina.realm.JDBCRealm</code></td> + </tr> + + <tr> + <td><code class="noHighlight">JDBCUserDatabase</code></td> + <td style="text-align: center;"><code class="noHighlight">USERDATABASE</code></td> + <td><code class="noHighlight">org.apache.catalina.users.JDBCUserDatabase</code></td> + <td><code class="noHighlight">org.apache.catalina.users.JDBCUserDatabase</code></td> + </tr> + + <tr> + <td><code class="noHighlight">JNDIRealm</code></td> + <td style="text-align: center;"><code class="noHighlight">REALM</code></td> + <td><code class="noHighlight">org.apache.catalina.Realm</code></td> + <td><code class="noHighlight">org.apache.catalina.realm.JNDIRealm</code></td> + </tr> + + <tr> + <td><code class="noHighlight">MBeanFactory</code></td> + <td style="text-align: center;"><code class="noHighlight"></code></td> + <td><code class="noHighlight"></code></td> + <td><code class="noHighlight">org.apache.catalina.mbeans.MBeanFactory</code></td> + </tr> + + <tr> + <td><code class="noHighlight">MemoryRealm</code></td> + <td style="text-align: center;"><code class="noHighlight">REALM</code></td> + <td><code class="noHighlight">org.apache.catalina.Realm</code></td> + <td><code class="noHighlight">org.apache.catalina.realm.MemoryRealm</code></td> + </tr> + + <tr> + <td><code class="noHighlight">MemoryUserDatabase</code></td> + <td style="text-align: center;"><code class="noHighlight">USERDATABASE</code></td> + <td><code class="noHighlight">org.apache.catalina.users.MemoryUserDatabase</code></td> + <td><code class="noHighlight">org.apache.catalina.users.MemoryUserDatabase</code></td> + </tr> + + <tr> + <td><code class="noHighlight">NamingContextListener</code></td> + <td style="text-align: center;"><code class="noHighlight">LISTENER</code></td> + <td><code class="noHighlight">org.apache.catalina.LifecycleListener</code></td> + <td><code class="noHighlight">org.apache.catalina.core.NamingContextListener</code></td> + </tr> + + <tr> + <td><code class="noHighlight">NamingResources</code></td> + <td style="text-align: center;"><code class="noHighlight">RESOURCES</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.NamingResources</code></td> + <td><code class="noHighlight">org.apache.catalina.deploy.NamingResources</code></td> + </tr> + + <tr> + <td><code class="noHighlight">NonLoginAuthenticator</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.authenticator.NonLoginAuthenticator</code></td> + </tr> + + <tr> + <td><code class="noHighlight">PersistentManager</code></td> + <td style="text-align: center;"><code class="noHighlight">MANAGER</code></td> + <td><code class="noHighlight">org.apache.catalina.Manager</code></td> + <td><code class="noHighlight">org.apache.catalina.session.PersistentManager</code></td> + </tr> + + <tr> + <td><code class="noHighlight">RemoteAddrValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.RemoteAddrValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">RemoteHostValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.RemoteHostValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">RequestDumperValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.RequestDumperValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">Role</code></td> + <td style="text-align: center;"><code class="noHighlight">ROLE</code></td> + <td><code class="noHighlight">org.apache.catalina.Role</code></td> + <td><code class="noHighlight">org.apache.catalina.Role</code></td> + </tr> + + <tr> + <td><code class="noHighlight">SingleSignOn</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.valves.SingleSignOn</code></td> + </tr> + + <tr> + <td><code class="noHighlight">SSLAuthenticator</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.authenticator.SSLAuthenticator</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardContext</code></td> + <td style="text-align: center;"><code class="noHighlight">CONTEXT</code></td> + <td><code class="noHighlight">org.apache.catalina.Context</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardContext</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardContextValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardContextValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardEngine</code></td> + <td style="text-align: center;"><code class="noHighlight">ENGINE</code></td> + <td><code class="noHighlight">org.apache.catalina.Engine</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardEngine</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardEngineValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardEngineValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardHost</code></td> + <td style="text-align: center;"><code class="noHighlight">HOST</code></td> + <td><code class="noHighlight">org.apache.catalina.Host</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardHost</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardHostValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardHostValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardManager</code></td> + <td style="text-align: center;"><code class="noHighlight">MANAGER</code></td> + <td><code class="noHighlight">org.apache.catalina.Manager</code></td> + <td><code class="noHighlight">org.apache.catalina.session.StandardManager</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardServer</code></td> + <td style="text-align: center;"><code class="noHighlight">SERVER</code></td> + <td><code class="noHighlight">org.apache.catalina.Server</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardServer</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardService</code></td> + <td style="text-align: center;"><code class="noHighlight">SERVICE</code></td> + <td><code class="noHighlight">org.apache.catalina.Service</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardService</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardWrapper</code></td> + <td style="text-align: center;"><code class="noHighlight">WRAPPER</code></td> + <td><code class="noHighlight">org.apache.catalina.Wrapper</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardWrapper</code></td> + </tr> + + <tr> + <td><code class="noHighlight">StandardWrapperValve</code></td> + <td style="text-align: center;"><code class="noHighlight">VALVE</code></td> + <td><code class="noHighlight">org.apache.catalina.Valve</code></td> + <td><code class="noHighlight">org.apache.catalina.core.StandardWrapperValve</code></td> + </tr> + + <tr> + <td><code class="noHighlight">User</code></td> + <td style="text-align: center;"><code class="noHighlight">USER</code></td> + <td><code class="noHighlight">org.apache.catalina.User</code></td> + <td><code class="noHighlight">org.apache.catalina.User</code></td> + </tr> + + <tr> + <td><code class="noHighlight">UserDatabaseRealm</code></td> + <td style="text-align: center;"><code class="noHighlight">REALM</code></td> + <td><code class="noHighlight">org.apache.catalina.Realm</code></td> + <td><code class="noHighlight">org.apache.catalina.realm.UserDatabaseRealm</code></td> + </tr> + + <tr> + <td><code class="noHighlight">WebappLoader</code></td> + <td style="text-align: center;"><code class="noHighlight">LOADER</code></td> + <td><code class="noHighlight">org.apache.catalina.Loader</code></td> + <td><code class="noHighlight">org.apache.catalina.loader.WebappLoader</code></td> + </tr> + +</table> + +</div><h3 id="JSR-88_Cross_Reference">JSR-88 Cross Reference</h3><div class="text"> + +<p>The deployment objects in the JSR-88 API object hierarchy correspond +to the specified MBean names or groups as follows:</p> + +<table class="defaultTable"> + + <tr> + <th>JSR-88 API Object</th> + <th>MBean Name or Group</th> + <th>Comments</th> + </tr> + + <tr> + <td><code class="noHighlight">DeployableObject</code></td> + <td><code class="noHighlight">${CONTEXT}</code></td> + <td>Context deployment info plus the corresponding WAR file</td> + </tr> + + <tr> + <td><code class="noHighlight">Target</code></td> + <td><code class="noHighlight">${HOST}</code></td> + <td></td> + </tr> + +</table> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/host-manager-howto.html b/src/tomcat/webapps/docs/host-manager-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..e75d88689b028c73a3e33c966d68316d56f03822 --- /dev/null +++ b/src/tomcat/webapps/docs/host-manager-howto.html @@ -0,0 +1,252 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Host Manager App -- Text Interface</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/host-manager-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Host Manager App -- Text Interface</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> + <ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#List_of_Commands">List of Commands</a><ol><li><a href="#List_command">List command</a></li><li><a href="#Add_command">Add command</a></li><li><a href="#Remove_command">Remove command</a></li><li><a href="#Start_command">Start command</a></li><li><a href="#Stop_command">Stop command</a></li><li><a href="#Persist_command">Persist command</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The <strong>Tomcat Host Manager</strong> application enables you to create, + delete, and otherwise manage virtual hosts within Tomcat. This how-to guide + is best accompanied by the following pieces of documentation: + </p> + <ul> + <li> + <a href="virtual-hosting-howto.html">Virtual Hosting How-To</a> for more + information about virtual hosting. + </li> + <li> + <a href="config/host.html">The Host Container</a> for more information + about the underlying xml configuration of virtual hosts and description + of attributes. + </li> + </ul> + + <p> + The <strong>Tomcat Host Manager</strong> application is a part of + Tomcat installation, by default available using the following + context: <code>/host-manager</code>. You can use the host manager in the + following ways: + </p> + + <ul> + <li> + Utilizing the graphical user interface, accessible at: + <code>{server}:{port}/host-manager/html</code>. + </li> + <li> + Utilizing a set of minimal HTTP requests suitable for scripting. + You can access this mode at: + <code>{server}:{port}/host-manager/text</code>. + </li> + </ul> + <p> + Both ways enable you to add, remove, start, and stop virtual hosts. Changes + may be presisted by using the <code>persist</code> command. This document + focuses on the text interface. For further information about the graphical + interface, see + <a href="html-host-manager-howto.html">Host Manager App -- HTML Interface</a>. + </p> +</div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text"> + <p><em>The description below uses <code>$CATALINA_HOME</code> to refer the + base Tomcat directory. It is the directory in which you installed + Tomcat, for example <code>C:/tomcat9</code>, or + <code>/usr/share/tomcat9</code>.</em></p> + + <p> + The Host Manager application requires a user with one of the following + roles: + </p> + + <ul> + <li> + <code>admin-gui</code> - use this role for the graphical web interface. + </li> + <li> + <code>admin-script</code> - use this role for the scripting web interface. + </li> + </ul> + + <p> + To enable access to the text interface of the Host Manager application, + either grant your Tomcat user the appropriate role, or create a new one with + the correct role. For example, open + <code>${CATALINA_BASE}/conf/tomcat-users.xml</code> and enter the following: + </p> + <div class="codeBox"><pre><code><user username="test" password="chang3m3N#w" roles="admin-script"/></code></pre></div> + <p> + No further settings is needed. When you now access + <code>{server}:{port}/host-manager/text/${COMMAND}</code>,you are able to + log in with the created credentials. For example: + <div class="codeBox"><pre><code>$ curl -u ${USERNAME}:${PASSWORD} http://localhost:8080/host-manager/text/list +OK - Listed hosts +localhost:</code></pre></div> + </p> + <p> + Note that in case you retreive your users using the + <code>DataSourceRealm</code>, <code>JDBCRealm</code>, or + <code>JNDIRealm</code> mechanism, add the appropriate role in the database + or the directory server respectively. + </p> +</div><h3 id="List_of_Commands">List of Commands</h3><div class="text"> + <p>The following commands are supported:</p> + <ul> + <li>list</li> + <li>add</li> + <li>remove</li> + <li>start</li> + <li>stop</li> + <li>persist</li> + </ul> + <p> + In the following subsections, the username and password is assumed to be + <b>test:test</b>. For your environment, use credentials created in the + previous sections. + </p> + <div class="subsection"><h4 id="List_command">List command</h4><div class="text"> + <p> + Use the <b>list</b> command to see the available virtual hosts on your + Tomcat instance. + </p> + <p><i>Example command</i>:</p> + <code>curl -u test:test http://localhost:8080/host-manager/text/list</code> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>OK - Listed hosts +localhost:</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Add_command">Add command</h4><div class="text"> + <p> + Use the <b>add</b> command to add a new virtual host. Parameters used + for the <b>add</b> command: + </p> + <ul> + <li>String <b>name</b>: Name of the virtual host. <b>REQUIRED</b></li> + <li>String <b>aliases</b>: Aliases for your virtual host.</li> + <li>String <b>appBase</b>: Base path for the application that will be + served by this virtual host. Provide relative or absolute path.</li> + <li>Boolean <b>manager</b>: If true, the Manager app is added to the + virtual host. You can access it with the <i>/manager</i> context.</li> + <li>Boolean <b>autoDeploy</b>: If true, Tomcat automatically redeploys + applications placed in the appBase directory.</li> + <li>Boolean <b>deployOnStartup</b>: If true, Tomcat automatically deploys + applications placed in the appBase directory on startup.</li> + <li>Boolean <b>deployXML</b>: If true, the <i>/META-INF/context.xml</i> + file is read and used by Tomcat.</li> + <li>Boolean <b>copyXML</b>: If true, Tomcat copies <i>/META-INF/context.xml</i> + file and uses the original copy regardless of updates to the application's + <i>/META-INF/context.xml</i> file.</li> + </ul> + <p><i>Example command</i>:</p> + <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/add?name=www.awesomeserver.com&aliases=awesomeserver.com&appBase/mnt/appDir&deployOnStartup=true</code></pre></div> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>add: Adding host [www.awesomeserver.com]</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Remove_command">Remove command</h4><div class="text"> + <p> + Use the <b>remove</b> command to remove a virtual host. Parameters used + for the <b>remove</b> command: + </p> + <ul> + <li>String <b>name</b>: Name of the virtual host to be removed. + <b>REQUIRED</b></li> + </ul> + <p><i>Example command</i>:</p> + <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/remove?name=www.awesomeserver.com</code></pre></div> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>remove: Removing host [www.awesomeserver.com]</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Start_command">Start command</h4><div class="text"> + <p> + Use the <b>start</b> command to start a virtual host. Parameters used + for the <b>start</b> command: + </p> + <ul> + <li>String <b>name</b>: Name of the virtual host to be started. + <b>REQUIRED</b></li> + </ul> + <p><i>Example command</i>:</p> + <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/start?name=www.awesomeserver.com</code></pre></div> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>OK - Host www.awesomeserver.com started</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Stop_command">Stop command</h4><div class="text"> + <p> + Use the <b>stop</b> command to stop a virtual host. Parameters used + for the <b>stop</b> command: + </p> + <ul> + <li>String <b>name</b>: Name of the virtual host to be stopped. + <b>REQUIRED</b></li> + </ul> + <p><i>Example command</i>:</p> + <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/stop?name=www.awesomeserver.com</code></pre></div> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>OK - Host www.awesomeserver.com stopped</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Persist_command">Persist command</h4><div class="text"> + <p> + Use the <b>persist</b> command to persist a virtual host into + <b>server.xml</b>. Parameters used for the <b>persist</b> command: + </p> + <ul> + <li>String <b>name</b>: Name of the virtual host to be persist. + <b>REQUIRED</b></li> + </ul> + <p> + This functionality is disabled by default. To enable this option, you must + configure the <code>StoreConfigLifecycleListener</code> listener first. + To do so, add the following listener to your <i>server.xml</i>: + </p> + <div class="codeBox"><pre><code><Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/></code></pre></div> + <p><i>Example command</i>:</p> + <div class="codeBox"><pre><code>curl -u test:test http://localhost:8080/host-manager/text/persist?name=www.awesomeserver.com</code></pre></div> + <p><i>Example response</i>:</p> + <div class="codeBox"><pre><code>OK - Configuration persisted</code></pre></div> + <p><i>Example manual entry</i>:</p> + <div class="codeBox"><pre><code><Host appBase="www.awesomeserver.com" name="www.awesomeserver.com" deployXML="false" unpackWARs="false"> +</Host></code></pre></div> + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/html-host-manager-howto.html b/src/tomcat/webapps/docs/html-host-manager-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..0955e5ee4aa998f16e058c26c26fef07c62eb1fd --- /dev/null +++ b/src/tomcat/webapps/docs/html-host-manager-howto.html @@ -0,0 +1,212 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Host Manager App -- HTML Interface</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/html-host-manager-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Host Manager App -- HTML Interface</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> + <ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#Interface_Description">Interface Description</a></li><li><a href="#Message">Message</a></li><li><a href="#Host_Manager">Host Manager</a></li><li><a href="#Host_Name">Host Name</a></li><li><a href="#Add_Virtual_Host">Add Virtual Host</a></li><li><a href="#Persist_Configuration">Persist Configuration</a></li><li><a href="#Server_Information">Server Information</a></li></ul> + </div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The <strong>Tomcat Host Manager</strong> application enables you to create, + delete, and otherwise manage virtual hosts within Tomcat. This how-to guide + is best accompanied by the following pieces of documentation: + </p> + <ul> + <li> + <a href="virtual-hosting-howto.html">Virtual Hosting How-To</a> for more + information about virtual hosting. + </li> + <li> + <a href="config/host.html">The Host Container</a> for more information + about the underlying xml configuration of virtual hosts and description + of attributes. + </li> + <li> + <a href="host-manager-howto.html">Host Manager App -- Text Interface</a> + for full description of the commands. + </li> + </ul> + + <p> + The <strong>Tomcat Host Manager</strong> application is a part of + Tomcat installation, by default available using the following + context: <code>/host-manager</code>. You can use the host manager in the + following ways: + </p> + + <ul> + <li> + Utilizing the graphical user interface, accessible at: + <code>{server}:{port}/host-manager/html</code>. + </li> + <li> + Utilizing a set of minimal HTTP requests suitable for scripting. + You can access this mode at: + <code>{server}:{port}/host-manager/text</code>. + </li> + </ul> + <p> + Both ways enable you to add, remove, start, and stop virtual hosts. + Changes may be presisted by using the <code>persist</code> command. This + document focuses on the HTML interface. For further information about the + graphical interface, see + <a href="host-manager-howto.html">Host Manager App -- Text Interface</a>. + </p> + </div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text"> + <p><em>The description below uses <code>$CATALINA_HOME</code> to refer the + base Tomcat directory. It is the directory in which you installed + Tomcat, for example <code>C:/tomcat9</code>, or + <code>/usr/share/tomcat9</code>.</em></p> + + <p> + The Host Manager application requires a user with one of the following + roles: + </p> + + <ul> + <li> + <code>admin-gui</code> - use this role for the graphical web interface. + </li> + <li> + <code>admin-script</code> - use this role for the scripting web interface. + </li> + </ul> + + <p> + To enable access to the HTML interface of the Host Manager application, + either grant your Tomcat user the appropriate role, or create a new one with + the correct role. For example, open + <code>${CATALINA_BASE}/conf/tomcat-users.xml</code> and enter the following: + </p> + <div class="codeBox"><pre><code><user username="test" password="chang3m3N#w" roles="admin-gui"/></code></pre></div> + <p> + No further settings is needed. When you now access + <code>{server}:{port}/host-manager/html</code>,you are able to + log in with the created credentials. + </p> + <p> + Note that in case you retreive your users using the + <code>DataSourceRealm</code>, <code>JDBCRealm</code>, or + <code>JNDIRealm</code> mechanism, add the appropriate role in the database + or the directory server respectively. + </p> + </div><h3 id="Interface_Description">Interface Description</h3><div class="text"> + <p>The interface is divided into six sections:</p> + <ul> + <li><strong>Message</strong> - Displays success and failure messages.</li> + <li><strong>Host Manager</strong> - Provides basic Host Manager operations + , like list and help.</li> + <li><strong>Host name</strong> - Provides a list of virtual Host Names and + enables you to operate them. </li> + <li><strong>Add Virtual Host</strong> - Enables you to add a new Virtual + Host.</li> + <li><strong>Persist configuration</strong> - Enables you to persist your + current Virtual Hosts.</li> + <li><strong>Server Information</strong> - Information about the Tomcat + server.</li> + </ul> + </div><h3 id="Message">Message</h3><div class="text"> + + <p> + Displays information about the success or failure of the last Host Manager + command you performed: + </p> + <ul> + <li>Success: <strong>OK</strong> is displayed + and may be followed by a success message.</li> + <li>Failure: <strong>FAIL</strong> + is displayed followed by an error message.</li> + </ul> + <p> + Note that the console of your Tomcat server may reveal more information + about each command. + </p> + </div><h3 id="Host_Manager">Host Manager</h3><div class="text"> + + <p>The Host Manager section enables you to:</p> + <ul> + <li><strong>List Virtual Hosts</strong> - Refresh a list of + currently-configured virtual hosts.</li> + <li><strong>HTML Host Manager Help</strong> - A documentation link.</li> + <li><strong>Host Manager Help</strong> - A documentation link.</li> + <li><strong>Server Status</strong> - A link to the <strong>Manager</strong> + application. Note that you user must have sufficient permissions to access + the application.</li> + </ul> + </div><h3 id="Host_Name">Host Name</h3><div class="text"> + + <p>The Host name section contains a list of currently-configured virtual host + names. It enables you to:</p> + <ul> + <li>View the host names</li> + <li>View the host name aliases</li> + <li>Perform basic commands, that is <strong>start</strong>, + <strong>stop</strong>, and <strong>remove</strong>.</li> + </ul> + </div><h3 id="Add_Virtual_Host">Add Virtual Host</h3><div class="text"> + + <p>The Add Virtual Host section enables you to add a virtual host using a + graphical interface. For a description of each property, see the + <a href="host-manager-howto.html">Host Manager App -- Text Interface</a> + documentation. Note that any configuration added via this interface is + non-persistent.</p> + </div><h3 id="Persist_Configuration">Persist Configuration</h3><div class="text"> + + <p>The Persist Configuration section enables you to persist your current + configuration into the <i>server.xml</i> file.</p> + + <p> This functionality is disabled by default. To enable this option, you must + configure the <code>StoreConfigLifecycleListener</code> listener first. + To do so, add the following listener to your <i>server.xml</i>:</p> + <div class="codeBox"><pre><code><Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/></code></pre></div> + + <p>After you configure the listener, click <strong>All</strong> to make your + configuration persistent.</p> + </div><h3 id="Server_Information">Server Information</h3><div class="text"> + <p> + Provides a basic information about the currently-running Tomcat instance, + the JVM, and the underlying operating system. + </p> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/html-manager-howto.html b/src/tomcat/webapps/docs/html-manager-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..b20105ed9b5f5193cdf7265fa9e0d6527f4696e3 --- /dev/null +++ b/src/tomcat/webapps/docs/html-manager-howto.html @@ -0,0 +1,537 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Tomcat Web Application Manager How To</title><meta name="author" content="Glenn L. Nielsen"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/html-manager-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Web Application Manager How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Message">Message</a></li><li><a href="#Manager">Manager</a></li><li><a href="#Applications">Applications</a><ol><li><a href="#Start">Start</a></li><li><a href="#Stop">Stop</a></li><li><a href="#Reload">Reload</a></li><li><a href="#Undeploy">Undeploy</a></li></ol></li><li><a href="#Deploy">Deploy</a><ol><li><a href="#Deploy_directory_or_WAR_file_located_on_server">Deploy directory or WAR file located on server</a><ol><li><a href="#Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</a></li><li><a href="#Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</a></li><li><a href="#Deploy_using_a_Context_configuration_%22.xml%22_file">Deploy using a Context configuration ".xml" file</a></li></ol></li><li><a href="#Upload_a_WAR_file_to_install">Upload a WAR file to install</a></li><li><a href="#Deployment_Notes">Deployment Notes</a></li><li><a href="#Deploy_Message">Deploy Message</a></li></ol></li><li><a href="#Diagnostics">Diagnostics</a><ol><li><a href="#Finding_memory_leaks">Finding memory leaks</a></li></ol></li><li><a href="#Server_Information">Server Information</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>In many production environments it is very useful to have the capability +to manage your web applications without having to shut down and restart +Tomcat. This document is for the HTML web interface to the web application +<a href="manager-howto.html">manager</a>.</p> + +<p>The interface is divided into six sections:</p> +<ul> + <li><strong>Message</strong> - Displays success and failure messages.</li> + <li><strong>Manager</strong> - General manager operations like list and + help.</li> + <li><strong>Applications</strong> - List of web applications and + commands.</li> + <li><strong>Deploy</strong> - Deploying web applications.</li> + <li><strong>Diagnostics</strong> - Identifying potential problems.</li> + <li><strong>Server Information</strong> - Information about the Tomcat + server.</li> +</ul> + +</div><h3 id="Message">Message</h3><div class="text"> + +<p> +Displays information about the success or failure of the last web application +manager command you performed. If it succeeded <strong>OK</strong> is displayed +and may be followed by a success message. If it failed <strong>FAIL</strong> +is displayed followed by an error message. Common failure messages are +documented below for each command. The complete list of failure messages for +each command can be found in the <a href="manager-howto.html">manager</a> web +application documentation. +</p> + +</div><h3 id="Manager">Manager</h3><div class="text"> + +<p>The Manager section has three links:</p> +<ul> + <li><strong>List Applications</strong> - Redisplay a list of web + applications.</li> + <li><strong>HTML Manager Help</strong> - A link to this document.</li> + <li><strong>Manager Help</strong> - A link to the comprehensive Manager + App HOW TO.</li> +</ul> + +</div><h3 id="Applications">Applications</h3><div class="text"> + +<p>The Applications section lists information about all the installed web +applications and provides links for managing them. For each web application +the following is displayed:</p> +<ul> + <li><strong>Path</strong> - The web application context path.</li> + <li><strong>Display Name</strong> - The display name for the web application + if it has one configured in its "web.xml" file.</li> + <li><strong>Running</strong> - Whether the web application is running and + available (true), or not running and unavailable (false).</li> + <li><strong>Sessions</strong> - The number of active sessions for remote + users of this web application. The number of sessions is a link which + when submitted displays more details about session usage by the web + application in the Message box.</li> + <li><strong>Commands</strong> - Lists all commands which can be performed on + the web application. Only those commands which can be performed will be + listed as a link which can be submitted. No commands can be performed on + the manager web application itself. The following commands can be + performed: + <ul> + <li><strong>Start</strong> - Start a web application which had been + stopped.</li> + <li><strong>Stop</strong> - Stop a web application which is currently + running and make it unavailable.</li> + <li><strong>Reload</strong> - Reload the web application so that new + ".jar" files in <code>/WEB-INF/lib/</code> or new classes in + <code>/WEB-INF/classes/</code> can be used.</li> + <li><strong>Undeploy</strong> - Stop and then remove this web + application from the server.</li> + </ul> + </li> +</ul> + +<div class="subsection"><h4 id="Start">Start</h4><div class="text"> + +<p>Signal a stopped application to restart, and make itself available again. +Stopping and starting is useful, for example, if the database required by +your application becomes temporarily unavailable. It is usually better to +stop the web application that relies on this database rather than letting +users continuously encounter database exceptions.</p> + +<p>If this command succeeds, you will see a Message like this:</p> +<div class="codeBox"><pre><code>OK - Started application at context path /examples</code></pre></div> + +<p>Otherwise, the Message will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to start the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + <p> + The <code>path</code> parameter is required. + </p> +</li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Stop">Stop</h4><div class="text"> + +<p>Signal an existing application to make itself unavailable, but leave it +deployed. Any request that comes in while an application is +stopped will see an HTTP error 404, and this application will show as +"stopped" on a list applications command.</p> + +<p>If this command succeeds, you will see a Message like this:</p> +<div class="codeBox"><pre><code>OK - Stopped application at context path /examples</code></pre></div> + +<p>Otherwise, the Message will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to stop the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + <p> + The <code>path</code> parameter is required. + </p> +</li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Reload">Reload</h4><div class="text"> + +<p>Signal an existing application to shut itself down and reload. This can +be useful when the web application context is not reloadable and you have +updated classes or property files in the <code>/WEB-INF/classes</code> +directory or when you have added or updated jar files in the +<code>/WEB-INF/lib</code> directory. +</p> +<p><strong>NOTE:</strong> The <code>/WEB-INF/web.xml</code> +web application configuration file is not checked on a reload; +the previous web.xml configuration is used. +If you have made changes to your web.xml file you must stop +then start the web application. +</p> + +<p>If this command succeeds, you will see a Message like this:</p> +<div class="codeBox"><pre><code> +OK - Reloaded application at context path /examples +</code></pre></div> + +<p>Otherwise, the Message will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to restart the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + <p>The <code>path</code> parameter is required.</p> + </li> +<li><em>Reload not supported on WAR deployed at path /foo</em> + <p>Currently, application reloading (to pick up changes to the classes or + <code>web.xml</code> file) is not supported when a web application is + installed directly from a WAR file, which happens when the host is + configured to not unpack WAR files. As it only works when the web + application is installed from an unpacked directory, if you are using + a WAR file, you should <code>undeploy</code> and then <code>deploy</code> + the application again to pick up your changes.</p> + </li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Undeploy">Undeploy</h4><div class="text"> + +<p><strong><span style="color: red;">WARNING</span> - This command will delete the +contents of the web application directory and/or ".war" file if it exists within +the <code>appBase</code> directory (typically "webapps") for this virtual host +</strong>. The web application temporary work directory is also deleted. If +you simply want to take an application out of service, you should use the +<code>/stop</code> command instead.</p> + +<p>Signal an existing application to gracefully shut itself down, and then +remove it from Tomcat (which also makes this context path available for +reuse later). This command is the logical opposite of the +<code>/deploy</code> Ant command, and the related deploy features available +in the HTML manager.</p> + +<p>If this command succeeds, you will see a Message like this:</p> +<div class="codeBox"><pre><code>OK - Undeployed application at context path /examples</code></pre></div> + +<p>Otherwise, the Message will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to undeploy the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a zero-length string.</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + The <code>path</code> parameter is required. + </li> +</ul> + +</div></div> + +</div><h3 id="Deploy">Deploy</h3><div class="text"> + +<p>Web applications can be deployed using files or directories located +on the Tomcat server or you can upload a web application archive (WAR) +file to the server.</p> + +<p>To install an application, fill in the appropriate fields for the type +of install you want to do and then submit it using the <i>Install</i> +button.</p> + +<div class="subsection"><h4 id="Deploy_directory_or_WAR_file_located_on_server">Deploy directory or WAR file located on server</h4><div class="text"> + +<p>Deploy and start a new web application, attached to the specified <i>Context +Path:</i> (which must not be in use by any other web application). +This command is the logical opposite of the <em>Undeploy</em> command.</p> + +<p>There are a number of different ways the deploy command can be used.</p> + +<div class="subsection"><h4 id="Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</h4><div class="text"> + +<p>Install a web application directory or ".war" file located on the Tomcat +server. If no <i>Context Path</i> is specified, the directory name or the +war file name without the ".war" extension is used as the path. The +<i>WAR or Directory URL</i> specifies a URL (including the <code>file:</code> +scheme) for either a directory or a web application archive (WAR) file. The +supported syntax for a URL referring to a WAR file is described on the Javadocs +page for the <code>java.net.JarURLConnection</code> class. Use only URLs that +refer to the entire WAR file.</p> + +<p>In this example the web application located in the directory +<code>C:\path\to\foo</code> on the Tomcat server (running on Windows) +is deployed as the web application context named <code>/footoo</code>.</p> +<div class="codeBox"><pre><code>Context Path: /footoo +WAR or Directory URL: file:C:/path/to/foo +</code></pre></div> + + +<p>In this example the ".war" file <code>/path/to/bar.war</code> on the +Tomcat server (running on Unix) is deployed as the web application +context named <code>/bar</code>. Notice that there is no <code>path</code> +parameter so the context path defaults to the name of the web application +archive file without the ".war" extension.</p> +<div class="codeBox"><pre><code>WAR or Directory URL: jar:file:/path/to/bar.war!/</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</h4><div class="text"> + +<p>Install a web application directory or ".war" file located in your Host +appBase directory. If no <i>Context Path</i> is specified the directory name +or the war file name without the ".war" extension is used as the path.</p> + +<p>In this example the web application located in a subdirectory named +<code>foo</code> in the Host appBase directory of the Tomcat server is +deployed as the web application context named <code>/foo</code>. Notice +that there is no <code>path</code> parameter so the context path defaults +to the name of the web application directory.</p> +<div class="codeBox"><pre><code>WAR or Directory URL: foo</code></pre></div> + + +<p>In this example the ".war" file <code>bar.war</code> located in your +Host appBase directory on the Tomcat server is deployed as the web +application context named <code>/bartoo</code>.</p> +<div class="codeBox"><pre><code>Context Path: /bartoo +WAR or Directory URL: bar.war</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Deploy_using_a_Context_configuration_".xml"_file">Deploy using a Context configuration ".xml" file</h4><div class="text"> + +<p>If the Host deployXML flag is set to true, you can install a web +application using a Context configuration ".xml" file and an optional +".war" file or web application directory. The <i>Context Path</i> +is not used when installing a web application using a context ".xml" +configuration file.</p> + +<p>A Context configuration ".xml" file can contain valid XML for a +web application Context just as if it were configured in your +Tomcat <code>server.xml</code> configuration file. Here is an +example for Tomcat running on Windows:</p> +<div class="codeBox"><pre><code><Context path="/foobar" docBase="C:\path\to\application\foobar"> +</Context></code></pre></div> + + +<p>Use of the <i>WAR or Directory URL</i> is optional. When used +to select a web application ".war" file or directory it overrides any +docBase configured in the context configuration ".xml" file.</p> + +<p>Here is an example of installing an application using a Context +configuration ".xml" file for Tomcat running on Windows.</p> +<div class="codeBox"><pre><code>XML Configuration file URL: file:C:/path/to/context.xml</code></pre></div> + + +<p>Here is an example of installing an application using a Context +configuration ".xml" file and a web application ".war" file located +on the server (Tomcat running on Unix).</p> +<div class="codeBox"><pre><code>XML Configuration file URL: file:/path/to/context.xml +WAR or Directory URL: jar:file:/path/to/bar.war!/</code></pre></div> + +</div></div> +</div></div> + +<div class="subsection"><h4 id="Upload_a_WAR_file_to_install">Upload a WAR file to install</h4><div class="text"> + +<p>Upload a WAR file from your local system and install it into the +appBase for your Host. The name of the WAR file without the ".war" +extension is used as the context path name.</p> + +<p>Use the <i>Browse</i> button to select a WAR file to upload to the +server from your local desktop system.</p> + +<p>The .WAR file may include Tomcat specific deployment configuration, by +including a Context configuration XML file in +<code>/META-INF/context.xml</code>.</p> + +<p>Upload of a WAR file could fail for the following reasons:</p> +<ul> +<li><em>File uploaded must be a .war</em> + <p>The upload install will only accept files which have the filename + extension of ".war".</p> + </li> +<li><em>War file already exists on server</em> + <p>If a war file of the same name already exists in your Host's + appBase the upload will fail. Either undeploy the existing war file + from your Host's appBase or upload the new war file using a different + name.</p> + </li> +<li><em>File upload failed, no file</em> + <p>The file upload failed, no file was received by the server.</p> + </li> +<li><em>Install Upload Failed, Exception:</em> + <p>The war file upload or install failed with a Java Exception. + The exception message will be listed.</p> + </li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Deployment_Notes">Deployment Notes</h4><div class="text"> + +<p>If the Host is configured with unpackWARs=true and you install a war +file, the war will be unpacked into a directory in your Host appBase +directory.</p> + +<p>If the application war or directory is deployed in your Host appBase +directory and either the Host is configured with autoDeploy=true the Context +path must match the directory name or war file name without the ".war" +extension.</p> + +<p>For security when untrusted users can manage web applications, the +Host deployXML flag can be set to false. This prevents untrusted users +from installing web applications using a configuration XML file and +also prevents them from installing application directories or ".war" +files located outside of their Host appBase.</p> + +</div></div> + +<div class="subsection"><h4 id="Deploy_Message">Deploy Message</h4><div class="text"> + +<p>If deployment and startup is successful, you will receive a Message +like this:</p> +<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div> + +<p>Otherwise, the Message will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Application already exists at path /foo</em> + <p>The context paths for all currently running web applications must be + unique. Therefore, you must either undeploy the existing web + application using this context path, or choose a different context path + for the new one.</p> + </li> +<li><em>Document base does not exist or is not a readable directory</em> + <p>The URL specified by the <i>WAR or Directory URL:</i> field must + identify a directory on this server that contains the "unpacked" version + of a web application, or the absolute URL of a web application archive + (WAR) file that contains this application. Correct the value entered for + the <i>WAR or Directory URL:</i> field.</p> + </li> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to start the new web application. + Check the Tomcat logs for the details, but likely explanations include + problems parsing your <code>/WEB-INF/web.xml</code> file, or missing + classes encountered when initializing application event listeners and + filters.</p> + </li> +<li><em>Invalid application URL was specified</em> + <p>The URL for the <i>WAR or Directory URL:</i> field that you specified + was not valid. Such URLs must start with <code>file:</code>, and URLs + for a WAR file must end in ".war".</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character, unless you are + referencing the ROOT web application -- in which case the context path + must be a "/" string.</p> + </li> +<li><em>Context path must match the directory or WAR file name:</em> + <p>If the application war or directory is deployed in your Host appBase + directory and either the Host is configured with autoDeploy=true the Context + path must match the directory name or war file name without the ".war" + extension.</p> + </li> +<li><em>Only web applications in the Host web application directory can + be deployed</em> + <p> + If the Host deployXML flag is set to false this error will happen + if an attempt is made to install a web application directory or + ".war" file outside of the Host appBase directory. + </p></li> +</ul> + +</div></div> +</div><h3 id="Diagnostics">Diagnostics</h3><div class="text"> + +<div class="subsection"><h4 id="Finding_memory_leaks">Finding memory leaks</h4><div class="text"> + +<p><strong>The find leaks diagnostic triggers a full garbage collection. It +should be used with extreme caution on production systems.</strong></p> + +<p>The find leaks diagnostic attempts to identify web applications that have +caused memory leaks when they were stopped, reloaded or undeployed. Results +should always be confirmed +with a profiler. The diagnostic uses additional functionality provided by the +StandardHost implementation. It will not work if a custom host is used that +does not extend StandardHost.</p> + +<p>This diagnostic will list context paths for the web applications that were +stopped, reloaded or undeployed, but which classes from the previous runs +are still present in memory, thus being a memory leak. If an application +has been reloaded several times, it may be listed several times.</p> + +<p>Explicitly triggering a full garbage collection from Java code is documented +to be unreliable. Furthermore, depending on the JVM used, there are options to +disable explicit GC triggering, like <code>-XX:+DisableExplicitGC</code>. +If you want to make sure, that the diagnostics were successfully running a full GC, +you will need to check using tools like GC logging, JConsole or similar.</p> + +</div></div> +</div><h3 id="Server_Information">Server Information</h3><div class="text"> + +<p>This section displays information about Tomcat, the operating system of the +server Tomcat is hosted on, the Java Virtual Machine Tomcat is running in, the +primary host name of the server (may not be the host name used to access Tomcat) +and the primary IP address of the server (may not be the IP address used to +access Tomcat).</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/images/add.gif b/src/tomcat/webapps/docs/images/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..0774d074e5e48291bdacfacb086506e6be117e51 Binary files /dev/null and b/src/tomcat/webapps/docs/images/add.gif differ diff --git a/src/tomcat/webapps/docs/images/asf-logo.svg b/src/tomcat/webapps/docs/images/asf-logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..e24cbe52975eaea5ed9ede394d40862db1a05b34 --- /dev/null +++ b/src/tomcat/webapps/docs/images/asf-logo.svg @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve"> +<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1 + c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1 + C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5 + c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6 + c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3 + h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12 + c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/> +<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/> +<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/> +<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/> +<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970 + l-205.1,493.2h404.7L2032.6,970z"/> +<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1 + H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/> +<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970 + l-205.1,493.2h404.7L3708.6,970z"/> +<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177 + c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1 + c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/> +<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/> +<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/> +<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4 + c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6 + c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6 + c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6 + c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9 + c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2 + c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1 + c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/> +<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/> +<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/> +<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/> +<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7 + l57.1-182.7h25l-70.6,210.6H2871.8z"/> +<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6 + l-46.9,106.8h94.4L3144.5,2086.6z"/> +<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5 + c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6 + c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56 + C3466.2,2180.2,3481,2176,3491.3,2167.6z"/> +<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/> +<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/> +<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/> +<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6 + v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124 + h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/> +<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/> +<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6 + c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z + M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42 + c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/> +<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6 + l-46.9,106.8h94.4L5725.8,2086.6z"/> +<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/> +<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/> +<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/> +<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#F69923"/> + <stop offset="0.3123" style="stop-color:#F79A23"/> + <stop offset="0.8383" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2 + c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7 + c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/> +<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1 + C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/> +<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/> +<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3 + c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6 + c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9 + c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3 + c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2 + c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4 + C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/> +<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/> +<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8 + c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1 + c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7 + c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5 + c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3 + l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2 + c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6 + c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2 + c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5 + C374.4,1966.3,371.7,1973.6,369,1981z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2 + c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51 + c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4 + c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5 + c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3 + L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1 + c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9 + c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6 + c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9 + c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8 + c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8 + c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7 + c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5 + c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2 + c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4 + c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1 + c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2 + c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8 + c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0 + c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2 + c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6 + c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9 + c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5 + c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/> +<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7 + L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +</svg> diff --git a/src/tomcat/webapps/docs/images/code.gif b/src/tomcat/webapps/docs/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..d27307b5c09467c2e45bbfcd1ff74989eb2e7d65 Binary files /dev/null and b/src/tomcat/webapps/docs/images/code.gif differ diff --git a/src/tomcat/webapps/docs/images/cors-flowchart.png b/src/tomcat/webapps/docs/images/cors-flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..9abb09d1c7fee7ed73d8d4bbccbff6876aeb378b Binary files /dev/null and b/src/tomcat/webapps/docs/images/cors-flowchart.png differ diff --git a/src/tomcat/webapps/docs/images/design.gif b/src/tomcat/webapps/docs/images/design.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5db0a9fc783924486176ce157924fba53df73fc Binary files /dev/null and b/src/tomcat/webapps/docs/images/design.gif differ diff --git a/src/tomcat/webapps/docs/images/docs-stylesheet.css b/src/tomcat/webapps/docs/images/docs-stylesheet.css new file mode 100644 index 0000000000000000000000000000000000000000..768e2ed36761a53c7ac85c3b9bd25e506e369e4e --- /dev/null +++ b/src/tomcat/webapps/docs/images/docs-stylesheet.css @@ -0,0 +1,303 @@ +@charset "utf-8"; +/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* Fonts */ +@import url("fonts/fonts.css"); + +/* General style */ + +h1, h2, h3, h4, h5, h6, th { + font-weight: 600; +} + +body { + margin: 0; +} + +body, input { + font-family: 'Open Sans', sans-serif; + font-size: 10.5pt; +} + +code, pre { + font-family: Consolas, monospace; +} + +img { + border: 0; +} + +table { + border-collapse: collapse; + text-align: left; +} +table *:not(table) { + /* Prevent border-collapsing for table child elements like <div> */ + border-collapse: separate; +} + +th { + text-align: left; +} + +main { + /* Remove this once all IEs support <main> element */ + display: block; +} + + +/* Layout */ + +#wrapper { + min-width: 400px; +} + +#header { + border-bottom: 1px solid #bbb; +} + +@media not print { + #header { + box-shadow: 0 0 7px #aaa; + } +} + +#header > div { + padding-left: 15px; + padding-right: 15px; + + /* Work-around for old browsers: */ + background-color: #F8F3E4; + background: linear-gradient(to bottom, #ffffff -10%, #F8F3E4 100%); + position: relative; +} + +#header .logo { + float: left; + padding-top: 10px; + min-width: 190px; +} + +#header .logo img{ + /* To avoid that the Font Descender being added to the parent div's height */ + vertical-align: middle; +} + +#header .asfLogo { + float: right; + position: relative; + top: 8px; +} + +#header h1 { + margin-top: 0.6em; + margin-bottom: 0; +} + +#header .versionInfo { + font-size: 13pt; + margin-bottom: 1em; +} + +#middle { + display: table; + table-layout: fixed; + margin: 0; + width: 100%; +} +#middle > div { display: table-row; } +#middle > div > div { display: table-cell; vertical-align: top; } + + + +#mainLeft { + width: 190px; +} + +#mainLeft > div { + margin-top: -1px; /* to overwrite border of element above */ + padding-left: 16px; + padding-right: 14px; + padding-top: 6px; + padding-bottom: 15px; + background-color: #F8F3E4; + border-right: 1px solid #bbb; + border-bottom: 1px solid #bbb; + font-size: 10pt; + border-bottom-right-radius: 20px; + box-shadow: 0 0 5px #aaa; +} + +#mainLeft h2 { + margin-bottom: 0.2em; + font-size: 1.2em; +} + +#mainLeft ul { + padding: 0; + margin: 0; + list-style-type: none; +} + +#mainLeft ul a { + text-indent: -0.6em; + padding-left: 1.4em; + display: block; + text-decoration: none; + color: #444; +} +#mainLeft ul a:hover { + color: #000; + background-color: #D1c9b9; +} + +#mainRight { + padding-left: 14px; + padding-right: 20px; + +} + +#footer { + margin-top: 30px; + padding-top: 20px; + padding-bottom: 20px; + padding-left: 20px; + padding-right: 20px; + border-top: 1px solid #ccc; + color: #444; + text-align: center; + /* font-style: italic; */ + font-size: 9pt; +} + + +/* Content */ + +#content div.text { + padding-left: 1em; + padding-left: 1em; +} + +#content h3, #content h4, #content h5, #content h6 { + padding-left: 5px; + padding-right: 5px; + background-color: #eaeaea; +} + +@media not print { + #content h3, #content h4, #content h5, #content h6 { + border: 1px solid #ccc; + border-radius: 4px; + } +} + +#content h4, #content h5, #content h6 { + background-color: #f6f6f6; +} + +code { + background-color: rgb(224,255,255); +} + +div.codeBox pre code, code.attributeName, code.propertyName, code.noHighlight, .noHighlight code { + background-color: transparent; +} +div.codeBox { + overflow: auto; + margin: 1em 0; +} +div.codeBox pre { + margin: 0; + padding: 4px; + border: 1px solid #999; + border-radius: 5px; + background-color: #eff8ff; + display: table; /* To prevent <pre>s from taking the complete available width. */ + /* + When it is officially supported, use the following CSS instead of display: table + to prevent big <pre>s from exceeding the browser window: + max-width: available; + width: min-content; + */ +} + +div.codeBox pre.wrap { + white-space: pre-wrap; +} + + +table.defaultTable tr, table.detail-table tr { + border: 1px solid #CCC; +} + +table.defaultTable tr:nth-child(even), table.detail-table tr:nth-child(even) { + background-color: #FAFBFF; +} + +table.defaultTable tr:nth-child(odd), table.detail-table tr:nth-child(odd) { + background-color: #EEEFFF; +} + +table.defaultTable th, table.detail-table th { + background-color: #88b; + color: #fff; +} + +table.defaultTable th, table.defaultTable td, table.detail-table th, table.detail-table td { + padding: 5px 8px; +} + + +p.notice { + border: 1px solid rgb(255, 0, 0); + background-color: rgb(238, 238, 238); + color: rgb(0, 51, 102); + padding: 0.5em; + margin: 1em 2em 1em 1em; +} + + +/* Changelog-Styles */ + +ul.changelog { + padding-left: 1em; + list-style-type: none; +} + +ul.changelog li{ + padding-top: 5px; + padding-bottom: 5px; +} + +ul.changelog img { + vertical-align: middle +} + + +/* Printer-only Styles */ +@media print { + .noPrint { display: none; } + #middle > div > div#mainLeft { display: none; } + a { color: inherit; text-decoration: none; } +} + +/* Fix for Comments section which contains a <h4> */ +#comments_thread h1, #comments_thread h2, #comments_thread h3, #comments_thread h4, #comments_thread h5, #comments_thread h6 { + border: none; + background-color: transparent; +} \ No newline at end of file diff --git a/src/tomcat/webapps/docs/images/docs.gif b/src/tomcat/webapps/docs/images/docs.gif new file mode 100644 index 0000000000000000000000000000000000000000..d64a4a18c405e2c10ab791363f9f7acd16f3d433 Binary files /dev/null and b/src/tomcat/webapps/docs/images/docs.gif differ diff --git a/src/tomcat/webapps/docs/images/fix.gif b/src/tomcat/webapps/docs/images/fix.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59ad642ba46c0bc1af17ebd2485722e92d6c70e Binary files /dev/null and b/src/tomcat/webapps/docs/images/fix.gif differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans400.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans400.woff new file mode 100644 index 0000000000000000000000000000000000000000..55b25f867099eb26c436b1c9fecff14a51290d46 Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans400.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..cedefb8f6ff406c6b77e75ae55ee88e2bd88dc17 Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans400italic.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans600.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans600.woff new file mode 100644 index 0000000000000000000000000000000000000000..e83bb333d2ea4655120d1791947d19d28ac710bc Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans600.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..983bb33145e7ac8d627892bcd53b4dc719b26766 Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans600italic.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans700.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans700.woff new file mode 100644 index 0000000000000000000000000000000000000000..27619e7cea1c29f9d71567b78470fdd705c174dc Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans700.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff b/src/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..e12c3a9f273c2f0e4952293bb852406c2ab1eb0a Binary files /dev/null and b/src/tomcat/webapps/docs/images/fonts/OpenSans700italic.woff differ diff --git a/src/tomcat/webapps/docs/images/fonts/fonts.css b/src/tomcat/webapps/docs/images/fonts/fonts.css new file mode 100644 index 0000000000000000000000000000000000000000..fa306fc44c05dfdac3f27a0b380811ca4b8579af --- /dev/null +++ b/src/tomcat/webapps/docs/images/fonts/fonts.css @@ -0,0 +1,54 @@ +@charset "utf-8"; +/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), local('OpenSans'), url('OpenSans400.woff') format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), url('OpenSans400italic.woff') format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url('OpenSans600.woff') format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans Semibold Italic'), local('OpenSans-SemiboldItalic'), url('OpenSans600italic.woff') format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), url('OpenSans700.woff') format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), url('OpenSans700italic.woff') format('woff'); +} \ No newline at end of file diff --git a/src/tomcat/webapps/docs/images/tomcat.gif b/src/tomcat/webapps/docs/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aa6f863e43e3924a35854c556a9c1b6d125cba Binary files /dev/null and b/src/tomcat/webapps/docs/images/tomcat.gif differ diff --git a/src/tomcat/webapps/docs/images/tomcat.png b/src/tomcat/webapps/docs/images/tomcat.png new file mode 100644 index 0000000000000000000000000000000000000000..209b07fd8a8d2429b1a0c9740dc184f803ba3c67 Binary files /dev/null and b/src/tomcat/webapps/docs/images/tomcat.png differ diff --git a/src/tomcat/webapps/docs/images/update.gif b/src/tomcat/webapps/docs/images/update.gif new file mode 100644 index 0000000000000000000000000000000000000000..31e22abbc7a2e24b20b978e9be9bce91d4d97728 Binary files /dev/null and b/src/tomcat/webapps/docs/images/update.gif differ diff --git a/src/tomcat/webapps/docs/images/void.gif b/src/tomcat/webapps/docs/images/void.gif new file mode 100644 index 0000000000000000000000000000000000000000..e565824aafafe632011b281cba976baf8b3ba89a Binary files /dev/null and b/src/tomcat/webapps/docs/images/void.gif differ diff --git a/src/tomcat/webapps/docs/index.html b/src/tomcat/webapps/docs/index.html new file mode 100644 index 0000000000000000000000000000000000000000..e42255d2a06320ae72b23b03a5f30f6cb491d514 --- /dev/null +++ b/src/tomcat/webapps/docs/index.html @@ -0,0 +1,234 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Documentation Index</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Remy Maucherat"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/index"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Documentation Index</h2><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>This is the top-level entry point of the documentation bundle for the +<strong>Apache Tomcat</strong> Servlet/JSP container. Apache Tomcat version +9.0 implements the Servlet 4.0 and JavaServer Pages 2.3 +<a href="http://wiki.apache.org/tomcat/Specifications">specifications</a> from the +<a href="http://www.jcp.org">Java Community Process</a>, and includes many +additional features that make it a useful platform for developing and deploying +web applications and web services.</p> + +<p>Select one of the links from the navigation menu (to the left) to drill +down to the more detailed documentation that is available. Each available +manual is described in more detail below.</p> + +</div><h3 id="Apache_Tomcat_User_Guide">Apache Tomcat User Guide</h3><div class="text"> + +<p>The following documents will assist you in downloading and installing +Apache Tomcat, and using many of the Apache Tomcat features.</p> + +<ol> +<li><a href="introduction.html"><strong>Introduction</strong></a> - A + brief, high level, overview of Apache Tomcat.</li> +<li><a href="setup.html"><strong>Setup</strong></a> - How to install and run + Apache Tomcat on a variety of platforms.</li> +<li><a href="appdev/index.html"><strong>First web application</strong></a> + - An introduction to the concepts of a <em>web application</em> as defined + in the Servlet Specification. Covers basic organization of your web application + source tree, the structure of a web application archive, and an + introduction to the web application deployment descriptor + (<code>/WEB-INF/web.xml</code>).</li> +<li><a href="deployer-howto.html"><strong>Deployer</strong></a> - + Operating the Apache Tomcat Deployer to deploy, precompile, and validate web + applications.</li> +<li><a href="manager-howto.html"><strong>Manager</strong></a> - + Operating the <strong>Manager</strong> web app to deploy, undeploy, and + redeploy applications while Apache Tomcat is running.</li> +<li><a href="host-manager-howto.html"><strong>Host Manager</strong></a> - + Operating the <strong>Host Manager</strong> web app to add and remove + virtual hosts while Apache Tomcat is running.</li> +<li><a href="realm-howto.html"><strong>Realms and Access Control</strong></a> + - Description of how to configure <em>Realms</em> (databases of users, + passwords, and their associated roles) for use in web applications that + utilize <em>Container Managed Security</em>.</li> +<li><a href="security-manager-howto.html"><strong>Security Manager</strong></a> + - Configuring and using a Java Security Manager to + support fine-grained control over the behavior of your web applications. + </li> +<li><a href="jndi-resources-howto.html"><strong>JNDI Resources</strong></a> + - Configuring standard and custom resources in the JNDI naming context + that is provided to each web application.</li> +<li><a href="jndi-datasource-examples-howto.html"> + <strong>JDBC DataSource</strong></a> + - Configuring a JNDI DataSource with a DB connection pool. + Examples for many popular databases.</li> +<li><a href="class-loader-howto.html"><strong>Classloading</strong></a> + - Information about class loading in Apache Tomcat, including where to place + your application classes so that they are visible.</li> +<li><a href="jasper-howto.html"><strong>JSPs</strong></a> + - Information about Jasper configuration, as well as the JSP compiler + usage.</li> +<li><a href="ssl-howto.html"><strong>SSL/TLS</strong></a> - + Installing and configuring SSL/TLS support so that your Apache Tomcat will + serve requests using the <code>https</code> protocol.</li> +<li><a href="ssi-howto.html"><strong>SSI</strong></a> - + Using Server Side Includes in Apache Tomcat.</li> +<li><a href="cgi-howto.html"><strong>CGI</strong></a> - + Using CGIs with Apache Tomcat.</li> +<li><a href="proxy-howto.html"><strong>Proxy Support</strong></a> - + Configuring Apache Tomcat to run behind a proxy server (or a web server + functioning as a proxy server).</li> +<li><a href="mbeans-descriptors-howto.html"><strong>MBeans Descriptors</strong></a> - + Configuring MBean descriptors files for custom components.</li> +<li><a href="default-servlet.html"><strong>Default Servlet</strong></a> - + Configuring the default servlet and customizing directory listings.</li> +<li><a href="cluster-howto.html"><strong>Apache Tomcat Clustering</strong></a> - + Enable session replication in a Apache Tomcat environment.</li> +<li><a href="balancer-howto.html"><strong>Balancer</strong></a> - + Configuring, using, and extending the load balancer application.</li> +<li><a href="connectors.html"><strong>Connectors</strong></a> - + Connectors available in Apache Tomcat, and native web server integration.</li> +<li><a href="monitoring.html"><strong>Monitoring and Management</strong></a> - + Enabling JMX Remote support, and using tools to monitor and manage Apache Tomcat.</li> +<li><a href="logging.html"><strong>Logging</strong></a> - + Configuring logging in Apache Tomcat.</li> +<li><a href="apr.html"><strong>Apache Portable Runtime</strong></a> - + Using APR to provide superior performance, scalability and better + integration with native server technologies.</li> +<li><a href="virtual-hosting-howto.html"><strong>Virtual Hosting</strong></a> - + Configuring virtual hosting in Apache Tomcat.</li> +<li><a href="aio.html"><strong>Advanced IO</strong></a> - + Extensions available over regular, blocking IO.</li> +<li><a href="extras.html"><strong>Additional Components</strong></a> - + Obtaining additional, optional components.</li> +<li><a href="maven-jars.html"><strong>Using Tomcat libraries with Maven</strong></a> - + Obtaining Tomcat jars through Maven.</li> +<li><a href="security-howto.html"><strong>Security Considerations</strong></a> - + Options to consider when securing an Apache Tomcat installation.</li> +<li><a href="windows-service-howto.html"><strong>Windows Service</strong></a> - + Running Tomcat as a service on Microsoft Windows.</li> +<li><a href="windows-auth-howto.html"><strong>Windows Authentication</strong></a> - + Configuring Tomcat to use integrated Windows authentication.</li> +<li><a href="jdbc-pool.html"><strong>High Concurrency JDBC Pool</strong></a> - + Configuring Tomcat to use an alternative JDBC pool.</li> +<li><a href="web-socket-howto.html"><strong>WebSocket support</strong></a> - + Developing WebSocket applications for Apache Tomcat.</li> +<li><a href="rewrite.html"><strong>URL rewrite</strong></a> - + Using the regexp based rewrite valve for conditional URL and host rewrite.</li> + +</ol> + +</div><h3 id="Reference">Reference</h3><div class="text"> + +<p>The following documents are aimed at <em>System Administrators</em> who +are responsible for installing, configuring, and operating an Apache Tomcat server. +</p> +<ul> +<li><a href="RELEASE-NOTES.txt"><strong>Release notes</strong></a> + - Known issues in this Apache Tomcat release. + </li> +<li><a href="config/index.html"><strong>Apache Tomcat Server Configuration Reference</strong></a> + - Reference manual that documents all available elements and attributes + that may be placed into the Apache Tomcat <code>conf/server.xml</code> file. + </li> +<li><a href="http://tomcat.apache.org/connectors-doc/index.html"><strong>JK Documentation</strong></a> + - Complete documentation and HOWTOs on the JK native webserver connector, + used to interface Apache Tomcat with servers like Apache HTTPd, IIS + and others.</li> +<li>Servlet 4.0 + <a href="https://jcp.org/aboutJava/communityprocess/final/jsr369/index.html"> + <strong>Specification</strong></a> + + </li> +<li>JSP 2.3 + <a href="http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html"> + <strong>Specification</strong></a> and + <a href="http://docs.oracle.com/javaee/7/api/javax/servlet/jsp/package-summary.html"> + <strong>Javadoc</strong></a> + </li> +<li>EL 3.0 + <a href="http://jcp.org/aboutJava/communityprocess/final/jsr341/index.html"> + <strong>Specification</strong></a> and + <a href="http://docs.oracle.com/javaee/7/api/javax/el/package-summary.html"> + <strong>Javadoc</strong></a> + </li> +<li>WebSocket 1.1 + <a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr356/index.html"> + <strong>Specification</strong></a> and + <a href="http://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html"> + <strong>Javadoc</strong></a> + </li> +<li>JASPIC 1.1 + <a href="https://jcp.org/aboutJava/communityprocess/mrel/jsr196/index.html"> + <strong>Specification</strong></a> and + <a href="http://docs.oracle.com/javaee/7/api/javax/security/auth/message/package-summary.html"> + <strong>Javadoc</strong></a> + </li> +</ul> + +</div><h3 id="Apache_Tomcat_Developers">Apache Tomcat Developers</h3><div class="text"> + +<p>The following documents are for Java developers who wish to contribute to +the development of the <em>Apache Tomcat</em> project.</p> +<ul> +<li><a href="building.html"><strong>Building from Source</strong></a> - + Details the steps necessary to download Apache Tomcat source code (and the + other packages that it depends on), and build a binary distribution from + those sources. + </li> +<li><a href="changelog.html"><strong>Changelog</strong></a> - Details the + changes made to Apache Tomcat. + </li> +<li><a href="http://wiki.apache.org/tomcat/TomcatVersions"><strong>Status</strong></a> - + Apache Tomcat development status. + </li> +<li><a href="developers.html"><strong>Developers</strong></a> - List of active + Apache Tomcat contributors. + </li> +<li><a href="funcspecs/index.html"><strong>Functional Specifications</strong></a> + - Requirements specifications for features of the <em>Catalina</em> servlet + container portion of Apache Tomcat.</li> +<li><a href="api/index.html"><strong>Javadocs</strong></a> + - Javadoc API documentation for Apache Tomcat's internals.</li> +<li><a href="architecture/index.html"><strong>Apache Tomcat Architecture</strong></a> + - Documentation of the Apache Tomcat Server Architecture.</li> +</ul> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/introduction.html b/src/tomcat/webapps/docs/introduction.html new file mode 100644 index 0000000000000000000000000000000000000000..3bfa001699334f246e8ea22dd758a5f1525ced8f --- /dev/null +++ b/src/tomcat/webapps/docs/introduction.html @@ -0,0 +1,147 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Introduction</title><meta name="author" content="Robert Slifka"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/introduction"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Introduction</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Terminology">Terminology</a></li><li><a href="#Directories_and_Files">Directories and Files</a></li><li><a href="#Configuring_Tomcat">Configuring Tomcat</a></li><li><a href="#Where_to_Go_for_Help">Where to Go for Help</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>For administrators and web developers alike, there are some important bits +of information you should familiarize yourself with before starting out. This +document serves as a brief introduction to some of the concepts and +terminology behind the Tomcat container. As well, where to go when you need +help.</p> + +</div><h3 id="Terminology">Terminology</h3><div class="text"> + +<p>In the course of reading these documents, you will run across a number of +terms; some specific to Tomcat, and others defined by the +<a href="http://wiki.apache.org/tomcat/Specifications">Servlet and +JSP specifications</a>.</p> + +<ul> +<li><strong>Context</strong> - In a nutshell, a Context is a + web application.</li> +</ul> +<p>That is it. If you find any more terms we need to add to this section, please +do let us know.</p> + +</div><h3 id="Directories_and_Files">Directories and Files</h3><div class="text"> + +<p>Throughout the docs, you'll notice there are numerous references to +<strong>$CATALINA_HOME</strong>. This represents the root of your Tomcat +installation. When we say, "This information can be found in your +$CATALINA_HOME/README.txt file" we mean to look at the README.txt file at the +root of your Tomcat install. Optionally, Tomcat may be configured for multiple +instances by defining <strong>$CATALINA_BASE</strong> for each instance. If +multiple instances are not configured, <strong>$CATALINA_BASE</strong> is the +same as <strong>$CATALINA_HOME</strong>.</p> + +<p>These are some of the key tomcat directories:</p> + +<ul> +<li><strong>/bin</strong> - Startup, shutdown, and other scripts. The + <code>*.sh</code> files (for Unix systems) are functional duplicates of + the <code>*.bat</code> files (for Windows systems). Since the Win32 + command-line lacks certain functionality, there are some additional + files in here.</li> +<li><strong>/conf</strong> - Configuration files and related DTDs. The most + important file in here is server.xml. It is the main configuration file + for the container.</li> +<li><strong>/logs</strong> - Log files are here by default.</li> +<li><strong>/webapps</strong> - This is where your webapps go.</li> +</ul> + +</div><h3 id="Configuring_Tomcat">Configuring Tomcat</h3><div class="text"> + +<p>This section will acquaint you with the basic information used during +the configuration of the container.</p> + +<p>All of the information in the configuration files is read at startup, +meaning that any change to the files necessitates a restart of the container. +</p> + +</div><h3 id="Where_to_Go_for_Help">Where to Go for Help</h3><div class="text"> + +<p>While we've done our best to ensure that these documents are clearly +written and easy to understand, we may have missed something. Provided +below are various web sites and mailing lists in case you get stuck.</p> + +<p>Keep in mind that some of the issues and solutions vary between the +major versions of Tomcat. As you search around the web, there will be +some documentation that is not relevant to Tomcat 9, but +only to earlier versions.</p> + +<ul> +<li>Current document - most documents will list potential hangups. Be sure + to fully read the relevant documentation as it will save you much time + and effort. There's nothing like scouring the web only to find out that + the answer was right in front of you all along!</li> +<li><a href="http://wiki.apache.org/tomcat/FAQ">Tomcat FAQ</a></li> +<li><a href="http://wiki.apache.org/tomcat/">Tomcat WIKI</a></li> +<li>Tomcat FAQ at <a href="http://www.jguru.com/faq/home.jsp?topic=Tomcat">jGuru</a></li> +<li>Tomcat mailing list archives - numerous sites archive the Tomcat mailing + lists. Since the links change over time, clicking here will search + <a href="http://www.google.com/search?q=tomcat+mailing+list+archives">Google</a>. + </li> +<li>The TOMCAT-USER mailing list, which you can subscribe to + <a href="http://tomcat.apache.org/lists.html">here</a>. If you don't + get a reply, then there's a good chance that your question was probably + answered in the list archives or one of the FAQs. Although questions + about web application development in general are sometimes asked and + answered, please focus your questions on Tomcat-specific issues.</li> +<li>The TOMCAT-DEV mailing list, which you can subscribe to + <a href="http://tomcat.apache.org/lists.html">here</a>. This list is + <strong>reserved</strong> for discussions about the development of Tomcat + itself. Questions about Tomcat configuration, and the problems you run + into while developing and running applications, will normally be more + appropriate on the TOMCAT-USER list instead.</li> +</ul> + +<p>And, if you think something should be in the docs, by all means let us know +on the TOMCAT-DEV list.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/jasper-howto.html b/src/tomcat/webapps/docs/jasper-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..6495df8ed1960d1de981ed5165c55eb79c6c95d7 --- /dev/null +++ b/src/tomcat/webapps/docs/jasper-howto.html @@ -0,0 +1,423 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Jasper 2 JSP Engine How To</title><meta name="author" content="Glenn L. Nielsen"><meta name="author" content="Peter Rossbach"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/jasper-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Jasper 2 JSP Engine How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuration">Configuration</a></li><li><a href="#Known_issues">Known issues</a></li><li><a href="#Production_Configuration">Production Configuration</a></li><li><a href="#Web_Application_Compilation">Web Application Compilation</a></li><li><a href="#Optimisation">Optimisation</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>Tomcat 9.0 uses the Jasper 2 JSP Engine to implement +the <a href="http://wiki.apache.org/tomcat/Specifications">JavaServer Pages 2.3</a> +specification.</p> + +<p>Jasper 2 has been redesigned to significantly improve performance over +the original Jasper. In addition to general code improvements the following +changes were made:</p> +<ul> +<li><strong>JSP Custom Tag Pooling</strong> - The java objects instantiated +for JSP Custom Tags can now be pooled and reused. This significantly boosts +the performance of JSP pages which use custom tags.</li> +<li><strong>Background JSP compilation</strong> - If you make a change to +a JSP page which had already been compiled Jasper 2 can recompile that +page in the background. The previously compiled JSP page will still be +available to serve requests. Once the new page has been compiled +successfully it will replace the old page. This helps improve availability +of your JSP pages on a production server.</li> +<li><strong>Recompile JSP when included page changes</strong> - Jasper 2 +can now detect when a page included at compile time from a JSP has changed +and then recompile the parent JSP.</li> +<li><strong>JDT used to compile JSP pages</strong> - The +Eclipse JDT Java compiler is now used to perform JSP java source code +compilation. This compiler loads source dependencies from the container +classloader. Ant and javac can still be used.</li> +</ul> + + +<p>Jasper is implemented using the servlet class +<code>org.apache.jasper.servlet.JspServlet</code>.</p> + +</div><h3 id="Configuration">Configuration</h3><div class="text"> + +<p>By default Jasper is configured for use when doing web application +development. See the section <a href="#Production_Configuration"> +Production Configuration</a> for information on configuring Jasper +for use on a production Tomcat server.</p> + +<p>The servlet which implements Jasper is configured using init parameters +in your global <code>$CATALINA_BASE/conf/web.xml</code>. +</p> +<ul> +<li><strong>checkInterval</strong> - If development is false and checkInterval +is greater than zero, background compiles are enabled. checkInterval is the time +in seconds between checks to see if a JSP page (and its dependent files) needs +to be recompiled. Default <code>0</code> seconds.</li> + +<li><strong>classdebuginfo</strong> - Should the class file be compiled with +debugging information? <code>true</code> or <code>false</code>, default +<code>true</code>. +</li> + +<li><strong>classpath</strong> - Defines the class path to be used to compile +the generated servlets. This parameter only has an effect if the ServletContext +attribute org.apache.jasper.Constants.SERVLET_CLASSPATH is not set. This +attribute is always set when Jasper is used within Tomcat. By default the +classpath is created dynamically based on the current web application.</li> + +<li><strong>compiler</strong> - Which compiler Ant should use to compile JSP +pages. The valid values for this are the same as for the compiler attribute of +Ant's +<a href="http://ant.apache.org/manual/Tasks/javac.html#compilervalues">javac</a> +task. If the value is not set, then the default Eclipse JDT Java compiler will +be used instead of using Ant. There is no default value. If this attribute is +set then <code>setenv.[sh|bat]</code> should be used to add +<code>ant.jar</code>, <code>ant-launcher.jar</code> and <code>tools.jar</code> +to the <code>CLASSPATH</code> environment variable.</li> + +<li><strong>compilerSourceVM</strong> - What JDK version are the source files +compatible with? (Default value: <code>1.8</code>)</li> + +<li><strong>compilerTargetVM</strong> - What JDK version are the generated files +compatible with? (Default value: <code>1.8</code>)</li> + +<li><strong>development</strong> - Is Jasper used in development mode? If true, +the frequency at which JSPs are checked for modification may be specified via +the modificationTestInterval parameter.<code>true</code> or <code>false</code>, +default <code>true</code>.</li> + +<li><strong>displaySourceFragment</strong> - Should a source fragment be +included in exception messages? <code>true</code> or <code>false</code>, +default <code>true</code>.</li> + +<li><strong>dumpSmap</strong> - Should the SMAP info for JSR45 debugging be +dumped to a file? <code>true</code> or <code>false</code>, default +<code>false</code>. <code>false</code> if suppressSmap is true.</li> + +<li><strong>enablePooling</strong> - Determines whether tag handler pooling is +enabled. This is a compilation option. It will not alter the behaviour of JSPs +that have already been compiled. <code>true</code> or <code>false</code>, +default <code>true</code>. +</li> + +<li><strong>engineOptionsClass</strong> - Allows specifying the Options class +used to configure Jasper. If not present, the default EmbeddedServletOptions +will be used. This option is ignored if running under a SecurityManager. +</li> + +<li><strong>errorOnUseBeanInvalidClassAttribute</strong> - Should Jasper issue +an error when the value of the class attribute in an useBean action is not a +valid bean class? <code>true</code> or <code>false</code>, default +<code>true</code>.</li> + +<li><strong>fork</strong> - Have Ant fork JSP page compiles so they are +performed in a separate JVM from Tomcat? <code>true</code> or +<code>false</code>, default <code>true</code>.</li> + +<li><strong>genStringAsCharArray</strong> - Should text strings be generated as char +arrays, to improve performance in some cases? Default <code>false</code>.</li> + +<li><strong>ieClassId</strong> - The class-id value to be sent to Internet +Explorer when using <jsp:plugin> tags. Default +<code>clsid:8AD9C840-044E-11D1-B3E9-00805F499D93</code>.</li> + +<li><strong>javaEncoding</strong> - Java file encoding to use for generating +java source files. Default <code>UTF8</code>.</li> + +<li><strong>keepgenerated</strong> - Should we keep the generated Java source +code for each page instead of deleting it? <code>true</code> or +<code>false</code>, default <code>true</code>.</li> + +<li><strong>mappedfile</strong> - Should we generate static content with one +print statement per input line, to ease debugging? +<code>true</code> or <code>false</code>, default <code>true</code>.</li> + +<li><strong>maxLoadedJsps</strong> - The maximum number of JSPs that will be +loaded for a web application. If more than this number of JSPs are loaded, the +least recently used JSPs will be unloaded so that the number of JSPs loaded at +any one time does not exceed this limit. A value of zero or less indicates no +limit. Default <code>-1</code></li> + +<li><strong>jspIdleTimeout</strong> - The amount of time in seconds a JSP can be +idle before it is unloaded. A value of zero or less indicates never unload. +Default <code>-1</code></li> + +<li><strong>modificationTestInterval</strong> - Causes a JSP (and its dependent +files) to not be checked for modification during the specified time interval +(in seconds) from the last time the JSP was checked for modification. A value of +0 will cause the JSP to be checked on every access. Used in development mode +only. Default is <code>4</code> seconds.</li> + +<li><strong>recompileOnFail</strong> - If a JSP compilation fails should the +modificationTestInterval be ignored and the next access trigger a re-compilation +attempt? Used in development mode only and is disabled by default as compilation +may be expensive and could lead to excessive resource usage.</li> + +<li><strong>scratchdir</strong> - What scratch directory should we use when +compiling JSP pages? Default is the work directory for the current web +application. This option is ignored if running under a SecurityManager.</li> + +<li><strong>suppressSmap</strong> - Should the generation of SMAP info for JSR45 +debugging be suppressed? <code>true</code> or <code>false</code>, default +<code>false</code>.</li> + +<li><strong>trimSpaces</strong> - Should template text that consists entirely of +whitespace be removed from the output (<code>true</code>), replaced with a +single space (<code>single</code>) or left unchanged (<code>false</code>)? Note +that if a JSP page or tag file specifies a <code>trimDirectiveWhitespaces</code> +value of <code>true</code>, that will take precedence over this configuration +setting for that page/tag. Default <code>false</code>.</li> + +<li><strong>xpoweredBy</strong> - Determines whether X-Powered-By response +header is added by generated servlet. <code>true</code> or <code>false</code>, +default <code>false</code>.</li> + +<li><strong>strictQuoteEscaping</strong> - When scriptlet expressions are used +for attribute values, should the rules in JSP.1.6 for the escaping of quote +characters be strictly applied? <code>true</code> or <code>false</code>, default +<code>true</code>.</li> + +<li><strong>quoteAttributeEL</strong> - When EL is used in an attribute value +on a JSP page, should the rules for quoting of attributes described in JSP.1.6 +be applied to the expression? <code>true</code> or <code>false</code>, default +<code>true</code>.</li> +</ul> + +<p>The Java compiler from Eclipse JDT in included as the default compiler. It is +an advanced Java compiler which will load all dependencies from the Tomcat class +loader, which will help tremendously when compiling on large installations with +tens of JARs. On fast servers, this will allow sub-second recompilation cycles +for even large JSP pages.</p> + +<p>Apache Ant, which was used in previous Tomcat releases, can be used instead +of the new compiler by configuring the compiler attribute as explained above. +</p> + +<p>If you need to change the JSP Servlet settings for an application you can +override the default configuration by re-defining the JSP Servlet in +<code>/WEB-INF/web.xml</code>. However, this may cause problems if you attempt +to deploy the application on another container as the JSP Servlet class may +not be recognised. You can work-around this problem by using the Tomact specific +<code>/WEB-INF/tomcat-web.xml</code> deployment descriptor. The format is +identical to <code>/WEB-INF/web.xml</code>. It will override any default +settings but not those in <code>/WEB-INF/web.xml</code>. Since it is Tomcat +specific, it will only be processed when the application is deployed on +Tomcat.</p> + +</div><h3 id="Known_issues">Known issues</h3><div class="text"> + +<p>As described in +<a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=39089"> +bug 39089</a>, a known JVM issue, +<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6294277"> +bug 6294277</a>, may cause a +<code>java.lang.InternalError: name is too long to represent</code> exception +when compiling very large JSPs. If this is observed then it may be worked around +by using one of the following: +</p> +<ul> +<li>reduce the size of the JSP</li> +<li>disable SMAP generation and JSR-045 support by setting +<code>suppressSmap</code> to <code>true</code>.</li> +</ul> + +</div><h3 id="Production_Configuration">Production Configuration</h3><div class="text"> + +<p>The main JSP optimization which can be done is precompilation of JSPs. +However, this might not be possible (for example, when using the +jsp-property-group feature) or practical, in which case the configuration of the +Jasper servlet becomes critical.</p> + +<p>When using Jasper 2 in a production Tomcat server you should consider making +the following changes from the default configuration.</p> +<ul> +<li><strong>development</strong> - To disable on access checks for JSP +pages compilation set this to <code>false</code>.</li> +<li><strong>genStringAsCharArray</strong> - To generate slightly more efficient +char arrays, set this to <code>true</code>.</li> +<li><strong>modificationTestInterval</strong> - If development has to be set to +<code>true</code> for any reason (such as dynamic generation of JSPs), setting +this to a high value will improve performance a lot.</li> +<li><strong>trimSpaces</strong> - To remove useless bytes from the response, +set this to <code>true</code>.</li> +</ul> + +</div><h3 id="Web_Application_Compilation">Web Application Compilation</h3><div class="text"> + +<p>Using Ant is the preferred way to compile web applications using JSPC. Note +that when pre-compiling JSPs, SMAP information will only be included in the +final classes if suppressSmap is false and compile is true. +Use the script given below (a similar script is included in the "deployer" +download) to precompile a webapp: +</p> + +<div class="codeBox"><pre><code><project name="Webapp Precompilation" default="all" basedir="."> + + <import file="${tomcat.home}/bin/catalina-tasks.xml"/> + + <target name="jspc"> + + <jasper + validateXml="false" + uriroot="${webapp.path}" + webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml" + outputDir="${webapp.path}/WEB-INF/src" /> + + </target> + + <target name="compile"> + + <mkdir dir="${webapp.path}/WEB-INF/classes"/> + <mkdir dir="${webapp.path}/WEB-INF/lib"/> + + <javac destdir="${webapp.path}/WEB-INF/classes" + optimize="off" + debug="on" failonerror="false" + srcdir="${webapp.path}/WEB-INF/src" + excludes="**/*.smap"> + <classpath> + <pathelement location="${webapp.path}/WEB-INF/classes"/> + <fileset dir="${webapp.path}/WEB-INF/lib"> + <include name="*.jar"/> + </fileset> + <pathelement location="${tomcat.home}/lib"/> + <fileset dir="${tomcat.home}/lib"> + <include name="*.jar"/> + </fileset> + <fileset dir="${tomcat.home}/bin"> + <include name="*.jar"/> + </fileset> + </classpath> + <include name="**" /> + <exclude name="tags/**" /> + </javac> + + </target> + + <target name="all" depends="jspc,compile"> + </target> + + <target name="cleanup"> + <delete> + <fileset dir="${webapp.path}/WEB-INF/src"/> + <fileset dir="${webapp.path}/WEB-INF/classes/org/apache/jsp"/> + </delete> + </target> + +</project></code></pre></div> + +<p> +The following command line can be used to run the script +(replacing the tokens with the Tomcat base path and the path to the webapp +which should be precompiled): +</p> +<div class="codeBox"><pre><code>$ANT_HOME/bin/ant -Dtomcat.home=<$TOMCAT_HOME> -Dwebapp.path=<$WEBAPP_PATH></code></pre></div> + + +<p> +Then, the declarations and mappings for the servlets which were generated +during the precompilation must be added to the web application deployment +descriptor. Insert the <code>${webapp.path}/WEB-INF/generated_web.xml</code> +at the right place inside the <code>${webapp.path}/WEB-INF/web.xml</code> file. +Restart the web application (using the manager) and test it to verify it is +running fine with precompiled servlets. An appropriate token placed in the +web application deployment descriptor may also be used to automatically +insert the generated servlet declarations and mappings using Ant filtering +capabilities. This is actually how all the webapps distributed with Tomcat +are automatically compiled as part of the build process. +</p> + +<p> +At the jasper task you can use the option <code>addWebXmlMappings</code> for +automatic merge the <code>${webapp.path}/WEB-INF/generated_web.xml</code> +with the current web application deployment descriptor at +<code>${webapp.path}/WEB-INF/web.xml</code>. When you want to use Java 6 +features inside your jsp's, add the following javac compiler task attributes: +<code>source="1.6" target="1.6"</code>. For live +applications you can also compile with <code>optimize="on"</code> and +without debug info <code>debug="off"</code>. +</p> + +<p> +When you don't want to stop the jsp generation at first jsp syntax error, use +<code>failOnError="false"</code>and with +<code>showSuccess="true"</code> all successful <i>jsp to java</i> +generation are printed out. Sometimes it is very helpful, when you cleanup the +generate java source files at <code>${webapp.path}/WEB-INF/src</code> +and the compile jsp servlet classes at +<code>${webapp.path}/WEB-INF/classes/org/apache/jsp</code>. +</p> + +<p><strong>Hints:</strong></p> +<ul> +<li> When you switch to another Tomcat release, then regenerate and recompile +your jsp's with the new Tomcat version.</li> +<li>Use java system property at server runtime to disable PageContext pooling +<code>org.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false</code>. +and limit the buffering with +<code>org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true</code>. Note +that changing from the defaults may affect performance, but it will vary +depending on the application.</li> +</ul> +</div><h3 id="Optimisation">Optimisation</h3><div class="text"> +<p> +There are a number of extension points provided within Jasper that enable the +user to optimise the behaviour for their environment. +</p> + +<p> +The first of these extension points is the tag plug-in mechanism. This allows +alternative implementations of tag handlers to be provided for a web application +to use. Tag plug-ins are registered via a <code>tagPlugins.xml</code> file +located under <code>WEB-INF</code>. A sample plug-in for the JSTL is included +with Jasper. +</p> + +<p> +The second extension point is the Expression Language interpreter. Alternative +interpreters may be configured through the <code>ServletContext</code>. See the +<code>ELInterpreterFactory</code> javadoc for details of how to configure an +alternative EL interpreter. +</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/jdbc-pool.html b/src/tomcat/webapps/docs/jdbc-pool.html new file mode 100644 index 0000000000000000000000000000000000000000..9cda5ac7f4c5bbe3bd5d8fbed5d70d09493d9ee2 --- /dev/null +++ b/src/tomcat/webapps/docs/jdbc-pool.html @@ -0,0 +1,929 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - The Tomcat JDBC Connection Pool</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/jdbc-pool"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The Tomcat JDBC Connection Pool</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#How_to_use">How to use</a><ol><li><a href="#Additional_features">Additional features</a></li><li><a href="#Inside_the_Apache_Tomcat_Container">Inside the Apache Tomcat Container</a></li><li><a href="#Standalone">Standalone</a></li><li><a href="#JMX">JMX</a></li></ol></li><li><a href="#Attributes">Attributes</a><ol><li><a href="#JNDI_Factory_and_Type">JNDI Factory and Type</a></li><li><a href="#System_Properties">System Properties</a></li><li><a href="#Common_Attributes">Common Attributes</a></li><li><a href="#Tomcat_JDBC_Enhanced_Attributes">Tomcat JDBC Enhanced Attributes</a></li></ol></li><li><a href="#Advanced_usage">Advanced usage</a><ol><li><a href="#JDBC_interceptors">JDBC interceptors</a></li><li><a href="#Configuring_JDBC_interceptors">Configuring JDBC interceptors</a></li><li><a href="#org.apache.tomcat.jdbc.pool.JdbcInterceptor">org.apache.tomcat.jdbc.pool.JdbcInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.ConnectionState">org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer">org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementCache">org.apache.tomcat.jdbc.pool.interceptor.StatementCache</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor">org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor">org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx</a></li><li><a href="#org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer">org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer</a></li></ol></li><li><a href="#Code_Example">Code Example</a><ol><li><a href="#Plain_Ol'_Java">Plain Ol' Java</a></li><li><a href="#As_a_Resource">As a Resource</a></li><li><a href="#Asynchronous_Connection_Retrieval">Asynchronous Connection Retrieval</a></li><li><a href="#Interceptors">Interceptors</a></li><li><a href="#Getting_the_actual_JDBC_connection">Getting the actual JDBC connection</a></li></ol></li><li><a href="#Building">Building</a><ol><li><a href="#Building_from_source">Building from source</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The <strong>JDBC Connection Pool <code>org.apache.tomcat.jdbc.pool</code></strong> + is a replacement or an alternative to the <a href="http://commons.apache.org/dbcp/">Apache Commons DBCP</a> + connection pool.</p> + + <p>So why do we need a new connection pool?</p> + + <p>Here are a few of the reasons:</p> + <ol> + <li>Commons DBCP 1.x is single threaded. In order to be thread safe + Commons locks the entire pool for short periods during both object + allocation and object return. Note that this does not apply to + Commons DBCP 2.x.</li> + <li>Commons DBCP 1.x can be slow. As the number of logical CPUs grows and + the number of concurrent threads attempting to borrow or return + objects increases, the performance suffers. For highly concurrent + systems the impact can be significant. Note that this does not apply + to Commons DBCP 2.x.</li> + <li>Commons DBCP is over 60 classes. tomcat-jdbc-pool core is 8 classes, + hence modifications for future requirement will require much less + changes. This is all you need to run the connection pool itself, the + rest is gravy.</li> + <li>Commons DBCP uses static interfaces. This means you have to use the + right version for a given JRE version or you may see + <code>NoSuchMethodException</code> exceptions.</li> + <li>It's not worth rewriting over 60 classes, when a connection pool can + be accomplished with a much simpler implementation.</li> + <li>Tomcat jdbc pool implements the ability retrieve a connection + asynchronously, without adding additional threads to the library + itself.</li> + <li>Tomcat jdbc pool is a Tomcat module, it depends on Tomcat JULI, a + simplified logging framework used in Tomcat.</li> + <li>Retrieve the underlying connection using the + <code>javax.sql.PooledConnection</code> interface.</li> + <li>Starvation proof. If a pool is empty, and threads are waiting for a + connection, when a connection is returned, the pool will awake the + correct thread waiting. Most pools will simply starve.</li> + </ol> + + <p>Features added over other connection pool implementations</p> + <ol> + <li>Support for highly concurrent environments and multi core/cpu systems.</li> + <li>Dynamic implementation of interface, will support <code>java.sql</code> and <code>javax.sql</code> interfaces for + your runtime environment (as long as your JDBC driver does the same), even when compiled with a lower version of the JDK.</li> + <li>Validation intervals - we don't have to validate every single time we use the connection, we can do this + when we borrow or return the connection, just not more frequent than an interval we can configure.</li> + <li>Run-Once query, a configurable query that will be run only once, when the connection to the database is established. + Very useful to setup session settings, that you want to exist during the entire time the connection is established.</li> + <li>Ability to configure custom interceptors. + This allows you to write custom interceptors to enhance the functionality. You can use interceptors to gather query stats, + cache session states, reconnect the connection upon failures, retry queries, cache query results, and so on. + Your options are endless and the interceptors are dynamic, not tied to a JDK version of a + <code>java.sql</code>/<code>javax.sql</code> interface.</li> + <li>High performance - we will show some differences in performance later on</li> + <li>Extremely simple, due to the very simplified implementation, the line count and source file count are very low, compare with c3p0 + that has over 200 source files(last time we checked), Tomcat jdbc has a core of 8 files, the connection pool itself is about half + that. As bugs may occur, they will be faster to track down, and easier to fix. Complexity reduction has been a focus from inception.</li> + <li>Asynchronous connection retrieval - you can queue your request for a connection and receive a <code>Future<Connection></code> back.</li> + <li>Better idle connection handling. Instead of closing connections directly, it can still pool connections and sizes the idle pool with a smarter algorithm.</li> + <li>You can decide at what moment connections are considered abandoned, is it when the pool is full, or directly at a timeout + by specifying a pool usage threshold. + </li> + <li>The abandon connection timer will reset upon a statement/query activity. Allowing a connections that is in use for a long time to not timeout. + This is achieved using the <code>ResetAbandonedTimer</code> + </li> + <li>Close connections after they have been connected for a certain time. Age based close upon return to the pool. + </li> + <li>Get JMX notifications and log entries when connections are suspected for being abandoned. This is similar to + the <code>removeAbandonedTimeout</code> but it doesn't take any action, only reports the information. + This is achieved using the <code>suspectTimeout</code> attribute.</li> + <li>Connections can be retrieved from a <code>java.sql.Driver</code>, <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code> + This is achieved using the <code>dataSource</code> and <code>dataSourceJNDI</code> attributes.</li> + <li>XA connection support</li> + </ol> + + +</div><h3 id="How_to_use">How to use</h3><div class="text"> + <p> + Usage of the Tomcat connection pool has been made to be as simple as possible, for those of you that are familiar with commons-dbcp, the + transition will be very simple. Moving from other connection pools is also fairly straight forward. + </p> + <div class="subsection"><h4 id="Additional_features">Additional features</h4><div class="text"> + <p>The Tomcat connection pool offers a few additional features over what most other pools let you do:</p> + <ul> + <li><code>initSQL</code> - the ability to run a SQL statement exactly once, when the connection is created</li> + <li><code>validationInterval</code> - in addition to running validations on connections, avoid running them too frequently.</li> + <li><code>jdbcInterceptors</code> - flexible and pluggable interceptors to create any customizations around the pool, + the query execution and the result set handling. More on this in the advanced section.</li> + <li><code>fairQueue</code> - Set the fair flag to true to achieve thread fairness or to use asynchronous connection retrieval</li> + </ul> + </div></div> + <div class="subsection"><h4 id="Inside_the_Apache_Tomcat_Container">Inside the Apache Tomcat Container</h4><div class="text"> + <p> + The Tomcat Connection pool is configured as a resource described in <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html" target="_blank">The Tomcat JDBC documentation</a> + With the only difference being that you have to specify the <code>factory</code> attribute and set the value to + <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code> + </p> + </div></div> + <div class="subsection"><h4 id="Standalone">Standalone</h4><div class="text"> + <p> + The connection pool only has another dependency, and that is on tomcat-juli.jar. + To configure the pool in a stand alone project using bean instantiation, the bean to instantiate is + <code>org.apache.tomcat.jdbc.pool.DataSource</code>. The same attributes (documented below) as you use to configure a connection + pool as a JNDI resource, are used to configure a data source as a bean. + </p> + </div></div> + <div class="subsection"><h4 id="JMX">JMX</h4><div class="text"> + <p> + The connection pool object exposes an MBean that can be registered. + In order for the connection pool object to create the MBean, the flag <code>jmxEnabled</code> has to be set to true. + This doesn't imply that the pool will be registered with an MBean server, merely that the MBean is created. + In a container like Tomcat, Tomcat itself registers the DataSource with the MBean server, the + <code>org.apache.tomcat.jdbc.pool.DataSource</code> object will then register the actual + connection pool MBean. + If you're running outside of a container, you can register the DataSource yourself under any object name you specify, + and it propagates the registration to the underlying pool. To do this you would call <code>mBeanServer.registerMBean(dataSource.getPool().getJmxPool(),objectname)</code>. + Prior to this call, ensure that the pool has been created by calling <code>dataSource.createPool()</code>. + </p> + </div></div> + +</div><h3 id="Attributes">Attributes</h3><div class="text"> + <p>To provide a very simple switch to and from commons-dbcp and tomcat-jdbc-pool, + Most attributes are the same and have the same meaning.</p> + <div class="subsection"><h4 id="JNDI_Factory_and_Type">JNDI Factory and Type</h4><div class="text"> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">factory</code></strong></td><td> + <p>factory is required, and the value should be <code>org.apache.tomcat.jdbc.pool.DataSourceFactory</code></p> + </td></tr><tr><td><strong><code class="attributeName">type</code></strong></td><td> + <p>Type should always be <code>javax.sql.DataSource</code> or <code>javax.sql.XADataSource</code></p> + <p>Depending on the type a <code>org.apache.tomcat.jdbc.pool.DataSource</code> or a <code>org.apache.tomcat.jdbc.pool.XADataSource</code> will be created.</p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="System_Properties">System Properties</h4><div class="text"> + <p>System properties are JVM wide, affect all pools created in the JVM</p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader</code></td><td> + <p>(boolean) Controls classloading of dynamic classes, such as + JDBC drivers, interceptors and validators. If set to + <code>false</code>, default value, the pool will first attempt + to load using the current loader (i.e. the class loader that + loaded the pool classes) and if class loading fails attempt to + load using the thread context loader. Set this value to + <code>true</code>, if you wish to remain backwards compatible + with Apache Tomcat 8.0.8 and earlier, and only attempt the + current loader. + If not set then the default value is <code>false</code>. + </p> + </td></tr></table> + </div></div> + + <div class="subsection"><h4 id="Common_Attributes">Common Attributes</h4><div class="text"> + <p>These attributes are shared between commons-dbcp and tomcat-jdbc-pool, in some cases default values are different.</p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">defaultAutoCommit</code></td><td> + <p>(boolean) The default auto-commit state of connections created by this pool. If not set, default is JDBC driver default (If not set then the <code>setAutoCommit</code> method will not be called.)</p> + </td></tr><tr><td><code class="attributeName">defaultReadOnly</code></td><td> + <p>(boolean) The default read-only state of connections created by this pool. If not set then the <code>setReadOnly</code> method will not be called. (Some drivers don't support read only mode, ex: Informix)</p> + </td></tr><tr><td><code class="attributeName">defaultTransactionIsolation</code></td><td> + <p>(String) The default TransactionIsolation state of connections created by this pool. One of the following: (see javadoc )</p> + <ul> + <li><code>NONE</code></li> + <li><code>READ_COMMITTED</code></li> + <li><code>READ_UNCOMMITTED</code></li> + <li><code>REPEATABLE_READ</code></li> + <li><code>SERIALIZABLE</code></li> + </ul> + <p>If not set, the method will not be called and it defaults to the JDBC driver.</p> + </td></tr><tr><td><code class="attributeName">defaultCatalog</code></td><td> + <p>(String) The default catalog of connections created by this pool.</p> + </td></tr><tr><td><strong><code class="attributeName">driverClassName</code></strong></td><td> + <p>(String) The fully qualified Java class name of the JDBC driver to be used. The driver has to be accessible + from the same classloader as tomcat-jdbc.jar + </p> + </td></tr><tr><td><strong><code class="attributeName">username</code></strong></td><td> + <p>(String) The connection username to be passed to our JDBC driver to establish a connection. + Note that method <code>DataSource.getConnection(username,password)</code> + by default will not use credentials passed into the method, + but will use the ones configured here. See <code>alternateUsernameAllowed</code> + property for more details. + </p> + </td></tr><tr><td><strong><code class="attributeName">password</code></strong></td><td> + <p>(String) The connection password to be passed to our JDBC driver to establish a connection. + Note that method <code>DataSource.getConnection(username,password)</code> + by default will not use credentials passed into the method, + but will use the ones configured here. See <code>alternateUsernameAllowed</code> + property for more details. + </p> + </td></tr><tr><td><code class="attributeName">maxActive</code></td><td> + <p>(int) The maximum number of active connections that can be allocated from this pool at the same time. + The default value is <code>100</code></p> + </td></tr><tr><td><code class="attributeName">maxIdle</code></td><td> + <p>(int) The maximum number of connections that should be kept in the pool at all times. + Default value is <code>maxActive</code>:<code>100</code> + Idle connections are checked periodically (if enabled) and + connections that been idle for longer than <code>minEvictableIdleTimeMillis</code> + will be released. (also see <code>testWhileIdle</code>)</p> + </td></tr><tr><td><code class="attributeName">minIdle</code></td><td> + <p> + (int) The minimum number of established connections that should be kept in the pool at all times. + The connection pool can shrink below this number if validation queries fail. + Default value is derived from <code>initialSize</code>:<code>10</code> (also see <code>testWhileIdle</code>) + </p> + </td></tr><tr><td><code class="attributeName">initialSize</code></td><td> + <p>(int)The initial number of connections that are created when the pool is started. + Default value is <code>10</code></p> + </td></tr><tr><td><code class="attributeName">maxWait</code></td><td> + <p>(int) The maximum number of milliseconds that the pool will wait (when there are no available connections) + for a connection to be returned before throwing an exception. + Default value is <code>30000</code> (30 seconds)</p> + </td></tr><tr><td><code class="attributeName">testOnBorrow</code></td><td> + <p>(boolean) The indication of whether objects will be validated before being borrowed from the pool. + If the object fails to validate, it will be dropped from the pool, and we will attempt to borrow another. + In order to have a more efficient validation, see <code>validationInterval</code>. + Default value is <code>false</code> + </p> + </td></tr><tr><td><code class="attributeName">testOnConnect</code></td><td> + <p>(boolean) The indication of whether objects will be validated when a connection is first created. + If an object fails to validate, it will be throw <code>SQLException</code>. + Default value is <code>false</code> + </p> + </td></tr><tr><td><code class="attributeName">testOnReturn</code></td><td> + <p>(boolean) The indication of whether objects will be validated before being returned to the pool. + The default value is <code>false</code>. + </p> + </td></tr><tr><td><code class="attributeName">testWhileIdle</code></td><td> + <p>(boolean) The indication of whether objects will be validated by the idle object evictor (if any). + If an object fails to validate, it will be dropped from the pool. + The default value is <code>false</code> and this property has to be set in order for the + pool cleaner/test thread is to run (also see <code>timeBetweenEvictionRunsMillis</code>) + </p> + </td></tr><tr><td><code class="attributeName">validationQuery</code></td><td> + <p>(String) The SQL query that will be used to validate connections from this pool before returning them to the caller. + If specified, this query does not have to return any data, it just can't throw a <code>SQLException</code>. + The default value is <code>null</code>. + If not specified, connections will be validation by the isValid() method. + Example values are <code>SELECT 1</code>(mysql), <code>select 1 from dual</code>(oracle), <code>SELECT 1</code>(MS Sql Server) + </p> + </td></tr><tr><td><code class="attributeName">validationQueryTimeout</code></td><td> + <p>(int) The timeout in seconds before a connection validation queries fail. This works by calling + <code>java.sql.Statement.setQueryTimeout(seconds)</code> on the statement that executes the <code>validationQuery</code>. + The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts. + A value less than or equal to zero will disable this feature. + The default value is <code>-1</code>. + </p> + </td></tr><tr><td><code class="attributeName">validatorClassName</code></td><td> + <p>(String) The name of a class which implements the + <code>org.apache.tomcat.jdbc.pool.Validator</code> interface and + provides a no-arg constructor (may be implicit). If specified, the + class will be used to create a Validator instance which is then used + instead of any validation query to validate connections. The default + value is <code>null</code>. An example value is + <code>com.mycompany.project.SimpleValidator</code>. + </p> + </td></tr><tr><td><code class="attributeName">timeBetweenEvictionRunsMillis</code></td><td> + <p>(int) The number of milliseconds to sleep between runs of the idle connection validation/cleaner thread. + This value should not be set under 1 second. It dictates how often we check for idle, abandoned connections, and how often + we validate idle connections. + The default value is <code>5000</code> (5 seconds). <br> + </p> + </td></tr><tr><td><code class="attributeName">numTestsPerEvictionRun</code></td><td> + <p>(int) Property not used in tomcat-jdbc-pool.</p> + </td></tr><tr><td><code class="attributeName">minEvictableIdleTimeMillis</code></td><td> + <p>(int) The minimum amount of time an object may sit idle in the pool before it is eligible for eviction. + The default value is <code>60000</code> (60 seconds).</p> + </td></tr><tr><td><code class="attributeName">accessToUnderlyingConnectionAllowed</code></td><td> + <p>(boolean) Property not used. Access can be achieved by calling <code>unwrap</code> on the pooled connection. + see <code>javax.sql.DataSource</code> interface, or call <code>getConnection</code> through reflection or + cast the object as <code>javax.sql.PooledConnection</code></p> + </td></tr><tr><td><code class="attributeName">removeAbandoned</code></td><td> + <p>(boolean) Flag to remove abandoned connections if they exceed the <code>removeAbandonedTimeout</code>. + If set to true a connection is considered abandoned and eligible for removal if it has been in use + longer than the <code>removeAbandonedTimeout</code> Setting this to <code>true</code> can recover db connections from + applications that fail to close a connection. See also <code>logAbandoned</code> + The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">removeAbandonedTimeout</code></td><td> + <p>(int) Timeout in seconds before an abandoned(in use) connection can be removed. + The default value is <code>60</code> (60 seconds). The value should be set to the longest running query your applications + might have.</p> + </td></tr><tr><td><code class="attributeName">logAbandoned</code></td><td> + <p>(boolean) Flag to log stack traces for application code which abandoned a Connection. + Logging of abandoned Connections adds overhead for every Connection borrow because a stack trace has to be generated. + The default value is <code>false</code>.</p> + </td></tr><tr><td><code class="attributeName">connectionProperties</code></td><td> + <p>(String) The connection properties that will be sent to our JDBC driver when establishing new connections. + Format of the string must be [propertyName=property;]* + NOTE - The "user" and "password" properties will be passed explicitly, so they do not need to be included here. + The default value is <code>null</code>.</p> + </td></tr><tr><td><code class="attributeName">poolPreparedStatements</code></td><td> + <p>(boolean) Property not used.</p> + </td></tr><tr><td><code class="attributeName">maxOpenPreparedStatements</code></td><td> + <p>(int) Property not used.</p> + </td></tr></table> + + </div></div> + + <div class="subsection"><h4 id="Tomcat_JDBC_Enhanced_Attributes">Tomcat JDBC Enhanced Attributes</h4><div class="text"> + + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">initSQL</code></td><td> + <p>(String) A custom query to be run when a connection is first created. + The default value is <code>null</code>.</p> + </td></tr><tr><td><code class="attributeName">jdbcInterceptors</code></td><td> + <p>(String) A semicolon separated list of classnames extending + <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class. + See <a href="#Configuring_JDBC_interceptors">Configuring JDBC interceptors</a> + below for more detailed description of syntax and examples. + </p> + <p> + These interceptors will be inserted as an interceptor into the chain + of operations on a <code>java.sql.Connection</code> object. + The default value is <code>null</code>. + </p> + <p> + Predefined interceptors:<br> + <code>org.apache.tomcat.jdbc.pool.interceptor.<br>ConnectionState</code> + - keeps track of auto commit, read only, catalog and transaction isolation level.<br> + <code>org.apache.tomcat.jdbc.pool.interceptor.<br>StatementFinalizer</code> + - keeps track of opened statements, and closes them when the connection is returned to the pool. + </p> + <p> + More predefined interceptors are described in detail in the + <a href="#JDBC_interceptors">JDBC Interceptors section</a>. + </p> + </td></tr><tr><td><code class="attributeName">validationInterval</code></td><td> + <p>(long) avoid excess validation, only run validation at most at this frequency - time in milliseconds. + If a connection is due for validation, but has been validated previously within this interval, it will not be validated again. + The default value is <code>3000</code> (3 seconds).</p> + </td></tr><tr><td><code class="attributeName">jmxEnabled</code></td><td> + <p>(boolean) Register the pool with JMX or not. + The default value is <code>true</code>.</p> + </td></tr><tr><td><code class="attributeName">fairQueue</code></td><td> + <p>(boolean) Set to true if you wish that calls to getConnection should be treated + fairly in a true FIFO fashion. This uses the <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue</code> + implementation for the list of the idle connections. The default value is <code>true</code>. + This flag is required when you want to use asynchronous connection retrieval.<br> + Setting this flag ensures that threads receive connections in the order they arrive.<br> + During performance tests, there is a very large difference in how locks + and lock waiting is implemented. When <code>fairQueue=true</code> + there is a decision making process based on what operating system the system is running. + If the system is running on Linux (property <code>os.name=Linux</code>. + To disable this Linux specific behavior and still use the fair queue, simply add the property + <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true</code> to your system properties + before the connection pool classes are loaded. + </p> + </td></tr><tr><td><code class="attributeName">abandonWhenPercentageFull</code></td><td> + <p>(int) Connections that have been abandoned (timed out) wont get closed and reported up unless + the number of connections in use are above the percentage defined by <code>abandonWhenPercentageFull</code>. + The value should be between 0-100. + The default value is <code>0</code>, which implies that connections are eligible for closure as soon + as <code>removeAbandonedTimeout</code> has been reached.</p> + </td></tr><tr><td><code class="attributeName">maxAge</code></td><td> + <p>(long) Time in milliseconds to keep this connection. This attribute + works both when returning connection and when borrowing connection. + When a connection is borrowed from the pool, the pool will check to see + if the <code>now - time-when-connected > maxAge</code> has been reached + , and if so, it reconnects before borrow it. When a connection is + returned to the pool, the pool will check to see if the + <code>now - time-when-connected > maxAge</code> has been reached, and + if so, it closes the connection rather than returning it to the pool. + The default value is <code>0</code>, which implies that connections + will be left open and no age check will be done upon borrowing from the + pool and returning the connection to the pool.</p> + </td></tr><tr><td><code class="attributeName">useEquals</code></td><td> + <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code> + when you wish to use <code>==</code> when comparing method names. This property does not apply to added interceptors as those are configured individually. + The default value is <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">suspectTimeout</code></td><td> + <p>(int) Timeout value in seconds. Default value is <code>0</code>.<br> + Similar to to the <code>removeAbandonedTimeout</code> value but instead of treating the connection + as abandoned, and potentially closing the connection, this simply logs the warning if + <code>logAbandoned</code> is set to true. If this value is equal or less than 0, no suspect + checking will be performed. Suspect checking only takes place if the timeout value is larger than 0 and + the connection was not abandoned or if abandon check is disabled. If a connection is suspect a WARN message gets + logged and a JMX notification gets sent once. + </p> + </td></tr><tr><td><code class="attributeName">rollbackOnReturn</code></td><td> + <p>(boolean) If <code>autoCommit==false</code> then the pool can terminate the transaction by calling rollback on the connection as it is returned to the pool + Default value is <code>false</code>.<br> + </p> + </td></tr><tr><td><code class="attributeName">commitOnReturn</code></td><td> + <p>(boolean) If <code>autoCommit==false</code> then the pool can complete the transaction by calling commit on the connection as it is returned to the pool + If <code>rollbackOnReturn==true</code> then this attribute is ignored. + Default value is <code>false</code>.<br> + </p> + </td></tr><tr><td><code class="attributeName">alternateUsernameAllowed</code></td><td> + <p>(boolean) By default, the jdbc-pool will ignore the + <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a> + call, and simply return a previously pooled connection under the globally configured properties <code>username</code> and <code>password</code>, for performance reasons. + </p> + <p> + The pool can however be configured to allow use of different credentials + each time a connection is requested. To enable the functionality described in the + <a href="http://docs.oracle.com/javase/6/docs/api/javax/sql/DataSource.html#getConnection(java.lang.String,%20java.lang.String)"><code>DataSource.getConnection(username,password)</code></a> + call, simply set the property <code>alternateUsernameAllowed</code> + to <code>true</code>.<br> + Should you request a connection with the credentials user1/password1 and the connection + was previously connected using different user2/password2, the connection will be closed, + and reopened with the requested credentials. This way, the pool size is still managed + on a global level, and not on a per schema level. <br> + The default value is <code>false</code>.<br> + This property was added as an enhancement to <a href="https://bz.apache.org/bugzilla/show_bug.cgi?id=50025">bug 50025</a>. + </p> + </td></tr><tr><td><code class="attributeName">dataSource</code></td><td> + <p>(javax.sql.DataSource) Inject a data source to the connection pool, and the pool will use the data source to retrieve connections instead of establishing them using the <code>java.sql.Driver</code> interface. + This is useful when you wish to pool XA connections or connections established using a data source instead of a connection string. Default value is <code>null</code> + </p> + </td></tr><tr><td><code class="attributeName">dataSourceJNDI</code></td><td> + <p>(String) The JNDI name for a data source to be looked up in JNDI and then used to establish connections to the database. See the <code>dataSource</code> attribute. Default value is <code>null</code> + </p> + </td></tr><tr><td><code class="attributeName">useDisposableConnectionFacade</code></td><td> + <p>(boolean) Set this to true if you wish to put a facade on your connection so that it cannot be reused after it has been closed. This prevents a thread holding on to a + reference of a connection it has already called closed on, to execute queries on it. Default value is <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">logValidationErrors</code></td><td> + <p>(boolean) Set this to true to log errors during the validation phase to the log file. If set to true, errors will be logged as SEVERE. Default value is <code>false</code> for backwards compatibility. + </p> + </td></tr><tr><td><code class="attributeName">propagateInterruptState</code></td><td> + <p>(boolean) Set this to true to propagate the interrupt state for a thread that has been interrupted (not clearing the interrupt state). Default value is <code>false</code> for backwards compatibility. + </p> + </td></tr><tr><td><code class="attributeName">ignoreExceptionOnPreLoad</code></td><td> + <p>(boolean) Flag whether ignore error of connection creation while initializing the pool. + Set to true if you want to ignore error of connection creation while initializing the pool. + Set to false if you want to fail the initialization of the pool by throwing exception. + The default value is <code>false</code>. + </p> + </td></tr><tr><td><code class="attributeName">useStatementFacade</code></td><td> + <p>(boolean) Set this to true if you wish to wrap statements in order to + enable <code>equals()</code> and <code>hashCode()</code> methods to be + called on the closed statements if any statement proxy is set. + Default value is <code>true</code>. + </p> + </td></tr></table> + </div></div> +</div><h3 id="Advanced_usage">Advanced usage</h3><div class="text"> + <div class="subsection"><h4 id="JDBC_interceptors">JDBC interceptors</h4><div class="text"> + <p>To see an example of how to use an interceptor, take a look at + <code>org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</code>. + This simple interceptor is a cache of three attributes, transaction isolation level, auto commit and read only state, + in order for the system to avoid not needed roundtrips to the database. + </p> + <p>Further interceptors will be added to the core of the pool as the need arises. Contributions are always welcome!</p> + <p>Interceptors are of course not limited to just <code>java.sql.Connection</code> but can be used to wrap any + of the results from a method invocation as well. You could build query performance analyzer that provides JMX notifications when a + query is running longer than the expected time.</p> + </div></div> + <div class="subsection"><h4 id="Configuring_JDBC_interceptors">Configuring JDBC interceptors</h4><div class="text"> + <p>Configuring JDBC interceptors is done using the <b>jdbcInterceptors</b> property. + The property contains a list of semicolon separated class names. If the + classname is not fully qualified it will be prefixed with the + <code>org.apache.tomcat.jdbc.pool.interceptor.</code> prefix. + </p> + <p>Example:<br> + <code> + jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; + org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" + </code> + <br> + is the same as + <br> + <code> jdbcInterceptors="ConnectionState;StatementFinalizer"</code> + </p> + <p> + Interceptors can have properties as well. Properties for an interceptor + are specified within parentheses after the class name. Several properties + are separated by commas. + </p> + <p>Example:<br> + <code> + jdbcInterceptors="ConnectionState;StatementFinalizer(useEquals=true)" + </code> + </p> + <p> + Extra whitespace characters around class names, property names and values + are ignored. + </p> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.JdbcInterceptor">org.apache.tomcat.jdbc.pool.JdbcInterceptor</h4><div class="text"> + <p>Abstract base class for all interceptors, cannot be instantiated.</p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">useEquals</code></td><td> + <p>(boolean) Set to true if you wish the <code>ProxyConnection</code> class to use <code>String.equals</code> and set to <code>false</code> + when you wish to use <code>==</code> when comparing method names. + The default value is <code>true</code>. + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState">org.apache.tomcat.jdbc.pool.interceptor.ConnectionState</h4><div class="text"> + <p>Caches the connection for the following attributes <code>autoCommit</code>, <code>readOnly</code>, + <code>transactionIsolation</code> and <code>catalog</code>. + It is a performance enhancement to avoid roundtrip to the database when getters are called or setters are called with an already set value. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer">org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer</h4><div class="text"> + <p>Keeps track of all statements created using <code>createStatement</code>, <code>prepareStatement</code> or <code>prepareCall</code> + and closes these statements when the connection is returned to the pool. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">trace</code></td><td> + <p>(boolean as String) Enable tracing of unclosed statements. + When enabled and a connection is closed, and statements are not closed, + the interceptor will log all stack traces. + The default value is <code>false</code>. + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementCache">org.apache.tomcat.jdbc.pool.interceptor.StatementCache</h4><div class="text"> + <p>Caches <code>PreparedStatement</code> and/or <code>CallableStatement</code> + instances on a connection. + </p> + <p>The statements are cached per connection. + The count limit is counted globally for all connections that belong to + the same pool. Once the count reaches <code>max</code>, subsequent + statements are not returned to the cache and are closed immediately. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">prepared</code></td><td> + <p>(boolean as String) Enable caching of <code>PreparedStatement</code> + instances created using <code>prepareStatement</code> calls. + The default value is <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">callable</code></td><td> + <p>(boolean as String) Enable caching of <code>CallableStatement</code> + instances created using <code>prepareCall</code> calls. + The default value is <code>false</code>. + </p> + </td></tr><tr><td><code class="attributeName">max</code></td><td> + <p>(int as String) Limit on the count of cached statements across + the connection pool. + The default value is <code>50</code>. + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor">org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor</h4><div class="text"> + <p>See <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=48392">48392</a>. Interceptor to wrap statements and result sets in order to prevent access to the actual connection + using the methods <code>ResultSet.getStatement().getConnection()</code> and <code>Statement.getConnection()</code> + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor">org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor</h4><div class="text"> + <p>Automatically calls <code>java.sql.Statement.setQueryTimeout(seconds)</code> when a new statement is created. + The pool itself doesn't timeout the query, it is still up to the JDBC driver to enforce query timeouts. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><strong><code class="attributeName">queryTimeout</code></strong></td><td> + <p>(int as String) The number of seconds to set for the query timeout. + A value less than or equal to zero will disable this feature. + The default value is <code>1</code> seconds. + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport</h4><div class="text"> + <p>Keeps track of query performance and issues log entries when queries exceed a time threshold of fail. + The log level used is <code>WARN</code> + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">threshold</code></td><td> + <p>(int as String) The number of milliseconds a query has to exceed before issuing a log alert. + The default value is <code>1000</code> milliseconds. + </p> + </td></tr><tr><td><code class="attributeName">maxQueries</code></td><td> + <p>(int as String) The maximum number of queries to keep track of in order to preserve memory space. + A value less than or equal to 0 will disable this feature. + The default value is <code>1000</code>. + </p> + </td></tr><tr><td><code class="attributeName">logSlow</code></td><td> + <p>(boolean as String) Set to <code>true</code> if you wish to log slow queries. + The default value is <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">logFailed</code></td><td> + <p>(boolean as String) Set to <code>true</code> if you wish to log failed queries. + The default value is <code>false</code>. + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx">org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx</h4><div class="text"> + <p>Extends the <code>SlowQueryReport</code> and in addition to log entries it issues JMX notification + for monitoring tools to react to. Inherits all the attributes from its parent class. + This class uses Tomcat's JMX engine so it wont work outside of the Tomcat container. + By default, JMX notifications are sent through the ConnectionPool mbean if it is enabled. + The <code>SlowQueryReportJmx</code> can also register an MBean if <code>notifyPool=false</code> + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr><tr><td><code class="attributeName">notifyPool</code></td><td> + <p>(boolean as String) Set to false if you want JMX notifications to go to the <code>SlowQueryReportJmx</code> MBean + The default value is <code>true</code>. + </p> + </td></tr><tr><td><code class="attributeName">objectName</code></td><td> + <p>(String) Define a valid <code>javax.management.ObjectName</code> string that will be used to register this object with the platform mbean server + The default value is <code>null</code> and the object will be registered using + tomcat.jdbc:type=org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx,name=the-name-of-the-pool + </p> + </td></tr></table> + </div></div> + <div class="subsection"><h4 id="org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer">org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer</h4><div class="text"> + <p> + The abandoned timer starts when a connection is checked out from the pool. + This means if you have a 30second timeout and run 10x10second queries using the connection + it will be marked abandoned and potentially reclaimed depending on the <code>abandonWhenPercentageFull</code> + attribute. + Using this interceptor it will reset the checkout timer every time you perform an operation on the connection or execute a + query successfully. + </p> + <table class="defaultTable"><tr><th style="width: 15%;"> + Attribute + </th><th style="width: 85%;"> + Description + </th></tr></table> + </div></div> +</div><h3 id="Code_Example">Code Example</h3><div class="text"> + <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p> + <div class="subsection"><h4 id="Plain_Ol'_Java">Plain Ol' Java</h4><div class="text"> + <p>Here is a simple example of how to create and use a data source.</p> +<div class="codeBox"><pre><code> import java.sql.Connection; + import java.sql.ResultSet; + import java.sql.Statement; + + import org.apache.tomcat.jdbc.pool.DataSource; + import org.apache.tomcat.jdbc.pool.PoolProperties; + + public class SimplePOJOExample { + + public static void main(String[] args) throws Exception { + PoolProperties p = new PoolProperties(); + p.setUrl("jdbc:mysql://localhost:3306/mysql"); + p.setDriverClassName("com.mysql.jdbc.Driver"); + p.setUsername("root"); + p.setPassword("password"); + p.setJmxEnabled(true); + p.setTestWhileIdle(false); + p.setTestOnBorrow(true); + p.setValidationQuery("SELECT 1"); + p.setTestOnReturn(false); + p.setValidationInterval(30000); + p.setTimeBetweenEvictionRunsMillis(30000); + p.setMaxActive(100); + p.setInitialSize(10); + p.setMaxWait(10000); + p.setRemoveAbandonedTimeout(60); + p.setMinEvictableIdleTimeMillis(30000); + p.setMinIdle(10); + p.setLogAbandoned(true); + p.setRemoveAbandoned(true); + p.setJdbcInterceptors( + "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); + DataSource datasource = new DataSource(); + datasource.setPoolProperties(p); + + Connection con = null; + try { + con = datasource.getConnection(); + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery("select * from user"); + int cnt = 1; + while (rs.next()) { + System.out.println((cnt++)+". Host:" +rs.getString("Host")+ + " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); + } + rs.close(); + st.close(); + } finally { + if (con!=null) try {con.close();}catch (Exception ignore) {} + } + } + + }</code></pre></div> + </div></div> + <div class="subsection"><h4 id="As_a_Resource">As a Resource</h4><div class="text"> + <p>And here is an example on how to configure a resource for JNDI lookups</p> +<div class="codeBox"><pre><code><Resource name="jdbc/TestDB" + auth="Container" + type="javax.sql.DataSource" + factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" + testWhileIdle="true" + testOnBorrow="true" + testOnReturn="false" + validationQuery="SELECT 1" + validationInterval="30000" + timeBetweenEvictionRunsMillis="30000" + maxActive="100" + minIdle="10" + maxWait="10000" + initialSize="10" + removeAbandonedTimeout="60" + removeAbandoned="true" + logAbandoned="true" + minEvictableIdleTimeMillis="30000" + jmxEnabled="true" + jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; + org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" + username="root" + password="password" + driverClassName="com.mysql.jdbc.Driver" + url="jdbc:mysql://localhost:3306/mysql"/></code></pre></div> + + </div></div> + <div class="subsection"><h4 id="Asynchronous_Connection_Retrieval">Asynchronous Connection Retrieval</h4><div class="text"> + <p> The Tomcat JDBC connection pool supports asynchronous connection retrieval without adding additional threads to the + pool library. It does this by adding a method to the data source called <code>Future<Connection> getConnectionAsync()</code>. + In order to use the async retrieval, two conditions must be met: + </p> + <ol> + <li>You must configure the <code>fairQueue</code> property to be <code>true</code>.</li> + <li>You will have to cast the data source to <code>org.apache.tomcat.jdbc.pool.DataSource</code></li> + </ol> + An example of using the async feature is show below. +<div class="codeBox"><pre><code> Connection con = null; + try { + Future<Connection> future = datasource.getConnectionAsync(); + while (!future.isDone()) { + System.out.println("Connection is not yet available. Do some background work"); + try { + Thread.sleep(100); //simulate work + }catch (InterruptedException x) { + Thread.currentThread().interrupt(); + } + } + con = future.get(); //should return instantly + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery("select * from user");</code></pre></div> + + </div></div> + <div class="subsection"><h4 id="Interceptors">Interceptors</h4><div class="text"> + <p>Interceptors are a powerful way to enable, disable or modify functionality on a specific connection or its sub components. + There are many different use cases for when interceptors are useful. By default, and for performance reasons, the connection pool is stateless. + The only state the pool itself inserts are <code>defaultAutoCommit</code>, <code>defaultReadOnly</code>, <code>defaultTransactionIsolation</code>, <code>defaultCatalog</code> if + these are set. These 4 properties are only set upon connection creation. Should these properties be modified during the usage of the connection, + the pool itself will not reset them.</p> + <p>An interceptor has to extend the <code>org.apache.tomcat.jdbc.pool.JdbcInterceptor</code> class. This class is fairly simple, + You will need to have a no arg constructor</p> +<div class="codeBox"><pre><code> public JdbcInterceptor() { + }</code></pre></div> + <p> + When a connection is borrowed from the pool, the interceptor can initialize or in some other way react to the event by implementing the + </p> +<div class="codeBox"><pre><code> public abstract void reset(ConnectionPool parent, PooledConnection con);</code></pre></div> + <p> + method. This method gets called with two parameters, a reference to the connection pool itself <code>ConnectionPool parent</code> + and a reference to the underlying connection <code>PooledConnection con</code>. + </p> + <p> + When a method on the <code>java.sql.Connection</code> object is invoked, it will cause the + </p> +<div class="codeBox"><pre><code> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable</code></pre></div> + <p> + method to get invoked. The <code>Method method</code> is the actual method invoked, and <code>Object[] args</code> are the arguments. + To look at a very simple example, where we demonstrate how to make the invocation to <code>java.sql.Connection.close()</code> a noop + if the connection has been closed + </p> +<div class="codeBox"><pre><code> if (CLOSE_VAL==method.getName()) { + if (isClosed()) return null; //noop for already closed. + } + return super.invoke(proxy,method,args);</code></pre></div> + <p> + There is an observation being made. It is the comparison of the method name. One way to do this would be to do + <code>"close".equals(method.getName())</code>. + Above we see a direct reference comparison between the method name and <code>static final String</code> reference. + According to the JVM spec, method names and static final String end up in a shared constant pool, so the reference comparison should work. + One could of course do this as well: + </p> +<div class="codeBox"><pre><code> if (compare(CLOSE_VAL,method)) { + if (isClosed()) return null; //noop for already closed. + } + return super.invoke(proxy,method,args);</code></pre></div> + <p> + The <code>compare(String,Method)</code> will use the <code>useEquals</code> flag on an interceptor and do either reference comparison or + a string value comparison when the <code>useEquals=true</code> flag is set. + </p> + <p>Pool start/stop<br> + When the connection pool is started or closed, you can be notifed. You will only be notified once per interceptor class + even though it is an instance method. and you will be notified using an interceptor currently not attached to a pool. + </p> +<div class="codeBox"><pre><code> public void poolStarted(ConnectionPool pool) { + } + + public void poolClosed(ConnectionPool pool) { + }</code></pre></div> + <p> + When overriding these methods, don't forget to call super if you are extending a class other than <code>JdbcInterceptor</code> + </p> + <p>Configuring interceptors<br> + Interceptors are configured using the <code>jdbcInterceptors</code> property or the <code>setJdbcInterceptors</code> method. + An interceptor can have properties, and would be configured like this + </p> +<div class="codeBox"><pre><code> String jdbcInterceptors= + "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState(useEquals=true,fast=yes)"</code></pre></div> + + <p>Interceptor properties<br> + Since interceptors can have properties, you need to be able to read the values of these properties within your + interceptor. Taking an example like the one above, you can override the <code>setProperties</code> method. + </p> +<div class="codeBox"><pre><code> public void setProperties(Map<String, InterceptorProperty> properties) { + super.setProperties(properties); + final String myprop = "myprop"; + InterceptorProperty p1 = properties.get(myprop); + if (p1!=null) { + setMyprop(Long.parseLong(p1.getValue())); + } + }</code></pre></div> + + </div></div> + <div class="subsection"><h4 id="Getting_the_actual_JDBC_connection">Getting the actual JDBC connection</h4><div class="text"> + <p>Connection pools create wrappers around the actual connection in order to properly pool them. + We also create interceptors in these wrappers to be able to perform certain functions. + If there is a need to retrieve the actual connection, one can do so using the <code>javax.sql.PooledConnection</code> + interface. + </p> +<div class="codeBox"><pre><code> Connection con = datasource.getConnection(); + Connection actual = ((javax.sql.PooledConnection)con).getConnection();</code></pre></div> + + </div></div> + +</div><h3 id="Building">Building</h3><div class="text"> + <p>We build the JDBC pool code with 1.6, but it is backwards compatible down to 1.5 for runtime environment. For unit test, we use 1.6 and higher</p> + <p>Other examples of Tomcat configuration for JDBC usage can be found <a href="http://tomcat.apache.org/tomcat-8.0-doc/jndi-datasource-examples-howto.html">in the Tomcat documentation</a>. </p> + <div class="subsection"><h4 id="Building_from_source">Building from source</h4><div class="text"> + <p>Building is pretty simple. The pool has a dependency on <code>tomcat-juli.jar</code> and in case you want the <code>SlowQueryReportJmx</code></p> +<div class="codeBox"><pre><code> javac -classpath tomcat-juli.jar \ + -d . \ + org/apache/tomcat/jdbc/pool/*.java \ + org/apache/tomcat/jdbc/pool/interceptor/*.java \ + org/apache/tomcat/jdbc/pool/jmx/*.java</code></pre></div> + <p> + A build file can be found in the Tomcat <a href="http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/">source repository</a>. + </p> + <p> + As a convenience, a build file is also included where a simple build command will generate all files needed. + </p> +<div class="codeBox"><pre><code> ant download (downloads dependencies) + ant build (compiles and generates .jar files) + ant dist (creates a release package) + ant test (runs tests, expects a test database to be setup)</code></pre></div> + + <p> + The system is structured for a Maven build, but does generate release artifacts. Just the library itself. + </p> + </div></div> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/jndi-datasource-examples-howto.html b/src/tomcat/webapps/docs/jndi-datasource-examples-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..586da9aee8ebaa162c470ad0e0ce6435b89b76f2 --- /dev/null +++ b/src/tomcat/webapps/docs/jndi-datasource-examples-howto.html @@ -0,0 +1,676 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - JNDI Datasource HOW-TO</title><meta name="author" content="Les Hughes"><meta name="author" content="David Haraburda"><meta name="author" content="Glenn Nielsen"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/jndi-datasource-examples-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JNDI Datasource HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#DriverManager,_the_service_provider_mechanism_and_memory_leaks">DriverManager, the service provider mechanism and memory leaks</a></li><li><a href="#Database_Connection_Pool_(DBCP_2)_Configurations">Database Connection Pool (DBCP 2) Configurations</a><ol><li><a href="#Installation">Installation</a></li><li><a href="#Preventing_database_connection_pool_leaks">Preventing database connection pool leaks</a></li><li><a href="#MySQL_DBCP_Example">MySQL DBCP Example</a></li><li><a href="#Oracle_8i,_9i_&_10g">Oracle 8i, 9i & 10g</a></li><li><a href="#PostgreSQL">PostgreSQL</a></li></ol></li><li><a href="#Non-DBCP_Solutions">Non-DBCP Solutions</a></li><li><a href="#Oracle_8i_with_OCI_client">Oracle 8i with OCI client</a><ol><li><a href="#Oracle_8i_with_OCI_client/Introduction">Introduction</a></li><li><a href="#Putting_it_all_together">Putting it all together</a></li></ol></li><li><a href="#Common_Problems">Common Problems</a><ol><li><a href="#Intermittent_Database_Connection_Failures">Intermittent Database Connection Failures</a></li><li><a href="#Random_Connection_Closed_Exceptions">Random Connection Closed Exceptions</a></li><li><a href="#Context_versus_GlobalNamingResources">Context versus GlobalNamingResources</a></li><li><a href="#JNDI_Resource_Naming_and_Realm_Interaction">JNDI Resource Naming and Realm Interaction</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>JNDI Datasource configuration is covered extensively in the +JNDI-Resources-HOWTO. However, feedback from <code>tomcat-user</code> has +shown that specifics for individual configurations can be rather tricky.</p> + +<p>Here then are some example configurations that have been posted to +tomcat-user for popular databases and some general tips for db usage.</p> + +<p>You should be aware that since these notes are derived from configuration +and/or feedback posted to <code>tomcat-user</code> YMMV :-). Please let us +know if you have any other tested configurations that you feel may be of use +to the wider audience, or if you feel we can improve this section in anyway.</p> + +<p> +<b>Please note that JNDI resource configuration changed somewhat between +Tomcat 7.x and Tomcat 8.x as they are using different versions of +Apache Commons DBCP library.</b> You will most likely need to modify older +JNDI resource configurations to match the syntax in the example below in order +to make them work in Tomcat 9. +See <a href="http://tomcat.apache.org/migration.html">Tomcat Migration Guide</a> +for details. +</p> + +<p> +Also, please note that JNDI DataSource configuration in general, and this +tutorial in particular, assumes that you have read and understood the +<a href="config/context.html">Context</a> and +<a href="config/host.html">Host</a> configuration references, including +the section about Automatic Application Deployment in the latter reference. +</p> +</div><h3 id="DriverManager,_the_service_provider_mechanism_and_memory_leaks">DriverManager, the service provider mechanism and memory leaks</h3><div class="text"> + +<p><code>java.sql.DriverManager</code> supports the +<a href="http://docs.oracle.com/javase/6/docs/api/index.html?java/sql/DriverManager.html">service +provider</a> mechanism. This feature is that all the available JDBC drivers +that announce themselves by providing a <code>META-INF/services/java.sql.Driver</code> +file are automatically discovered, loaded and registered, +relieving you from the need to load the database driver explicitly before +you create a JDBC connection. +However, the implementation is fundamentally broken in all Java versions for +a servlet container environment. The problem is that +<code>java.sql.DriverManager</code> will scan for the drivers only once.</p> + +<p>The <a href="config/listeners.html">JRE Memory Leak Prevention Listener</a> +that is included with Apache Tomcat solves this by triggering the drivers scan +during Tomcat startup. This is enabled by default. It means that only +libraries visible to the listener such as the ones in +<code>$CATALINA_BASE/lib</code> will be scanned for database drivers. +If you are considering disabling this feature, note that +the scan would be triggered by the first web application that is +using JDBC, leading to failures when this web application is reloaded +and for other web applications that rely on this feature. +</p> + +<p>Thus, the web applications that have database drivers in their +<code>WEB-INF/lib</code> directory cannot rely on the service provider +mechanism and should register the drivers explicitly.</p> + +<p>The list of drivers in <code>java.sql.DriverManager</code> is also +a known source of memory leaks. Any Drivers registered +by a web application must be deregistered when the web application stops. +Tomcat will attempt to automatically discover and deregister any +JDBC drivers loaded by the web application class loader when the web +application stops. +However, it is expected that applications do this for themselves via +a <code>ServletContextListener</code>. +</p> + +</div><h3 id="Database_Connection_Pool_(DBCP_2)_Configurations">Database Connection Pool (DBCP 2) Configurations</h3><div class="text"> + +<p>The default database connection pool implementation in Apache Tomcat +relies on the libraries from the +<a href="http://commons.apache.org/">Apache Commons</a> project. +The following libraries are used: +</p> + +<ul> +<li>Commons DBCP</li> +<li>Commons Pool</li> +</ul> + +<p> +These libraries are located in a single JAR at +<code>$CATALINA_HOME/lib/tomcat-dbcp.jar</code>. However, +only the classes needed for connection pooling have been included, and the +packages have been renamed to avoid interfering with applications. +</p> + +<p>DBCP 2.0 provides support for JDBC 4.1.</p> + +<div class="subsection"><h4 id="Installation">Installation</h4><div class="text"> + +<p>See the <a href="http://commons.apache.org/dbcp/configuration.html"> +DBCP documentation</a> for a complete list of configuration parameters. +</p> + +</div></div> + +<div class="subsection"><h4 id="Preventing_database_connection_pool_leaks">Preventing database connection pool leaks</h4><div class="text"> + +<p> +A database connection pool creates and manages a pool of connections +to a database. Recycling and reusing already existing connections +to a database is more efficient than opening a new connection. +</p> + +<p> +There is one problem with connection pooling. A web application has +to explicitly close ResultSet's, Statement's, and Connection's. +Failure of a web application to close these resources can result in +them never being available again for reuse, a database connection pool "leak". +This can eventually result in your web application database connections failing +if there are no more available connections.</p> + +<p> +There is a solution to this problem. The Apache Commons DBCP can be +configured to track and recover these abandoned database connections. Not +only can it recover them, but also generate a stack trace for the code +which opened these resources and never closed them.</p> + +<p> +To configure a DBCP DataSource so that abandoned database connections are +removed and recycled, add one or both of the following attributes to the +<code>Resource</code> configuration for your DBCP DataSource: +</p> +<div class="codeBox"><pre><code>removeAbandonedOnBorrow=true</code></pre></div> +<div class="codeBox"><pre><code>removeAbandonedOnMaintenance=true</code></pre></div> +<p> The default for both of these attributes is <code>false</code>. Note that +<code>removeAbandonedOnMaintenance</code> has no effect unless pool +maintenance is enabled by setting <code>timeBetweenEvictionRunsMillis</code> +to a positive value. See the +<a href="http://commons.apache.org/dbcp/configuration.html"> +DBCP documentation</a> for full documentation on these attributes. +</p> + +<p> +Use the <code>removeAbandonedTimeout</code> attribute to set the number +of seconds a database connection has been idle before it is considered abandoned. +</p> + +<div class="codeBox"><pre><code>removeAbandonedTimeout="60"</code></pre></div> + +<p> +The default timeout for removing abandoned connections is 300 seconds. +</p> + +<p> +The <code>logAbandoned</code> attribute can be set to <code>true</code> +if you want DBCP to log a stack trace of the code which abandoned the +database connection resources. +</p> +<div class="codeBox"><pre><code>logAbandoned="true"</code></pre></div> +<p> +The default is <code>false</code>. +</p> + +</div></div> + +<div class="subsection"><h4 id="MySQL_DBCP_Example">MySQL DBCP Example</h4><div class="text"> + +<h5>0. Introduction</h5> +<p>Versions of <a href="http://www.mysql.com/products/mysql/index.html">MySQL</a> and JDBC +drivers that have been reported to work: +</p> +<ul> +<li>MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha</li> +<li><a href="http://www.mysql.com/products/connector-j">Connector/J</a> 3.0.11-stable (the official JDBC Driver)</li> +<li><a href="http://mmmysql.sourceforge.net">mm.mysql</a> 2.0.14 (an old 3rd party JDBC Driver)</li> +</ul> + +<p>Before you proceed, don't forget to copy the JDBC Driver's jar into <code>$CATALINA_HOME/lib</code>.</p> + +<h5>1. MySQL configuration</h5> +<p> +Ensure that you follow these instructions as variations can cause problems. +</p> + +<p>Create a new test user, a new database and a single test table. +Your MySQL user <strong>must</strong> have a password assigned. The driver +will fail if you try to connect with an empty password. +</p> +<div class="codeBox"><pre><code>mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost + -> IDENTIFIED BY 'javadude' WITH GRANT OPTION; +mysql> create database javatest; +mysql> use javatest; +mysql> create table testdata ( + -> id int not null auto_increment primary key, + -> foo varchar(25), + -> bar int);</code></pre></div> +<blockquote> +<strong>Note:</strong> the above user should be removed once testing is +complete! +</blockquote> + +<p>Next insert some test data into the testdata table. +</p> +<div class="codeBox"><pre><code>mysql> insert into testdata values(null, 'hello', 12345); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from testdata; ++----+-------+-------+ +| ID | FOO | BAR | ++----+-------+-------+ +| 1 | hello | 12345 | ++----+-------+-------+ +1 row in set (0.00 sec) + +mysql></code></pre></div> + +<h5>2. Context configuration</h5> +<p>Configure the JNDI DataSource in Tomcat by adding a declaration for your +resource to your <a href="config/context.html">Context</a>.</p> +<p>For example:</p> +<div class="codeBox"><pre><code><Context> + + <!-- maxTotal: Maximum number of database connections in pool. Make sure you + configure your mysqld max_connections large enough to handle + all of your db connections. Set to -1 for no limit. + --> + + <!-- maxIdle: Maximum number of idle database connections to retain in pool. + Set to -1 for no limit. See also the DBCP documentation on this + and the minEvictableIdleTimeMillis configuration parameter. + --> + + <!-- maxWaitMillis: Maximum time to wait for a database connection to become available + in ms, in this example 10 seconds. An Exception is thrown if + this timeout is exceeded. Set to -1 to wait indefinitely. + --> + + <!-- username and password: MySQL username and password for database connections --> + + <!-- driverClassName: Class name for the old mm.mysql JDBC driver is + org.gjt.mm.mysql.Driver - we recommend using Connector/J though. + Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver. + --> + + <!-- url: The JDBC connection url for connecting to your MySQL database. + --> + + <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" + maxTotal="100" maxIdle="30" maxWaitMillis="10000" + username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver" + url="jdbc:mysql://localhost:3306/javatest"/> + +</Context></code></pre></div> + +<h5>3. web.xml configuration</h5> + +<p>Now create a <code>WEB-INF/web.xml</code> for this test application.</p> +<div class="codeBox"><pre><code><web-app xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee +http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" + version="2.4"> + <description>MySQL Test App</description> + <resource-ref> + <description>DB Connection</description> + <res-ref-name>jdbc/TestDB</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> + </resource-ref> +</web-app></code></pre></div> + +<h5>4. Test code</h5> +<p>Now create a simple <code>test.jsp</code> page for use later.</p> +<div class="codeBox"><pre><code><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + +<sql:query var="rs" dataSource="jdbc/TestDB"> +select id, foo, bar from testdata +</sql:query> + +<html> + <head> + <title>DB Test</title> + </head> + <body> + + <h2>Results</h2> + +<c:forEach var="row" items="${rs.rows}"> + Foo ${row.foo}<br/> + Bar ${row.bar}<br/> +</c:forEach> + + </body> +</html></code></pre></div> + +<p>That JSP page makes use of +<a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JSTL</a>'s +SQL and Core taglibs. You can get it from +<a href="http://tomcat.apache.org/taglibs/standard/">Apache Tomcat Taglibs - Standard Tag Library</a> +project — just make sure you get a 1.1.x or later release. Once you have +JSTL, copy <code>jstl.jar</code> and <code>standard.jar</code> to your web app's +<code>WEB-INF/lib</code> directory. + +</p> + +<p>Finally deploy your web app into <code>$CATALINA_BASE/webapps</code> either +as a warfile called <code>DBTest.war</code> or into a sub-directory called +<code>DBTest</code></p> +<p>Once deployed, point a browser at +<code>http://localhost:8080/DBTest/test.jsp</code> to view the fruits of +your hard work.</p> + +</div></div> + +<div class="subsection"><h4 id="Oracle_8i,_9i_&_10g">Oracle 8i, 9i & 10g</h4><div class="text"> +<h5>0. Introduction</h5> + +<p>Oracle requires minimal changes from the MySQL configuration except for the +usual gotchas :-)</p> +<p>Drivers for older Oracle versions may be distributed as *.zip files rather +than *.jar files. Tomcat will only use <code>*.jar</code> files installed in +<code>$CATALINA_HOME/lib</code>. Therefore <code>classes111.zip</code> +or <code>classes12.zip</code> will need to be renamed with a <code>.jar</code> +extension. Since jarfiles are zipfiles, there is no need to unzip and jar these +files - a simple rename will suffice.</p> + +<p>For Oracle 9i onwards you should use <code>oracle.jdbc.OracleDriver</code> +rather than <code>oracle.jdbc.driver.OracleDriver</code> as Oracle have stated +that <code>oracle.jdbc.driver.OracleDriver</code> is deprecated and support +for this driver class will be discontinued in the next major release. +</p> + +<h5>1. Context configuration</h5> +<p>In a similar manner to the mysql config above, you will need to define your +Datasource in your <a href="config/context.html">Context</a>. Here we define a +Datasource called myoracle using the thin driver to connect as user scott, +password tiger to the sid called mysid. (Note: with the thin driver this sid is +not the same as the tnsname). The schema used will be the default schema for the +user scott.</p> + +<p>Use of the OCI driver should simply involve a changing thin to oci in the URL string. +</p> +<div class="codeBox"><pre><code><Resource name="jdbc/myoracle" auth="Container" + type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" + url="jdbc:oracle:thin:@127.0.0.1:1521:mysid" + username="scott" password="tiger" maxTotal="20" maxIdle="10" + maxWaitMillis="-1"/></code></pre></div> + +<h5>2. web.xml configuration</h5> +<p>You should ensure that you respect the element ordering defined by the DTD when you +create you applications web.xml file.</p> +<div class="codeBox"><pre><code><resource-ref> + <description>Oracle Datasource example</description> + <res-ref-name>jdbc/myoracle</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> +</resource-ref></code></pre></div> +<h5>3. Code example</h5> +<p>You can use the same example application as above (assuming you create the required DB +instance, tables etc.) replacing the Datasource code with something like</p> +<div class="codeBox"><pre><code>Context initContext = new InitialContext(); +Context envContext = (Context)initContext.lookup("java:/comp/env"); +DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle"); +Connection conn = ds.getConnection(); +//etc.</code></pre></div> +</div></div> + + +<div class="subsection"><h4 id="PostgreSQL">PostgreSQL</h4><div class="text"> +<h5>0. Introduction</h5> +<p>PostgreSQL is configured in a similar manner to Oracle.</p> + +<h5>1. Required files </h5> +<p> +Copy the Postgres JDBC jar to $CATALINA_HOME/lib. As with Oracle, the +jars need to be in this directory in order for DBCP's Classloader to find +them. This has to be done regardless of which configuration step you take next. +</p> + +<h5>2. Resource configuration</h5> + +<p> +You have two choices here: define a datasource that is shared across all Tomcat +applications, or define a datasource specifically for one application. +</p> + +<h6>2a. Shared resource configuration</h6> +<p> +Use this option if you wish to define a datasource that is shared across +multiple Tomcat applications, or if you just prefer defining your datasource +in this file. +</p> +<p><i>This author has not had success here, although others have reported so. +Clarification would be appreciated here.</i></p> + +<div class="codeBox"><pre><code><Resource name="jdbc/postgres" auth="Container" + type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" + url="jdbc:postgresql://127.0.0.1:5432/mydb" + username="myuser" password="mypasswd" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/></code></pre></div> +<h6>2b. Application-specific resource configuration</h6> + +<p> +Use this option if you wish to define a datasource specific to your application, +not visible to other Tomcat applications. This method is less invasive to your +Tomcat installation. +</p> + +<p> +Create a resource definition for your <a href="config/context.html">Context</a>. +The Context element should look something like the following. +</p> + +<div class="codeBox"><pre><code><Context> + +<Resource name="jdbc/postgres" auth="Container" + type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" + url="jdbc:postgresql://127.0.0.1:5432/mydb" + username="myuser" password="mypasswd" maxTotal="20" maxIdle="10" +maxWaitMillis="-1"/> +</Context></code></pre></div> + +<h5>3. web.xml configuration</h5> +<div class="codeBox"><pre><code><resource-ref> + <description>postgreSQL Datasource example</description> + <res-ref-name>jdbc/postgres</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> +</resource-ref></code></pre></div> + +<h5>4. Accessing the datasource</h5> +<p> +When accessing the datasource programmatically, remember to prepend +<code>java:/comp/env</code> to your JNDI lookup, as in the following snippet of +code. Note also that "jdbc/postgres" can be replaced with any value you prefer, provided +you change it in the above resource definition file as well. +</p> + +<div class="codeBox"><pre><code>InitialContext cxt = new InitialContext(); +if ( cxt == null ) { + throw new Exception("Uh oh -- no context!"); +} + +DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" ); + +if ( ds == null ) { + throw new Exception("Data source not found!"); +}</code></pre></div> + +</div></div> +</div><h3 id="Non-DBCP_Solutions">Non-DBCP Solutions</h3><div class="text"> +<p> +These solutions either utilise a single connection to the database (not recommended for anything other +than testing!) or some other pooling technology. +</p> +</div><h3 id="Oracle_8i_with_OCI_client">Oracle 8i with OCI client</h3><div class="text"> +<div class="subsection"><h4 id="Oracle_8i_with_OCI_client/Introduction">Introduction</h4><div class="text"> +<p>Whilst not strictly addressing the creation of a JNDI DataSource using the OCI client, these notes can be combined with the +Oracle and DBCP solution above.</p> +<p> +In order to use OCI driver, you should have an Oracle client installed. You should have installed +Oracle8i(8.1.7) client from cd, and download the suitable JDBC/OCI +driver(Oracle8i 8.1.7.1 JDBC/OCI Driver) from <a href="http://otn.oracle.com/">otn.oracle.com</a>. +</p> +<p> +After renaming <code>classes12.zip</code> file to <code>classes12.jar</code> +for Tomcat, copy it into <code>$CATALINA_HOME/lib</code>. +You may also have to remove the <code>javax.sql.*</code> classes +from this file depending upon the version of Tomcat and JDK you are using. +</p> +</div></div> + +<div class="subsection"><h4 id="Putting_it_all_together">Putting it all together</h4><div class="text"> +<p> +Ensure that you have the <code>ocijdbc8.dll</code> or <code>.so</code> in your <code>$PATH</code> or <code>LD_LIBRARY_PATH</code> + (possibly in <code>$ORAHOME\bin</code>) and also confirm that the native library can be loaded by a simple test program +using <code>System.loadLibrary("ocijdbc8");</code> +</p> +<p> +You should next create a simple test servlet or jsp that has these +<strong>critical lines</strong>: +</p> +<div class="codeBox"><pre><code>DriverManager.registerDriver(new +oracle.jdbc.driver.OracleDriver()); +conn = +DriverManager.getConnection("jdbc:oracle:oci8:@database","username","password");</code></pre></div> +<p> +where database is of the form <code>host:port:SID</code> Now if you try to access the URL of your +test servlet/jsp and what you get is a +<code>ServletException</code> with a root cause of <code>java.lang.UnsatisfiedLinkError:get_env_handle</code>. +</p> +<p> +First, the <code>UnsatisfiedLinkError</code> indicates that you have +</p> +<ul> +<li>a mismatch between your JDBC classes file and +your Oracle client version. The giveaway here is the message stating that a needed library file cannot be +found. For example, you may be using a classes12.zip file from Oracle Version 8.1.6 with a Version 8.1.5 +Oracle client. The classesXXX.zip file and Oracle client software versions must match. +</li> +<li>A <code>$PATH</code>, <code>LD_LIBRARY_PATH</code> problem.</li> +<li>It has been reported that ignoring the driver you have downloaded from otn and using +the classes12.zip file from the directory <code>$ORAHOME\jdbc\lib</code> will also work. +</li> +</ul> +<p> +Next you may experience the error <code>ORA-06401 NETCMN: invalid driver designator</code> +</p> +<p> +The Oracle documentation says : "Cause: The login (connect) string contains an invalid +driver designator. Action: Correct the string and re-submit." + +Change the database connect string (of the form <code>host:port:SID</code>) with this one: +<code>(description=(address=(host=myhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))</code> +</p> +<p> +<i>Ed. Hmm, I don't think this is really needed if you sort out your TNSNames - but I'm not an Oracle DBA :-)</i> +</p> +</div></div> +</div><h3 id="Common_Problems">Common Problems</h3><div class="text"> +<p>Here are some common problems encountered with a web application which +uses a database and tips for how to solve them.</p> + +<div class="subsection"><h4 id="Intermittent_Database_Connection_Failures">Intermittent Database Connection Failures</h4><div class="text"> +<p> +Tomcat runs within a JVM. The JVM periodically performs garbage collection +(GC) to remove java objects which are no longer being used. When the JVM +performs GC execution of code within Tomcat freezes. If the maximum time +configured for establishment of a database connection is less than the amount +of time garbage collection took you can get a database connection failure. +</p> + +<p>To collect data on how long garbage collection is taking add the +<code>-verbose:gc</code> argument to your <code>CATALINA_OPTS</code> +environment variable when starting Tomcat. When verbose gc is enabled +your <code>$CATALINA_BASE/logs/catalina.out</code> log file will include +data for every garbage collection including how long it took.</p> + +<p>When your JVM is tuned correctly 99% of the time a GC will take less +than one second. The remainder will only take a few seconds. Rarely, +if ever should a GC take more than 10 seconds.</p> + +<p>Make sure that the db connection timeout is set to 10-15 seconds. +For the DBCP you set this using the parameter <code>maxWaitMillis</code>.</p> + +</div></div> + +<div class="subsection"><h4 id="Random_Connection_Closed_Exceptions">Random Connection Closed Exceptions</h4><div class="text"> +<p> +These can occur when one request gets a db connection from the connection +pool and closes it twice. When using a connection pool, closing the +connection just returns it to the pool for reuse by another request, +it doesn't close the connection. And Tomcat uses multiple threads to +handle concurrent requests. Here is an example of the sequence +of events which could cause this error in Tomcat: +</p> +<pre> + Request 1 running in Thread 1 gets a db connection. + + Request 1 closes the db connection. + + The JVM switches the running thread to Thread 2 + + Request 2 running in Thread 2 gets a db connection + (the same db connection just closed by Request 1). + + The JVM switches the running thread back to Thread 1 + + Request 1 closes the db connection a second time in a finally block. + + The JVM switches the running thread back to Thread 2 + + Request 2 Thread 2 tries to use the db connection but fails + because Request 1 closed it. +</pre> +<p> +Here is an example of properly written code to use a database connection +obtained from a connection pool: +</p> +<div class="codeBox"><pre><code> Connection conn = null; + Statement stmt = null; // Or PreparedStatement if needed + ResultSet rs = null; + try { + conn = ... get connection from connection pool ... + stmt = conn.createStatement("select ..."); + rs = stmt.executeQuery(); + ... iterate through the result set ... + rs.close(); + rs = null; + stmt.close(); + stmt = null; + conn.close(); // Return to connection pool + conn = null; // Make sure we don't close it twice + } catch (SQLException e) { + ... deal with errors ... + } finally { + // Always make sure result sets and statements are closed, + // and the connection is returned to the pool + if (rs != null) { + try { rs.close(); } catch (SQLException e) { ; } + rs = null; + } + if (stmt != null) { + try { stmt.close(); } catch (SQLException e) { ; } + stmt = null; + } + if (conn != null) { + try { conn.close(); } catch (SQLException e) { ; } + conn = null; + } + }</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Context_versus_GlobalNamingResources">Context versus GlobalNamingResources</h4><div class="text"> +<p> + Please note that although the above instructions place the JNDI declarations in a Context + element, it is possible and sometimes desirable to place these declarations in the + <a href="config/globalresources.html">GlobalNamingResources</a> section of the server + configuration file. A resource placed in the GlobalNamingResources section will be shared + among the Contexts of the server. +</p> +</div></div> + +<div class="subsection"><h4 id="JNDI_Resource_Naming_and_Realm_Interaction">JNDI Resource Naming and Realm Interaction</h4><div class="text"> +<p> + In order to get Realms to work, the realm must refer to the datasource as + defined in the <GlobalNamingResources> or <Context> section, not a datasource as renamed + using <ResourceLink>. +</p> +</div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/jndi-resources-howto.html b/src/tomcat/webapps/docs/jndi-resources-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..b9763811cdb3c0842340ae1a0b52bdf672e15563 --- /dev/null +++ b/src/tomcat/webapps/docs/jndi-resources-howto.html @@ -0,0 +1,1056 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - JNDI Resources HOW-TO</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/jndi-resources-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>JNDI Resources HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#web.xml_configuration">web.xml configuration</a></li><li><a href="#context.xml_configuration">context.xml configuration</a></li><li><a href="#Global_configuration">Global configuration</a></li><li><a href="#Using_resources">Using resources</a></li><li><a href="#Tomcat_Standard_Resource_Factories">Tomcat Standard Resource Factories</a><ol><li><a href="#Generic_JavaBean_Resources">Generic JavaBean Resources</a></li><li><a href="#UserDatabase_Resources">UserDatabase Resources</a></li><li><a href="#JavaMail_Sessions">JavaMail Sessions</a></li><li><a href="#JDBC_Data_Sources">JDBC Data Sources</a></li></ol></li><li><a href="#Adding_Custom_Resource_Factories">Adding Custom Resource Factories</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>Tomcat provides a JNDI <strong>InitialContext</strong> implementation +instance for each web application running under it, in a manner that is +compatible with those provided by a +<a href="http://www.oracle.com/technetwork/java/javaee/overview/index.html"> +Java Enterprise Edition</a> application server. The Java EE standard provides +a standard set of elements in the <code>/WEB-INF/web.xml</code> file to +reference/define resources.</p> + +<p>See the following Specifications for more information about programming APIs +for JNDI, and for the features supported by Java Enterprise Edition (Java EE) +servers, which Tomcat emulates for the services that it provides:</p> +<ul> +<li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html"> + Java Naming and Directory Interface</a> (included in JDK 1.4 onwards)</li> +<li><a href="http://www.oracle.com/technetwork/java/javaee/documentation/index.html"> + Java EE Platform Specification</a> (in particular, see Chapter 5 on <em>Naming</em>)</li> +</ul> + +</div><h3 id="web.xml_configuration">web.xml configuration</h3><div class="text"> + +<p>The following elements may be used in the web application deployment +descriptor (<code>/WEB-INF/web.xml</code>) of your web application to define +resources:</p> +<ul> +<li><code><strong><env-entry></strong></code> - Environment entry, a + single-value parameter that can be used to configure how the application + will operate.</li> +<li><code><strong><resource-ref></strong></code> - Resource reference, + which is typically to an object factory for resources such as a JDBC + <code>DataSource</code>, a JavaMail <code>Session</code>, or custom + object factories configured into Tomcat.</li> +<li><code><strong><resource-env-ref></strong></code> - Resource + environment reference, a new variation of <code>resource-ref</code> + added in Servlet 2.4 that is simpler to configure for resources + that do not require authentication information.</li> +</ul> + +<p>Providing that Tomcat is able to identify an appropriate resource factory to +use to create the resource and that no further configuration information is +required, Tomcat will use the information in <code>/WEB-INF/web.xml</code> to +create the resource.</p> + +<p>Tomcat provides a number of Tomcat specific options for JNDI resources that +cannot be specified in web.xml. These include <code>closeMethod</code> that +enables faster cleaning-up of JNDI resources when a web application stops and +<code>singleton</code> that controls whether or not a new instance of the +resource is created for every JNDI lookup. To use these configuration options +the resource must be specified in a web application's +<a href="config/context.html"><code><Context></code></a> element or in the +<a href="config/globalresources.html"> +<code><strong><GlobalNamingResources></strong></code></a> element of +<code>$CATALINA_BASE/conf/server.xml</code>.</p> + +</div><h3 id="context.xml_configuration">context.xml configuration</h3><div class="text"> + +<p>If Tomcat is unable to identify the appropriate resource factory and/or +additional configuration information is required, additional Tomcat specific +configuration must be specified before Tomcat can create the resource. +Tomcat specific resource configuration is entered in +the <a href="config/context.html"><code><Context></code></a> elements that +can be specified in either <code>$CATALINA_BASE/conf/server.xml</code> or, +preferably, the per-web-application context XML file +(<code>META-INF/context.xml</code>).</p> + +<p>Tomcat specific resource configuration is performed using the following +elements in the <a href="config/context.html"><code><Context></code></a> +element:</p> + +<ul> +<li><a href="config/context.html#Environment_Entries"><Environment></a> - + Configure names and values for scalar environment entries that will be + exposed to the web application through the JNDI + <code>InitialContext</code> (equivalent to the inclusion of an + <code><env-entry></code> element in the web application + deployment descriptor).</li> +<li><a href="config/context.html#Resource_Definitions"><Resource></a> - + Configure the name and data type of a resource made available to the + application (equivalent to the inclusion of a + <code><resource-ref></code> element in the web application + deployment descriptor).</li> +<li><a href="config/context.html#Resource_Links"><ResourceLink></a> - + Add a link to a resource defined in the global JNDI context. Use resource + links to give a web application access to a resource defined in + the <a href="config/globalresources.html"><GlobalNamingResources></a> + child element of the <a href="config/server.html"><Server></a> + element.</li> +<li><a href="config/context.html#Transaction"><Transaction></a> - + Add a resource factory for instantiating the UserTransaction object + instance that is available at <code>java:comp/UserTransaction</code>.</li> + +</ul> + +<p>Any number of these elements may be nested inside a +<a href="config/context.html"><code><Context></code></a> element and will +be associated only with that particular web application.</p> + +<p>If a resource has been defined in a +<a href="config/context.html"><code><Context></code></a> element it is not +necessary for that resource to be defined in <code>/WEB-INF/web.xml</code>. +However, it is recommended to keep the entry in <code>/WEB-INF/web.xml</code> +to document the resource requirements for the web application.</p> + +<p>Where the same resource name has been defined for a +<code><env-entry></code> element included in the web application +deployment descriptor (<code>/WEB-INF/web.xml</code>) and in an +<code><Environment></code> element as part of the +<a href="config/context.html"><code><Context></code></a> element for the +web application, the values in the deployment descriptor will take precedence +<strong>only</strong> if allowed by the corresponding +<code><Environment></code> element (by setting the <code>override</code> +attribute to "true").</p> + +</div><h3 id="Global_configuration">Global configuration</h3><div class="text"> + +<p>Tomcat maintains a separate namespace of global resources for the +entire server. These are configured in the +<a href="config/globalresources.html"> +<code><strong><GlobalNamingResources></strong></code></a> element of +<code>$CATALINA_BASE/conf/server.xml</code>. You may expose these resources to +web applications by using a +<a href="config/context.html#Resource_Links"><ResourceLink></a> to +include it in the per-web-application context.</p> + +<p>If a resource has been defined using a +<a href="config/context.html#Resource_Links"><ResourceLink></a>, it is not +necessary for that resource to be defined in <code>/WEB-INF/web.xml</code>. +However, it is recommended to keep the entry in <code>/WEB-INF/web.xml</code> +to document the resource requirements for the web application.</p> + +</div><h3 id="Using_resources">Using resources</h3><div class="text"> + +<p>The <code>InitialContext</code> is configured as a web application is +initially deployed, and is made available to web application components (for +read-only access). All configured entries and resources are placed in +the <code>java:comp/env</code> portion of the JNDI namespace, so a typical +access to a resource - in this case, to a JDBC <code>DataSource</code> - +would look something like this:</p> + +<div class="codeBox"><pre><code>// Obtain our environment naming context +Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); + +// Look up our data source +DataSource ds = (DataSource) + envCtx.lookup("jdbc/EmployeeDB"); + +// Allocate and use a connection from the pool +Connection conn = ds.getConnection(); +... use this connection to access the database ... +conn.close();</code></pre></div> + +</div><h3 id="Tomcat_Standard_Resource_Factories">Tomcat Standard Resource Factories</h3><div class="text"> + + <p>Tomcat includes a series of standard resource factories that can + provide services to your web applications, but give you configuration + flexibility (via the + <a href="config/context.html"><code><Context></code></a> element) + without modifying the web application or the deployment descriptor. Each + subsection below details the configuration and usage of the standard resource + factories.</p> + + <p>See <a href="#Adding_Custom_Resource_Factories">Adding Custom + Resource Factories</a> for information about how to create, install, + configure, and use your own custom resource factory classes with + Tomcat.</p> + + <p><em>NOTE</em> - Of the standard resource factories, only the + "JDBC Data Source" and "User Transaction" factories are mandated to + be available on other platforms, and then they are required only if + the platform implements the Java Enterprise Edition (Java EE) specs. + All other standard resource factories, plus custom resource factories + that you write yourself, are specific to Tomcat and cannot be assumed + to be available on other containers.</p> + + <div class="subsection"><h4 id="Generic_JavaBean_Resources">Generic JavaBean Resources</h4><div class="text"> + + <h5>0. Introduction</h5> + + <p>This resource factory can be used to create objects of <em>any</em> + Java class that conforms to standard JavaBeans naming conventions (i.e. + it has a zero-arguments constructor, and has property setters that + conform to the setFoo() naming pattern. The resource factory will + only create a new instance of the appropriate bean class every time a + <code>lookup()</code> for this entry is made if the <code>singleton</code> + attribute of the factory is set to <code>false</code>.</p> + + <p>The steps required to use this facility are described below.</p> + + <h5>1. Create Your JavaBean Class</h5> + + <p>Create the JavaBean class which will be instantiated each time + that the resource factory is looked up. For this example, assume + you create a class <code>com.mycompany.MyBean</code>, which looks + like this:</p> + +<div class="codeBox"><pre><code>package com.mycompany; + +public class MyBean { + + private String foo = "Default Foo"; + + public String getFoo() { + return (this.foo); + } + + public void setFoo(String foo) { + this.foo = foo; + } + + private int bar = 0; + + public int getBar() { + return (this.bar); + } + + public void setBar(int bar) { + this.bar = bar; + } + + +}</code></pre></div> + + <h5>2. Declare Your Resource Requirements</h5> + + <p>Next, modify your web application deployment descriptor + (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which + you will request new instances of this bean. The simplest approach is + to use a <code><resource-env-ref></code> element, like this:</p> + +<div class="codeBox"><pre><code><resource-env-ref> + <description> + Object factory for MyBean instances. + </description> + <resource-env-ref-name> + bean/MyBeanFactory + </resource-env-ref-name> + <resource-env-ref-type> + com.mycompany.MyBean + </resource-env-ref-type> +</resource-env-ref></code></pre></div> + + <p><strong>WARNING</strong> - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet + Specification</a> for details.</p> + + <h5>3. Code Your Application's Use Of This Resource</h5> + + <p>A typical use of this resource environment reference might look + like this:</p> + +<div class="codeBox"><pre><code>Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); + +writer.println("foo = " + bean.getFoo() + ", bar = " + + bean.getBar());</code></pre></div> + + <h5>4. Configure Tomcat's Resource Factory</h5> + + <p>To configure Tomcat's resource factory, add an element like this to the + <a href="config/context.html"><code><Context></code></a> element for + this web application.</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean" + factory="org.apache.naming.factory.BeanFactory" + bar="23"/> + ... +</Context></code></pre></div> + + <p>Note that the resource name (here, <code>bean/MyBeanFactory</code> + must match the value specified in the web application deployment + descriptor. We are also initializing the value of the <code>bar</code> + property, which will cause <code>setBar(23)</code> to be called before + the new bean is returned. Because we are not initializing the + <code>foo</code> property (although we could have), the bean will + contain whatever default value is set up by its constructor.</p> + + <p>Some beans have properties with types that cannot automatically be + converted from a string value. Setting such properties using the Tomcat + BeanFactory will fail with a NamingException. In cases were those beans + provide methods to set the properties from a string value, the Tomcat + BeanFactory can be configured to use these methods. The configuration is + done with the <code>forceString</code> attribute.</p> + + <p>Assume our bean looks like this:</p> + +<div class="codeBox"><pre><code>package com.mycompany; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class MyBean2 { + + private InetAddress local = null; + + public InetAddress getLocal() { + return local; + } + + public void setLocal(InetAddress ip) { + local = ip; + } + + public void setLocal(String localHost) { + try { + local = InetAddress.getByName(localHost); + } catch (UnknownHostException ex) { + } + } + + private InetAddress remote = null; + + public InetAddress getRemote() { + return remote; + } + + public void setRemote(InetAddress ip) { + remote = ip; + } + + public void host(String remoteHost) { + try { + remote = InetAddress.getByName(remoteHost); + } catch (UnknownHostException ex) { + } + } + +}</code></pre></div> + + <p>The bean has two properties, both are of type <code>InetAddress</code>. + The first property <code>local</code> has an additional setter taking a + string argument. By default the Tomcat BeanFactory would try to use the + automatically detected setter with the same argument type as the property + type and then throw a NamingException, because it is not prepared to convert + the given string attribute value to <code>InetAddress</code>. + We can tell the Tomcat BeanFactory to use the other setter like that:</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean2" + factory="org.apache.naming.factory.BeanFactory" + forceString="local" + local="localhost"/> + ... +</Context></code></pre></div> + + <p>The bean property <code>remote</code> can also be set from a string, + but one has to use the non-standard method name <code>host</code>. + To set <code>local</code> and <code>remote</code> use the following + configuration:</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean2" + factory="org.apache.naming.factory.BeanFactory" + forceString="local,remote=host" + local="localhost" + remote="tomcat.apache.org"/> + ... +</Context></code></pre></div> + + <p>Multiple property descriptions can be combined in + <code>forceString</code> by concatenation with comma as a separator. + Each property description consists of either only the property name + in which case the BeanFactory calls the setter method. Or it consist + of <code>name=method</code> in which case the property named + <code>name</code> is set by calling method <code>method</code>. + For properties of types <code>String</code> or of primitive type + or of their associated primitive wrapper classes using + <code>forceString</code> is not needed. The correct setter will be + automatically detected and argument conversion will be applied.</p> + + </div></div> + + + <div class="subsection"><h4 id="UserDatabase_Resources">UserDatabase Resources</h4><div class="text"> + + <h5>0. Introduction</h5> + + <p>UserDatabase resources are typically configured as global resources for + use by a UserDatabase realm. Tomcat includes a UserDatabaseFactory that + creates UserDatabase resources backed by an XML file - usually + <code>tomcat-users.xml</code></p> + + <p>The steps required to set up a global UserDatabase resource are described + below.</p> + + <h5>1. Create/edit the XML file</h5> + + <p>The XML file is typically located at + <code>$CATALINA_BASE/conf/tomcat-users.xml</code> however, you are free to + locate the file anywhere on the file system. It is recommended that the XML + files are placed in <code>$CATALINA_BASE/conf</code>. A typical XML would + look like:</p> + +<div class="codeBox"><pre><code><?xml version="1.0" encoding="UTF-8"?> +<tomcat-users> + <role rolename="tomcat"/> + <role rolename="role1"/> + <user username="tomcat" password="tomcat" roles="tomcat"/> + <user username="both" password="tomcat" roles="tomcat,role1"/> + <user username="role1" password="tomcat" roles="role1"/> +</tomcat-users></code></pre></div> + + <h5>2. Declare Your Resource</h5> + + <p>Next, modify <code>$CATALINA_BASE/conf/server.xml</code> to create the + UserDatabase resource based on your XML file. It should look something like + this:</p> + +<div class="codeBox"><pre><code><Resource name="UserDatabase" + auth="Container" + type="org.apache.catalina.UserDatabase" + description="User database that can be updated and saved" + factory="org.apache.catalina.users.MemoryUserDatabaseFactory" + pathname="conf/tomcat-users.xml" + readonly="false" /></code></pre></div> + + <p>The <code>pathname</code> attribute can be a URL, an absolute path or a + relative path. If relative, it is relative to <code>$CATALINA_BASE</code>. + </p> + + <p>The <code>readonly</code> attribute is optional and defaults to + <code>true</code> if not supplied. If the XML is writeable then it will be + written to when Tomcat starts. <strong>WARNING:</strong> When the file is + written it will inherit the default file permissions for the user Tomcat + is running as. Ensure that these are appropriate to maintain the security + of your installation.</p> + + <h5>3. Configure the Realm</h5> + + <p>Configure a UserDatabase Realm to use this resource as described in the + <a href="config/realm.html">Realm configuration documentation</a>.</p> + + </div></div> + + + <div class="subsection"><h4 id="JavaMail_Sessions">JavaMail Sessions</h4><div class="text"> + + <h5>0. Introduction</h5> + + <p>In many web applications, sending electronic mail messages is a + required part of the system's functionality. The + <a href="http://www.oracle.com/technetwork/java/javamail/index.html">Java Mail</a> API + makes this process relatively straightforward, but requires many + configuration details that the client application must be aware of + (including the name of the SMTP host to be used for message sending).</p> + + <p>Tomcat includes a standard resource factory that will create + <code>javax.mail.Session</code> session instances for you, already + configured to connect to an SMTP server. + In this way, the application is totally insulated from changes in the + email server configuration environment - it simply asks for, and receives, + a preconfigured session whenever needed.</p> + + <p>The steps required for this are outlined below.</p> + + <h5>1. Declare Your Resource Requirements</h5> + + <p>The first thing you should do is modify the web application deployment + descriptor (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under + which you will look up preconfigured sessions. By convention, all such + names should resolve to the <code>mail</code> subcontext (relative to the + standard <code>java:comp/env</code> naming context that is the root of + all provided resource factories. A typical <code>web.xml</code> entry + might look like this:</p> +<div class="codeBox"><pre><code><resource-ref> + <description> + Resource reference to a factory for javax.mail.Session + instances that may be used for sending electronic mail + messages, preconfigured to connect to the appropriate + SMTP server. + </description> + <res-ref-name> + mail/Session + </res-ref-name> + <res-type> + javax.mail.Session + </res-type> + <res-auth> + Container + </res-auth> +</resource-ref></code></pre></div> + + <p><strong>WARNING</strong> - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet + Specification</a> for details.</p> + + <h5>2. Code Your Application's Use Of This Resource</h5> + + <p>A typical use of this resource reference might look like this:</p> +<div class="codeBox"><pre><code>Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +Session session = (Session) envCtx.lookup("mail/Session"); + +Message message = new MimeMessage(session); +message.setFrom(new InternetAddress(request.getParameter("from"))); +InternetAddress to[] = new InternetAddress[1]; +to[0] = new InternetAddress(request.getParameter("to")); +message.setRecipients(Message.RecipientType.TO, to); +message.setSubject(request.getParameter("subject")); +message.setContent(request.getParameter("content"), "text/plain"); +Transport.send(message);</code></pre></div> + + <p>Note that the application uses the same resource reference name + that was declared in the web application deployment descriptor. This + is matched up against the resource factory that is configured in the + <a href="config/context.html"><code><Context></code></a> element + for the web application as described below.</p> + + <h5>3. Configure Tomcat's Resource Factory</h5> + + <p>To configure Tomcat's resource factory, add an elements like this to the + <a href="config/context.html"><code><Context></code></a> element for + this web application.</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="mail/Session" auth="Container" + type="javax.mail.Session" + mail.smtp.host="localhost"/> + ... +</Context></code></pre></div> + + <p>Note that the resource name (here, <code>mail/Session</code>) must + match the value specified in the web application deployment descriptor. + Customize the value of the <code>mail.smtp.host</code> parameter to + point at the server that provides SMTP service for your network.</p> + + <p>Additional resource attributes and values will be converted to properties + and values and passed to + <code>javax.mail.Session.getInstance(java.util.Properties)</code> as part of + the <code>java.util.Properties</code> collection. In addition to the + properties defined in Annex A of the JavaMail specification, individual + providers may also support additional properties. + </p> + + <p>If the resource is configured with a <code>password</code> attribute and + either a <code>mail.smtp.user</code> or <code>mail.user</code> attribute + then Tomcat's resource factory will configure and add a + <code>javax.mail.Authenticator</code> to the mail session.</p> + + <h5>4. Install the JavaMail libraries</h5> + + <p><a href="http://javamail.java.net/"> + Download the JavaMail API</a>.</p> + + <p>Unpackage the distribution and place mail.jar into $CATALINA_HOME/lib so + that it is available to Tomcat during the initialization of the mail Session + Resource. <strong>Note:</strong> placing this jar in both $CATALINA_HOME/lib + and a web application's lib folder will cause an error, so ensure you have + it in the $CATALINA_HOME/lib location only. + </p> + + <h5>5. Restart Tomcat</h5> + + <p>For the additional JAR to be visible to Tomcat, it is necessary for the + Tomcat instance to be restarted.</p> + + + <h5>Example Application</h5> + + <p>The <code>/examples</code> application included with Tomcat contains + an example of utilizing this resource factory. It is accessed via the + "JSP Examples" link. The source code for the servlet that actually + sends the mail message is in + <code>/WEB-INF/classes/SendMailServlet.java</code>.</p> + + <p><strong>WARNING</strong> - The default configuration assumes that there + is an SMTP server listing on port 25 on <code>localhost</code>. If this is + not the case, edit the + <a href="config/context.html"><code><Context></code></a> element for + this web application and modify the parameter value for the + <code>mail.smtp.host</code> parameter to be the host name of an SMTP server + on your network.</p> + + </div></div> + + <div class="subsection"><h4 id="JDBC_Data_Sources">JDBC Data Sources</h4><div class="text"> + + <h5>0. Introduction</h5> + + <p>Many web applications need to access a database via a JDBC driver, + to support the functionality required by that application. The Java EE + Platform Specification requires Java EE Application Servers to make + available a <em>DataSource</em> implementation (that is, a connection + pool for JDBC connections) for this purpose. Tomcat offers exactly + the same support, so that database-based applications you develop on + Tomcat using this service will run unchanged on any Java EE server.</p> + + <p>For information about JDBC, you should consult the following:</p> + <ul> + <li><a href="http://www.oracle.com/technetwork/java/javase/jdbc/index.html"> + http://www.oracle.com/technetwork/java/javase/jdbc/index.html</a> - + Home page for information about Java Database Connectivity.</li> + <li><a href="http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html">http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html</a> - + The JDBC 2.1 API Specification.</li> + <li><a href="http://java.sun.com/products/jdbc/jdbc20.stdext.pdf">http://java.sun.com/products/jdbc/jdbc20.stdext.pdf</a> - + The JDBC 2.0 Standard Extension API (including the + <code>javax.sql.DataSource</code> API). This package is now known + as the "JDBC Optional Package".</li> + <li><a href="http://www.oracle.com/technetwork/java/javaee/overview/index.htm"> + http://www.oracle.com/technetwork/java/javaee/overview/index.htm</a> - + The Java EE Platform Specification (covers the JDBC facilities that + all Java EE platforms must provide to applications).</li> + </ul> + + <p><strong>NOTE</strong> - The default data source support in Tomcat + is based on the <strong>DBCP</strong> connection pool from the + <a href="http://commons.apache.org/">Commons</a> + project. However, it is possible to use any other connection pool + that implements <code>javax.sql.DataSource</code>, by writing your + own custom resource factory, as described + <a href="#Adding_Custom_Resource_Factories">below</a>.</p> + + <h5>1. Install Your JDBC Driver</h5> + + <p>Use of the <em>JDBC Data Sources</em> JNDI Resource Factory requires + that you make an appropriate JDBC driver available to both Tomcat internal + classes and to your web application. This is most easily accomplished by + installing the driver's JAR file(s) into the + <code>$CATALINA_HOME/lib</code> directory, which makes the driver + available both to the resource factory and to your application.</p> + + <h5>2. Declare Your Resource Requirements</h5> + + <p>Next, modify the web application deployment descriptor + (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under + which you will look up preconfigured data source. By convention, all such + names should resolve to the <code>jdbc</code> subcontext (relative to the + standard <code>java:comp/env</code> naming context that is the root of + all provided resource factories. A typical <code>web.xml</code> entry + might look like this:</p> +<div class="codeBox"><pre><code><resource-ref> + <description> + Resource reference to a factory for java.sql.Connection + instances that may be used for talking to a particular + database that is configured in the <Context> + configuration for the web application. + </description> + <res-ref-name> + jdbc/EmployeeDB + </res-ref-name> + <res-type> + javax.sql.DataSource + </res-type> + <res-auth> + Container + </res-auth> +</resource-ref></code></pre></div> + + <p><strong>WARNING</strong> - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet + Specification</a> for details.</p> + + <h5>3. Code Your Application's Use Of This Resource</h5> + + <p>A typical use of this resource reference might look like this:</p> +<div class="codeBox"><pre><code>Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +DataSource ds = (DataSource) + envCtx.lookup("jdbc/EmployeeDB"); + +Connection conn = ds.getConnection(); +... use this connection to access the database ... +conn.close();</code></pre></div> + + <p>Note that the application uses the same resource reference name that was + declared in the web application deployment descriptor. This is matched up + against the resource factory that is configured in the + <a href="config/context.html"><code><Context></code></a> element for + the web application as described below.</p> + + <h5>4. Configure Tomcat's Resource Factory</h5> + + <p>To configure Tomcat's resource factory, add an element like this to the + <a href="config/context.html"><code><Context></code></a> element for + the web application.</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="jdbc/EmployeeDB" + auth="Container" + type="javax.sql.DataSource" + username="dbusername" + password="dbpassword" + driverClassName="org.hsql.jdbcDriver" + url="jdbc:HypersonicSQL:database" + maxTotal="8" + maxIdle="4"/> + ... +</Context></code></pre></div> + + <p>Note that the resource name (here, <code>jdbc/EmployeeDB</code>) must + match the value specified in the web application deployment descriptor.</p> + + <p>This example assumes that you are using the HypersonicSQL database + JDBC driver. Customize the <code>driverClassName</code> and + <code>driverName</code> parameters to match your actual database's + JDBC driver and connection URL.</p> + + <p>The configuration properties for Tomcat's standard data source + resource factory + (<code>org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory</code>) are + as follows:</p> + <ul> + <li><strong>driverClassName</strong> - Fully qualified Java class name + of the JDBC driver to be used.</li> + <li><strong>username</strong> - Database username to be passed to our + JDBC driver.</li> + <li><strong>password</strong> - Database password to be passed to our + JDBC driver.</li> + <li><strong>url</strong> - Connection URL to be passed to our JDBC driver. + (For backwards compatibility, the property <code>driverName</code> + is also recognized.)</li> + <li><strong>initialSize</strong> - The initial number of connections + that will be created in the pool during pool initialization. Default: 0</li> + <li><strong>maxTotal</strong> - The maximum number of connections + that can be allocated from this pool at the same time. Default: 8</li> + <li><strong>minIdle</strong> - The minimum number of connections that + will sit idle in this pool at the same time. Default: 0</li> + <li><strong>maxIdle</strong> - The maximum number of connections that + can sit idle in this pool at the same time. Default: 8</li> + <li><strong>maxWaitMillis</strong> - The maximum number of milliseconds that the + pool will wait (when there are no available connections) for a + connection to be returned before throwing an exception. Default: -1 (infinite)</li> + </ul> + <p>Some additional properties handle connection validation:</p> + <ul> + <li><strong>validationQuery</strong> - SQL query that can be used by the + pool to validate connections before they are returned to the + application. If specified, this query MUST be an SQL SELECT + statement that returns at least one row.</li> + <li><strong>validationQueryTimeout</strong> - Timeout in seconds + for the validation query to return. Default: -1 (infinite)</li> + <li><strong>testOnBorrow</strong> - true or false: whether a connection + should be validated using the validation query each time it is + borrowed from the pool. Default: true</li> + <li><strong>testOnReturn</strong> - true or false: whether a connection + should be validated using the validation query each time it is + returned to the pool. Default: false</li> + </ul> + <p>The optional evictor thread is responsible for shrinking the pool + by removing any connections which are idle for a long time. The evictor + does not respect <code>minIdle</code>. Note that you do not need to + activate the evictor thread if you only want the pool to shrink according + to the configured <code>maxIdle</code> property.</p> + <p>The evictor is disabled by default and can be configured using + the following properties:</p> + <ul> + <li><strong>timeBetweenEvictionRunsMillis</strong> - The number of + milliseconds between consecutive runs of the evictor. + Default: -1 (disabled)</li> + <li><strong>numTestsPerEvictionRun</strong> - The number of connections + that will be checked for idleness by the evictor during each + run of the evictor. Default: 3</li> + <li><strong>minEvictableIdleTimeMillis</strong> - The idle time in + milliseconds after which a connection can be removed from the pool + by the evictor. Default: 30*60*1000 (30 minutes)</li> + <li><strong>testWhileIdle</strong> - true or false: whether a connection + should be validated by the evictor thread using the validation query + while sitting idle in the pool. Default: false</li> + </ul> + <p>Another optional feature is the removal of abandoned connections. + A connection is called abandoned if the application does not return it + to the pool for a long time. The pool can close such connections + automatically and remove them from the pool. This is a workaround + for applications leaking connections.</p> + <p>The abandoning feature is disabled by default and can be configured + using the following properties:</p> + <ul> + <li><strong>removeAbandoned</strong> - true or false: whether to + remove abandoned connections from the pool. Default: false</li> + <li><strong>removeAbandonedTimeout</strong> - The number of + seconds after which a borrowed connection is assumed to be abandoned. + Default: 300</li> + <li><strong>logAbandoned</strong> - true or false: whether to log + stack traces for application code which abandoned a statement + or connection. This adds serious overhead. Default: false</li> + </ul> + <p>Finally there are various properties that allow further fine tuning + of the pool behaviour:</p> + <ul> + <li><strong>defaultAutoCommit</strong> - true or false: default + auto-commit state of the connections created by this pool. + Default: true</li> + <li><strong>defaultReadOnly</strong> - true or false: default + read-only state of the connections created by this pool. + Default: false</li> + <li><strong>defaultTransactionIsolation</strong> - This sets the + default transaction isolation level. Can be one of + <code>NONE</code>, <code>READ_COMMITTED</code>, + <code>READ_UNCOMMITTED</code>, <code>REPEATABLE_READ</code>, + <code>SERIALIZABLE</code>. Default: no default set</li> + <li><strong>poolPreparedStatements</strong> - true or false: whether to + pool PreparedStatements and CallableStatements. Default: false</li> + <li><strong>maxOpenPreparedStatements</strong> - The maximum number of open + statements that can be allocated from the statement pool at the same time. + Default: -1 (unlimited)</li> + <li><strong>defaultCatalog</strong> - The name of the default catalog. + Default: not set</li> + <li><strong>connectionInitSqls</strong> - A list of SQL statements + run once after a Connection is created. Separate multiple statements + by semicolons (<code>;</code>). Default: no statement</li> + <li><strong>connectionProperties</strong> - A list of driver specific + properties passed to the driver for creating connections. Each + property is given as <code>name=value</code>, multiple properties + are separated by semicolons (<code>;</code>). Default: no properties</li> + <li><strong>accessToUnderlyingConnectionAllowed</strong> - true or false: whether + accessing the underlying connections is allowed. Default: false</li> + </ul> + <p>For more details, please refer to the commons-dbcp documentation.</p> + + </div></div> + +</div><h3 id="Adding_Custom_Resource_Factories">Adding Custom Resource Factories</h3><div class="text"> + + <p>If none of the standard resource factories meet your needs, you can write + your own factory and integrate it into Tomcat, and then configure the use + of this factory in the + <a href="config/context.html"><code><Context></code></a> element for + the web application. In the example below, we will create a factory that only + knows how to create <code>com.mycompany.MyBean</code> beans from the + <a href="#Generic_JavaBean_Resources">Generic JavaBean Resources</a> example + above.</p> + + <h4>1. Write A Resource Factory Class</h4> + + <p>You must write a class that implements the JNDI service provider + <code>javax.naming.spi.ObjectFactory</code> interface. Every time your + web application calls <code>lookup()</code> on a context entry that is + bound to this factory (assuming that the factory is configured with + <code>singleton="false"</code>), the + <code>getObjectInstance()</code> method is called, with the following + arguments:</p> + <ul> + <li><strong>Object obj</strong> - The (possibly null) object containing + location or reference information that can be used in creating an object. + For Tomcat, this will always be an object of type + <code>javax.naming.Reference</code>, which contains the class name of + this factory class, as well as the configuration properties (from the + <a href="config/context.html"><code><Context></code></a> for the + web application) to use in creating objects to be returned.</li> + <li><strong>Name name</strong> - The name to which this factory is bound + relative to <code>nameCtx</code>, or <code>null</code> if no name + is specified.</li> + <li><strong>Context nameCtx</strong> - The context relative to which the + <code>name</code> parameter is specified, or <code>null</code> if + <code>name</code> is relative to the default initial context.</li> + <li><strong>Hashtable environment</strong> - The (possibly null) + environment that is used in creating this object. This is generally + ignored in Tomcat object factories.</li> + </ul> + + <p>To create a resource factory that knows how to produce <code>MyBean</code> + instances, you might create a class like this:</p> + +<div class="codeBox"><pre><code>package com.mycompany; + +import java.util.Enumeration; +import java.util.Hashtable; +import javax.naming.Context; +import javax.naming.Name; +import javax.naming.NamingException; +import javax.naming.RefAddr; +import javax.naming.Reference; +import javax.naming.spi.ObjectFactory; + +public class MyBeanFactory implements ObjectFactory { + + public Object getObjectInstance(Object obj, + Name name2, Context nameCtx, Hashtable environment) + throws NamingException { + + // Acquire an instance of our specified bean class + MyBean bean = new MyBean(); + + // Customize the bean properties from our attributes + Reference ref = (Reference) obj; + Enumeration addrs = ref.getAll(); + while (addrs.hasMoreElements()) { + RefAddr addr = (RefAddr) addrs.nextElement(); + String name = addr.getType(); + String value = (String) addr.getContent(); + if (name.equals("foo")) { + bean.setFoo(value); + } else if (name.equals("bar")) { + try { + bean.setBar(Integer.parseInt(value)); + } catch (NumberFormatException e) { + throw new NamingException("Invalid 'bar' value " + value); + } + } + } + + // Return the customized instance + return (bean); + + } + +}</code></pre></div> + + <p>In this example, we are unconditionally creating a new instance of + the <code>com.mycompany.MyBean</code> class, and populating its properties + based on the parameters included in the <code><ResourceParams></code> + element that configures this factory (see below). You should note that any + parameter named <code>factory</code> should be skipped - that parameter is + used to specify the name of the factory class itself (in this case, + <code>com.mycompany.MyBeanFactory</code>) rather than a property of the + bean being configured.</p> + + <p>For more information about <code>ObjectFactory</code>, see the + <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html"> + JNDI Service Provider Interface (SPI) Specification</a>.</p> + + <p>You will need to compile this class against a class path that includes + all of the JAR files in the <code>$CATALINA_HOME/lib</code> directory. When you are through, + place the factory class (and the corresponding bean class) unpacked under + <code>$CATALINA_HOME/lib</code>, or in a JAR file inside + <code>$CATALINA_HOME/lib</code>. In this way, the required class + files are visible to both Catalina internal resources and your web + application.</p> + + <h4>2. Declare Your Resource Requirements</h4> + + <p>Next, modify your web application deployment descriptor + (<code>/WEB-INF/web.xml</code>) to declare the JNDI name under which + you will request new instances of this bean. The simplest approach is + to use a <code><resource-env-ref></code> element, like this:</p> + +<div class="codeBox"><pre><code><resource-env-ref> + <description> + Object factory for MyBean instances. + </description> + <resource-env-ref-name> + bean/MyBeanFactory + </resource-env-ref-name> + <resource-env-ref-type> + com.mycompany.MyBean + </resource-env-ref-type> +</resource-env-ref></code></pre></div> + + <p><strong>WARNING</strong> - Be sure you respect the element ordering + that is required by the DTD for web application deployment descriptors! + See the + <a href="http://wiki.apache.org/tomcat/Specifications">Servlet + Specification</a> for details.</p> + + <h4>3. Code Your Application's Use Of This Resource</h4> + + <p>A typical use of this resource environment reference might look + like this:</p> + +<div class="codeBox"><pre><code>Context initCtx = new InitialContext(); +Context envCtx = (Context) initCtx.lookup("java:comp/env"); +MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory"); + +writer.println("foo = " + bean.getFoo() + ", bar = " + + bean.getBar());</code></pre></div> + + <h4>4. Configure Tomcat's Resource Factory</h4> + + <p>To configure Tomcat's resource factory, add an elements like this to the + <a href="config/context.html"><code><Context></code></a> element for + this web application.</p> + +<div class="codeBox"><pre><code><Context ...> + ... + <Resource name="bean/MyBeanFactory" auth="Container" + type="com.mycompany.MyBean" + factory="com.mycompany.MyBeanFactory" + singleton="false" + bar="23"/> + ... +</Context></code></pre></div> + + <p>Note that the resource name (here, <code>bean/MyBeanFactory</code> + must match the value specified in the web application deployment + descriptor. We are also initializing the value of the <code>bar</code> + property, which will cause <code>setBar(23)</code> to be called before + the new bean is returned. Because we are not initializing the + <code>foo</code> property (although we could have), the bean will + contain whatever default value is set up by its constructor.</p> + + <p>You will also note that, from the application developer's perspective, + the declaration of the resource environment reference, and the programming + used to request new instances, is identical to the approach used for the + <em>Generic JavaBean Resources</em> example. This illustrates one of the + advantages of using JNDI resources to encapsulate functionality - you can + change the underlying implementation without necessarily having to + modify applications using the resources, as long as you maintain + compatible APIs.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/jspapi/index.html b/src/tomcat/webapps/docs/jspapi/index.html new file mode 100644 index 0000000000000000000000000000000000000000..c43227dc12dc787a9fda02fca83c3b1303eca7c7 --- /dev/null +++ b/src/tomcat/webapps/docs/jspapi/index.html @@ -0,0 +1,34 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8" /> + <title>API docs</title> +</head> + +<body> + +The JSP Javadoc is not installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +<a href="http://tomcat.apache.org/tomcat-9.0-doc/"> +documentation bundle</a>. + +</body> +</html> diff --git a/src/tomcat/webapps/docs/logging.html b/src/tomcat/webapps/docs/logging.html new file mode 100644 index 0000000000000000000000000000000000000000..06f44c68c8646a90d805e751ab74a7afdc2de7fa --- /dev/null +++ b/src/tomcat/webapps/docs/logging.html @@ -0,0 +1,424 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Logging in Tomcat</title><meta name="author" content="Allistair Crossley"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/logging"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Logging in Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a><ol><li><a href="#Java_logging_API_%E2%80%94_java.util.logging">Java logging API — java.util.logging</a></li><li><a href="#Servlets_logging_API">Servlets logging API</a></li><li><a href="#Console">Console</a></li><li><a href="#Access_logging">Access logging</a></li></ol></li><li><a href="#Using_java.util.logging_(default)">Using java.util.logging (default)</a><ol><li><a href="#Documentation_references">Documentation references</a></li><li><a href="#Considerations_for_production_usage">Considerations for production usage</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + The internal logging for Apache Tomcat uses JULI, a packaged renamed fork + of <a href="http://commons.apache.org/logging">Apache Commons Logging</a> + that is hard-coded to use the <code>java.util.logging</code> framework. + This ensures that Tomcat's internal logging and any web application + logging will remain independent, even if a web application uses Apache + Commons Logging. + </p> + + <p> + To configure Tomcat to use an alternative logging framework for its + internal logging, follow the instructions provided by the alternative + logging framework for redirecting logging for applications that use + <code>java.util.logging</code>. Keep in mind that the alternative logging + framework will need to be capable of working in an environment where + different loggers with the same name may exist in different class loaders. + </p> + + <p> + A web application running on Apache Tomcat can: + </p> + <ul> + <li> + Use any logging framework of its choice. + </li> + <li> + Use system logging API, <code>java.util.logging</code>. + </li> + <li> + Use the logging API provided by the Java Servlets specification, + <code>javax.servlet.ServletContext.log(...)</code> + </li> + </ul> + + <p> + The logging frameworks used by different web applications are independent. + See <a href="class-loader-howto.html">class loading</a> for more details. + The exception to this rule is <code>java.util.logging</code>. If it used + directly or indirectly by your logging library then elements of it will be + shared across web applications because it is loaded by the system class + loader. + </p> + + <div class="subsection"><h4 id="Java_logging_API_—_java.util.logging">Java logging API — java.util.logging</h4><div class="text"> + + <p> + Apache Tomcat has its own implementation of several key elements of + <code>java.util.logging</code> API. This implementation is called JULI. + The key component there is a custom LogManager implementation, + that is aware of different web applications running on Tomcat (and + their different class loaders). It supports private per-application + logging configurations. It is also notified by Tomcat when a web application + is unloaded from memory, so that the references to its classes can be + cleared, preventing memory leaks. + </p> + + <p> + This <code>java.util.logging</code> implementation is enabled by providing + certain system properties when starting Java. The Apache Tomcat startup + scripts do this for you, but if you are using different tools to run + Tomcat (such as jsvc, or running Tomcat from within an IDE), you should + take care of them by yourself. + </p> + + <p> + More details about java.util.logging may be found in the documentation + for your JDK and on its Javadoc pages for the <code>java.util.logging</code> + package. + </p> + + <p> + More details about Tomcat JULI may be found below. + </p> + + </div></div> + + <div class="subsection"><h4 id="Servlets_logging_API">Servlets logging API</h4><div class="text"> + + <p> + The calls to <code>javax.servlet.ServletContext.log(...)</code> to write + log messages are handled by internal Tomcat logging. Such messages are + logged to the category named + </p> + <div class="codeBox"><pre><code>org.apache.catalina.core.ContainerBase.[${engine}].[${host}].[${context}]</code></pre></div> + <p> + This logging is performed according to the Tomcat logging configuration. You + cannot overwrite it in a web application. + </p> + + <p> + The Servlets logging API predates the <code>java.util.logging</code> API + that is now provided by Java. As such, it does not offer you much options. + E.g., you cannot control the log levels. It can be noted, though, that + in Apache Tomcat implementation the calls to <code>ServletContext.log(String)</code> + or <code>GenericServlet.log(String)</code> are logged at the INFO level. + The calls to <code>ServletContext.log(String, Throwable)</code> or + <code>GenericServlet.log(String, Throwable)</code> + are logged at the SEVERE level. + </p> + + </div></div> + + <div class="subsection"><h4 id="Console">Console</h4><div class="text"> + + <p> + When running Tomcat on unixes, the console output is usually redirected + to the file named <code>catalina.out</code>. The name is configurable + using an environment variable. (See the startup scripts). + Whatever is written to <code>System.err/out</code> will be caught into + that file. That may include: + </p> + + <ul> + <li>Uncaught exceptions printed by <code>java.lang.ThreadGroup.uncaughtException(..)</code></li> + <li>Thread dumps, if you requested them via a system signal</li> + </ul> + + <p> + When running as a service on Windows, the console output is also caught + and redirected, but the file names are different. + </p> + + <p> + The default logging configuration in Apache Tomcat writes the same + messages to the console and to a log file. This is great when using + Tomcat for development, but usually is not needed in production. + </p> + + <p> + Old applications that still use <code>System.out</code> or <code>System.err</code> + can be tricked by setting <code>swallowOutput</code> attribute on a + <a href="config/context.html">Context</a>. If the attribute is set to + <code>true</code>, the calls to <code>System.out/err</code> during request + processing will be intercepted, and their output will be fed to the + logging subsystem using the + <code>javax.servlet.ServletContext.log(...)</code> calls.<br> + <strong>Note</strong>, that the <code>swallowOutput</code> feature is + actually a trick, and it has its limitations. + It works only with direct calls to <code>System.out/err</code>, + and only during request processing cycle. It may not work in other + threads that might be created by the application. It cannot be used to + intercept logging frameworks that themselves write to the system streams, + as those start early and may obtain a direct reference to the streams + before the redirection takes place. + </p> + + </div></div> + + <div class="subsection"><h4 id="Access_logging">Access logging</h4><div class="text"> + + <p> + Access logging is a related but different feature, which is + implemented as a <code>Valve</code>. It uses self-contained + logic to write its log files. The essential requirement for + access logging is to handle a large continuous stream of data + with low overhead, so it only uses Apache Commons Logging for + its own debug messages. This implementation approach avoids + additional overhead and potentially complex configuration. + Please refer to the <a href="config/valve.html#Access_Logging">Valves</a> + documentation for more details on its configuration, including + the various report formats. + </p> + + </div></div> + + </div><h3 id="Using_java.util.logging_(default)">Using java.util.logging (default)</h3><div class="text"> + + <p> + The default implementation of java.util.logging provided in the JDK is too + limited to be useful. The key limitation is the inability to have per-web + application logging, as the configuration is per-VM. As a result, Tomcat + will, in the default configuration, replace the default LogManager + implementation with a container friendly implementation called JULI, which + addresses these shortcomings. + </p> + <p> + JULI supports the same configuration mechanisms as the standard JDK + <code>java.util.logging</code>, using either a programmatic approach, or + properties files. The main difference is that per-classloader properties + files can be set (which enables easy redeployment friendly webapp + configuration), and the properties files support extended constructs which + allows more freedom for defining handlers and assigning them to loggers. + </p> + <p> + JULI is enabled by default, and supports per classloader configuration, in + addition to the regular global java.util.logging configuration. This means + that logging can be configured at the following layers: + </p> + <ul> + <li>Globally. That is usually done in the + <code>${catalina.base}/conf/logging.properties</code> file. + The file is specified by the <code>java.util.logging.config.file</code> + System property which is set by the startup scripts. + If it is not readable or is not configured, the default is to use the + <code>${java.home}/lib/logging.properties</code> file in the JRE. + </li> + <li>In the web application. The file will be + <code>WEB-INF/classes/logging.properties</code> + </li> + </ul> + <p> + The default <code>logging.properties</code> in the JRE specifies a + <code>ConsoleHandler</code> that routes logging to System.err. + The default <code>conf/logging.properties</code> in Apache Tomcat also + adds several <code>FileHandler</code>s that write to files. + </p> + <p> + A handler's log level threshold is INFO by default and can be set using + SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST or ALL. + You can also target specific packages to collect logging from and specify + a level. + </p> + <p> + To enable debug logging for part of Tomcat's internals, you should + configure both the appropriate logger(s) and the appropriate handler(s) to + use the <code>FINEST</code> or <code>ALL</code> level. e.g.: + </p> + <div class="codeBox"><pre><code>org.apache.catalina.session.level=ALL +java.util.logging.ConsoleHandler.level=ALL</code></pre></div> + <p> + When enabling debug logging it is recommended that it is enabled for the + narrowest possible scope as debug logging can generate large amounts of + information. + </p> + <p> + The configuration used by JULI is the same as the one supported by plain + <code>java.util.logging</code>, but uses a few extensions to allow better + flexibility in configuring loggers and handlers. The main differences are: + </p> + <ul> + <li>A prefix may be added to handler names, so that multiple handlers of a + single class may be instantiated. A prefix is a String which starts with a + digit, and ends with '.'. For example, <code>22foobar.</code> is a valid + prefix.</li> + <li>System property replacement is performed for property values which + contain ${systemPropertyName}.</li> + <li>If using a class loader that implements the + <code>org.apache.juli.WebappProperties</code> interface (Tomcat's + web application class loader does) then property replacement is also + performed for <code>${classloader.webappName}</code>, + <code>${classloader.hostName}</code> and + <code>${classloader.serviceName}</code> which are replaced with the + web application name, the host name and the service name respectively. + </li> + <li>By default, loggers will not delegate to their parent if they have + associated handlers. This may be changed per logger using the + <code>loggerName.useParentHandlers</code> property, which accepts a + boolean value.</li> + <li>The root logger can define its set of handlers using the + <code>.handlers</code> property.</li> + <li> By default the log files will be kept on the file system + <code>90</code> days. This may be changed per handler using the + <code>handlerName.maxDays</code> property. If the specified value for the + property is <code><=0</code> then the log files will be kept on the + file system forever, otherwise they will be kept the specified maximum + days.</li> + </ul> + <p> + There are several additional implementation classes, that can be used + together with the ones provided by Java. The notable one is + <code>org.apache.juli.FileHandler</code>. + </p> + <p> + <code>org.apache.juli.FileHandler</code> supports buffering of the + logs. The buffering is not enabled by default. To configure it, use the + <code>bufferSize</code> property of a handler. The value of <code>0</code> + uses system default buffering (typically an 8K buffer will be used). A + value of <code><0</code> forces a writer flush upon each log write. A + value <code>>0</code> uses a BufferedOutputStream with the defined + value but note that the system default buffering will also be + applied. + </p> + <p> + Example logging.properties file to be placed in $CATALINA_BASE/conf: + </p> + <div class="codeBox"><pre><code>handlers = 1catalina.org.apache.juli.FileHandler, \ + 2localhost.org.apache.juli.FileHandler, \ + 3manager.org.apache.juli.FileHandler, \ + java.util.logging.ConsoleHandler + +.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +1catalina.org.apache.juli.FileHandler.level = FINE +1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +1catalina.org.apache.juli.FileHandler.prefix = catalina. + +2localhost.org.apache.juli.FileHandler.level = FINE +2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +2localhost.org.apache.juli.FileHandler.prefix = localhost. + +3manager.org.apache.juli.FileHandler.level = FINE +3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs +3manager.org.apache.juli.FileHandler.prefix = manager. +3manager.org.apache.juli.FileHandler.bufferSize = 16384 + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter + + +############################################################ +# Facility specific properties. +# Provides extra control for each logger. +############################################################ + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \ + 2localhost.org.apache.juli.FileHandler + +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO +org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \ + 3manager.org.apache.juli.FileHandler + +# For example, set the org.apache.catalina.util.LifecycleBase logger to log +# each component that extends LifecycleBase changing state: +#org.apache.catalina.util.LifecycleBase.level = FINE</code></pre></div> + + <p> + Example logging.properties for the servlet-examples web application to be + placed in WEB-INF/classes inside the web application: + </p> + <div class="codeBox"><pre><code>handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler + +############################################################ +# Handler specific properties. +# Describes specific configuration info for Handlers. +############################################################ + +org.apache.juli.FileHandler.level = FINE +org.apache.juli.FileHandler.directory = ${catalina.base}/logs +org.apache.juli.FileHandler.prefix = ${classloader.webappName}. + +java.util.logging.ConsoleHandler.level = FINE +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter</code></pre></div> + + + <div class="subsection"><h4 id="Documentation_references">Documentation references</h4><div class="text"> + <p>See the following resources for additional information:</p> + <ul> + <li>Apache Tomcat Javadoc for the + <a href="api/org/apache/juli/package-summary.html"><code>org.apache.juli</code></a> + package. + </li> + <li>Oracle Java 6 Javadoc for the + <a href="http://docs.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html"><code>java.util.logging</code></a> + package. + </li> + </ul> + </div></div> + + <div class="subsection"><h4 id="Considerations_for_production_usage">Considerations for production usage</h4><div class="text"> + <p>You may want to take note of the following:</p> + <ul> + <li>Consider removing <code>ConsoleHandler</code> from configuration. By + default (thanks to the <code>.handlers</code> setting) logging goes both + to a <code>FileHandler</code> and to a <code>ConsoleHandler</code>. The + output of the latter one is usually captured into a file, such as + <code>catalina.out</code>. Thus you end up with two copies of the same + messages.</li> + <li>Consider removing <code>FileHandler</code>s for the applications + that you do not use. E.g., the one for <code>host-manager</code>.</li> + <li>The handlers by default use the system default encoding to write + the log files. It can be configured with <code>encoding</code> property. + See Javadoc for details.</li> + <li>Consider configuring an + <a href="config/valve.html#Access_Logging">Access log</a>.</li> + </ul> + </div></div> + + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/manager-howto.html b/src/tomcat/webapps/docs/manager-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..b266db136b2ae2e2898fde70e23926c5aab00d5f --- /dev/null +++ b/src/tomcat/webapps/docs/manager-howto.html @@ -0,0 +1,1470 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Manager App HOW-TO</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/manager-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Manager App HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Configuring_Manager_Application_Access">Configuring Manager Application Access</a></li><li><a href="#HTML_User-friendly_Interface">HTML User-friendly Interface</a></li><li><a href="#Supported_Manager_Commands">Supported Manager Commands</a><ol><li><a href="#Common_Parameters">Common Parameters</a></li><li><a href="#Deploy_A_New_Application_Archive_(WAR)_Remotely">Deploy A New Application Archive (WAR) Remotely</a></li><li><a href="#Deploy_A_New_Application_from_a_Local_Path">Deploy A New Application from a Local Path</a><ol><li><a href="#Deploy_a_previously_deployed_webapp">Deploy a previously deployed webapp</a></li><li><a href="#Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</a></li><li><a href="#Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</a></li><li><a href="#Deploy_using_a_Context_configuration_%22.xml%22_file">Deploy using a Context configuration ".xml" file</a></li><li><a href="#Deployment_Notes">Deployment Notes</a></li><li><a href="#Deploy_Response">Deploy Response</a></li></ol></li><li><a href="#List_Currently_Deployed_Applications">List Currently Deployed Applications</a></li><li><a href="#Reload_An_Existing_Application">Reload An Existing Application</a></li><li><a href="#List_OS_and_JVM_Properties">List OS and JVM Properties</a></li><li><a href="#List_Available_Global_JNDI_Resources">List Available Global JNDI Resources</a></li><li><a href="#Session_Statistics">Session Statistics</a></li><li><a href="#Expire_Sessions">Expire Sessions</a></li><li><a href="#Start_an_Existing_Application">Start an Existing Application</a></li><li><a href="#Stop_an_Existing_Application">Stop an Existing Application</a></li><li><a href="#Undeploy_an_Existing_Application">Undeploy an Existing Application</a></li><li><a href="#Finding_memory_leaks">Finding memory leaks</a></li><li><a href="#Connector_SSL/TLS_cipher_information">Connector SSL/TLS cipher information</a></li><li><a href="#Connector_SSL/TLS_certificate_chain_information">Connector SSL/TLS certificate chain information</a></li><li><a href="#Connector_SSL/TLS_trusted_certificate_information">Connector SSL/TLS trusted certificate information</a></li><li><a href="#Reload_TLS_configuration">Reload TLS configuration</a></li><li><a href="#Thread_Dump">Thread Dump</a></li><li><a href="#VM_Info">VM Info</a></li><li><a href="#Save_Configuration">Save Configuration</a></li></ol></li><li><a href="#Server_Status">Server Status</a></li><li><a href="#Using_the_JMX_Proxy_Servlet">Using the JMX Proxy Servlet</a><ol><li><a href="#What_is_JMX_Proxy_Servlet">What is JMX Proxy Servlet</a></li><li><a href="#JMX_Query_command">JMX Query command</a></li><li><a href="#JMX_Get_command">JMX Get command</a></li><li><a href="#JMX_Set_command">JMX Set command</a></li><li><a href="#JMX_Invoke_command">JMX Invoke command</a></li></ol></li><li><a href="#Executing_Manager_Commands_With_Ant">Executing Manager Commands With Ant</a><ol><li><a href="#Tasks_output_capture">Tasks output capture</a></li></ol></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>In many production environments, it is very useful to have the capability +to deploy a new web application, or undeploy an existing one, without having +to shut down and restart the entire container. In addition, you can request +an existing application to reload itself, even if you have not declared it +to be <code>reloadable</code> in the Tomcat server +configuration file.</p> + +<p>To support these capabilities, Tomcat includes a web application +(installed by default on context path <code>/manager</code>) that supports +the following functions:</p> +<ul> +<li>Deploy a new web application from the uploaded contents of a WAR file.</li> +<li>Deploy a new web application, on a specified context path, from the + server file system.</li> +<li>List the currently deployed web applications, as well as the + sessions that are currently active for those web apps.</li> +<li>Reload an existing web application, to reflect changes in the + contents of <code>/WEB-INF/classes</code> or <code>/WEB-INF/lib</code>. + </li> +<li>List the OS and JVM property values.</li> +<li>List the available global JNDI resources, for use in deployment + tools that are preparing <code><ResourceLink></code> elements + nested in a <code><Context></code> deployment description.</li> +<li>Start a stopped application (thus making it available again).</li> +<li>Stop an existing application (so that it becomes unavailable), but + do not undeploy it.</li> +<li>Undeploy a deployed web application and delete its document base + directory (unless it was deployed from file system).</li> +</ul> + +<p>A default Tomcat installation includes the Manager. To add an instance of the +Manager web application <code>Context</code> to a new host install the +<code>manager.xml</code> context configuration file in the +<code>$CATALINA_BASE/conf/[enginename]/[hostname]</code> folder. Here is an +example:</p> +<div class="codeBox"><pre><code><Context privileged="true" antiResourceLocking="false" + docBase="${catalina.home}/webapps/manager"> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.0\.0\.1" /> +</Context></code></pre></div> + +<p>If you have Tomcat configured to support multiple virtual hosts +(websites) you would need to configure a Manager for each.</p> + +<p>There are three ways to use the <strong>Manager</strong> web application.</p> +<ul> +<li>As an application with a user interface you use in your browser. +Here is an example URL where you can replace <code>localhost</code> with +your website host name: <code>http://localhost:8080/manager/html</code> .</li> +<li>A minimal version using HTTP requests only which is suitable for use +by scripts setup by system administrators. Commands are given as part of the +request URI, and responses are in the form of simple text that can be easily +parsed and processed. See <a href="#Supported_Manager_Commands"> +Supported Manager Commands</a> for more information.</li> +<li>A convenient set of task definitions for the <em>Ant</em> +(version 1.4 or later) build tool. See +<a href="#Executing_Manager_Commands_With_Ant">Executing Manager Commands +With Ant</a> for more information.</li> +</ul> + +</div><h3 id="Configuring_Manager_Application_Access">Configuring Manager Application Access</h3><div class="text"> + + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + + +<p>It would be quite unsafe to ship Tomcat with default settings that allowed +anyone on the Internet to execute the Manager application on your server. +Therefore, the Manager application is shipped with the requirement that anyone +who attempts to use it must authenticate themselves, using a username and +password that have one of <strong>manager-xxx</strong> roles associated with +them (the role name depends on what functionality is required). +Further, there is no username in the default users file +(<code>$CATALINA_BASE/conf/tomcat-users.xml</code>) that is assigned to those +roles. Therefore, access to the Manager application is completely disabled +by default.</p> + +<p>You can find the role names in the <code>web.xml</code> file of the Manager +web application. The available roles are:</p> + +<ul> + <li><strong>manager-gui</strong> — Access to the HTML interface.</li> + <li><strong>manager-status</strong> — Access to the "Server Status" + page only.</li> + <li><strong>manager-script</strong> — Access to the tools-friendly + plain text interface that is described in this document, + and to the "Server Status" page.</li> + <li><strong>manager-jmx</strong> — Access to JMX proxy interface + and to the "Server Status" page.</li> +</ul> + +<p>The HTML interface is protected against CSRF (Cross-Site Request Forgery) +attacks, but the text and JMX interfaces cannot be protected. It means that +users who are allowed access to the text and JMX interfaces have to be cautious +when accessing the Manager application with a web browser. +To maintain the CSRF protection:</p> + +<ul> + <li>If you use web browser to access the Manager application using + a user that has either <strong>manager-script</strong> or + <strong>manager-jmx</strong> roles (for example for testing + the plain text or JMX interfaces), you MUST close all windows + of the browser afterwards to terminate the session. + If you do not close the browser and visit other sites, you may become + victim of a CSRF attack.</li> + <li>It is recommended to never grant + the <strong>manager-script</strong> or <strong>manager-jmx</strong> + roles to users that have the <strong>manager-gui</strong> role.</li> +</ul> + +<p><strong>Note</strong> that JMX proxy interface is effectively low-level root-like +administrative interface of Tomcat. One can do a lot, if he knows +what commands to call. You should be cautious when enabling the +<strong>manager-jmx</strong> role.</p> + +<p>To enable access to the Manager web application, you must either create +a new username/password combination and associate one of the +<strong>manager-xxx</strong> roles with it, or add a +<strong>manager-xxx</strong> role +to some existing username/password combination. +As the majority of this document describes the using the text interface, this +example will use the role name <strong>manager-script</strong>. +Exactly how the usernames/passwords are configured depends on which +<a href="config/realm.html">Realm implementation</a> you are using:</p> +<ul> +<li><em>UserDatabaseRealm</em> plus <em>MemoryUserDatabase</em>, or <em>MemoryRealm</em> + — The <em>UserDatabaseRealm</em> and <em>MemoryUserDatabase</em> are + configured in the default <code>$CATALINA_BASE/conf/server.xml</code>. + Both <em>MemoryUserDatabase</em> and <em>MemoryRealm</em> read an + XML-format file by default stored at + <code>$CATALINA_BASE/conf/tomcat-users.xml</code>, which can be + edited with any text editor. This file contains an XML + <code><user></code> for each individual user, which might + look something like this: +<div class="codeBox"><pre><code><user username="craigmcc" password="secret" roles="standard,manager-script" /></code></pre></div> + which defines the username and password used by this individual to + log on, and the role names he or she is associated with. You can + add the <strong>manager-script</strong> role to the comma-delimited + <code>roles</code> attribute for one or more existing users, and/or + create new users with that assigned role.</li> +<li><em>DataSourceRealm</em> or <em>JDBCRealm</em> + — Your user and role information is stored in + a database accessed via JDBC. Add the <strong>manager-script</strong> role + to one or more existing users, and/or create one or more new users + with this role assigned, following the standard procedures for your + environment.</li> +<li><em>JNDIRealm</em> — Your user and role information is stored in + a directory server accessed via LDAP. Add the + <strong>manager-script</strong> role to one or more existing users, + and/or create one or more new users with this role assigned, following + the standard procedures for your environment.</li> +</ul> + +<p>The first time you attempt to issue one of the Manager commands +described in the next section, you will be challenged to log on using +BASIC authentication. The username and password you enter do not matter, +as long as they identify a valid user in the users database who possesses +the role <strong>manager-script</strong>.</p> + +<p>In addition to the password restrictions, access to the Manager web +application can be restricted by the <strong>remote IP address</strong> or host +by adding a <code>RemoteAddrValve</code> or <code>RemoteHostValve</code>. +See <a href="config/valve.html#Remote_Address_Filter">valves documentation</a> +for details. Here is +an example of restricting access to the localhost by IP address:</p> +<div class="codeBox"><pre><code><Context privileged="true"> + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.0\.0\.1"/> +</Context></code></pre></div> + +</div><h3 id="HTML_User-friendly_Interface">HTML User-friendly Interface</h3><div class="text"> + +<p>The user-friendly HTML interface of Manager web application is located at</p> + +<div class="codeBox"><pre><code>http://{host}:{port}/manager/html</code></pre></div> + +<p>As has already been mentioned above, you need <strong>manager-gui</strong> +role to be allowed to access it. There is a separate document that provides +help on this interface. See:</p> + +<ul> + <li><a href="html-manager-howto.html">HTML Manager documentation</a></li> +</ul> + +<p>The HTML interface is protected against CSRF (Cross-Site Request Forgery) +attacks. Each access to the HTML pages generates a random token, which is +stored in your session and is included in all links on the page. If your next +action does not have correct value of the token, the action will be denied. +If the token has expired you can start again from the main page or +<em>List Applications</em> page of Manager.</p> + +</div><h3 id="Supported_Manager_Commands">Supported Manager Commands</h3><div class="text"> + +<p>All commands that the Manager application knows how to process are +specified in a single request URI like this:</p> +<div class="codeBox"><pre><code>http://{host}:{port}/manager/text/{command}?{parameters}</code></pre></div> +<p>where <code>{host}</code> and <code>{port}</code> represent the hostname +and port number on which Tomcat is running, <code>{command}</code> +represents the Manager command you wish to execute, and +<code>{parameters}</code> represents the query parameters +that are specific to that command. In the illustrations below, customize +the host and port appropriately for your installation.</p> + +<p>The commands are usually executed by HTTP GET requests. The +<code>/deploy</code> command has a form that is executed by an HTTP PUT request.</p> + +<div class="subsection"><h4 id="Common_Parameters">Common Parameters</h4><div class="text"> + +<p>Most commands accept one or more of the following query parameters:</p> +<ul> +<li><strong>path</strong> - The context path (including the leading slash) + of the web application you are dealing with. To select the ROOT web + application, specify "/". + <br> + <strong>NOTE</strong>: It is not possible to perform administrative commands + on the Manager application itself. + <br> + <strong>NOTE</strong>: If the path parameter is not explicitly specified + then the path and the version will be derived using the standard + <a href="config/context.html#Naming">Context naming</a> rules from the + config parameter or, if the config parameter is not present, the war + parameter.</li> +<li><strong>version</strong> - The version of this web application as used by + the <a href="config/context.html">parallel deployment</a> feature. If you + use parallel deployment wherever a path is required you must specify a + version in addition to the path and it is the combination of path and + version that must be unique rather than just the path. + <br> + <strong>NOTE</strong>: If the path is not explicitly specified, the version + parameter is ignored.</li> +<li><strong>war</strong> - URL of a web application archive (WAR) file, or + pathname of a directory which contains the web application, or a + Context configuration ".xml" file. You can use URLs in any of the + following formats: + <ul> + <li><strong>file:/absolute/path/to/a/directory</strong> - The absolute + path of a directory that contains the unpacked version of a web + application. This directory will be attached to the context path + you specify without any changes.</li> + <li><strong>file:/absolute/path/to/a/webapp.war</strong> - The absolute + path of a web application archive (WAR) file. This is valid + <strong>only</strong> for the <code>/deploy</code> command, and is + the only acceptable format to that command.</li> + <li><strong>file:/absolute/path/to/a/context.xml</strong> - The + absolute path of a web application Context configuration ".xml" + file which contains the Context configuration element.</li> + <li><strong>directory</strong> - The directory name for the web + application context in the Host's application base directory.</li> + <li><strong>webapp.war</strong> - The name of a web application war file + located in the Host's application base directory.</li> + </ul></li> +</ul> + +<p>Each command will return a response in <code>text/plain</code> format +(i.e. plain ASCII with no HTML markup), making it easy for both humans and +programs to read). The first line of the response will begin with either +<code>OK</code> or <code>FAIL</code>, indicating whether the requested +command was successful or not. In the case of failure, the rest of the first +line will contain a description of the problem that was encountered. Some +commands include additional lines of information as described below.</p> + +<p><em>Internationalization Note</em> - The Manager application looks up +its message strings in resource bundles, so it is possible that the strings +have been translated for your platform. The examples below show the English +version of the messages.</p> + +</div></div> + +<div class="subsection"><h4 id="Deploy_A_New_Application_Archive_(WAR)_Remotely">Deploy A New Application Archive (WAR) Remotely</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/foo</code></pre></div> + +<p>Upload the web application archive (WAR) file that is specified as the +request data in this HTTP PUT request, install it into the <code>appBase</code> +directory of our corresponding virtual host, and start, deriving the name for +the WAR file added to the <code>appBase</code> from the specified path. The +application can later be undeployed (and the corresponding WAR file removed) by +use of the <code>/undeploy</code> command.</p> + +<p>This command is executed by an HTTP PUT request.</p> + +<p>The .WAR file may include Tomcat specific deployment configuration, by +including a Context configuration XML file in +<code>/META-INF/context.xml</code>.</p> + +<p>URL parameters include:</p> +<ul> +<li><code>update</code>: When set to true, any existing update will be + undeployed first. The default value is set to false.</li> +<li><code>tag</code>: Specifying a tag name, this allows associating the + deployed webapp with a tag or label. If the web application is undeployed, + it can be later redeployed when needed using only the tag.</li> +</ul> + +<p><strong>NOTE</strong> - This command is the logical +opposite of the <code>/undeploy</code> command.</p> + +<p>If installation and startup is successful, you will receive a response +like this:</p> +<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Application already exists at path /foo</em> + <p>The context paths for all currently running web applications must be + unique. Therefore, you must undeploy the existing web + application using this context path, or choose a different context path + for the new one. The <code>update</code> parameter may be specified as + a parameter on the URL, with a value of <code>true</code> to avoid this + error. In that case, an undeploy will be performed on an existing + application before performing the deployment.</p> + </li> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to start the new web application. + Check the Tomcat logs for the details, but likely explanations include + problems parsing your <code>/WEB-INF/web.xml</code> file, or missing + classes encountered when initializing application event listeners and + filters.</p> + </li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Deploy_A_New_Application_from_a_Local_Path">Deploy A New Application from a Local Path</h4><div class="text"> + +<p>Deploy and start a new web application, attached to the specified context +<code>path</code> (which must not be in use by any other web application). +This command is the logical opposite of the <code>/undeploy</code> command.</p> + +<p>This command is executed by an HTTP GET request. +There are a number of different ways the deploy command can be used.</p> + +<div class="subsection"><h4 id="Deploy_a_previously_deployed_webapp">Deploy a previously deployed webapp</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag</code></pre></div> + +<p>This can be used to deploy a previously deployed web application, which +has been deployed using the <code>tag</code> attribute. Note that the work +directory of the Manager webapp will contain the previously deployed WARs; +removing it would make the deployment fail.</p> + +</div></div> + +<div class="subsection"><h4 id="Deploy_a_Directory_or_WAR_by_URL">Deploy a Directory or WAR by URL</h4><div class="text"> + +<p>Deploy a web application directory or ".war" file located on the Tomcat +server. If no <code>path</code> is specified, the path and version are derived +from the directory name or the war file name. The <code>war</code> parameter +specifies a URL (including the <code>file:</code> scheme) for either +a directory or a web application archive (WAR) file. The supported syntax for +a URL referring to a WAR file is described on the Javadocs page for the +<code>java.net.JarURLConnection</code> class. Use only URLs that refer to +the entire WAR file.</p> + +<p>In this example the web application located in the directory +<code>/path/to/foo</code> on the Tomcat server is deployed as the +web application context named <code>/footoo</code>.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo</code></pre></div> + + +<p>In this example the ".war" file <code>/path/to/bar.war</code> on the +Tomcat server is deployed as the web application context named +<code>/bar</code>. Notice that there is no <code>path</code> parameter +so the context path defaults to the name of the web application archive +file without the ".war" extension.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=file:/path/to/bar.war</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Deploy_a_Directory_or_War_from_the_Host_appBase">Deploy a Directory or War from the Host appBase</h4><div class="text"> + +<p>Deploy a web application directory or ".war" file located in your Host +appBase directory. The path and optional version are derived from the directory +or war file name.</p> + +<p>In this example the web application located in a sub directory named +<code>foo</code> in the Host appBase directory of the Tomcat server is +deployed as the web application context named <code>/foo</code>. Notice +that the context path used is the name of the web application directory.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=foo</code></pre></div> + + +<p>In this example the ".war" file <code>bar.war</code> located in your +Host appBase directory on the Tomcat server is deployed as the web +application context named <code>/bar</code>.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?war=bar.war</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Deploy_using_a_Context_configuration_".xml"_file">Deploy using a Context configuration ".xml" file</h4><div class="text"> + +<p>If the Host deployXML flag is set to true you can deploy a web +application using a Context configuration ".xml" file and an optional +".war" file or web application directory. The context <code>path</code> +is not used when deploying a web application using a context ".xml" +configuration file.</p> + +<p>A Context configuration ".xml" file can contain valid XML for a +web application Context just as if it were configured in your +Tomcat <code>server.xml</code> configuration file. Here is an +example:</p> +<div class="codeBox"><pre><code><Context path="/foobar" docBase="/path/to/application/foobar"> +</Context></code></pre></div> + + +<p>When the optional <code>war</code> parameter is set to the URL +for a web application ".war" file or directory it overrides any +docBase configured in the context configuration ".xml" file.</p> + +<p>Here is an example of deploying an application using a Context +configuration ".xml" file.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy?config=file:/path/context.xml</code></pre></div> + + +<p>Here is an example of deploying an application using a Context +configuration ".xml" file and a web application ".war" file located +on the server.</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/deploy + ?config=file:/path/context.xml&war=file:/path/bar.war</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Deployment_Notes">Deployment Notes</h4><div class="text"> + +<p>If the Host is configured with unpackWARs=true and you deploy a war +file, the war will be unpacked into a directory in your Host appBase +directory.</p> + +<p>If the application war or directory is installed in your Host appBase +directory and either the Host is configured with autoDeploy=true or the +Context path must match the directory name or war file name without the +".war" extension.</p> + +<p>For security when untrusted users can manage web applications, the +Host deployXML flag can be set to false. This prevents untrusted users +from deploying web applications using a configuration XML file and +also prevents them from deploying application directories or ".war" +files located outside of their Host appBase.</p> + +</div></div> + +<div class="subsection"><h4 id="Deploy_Response">Deploy Response</h4><div class="text"> + +<p>If installation and startup is successful, you will receive a response +like this:</p> +<div class="codeBox"><pre><code>OK - Deployed application at context path /foo</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Application already exists at path /foo</em> + <p>The context paths for all currently running web applications must be + unique. Therefore, you must undeploy the existing web + application using this context path, or choose a different context path + for the new one. The <code>update</code> parameter may be specified as + a parameter on the URL, with a value of <code>true</code> to avoid this + error. In that case, an undeploy will be performed on an existing + application before performing the deployment.</p> + </li> +<li><em>Document base does not exist or is not a readable directory</em> + <p>The URL specified by the <code>war</code> parameter must identify a + directory on this server that contains the "unpacked" version of a + web application, or the absolute URL of a web application archive (WAR) + file that contains this application. Correct the value specified by + the <code>war</code> parameter.</p> + </li> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to start the new web application. + Check the Tomcat logs for the details, but likely explanations include + problems parsing your <code>/WEB-INF/web.xml</code> file, or missing + classes encountered when initializing application event listeners and + filters.</p> + </li> +<li><em>Invalid application URL was specified</em> + <p>The URL for the directory or web application that you specified + was not valid. Such URLs must start with <code>file:</code>, and URLs + for a WAR file must end in ".war".</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character. To reference the + ROOT web application use "/".</p> + </li> +<li><em>Context path must match the directory or WAR file name:</em> + <p>If the application war or directory is installed in your Host appBase + directory and either the Host is configured with autoDeploy=true the + Context path must match the directory name or war file name without + the ".war" extension.</p> + </li> +<li><em>Only web applications in the Host web application directory can + be installed</em> + <p> + If the Host deployXML flag is set to false this error will happen + if an attempt is made to deploy a web application directory or + ".war" file outside of the Host appBase directory. + </p></li> +</ul> + +</div></div> +</div></div> + +<div class="subsection"><h4 id="List_Currently_Deployed_Applications">List Currently Deployed Applications</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/list</code></pre></div> + +<p>List the context paths, current status (<code>running</code> or +<code>stopped</code>), and number of active sessions for all currently +deployed web applications. A typical response immediately +after starting Tomcat might look like this:</p> +<div class="codeBox"><pre><code>OK - Listed applications for virtual host localhost +/webdav:running:0:webdav +/examples:running:0:examples +/manager:running:0:manager +/:running:0:ROOT +/test:running:0:test##2 +/test:running:0:test##1</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Reload_An_Existing_Application">Reload An Existing Application</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/reload?path=/examples</code></pre></div> + +<p>Signal an existing application to shut itself down and reload. This can +be useful when the web application context is not reloadable and you have +updated classes or property files in the <code>/WEB-INF/classes</code> +directory or when you have added or updated jar files in the +<code>/WEB-INF/lib</code> directory. +</p> + +<p>If this command succeeds, you will see a response like this:</p> +<div class="codeBox"><pre><code>OK - Reloaded application at context path /examples</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to restart the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character. To reference the + ROOT web application use "/".</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + <p> + The <code>path</code> parameter is required. + </p></li> +<li><em>Reload not supported on WAR deployed at path /foo</em> + <p> + Currently, application reloading (to pick up changes to the classes or + <code>web.xml</code> file) is not supported when a web application is + deployed directly from a WAR file. It only works when the web application + is deployed from an unpacked directory. If you are using a WAR file, + you should <code>undeploy</code> and then <code>deploy</code> or + <code>deploy</code> with the <code>update</code> parameter the + application again to pick up your changes. + </p></li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="List_OS_and_JVM_Properties">List OS and JVM Properties</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/serverinfo</code></pre></div> + +<p>Lists information about the Tomcat version, OS, and JVM properties.</p> + +<p>If an error occurs, the response will start with <code>FAIL</code> and +include an error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to enumerate the system properties. + Check the Tomcat logs for the details.</p> + </li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="List_Available_Global_JNDI_Resources">List Available Global JNDI Resources</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/resources[?type=xxxxx]</code></pre></div> + +<p>List the global JNDI resources that are available for use in resource +links for context configuration files. If you specify the <code>type</code> +request parameter, the value must be the fully qualified Java class name of +the resource type you are interested in (for example, you would specify +<code>javax.sql.DataSource</code> to acquire the names of all available +JDBC data sources). If you do not specify the <code>type</code> request +parameter, resources of all types will be returned.</p> + +<p>Depending on whether the <code>type</code> request parameter is specified +or not, the first line of a normal response will be:</p> +<div class="codeBox"><pre><code>OK - Listed global resources of all types</code></pre></div> +<p>or</p> +<div class="codeBox"><pre><code>OK - Listed global resources of type xxxxx</code></pre></div> +<p>followed by one line for each resource. Each line is composed of fields +delimited by colon characters (":"), as follows:</p> +<ul> +<li><em>Global Resource Name</em> - The name of this global JNDI resource, + which would be used in the <code>global</code> attribute of a + <code><ResourceLink></code> element.</li> +<li><em>Global Resource Type</em> - The fully qualified Java class name of + this global JNDI resource.</li> +</ul> + +<p>If an error occurs, the response will start with <code>FAIL</code> and +include an error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to enumerate the global JNDI + resources. Check the Tomcat logs for the details.</p> + </li> +<li><em>No global JNDI resources are available</em> + <p>The Tomcat server you are running has been configured without + global JNDI resources.</p> + </li> +</ul> + + +</div></div> + +<div class="subsection"><h4 id="Session_Statistics">Session Statistics</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sessions?path=/examples</code></pre></div> + +<p>Display the default session timeout for a web application, and the +number of currently active sessions that fall within one-minute ranges of +their actual timeout times. For example, after restarting Tomcat and then +executing one of the JSP samples in the <code>/examples</code> web app, +you might get something like this:</p> + +<div class="codeBox"><pre><code>OK - Session information for application at context path /examples +Default maximum session inactive interval 30 minutes +<1 minutes: 1 sessions +1 - <2 minutes: 1 sessions</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Expire_Sessions">Expire Sessions</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/expire?path=/examples&idle=num</code></pre></div> + +<p>Display the session statistics (like the above <code>/sessions</code> +command) and expire sessions that are idle for longer than <code>num</code> +minutes. To expire all sessions, use <code>&idle=0</code> .</p> + +<div class="codeBox"><pre><code>OK - Session information for application at context path /examples +Default maximum session inactive interval 30 minutes +1 - <2 minutes: 1 sessions +3 - <4 minutes: 1 sessions +>0 minutes: 2 sessions were expired</code></pre></div> + +<p>Actually <code>/sessions</code> and <code>/expire</code> are synonyms for +the same command. The difference is in the presence of <code>idle</code> +parameter.</p> + +</div></div> + +<div class="subsection"><h4 id="Start_an_Existing_Application">Start an Existing Application</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/start?path=/examples</code></pre></div> + +<p>Signal a stopped application to restart, and make itself available again. +Stopping and starting is useful, for example, if the database required by +your application becomes temporarily unavailable. It is usually better to +stop the web application that relies on this database rather than letting +users continuously encounter database exceptions.</p> + +<p>If this command succeeds, you will see a response like this:</p> +<div class="codeBox"><pre><code>OK - Started application at context path /examples</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to start the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character. To reference the + ROOT web application use "/".</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + <p> + The <code>path</code> parameter is required. + </p></li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Stop_an_Existing_Application">Stop an Existing Application</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/stop?path=/examples</code></pre></div> + +<p>Signal an existing application to make itself unavailable, but leave it +deployed. Any request that comes in while an application is +stopped will see an HTTP error 404, and this application will show as +"stopped" on a list applications command.</p> + +<p>If this command succeeds, you will see a response like this:</p> +<div class="codeBox"><pre><code>OK - Stopped application at context path /examples</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to stop the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character. To reference the + ROOT web application use "/".</p> + </li> +<li><em>No context exists for path /foo</em> + <p>There is no deployed application on the context path + that you specified.</p> + </li> +<li><em>No context path was specified</em> + The <code>path</code> parameter is required. + </li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="Undeploy_an_Existing_Application">Undeploy an Existing Application</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/undeploy?path=/examples</code></pre></div> + +<p><strong><span style="color: red;">WARNING</span> - This command will delete any web +application artifacts that exist within <code>appBase</code> directory +(typically "webapps") for this virtual host</strong>. +This will delete the application .WAR, if present, +the application directory resulting either from a deploy in unpacked form +or from .WAR expansion as well as the XML Context definition from +<code>$CATALINA_BASE/conf/[enginename]/[hostname]/</code> directory. +If you simply want to take an application +out of service, you should use the <code>/stop</code> command instead.</p> + +<p>Signal an existing application to gracefully shut itself down, and +remove it from Tomcat (which also makes this context path available for +reuse later). In addition, the document root directory is removed, if it +exists in the <code>appBase</code> directory (typically "webapps") for +this virtual host. This command is the logical opposite of the +<code>/deploy</code> command.</p> + +<p>If this command succeeds, you will see a response like this:</p> +<div class="codeBox"><pre><code>OK - Undeployed application at context path /examples</code></pre></div> + +<p>Otherwise, the response will start with <code>FAIL</code> and include an +error message. Possible causes for problems include:</p> +<ul> +<li><em>Encountered exception</em> + <p>An exception was encountered trying to undeploy the web application. + Check the Tomcat logs for the details.</p> + </li> +<li><em>Invalid context path was specified</em> + <p>The context path must start with a slash character. To reference the + ROOT web application use "/".</p> + </li> +<li><em>No context exists named /foo</em> + <p>There is no deployed application with the name that you specified.</p> + </li> +<li><em>No context path was specified</em> + The <code>path</code> parameter is required. + </li> +</ul> + +</div></div> + +<div class="subsection"><h4 id="Finding_memory_leaks">Finding memory leaks</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/findleaks[?statusLine=[true|false]]</code></pre></div> + +<p><strong>The find leaks diagnostic triggers a full garbage collection. It +should be used with extreme caution on production systems.</strong></p> + +<p>The find leaks diagnostic attempts to identify web applications that have +caused memory leaks when they were stopped, reloaded or undeployed. Results +should always be confirmed +with a profiler. The diagnostic uses additional functionality provided by the +StandardHost implementation. It will not work if a custom host is used that +does not extend StandardHost.</p> + +<p>Explicitly triggering a full garbage collection from Java code is documented +to be unreliable. Furthermore, depending on the JVM used, there are options to +disable explicit GC triggering, like <code>-XX:+DisableExplicitGC</code>. +If you want to make sure, that the diagnostics were successfully running a full +GC, you will need to check using tools like GC logging, JConsole or similar.</p> + +<p>If this command succeeds, you will see a response like this:</p> +<div class="codeBox"><pre><code>/leaking-webapp</code></pre></div> + +<p>If you wish to see a status line included in the response then include the +<code>statusLine</code> query parameter in the request with a value of +<code>true</code>.</p> + +<p>Each context path for a web application that was stopped, reloaded or +undeployed, but which classes from the previous runs are still loaded in memory, +thus causing a memory leak, will be listed on a new line. If an application +has been reloaded several times, it may be listed several times.</p> + +<p>If the command does not succeed, the response will start with +<code>FAIL</code> and include an error message.</p> + +</div></div> + +<div class="subsection"><h4 id="Connector_SSL/TLS_cipher_information">Connector SSL/TLS cipher information</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorCiphers</code></pre></div> + +<p>The SSL Connector/Ciphers diagnostic lists the SSL/TLS ciphers that are currently +configured for each connector. For NIO and NIO2, the names of the individual +cipher suites are listed. For APR, the value of SSLCipherSuite is returned.</p> + +<p>The response will look something like this:</p> +<div class="codeBox"><pre><code>OK - Connector / SSL Cipher information +Connector[HTTP/1.1-8080] + SSL is not enabled for this connector +Connector[HTTP/1.1-8443] + TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA + TLS_DHE_RSA_WITH_AES_128_CBC_SHA + TLS_ECDH_RSA_WITH_AES_128_CBC_SHA + TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA + ...</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Connector_SSL/TLS_certificate_chain_information">Connector SSL/TLS certificate chain information</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorCerts</code></pre></div> + +<p>The SSL Connector/Certs diagnostic lists the certificate chain that is +currently configured for each virtual host.</p> + +<p>The response will look something like this:</p> +<div class="codeBox"><pre><code>OK - Connector / Certificate Chain information +Connector[HTTP/1.1-8080] +SSL is not enabled for this connector +Connector[HTTP/1.1-8443]-_default_-RSA +[ +[ + Version: V3 + Subject: CN=localhost, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US + Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 + ...</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Connector_SSL/TLS_trusted_certificate_information">Connector SSL/TLS trusted certificate information</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslConnectorTrustedCerts</code></pre></div> + +<p>The SSL Connector/Certs diagnostic lists the trusted certificates that are +currently configured for each virtual host.</p> + +<p>The response will look something like this:</p> +<div class="codeBox"><pre><code>OK - Connector / Trusted Certificate information +Connector[HTTP/1.1-8080] +SSL is not enabled for this connector +Connector[AJP/1.3-8009] +SSL is not enabled for this connector +Connector[HTTP/1.1-8443]-_default_ +[ +[ + Version: V3 + Subject: CN=Apache Tomcat Test CA, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US + ...</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Reload_TLS_configuration">Reload TLS configuration</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/sslReload?tlsHostName=name</code></pre></div> + +<p>Reload the TLS configuration files (the certificate and key files, this does +not trigger a re-parsing of server.xml). To reload the files for all hosts don't +specify the <code>tlsHostName</code> parameter.</p> + +<div class="codeBox"><pre><code>OK - Reloaded TLS configuration for [_default_]</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Thread_Dump">Thread Dump</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/threaddump</code></pre></div> + +<p>Write a JVM thread dump.</p> + +<p>The response will look something like this:</p> +<div class="codeBox"><pre><code>OK - JVM thread dump +2014-12-08 07:24:40.080 +Full thread dump Java HotSpot(TM) Client VM (25.25-b02 mixed mode): + +"http-nio-8080-exec-2" Id=26 cpu=46800300 ns usr=46800300 ns blocked 0 for -1 ms waited 0 for -1 ms + java.lang.Thread.State: RUNNABLE + locks java.util.concurrent.ThreadPoolExecutor$Worker@1738ad4 + at sun.management.ThreadImpl.dumpThreads0(Native Method) + at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446) + at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:440) + at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:409) + at org.apache.catalina.manager.ManagerServlet.threadDump(ManagerServlet.java:557) + at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:371) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) +... +</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="VM_Info">VM Info</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/vminfo</code></pre></div> + +<p>Write some diagnostic information about Java Virtual Machine.</p> + +<p>The response will look something like this:</p> +<div class="codeBox"><pre><code>OK - VM info +2014-12-08 07:27:32.578 +Runtime information: + vmName: Java HotSpot(TM) Client VM + vmVersion: 25.25-b02 + vmVendor: Oracle Corporation + specName: Java Virtual Machine Specification + specVersion: 1.8 + specVendor: Oracle Corporation + managementSpecVersion: 1.2 + name: ... + startTime: 1418012458849 + uptime: 393855 + isBootClassPathSupported: true + +OS information: +... +</code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="Save_Configuration">Save Configuration</h4><div class="text"> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/text/save</code></pre></div> + +<p>If specified without any parameters, this command saves the current +configuration of the server to server.xml. The existing file will be renamed as +a backup if required.</p> + +<p>If specified with a <code>path</code> parameter that matches the path of +a deployed web application then the configuration for that web application will +be saved to an appropriately named context.xml file in the <code>xmlBase</code> +for the current Host.</p> + +<p>To use the command a StoreConfig MBean must be present. Typically this is +configured using the <a href="config/listeners.html#StoreConfig_Lifecycle_Listener_-_org.apache.catalina.storeconfig.StoreConfigLifecycleListener">StoreConfigLifecycleListener</a>. +</p> + +<p>If the command does not succeed, the response will start with +<code>FAIL</code> and include an error message.</p> + +</div></div> + +</div><h3 id="Server_Status">Server Status</h3><div class="text"> + +<p>From the following links you can view Status information about the server. +Any one of <strong>manager-xxx</strong> roles allows access to this page.</p> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/status +http://localhost:8080/manager/status/all</code></pre></div> + +<p>Displays server status information in HTML format.</p> + +<div class="codeBox"><pre><code>http://localhost:8080/manager/status?XML=true +http://localhost:8080/manager/status/all?XML=true</code></pre></div> + +<p>Displays server status information in XML format.</p> + +<p>First, you have the server and JVM version number, JVM provider, OS name +and number followed by the architecture type.</p> + +<p>Second, there is information about the memory usage of the JVM.</p> + +<p>Then, there is information about the Tomcat AJP and HTTP connectors. +The same information is available for both of them : +</p> +<ul> + <li><p>Threads information : Max threads, min and max spare threads, + current thread count and current thread busy.</p></li> + <li><p>Request information : Max processing time and processing time, + request and error count, bytes received and sent.</p></li> + <li><p>A table showing Stage, Time, Bytes Sent, Bytes Receive, Client, + VHost and Request. All existing threads are listed in the table. + Here is the list of the possible thread stages :</p> + <ul> + <li><p><em>"Parse and Prepare Request"</em> : The request headers are + being parsed or the necessary preparation to read the request body (if + a transfer encoding has been specified) is taking place.</p></li> + <li><p><em>"Service"</em> : The thread is processing a request and + generating the response. This stage follows the "Parse and Prepare + Request" stage and precedes the "Finishing" stage. There is always at + least one thread in this stage (the server-status page).</p></li> + <li><p><em>"Finishing"</em> : The end of the request processing. Any + remainder of the response still in the output buffers is sent to the + client. This stage is followed by "Keep-Alive" if it is appropriate to + keep the connection alive or "Ready" if "Keep-Alive" is not + appropriate.</p></li> + <li><p><em>"Keep-Alive"</em> : The thread keeps the connection open to + the client in case the client sends another request. If another request + is received, the next stage will be "Parse and Prepare Request". If no + request is received before the keep alive times out, the connection will + be closed and the next stage will be "Ready".</p></li> + <li><p><em>"Ready"</em> : The thread is at rest and ready to be + used.</p></li> + </ul> + </li> +</ul> + +<p>If you are using <code>/status/all</code> command, additional information +on each of deployed web applications will be available.</p> + +</div><h3 id="Using_the_JMX_Proxy_Servlet">Using the JMX Proxy Servlet</h3><div class="text"> + + <div class="subsection"><h4 id="What_is_JMX_Proxy_Servlet">What is JMX Proxy Servlet</h4><div class="text"> + The JMX Proxy Servlet is a lightweight proxy to get and set the + tomcat internals. (Or any class that has been exposed via an MBean) + Its usage is not very user friendly but the UI is + extremely helpful for integrating command line scripts for monitoring + and changing the internals of tomcat. You can do two things with the proxy: + get information and set information. For you to really understand the + JMX Proxy Servlet, you should have a general understanding of JMX. + If you don't know what JMX is, then prepare to be confused. + </div></div> + + <div class="subsection"><h4 id="JMX_Query_command">JMX Query command</h4><div class="text"> + <p>This takes the form:</p> +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?qry=STUFF</code></pre></div> + <p>Where <code>STUFF</code> is the JMX query you wish to perform. For example, + here are some queries you might wish to run:</p> + <ul> + <li> + <code>qry=*%3Atype%3DRequestProcessor%2C* --> + type=RequestProcessor</code> which will locate all + workers which can process requests and report + their state. + </li> + <li> + <code>qry=*%3Aj2eeType=Servlet%2c* --> + j2eeType=Servlet</code> which return all loaded servlets. + </li> + <li> + <code>qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> + Catalina:type=Environment,resourcetype=Global,name=simpleValue</code> + which look for a specific MBean by the given name. + </li> + </ul> + <p> + You'll need to experiment with this to really understand its capabilities + If you provide no <code>qry</code> parameter, then all of the MBeans will + be displayed. We really recommend looking at the tomcat source code and + understand the JMX spec to get a better understanding of all the queries + you may run. + </p> + </div></div> + + <div class="subsection"><h4 id="JMX_Get_command">JMX Get command</h4><div class="text"> + <p> + The JXMProxyServlet also supports a "get" command that you can use to + fetch the value of a specific MBean's attribute. The general form of + the <code>get</code> command is: + </p> + +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?get=BEANNAME&att=MYATTRIBUTE&key=MYKEY</code></pre></div> + + <p>You must provide the following parameters:</p> + <ol> + <li><code>get</code>: The full bean name</li> + <li><code>att</code>: The attribute you wish to fetch</li> + <li><code>key</code>: (optional) The key into a CompositeData MBean attribute</li> + </ol> + <p> + If all goes well, then it will say OK, otherwise an error message will + be shown. For example, let's say we wish to fetch the current heap memory + data: + </p> + +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage</code></pre></div> + + <p>Or, if you only want the "used" key:</p> + +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/ + ?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used</code></pre></div> + </div></div> + + <div class="subsection"><h4 id="JMX_Set_command">JMX Set command</h4><div class="text"> + <p> + Now that you can query an MBean, its time to muck with Tomcat's internals! + The general form of the set command is : + </p> +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE</code></pre></div> + <p>So you need to provide 3 request parameters:</p> + <ol> + <li><code>set</code>: The full bean name</li> + <li><code>att</code>: The attribute you wish to alter</li> + <li><code>val</code>: The new value </li> + </ol> + <p> + If all goes ok, then it will say OK, otherwise an error message will be + shown. For example, lets say we wish to turn up debugging on the fly for the + <code>ErrorReportValve</code>. The following will set debugging to 10. + </p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/ + ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost + &att=debug&val=10</code></pre></div> + <p>and my result is (YMMV):</p> +<div class="codeBox"><pre><code>Result: ok</code></pre></div> + + <p>Here is what I see if I pass in a bad value. Here is the URL I used, + I try set debugging equal to 'cow':</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/ + ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost + &att=debug&val=cow</code></pre></div> + <p>When I try that, my result is</p> +<div class="codeBox"><pre><code>Error: java.lang.NumberFormatException: For input string: "cow"</code></pre></div> + </div></div> + + <div class="subsection"><h4 id="JMX_Invoke_command">JMX Invoke command</h4><div class="text"> + <p>The <code>invoke</code> command enables methods to be called on MBeans. The + general form of the command is:</p> +<div class="codeBox"><pre><code>http://webserver/manager/jmxproxy/ + ?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS</code></pre></div> + <p>For example, to call the <code>findConnectors()</code> method of the + <strong>Service</strong> use:</p> +<div class="codeBox"><pre><code>http://localhost:8080/manager/jmxproxy/ + ?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=</code></pre></div> + </div></div> +</div><h3 id="Executing_Manager_Commands_With_Ant">Executing Manager Commands With Ant</h3><div class="text"> + +<p>In addition to the ability to execute Manager commands via HTTP requests, +as documented above, Tomcat includes a convenient set of Task definitions +for the <em>Ant</em> (version 1.4 or later) build tool. In order to use these +commands, you must perform the following setup operations:</p> +<ul> +<li>Download the binary distribution of Ant from + <a href="http://ant.apache.org">http://ant.apache.org</a>. + You must use version <strong>1.4</strong> or later.</li> +<li>Install the Ant distribution in a convenient directory (called + ANT_HOME in the remainder of these instructions).</li> +<li>Add the <code>$ANT_HOME/bin</code> directory to your <code>PATH</code> + environment variable.</li> +<li>Configure at least one username/password combination in your Tomcat + user database that includes the <code>manager-script</code> role.</li> +</ul> + +<p>To use custom tasks within Ant, you must declare them first with an +<code><import></code> element. Therefore, your <code>build.xml</code> +file might look something like this:</p> + +<div class="codeBox"><pre><code><project name="My Application" default="compile" basedir="."> + + <!-- Configure the directory into which the web application is built --> + <property name="build" value="${basedir}/build"/> + + <!-- Configure the context path for this application --> + <property name="path" value="/myapp"/> + + <!-- Configure properties to access the Manager application --> + <property name="url" value="http://localhost:8080/manager/text"/> + <property name="username" value="myusername"/> + <property name="password" value="mypassword"/> + + <!-- Configure the path to the Tomcat installation --> + <property name="catalina.home" value="/usr/local/apache-tomcat"/> + + <!-- Configure the custom Ant tasks for the Manager application --> + <import file="${catalina.home}/bin/catalina-tasks.xml"/> + + <!-- Executable Targets --> + <target name="compile" description="Compile web application"> + <!-- ... construct web application in ${build} subdirectory, and + generated a ${path}.war ... --> + </target> + + <target name="deploy" description="Install web application" + depends="compile"> + <deploy url="${url}" username="${username}" password="${password}" + path="${path}" war="file:${build}${path}.war"/> + </target> + + <target name="reload" description="Reload web application" + depends="compile"> + <reload url="${url}" username="${username}" password="${password}" + path="${path}"/> + </target> + + <target name="undeploy" description="Remove web application"> + <undeploy url="${url}" username="${username}" password="${password}" + path="${path}"/> + </target> + +</project></code></pre></div> + +<p>Note: The definition of the resources task via the import above will override +the resources datatype added in Ant 1.7. If you wish to use the resources +datatype you will need to use Ant's namespace support to modify +<code>catalina-tasks.xml</code> to assign the Tomcat tasks to their own +namespace.</p> + +<p>Now, you can execute commands like <code>ant deploy</code> to deploy the +application to a running instance of Tomcat, or <code>ant reload</code> to +tell Tomcat to reload it. Note also that most of the interesting values in +this <code>build.xml</code> file are defined as replaceable properties, so +you can override their values from the command line. For example, you might +consider it a security risk to include the real manager password in your +<code>build.xml</code> file's source code. To avoid this, omit the password +property, and specify it from the command line:</p> +<div class="codeBox"><pre><code>ant -Dpassword=secret deploy</code></pre></div> + +<div class="subsection"><h4 id="Tasks_output_capture">Tasks output capture</h4><div class="text"> + +<p>Using <em>Ant</em> version <strong>1.6.2</strong> or later, +the Catalina tasks offer the option to capture their output in +properties or external files. They support directly the following subset of the +<code><redirector></code> type attributes: +</p> + +<table class="defaultTable"> +<tr> +<th>Attribute</th> +<th>Description</th> +<th style="text-align: center;">Required</th> +</tr> +<tr> +<td>output</td> +<td>Name of a file to which to write the output. If +the error stream is not also redirected to a file or property, it will +appear in this output.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>error</td> +<td>The file to which the standard error of the +command should be redirected.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>logError</td> +<td>This attribute is used when you wish to see +error output in Ant's log and you are redirecting output to a +file/property. The error output will not be included in the output +file/property. If you redirect error with the <i>error</i> or <i>errorProperty</i> +attributes, this will have no effect.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>append</td> +<td>Whether output and error files should be +appended to or overwritten. Defaults to <code>false</code>.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>createemptyfiles</td> +<td>Whether output and error files should be created +even when empty. Defaults to <code>true</code>.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>outputproperty</td> +<td>The name of a property in which the output of +the command should be stored. Unless the error stream is redirected to +a separate file or stream, this property will include the error output.</td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>errorproperty</td> +<td>The name of a property in which the standard +error of the command should be stored.</td> +<td style="text-align: center;">No</td> +</tr> +</table> + +<p>A couple of additional attributes can also be specified: +</p> +<table class="defaultTable"> +<tr> +<th>Attribute</th> +<th>Description</th> +<th style="text-align: center;">Required</th> +</tr> +<tr> +<td>alwaysLog</td> +<td>This attribute is used when you wish to see the +output you are capturing, appearing also in the Ant's log. It must not be +used unless you are capturing task output. +Defaults to <code>false</code>. +<em>This attribute will be supported directly by <code><redirector></code> +in Ant 1.6.3</em></td> +<td style="text-align: center;">No</td> +</tr> +<tr> +<td>failonerror</td> +<td>This attribute is used when you wish to avoid that +any manager command processing error terminates the ant execution. Defaults to <code>true</code>. +It must be set to <code>false</code>, if you want to capture error output, +otherwise execution will terminate before anything can be captured. +<br> +This attribute acts only on manager command execution, +any wrong or missing command attribute will still cause Ant execution termination. +</td> +<td style="text-align: center;">No</td> +</tr> +</table> + +<p>They also support the embedded <code><redirector></code> element +in which you can specify +its full set of attributes, but <code>input</code>, <code>inputstring</code> and +<code>inputencoding</code> that, even if accepted, are not used because they have +no meaning in this context. +Refer to <a href="http://ant.apache.org">ant manual</a> for details on +<code><redirector></code> element attributes. +</p> + +<p> +Here is a sample build file extract that shows how this output redirection support +can be used: +</p> + +<div class="codeBox"><pre><code> <target name="manager.deploy" + depends="context.status" + if="context.notInstalled"> + <deploy url="${mgr.url}" + username="${mgr.username}" + password="${mgr.password}" + path="${mgr.context.path}" + config="${mgr.context.descriptor}"/> + </target> + + <target name="manager.deploy.war" + depends="context.status" + if="context.deployable"> + <deploy url="${mgr.url}" + username="${mgr.username}" + password="${mgr.password}" + update="${mgr.update}" + path="${mgr.context.path}" + war="${mgr.war.file}"/> + </target> + + <target name="context.status"> + <property name="running" value="${mgr.context.path}:running"/> + <property name="stopped" value="${mgr.context.path}:stopped"/> + + <list url="${mgr.url}" + outputproperty="ctx.status" + username="${mgr.username}" + password="${mgr.password}"> + </list> + + <condition property="context.running"> + <contains string="${ctx.status}" substring="${running}"/> + </condition> + <condition property="context.stopped"> + <contains string="${ctx.status}" substring="${stopped}"/> + </condition> + <condition property="context.notInstalled"> + <and> + <isfalse value="${context.running}"/> + <isfalse value="${context.stopped}"/> + </and> + </condition> + <condition property="context.deployable"> + <or> + <istrue value="${context.notInstalled}"/> + <and> + <istrue value="${context.running}"/> + <istrue value="${mgr.update}"/> + </and> + <and> + <istrue value="${context.stopped}"/> + <istrue value="${mgr.update}"/> + </and> + </or> + </condition> + <condition property="context.undeployable"> + <or> + <istrue value="${context.running}"/> + <istrue value="${context.stopped}"/> + </or> + </condition> + </target></code></pre></div> + +<p><strong>WARNING:</strong> even if it doesn't make many sense, and is always a bad idea, +calling a Catalina task more than once, +badly set Ant tasks depends chains may cause that a task be called +more than once in the same Ant run, even if not intended to. A bit of caution should be exercised when you are +capturing output from that task, because this could lead to something unexpected:</p> +<ul> +<li>when capturing in a property you will find in it only the output from the <em>first</em> call, because +Ant properties are immutable and once set they cannot be changed, +</li> +<li>when capturing in a file, each run will overwrite it and you will find in it only the <em>last</em> call +output, unless you are using the <code>append="true"</code> attribute, in which case you will +see the output of each task call appended to the file. +</li> +</ul> + +</div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/maven-jars.html b/src/tomcat/webapps/docs/maven-jars.html new file mode 100644 index 0000000000000000000000000000000000000000..eeda6cdbb51913742d48c6a8a45ca37c5338859e --- /dev/null +++ b/src/tomcat/webapps/docs/maven-jars.html @@ -0,0 +1,69 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Apache Tomcat - Using Tomcat libraries with Maven</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/maven-jars"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tomcat - Using Tomcat libraries with Maven</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Using_Tomcat_libraries_With_Maven">Using Tomcat libraries With Maven</a><ol><li><a href="#Tomcat_Snapshots">Tomcat Snapshots</a></li><li><a href="#Tomcat_Releases">Tomcat Releases</a></li></ol></li></ul> +</div><h3 id="Using_Tomcat_libraries_With_Maven">Using Tomcat libraries With Maven</h3><div class="text"> + <div class="subsection"><h4 id="Tomcat_Snapshots">Tomcat Snapshots</h4><div class="text"> + Tomcat snapshots are located in the + <a href="http://repository.apache.org/content/repositories/snapshots/org/apache/tomcat/">Apache Snapshot Repository</a>. + The official URL is <div class="codeBox"><pre><code>http://repository.apache.org/content/repositories/snapshots/org/apache/tomcat/</code></pre></div> + <p> + Snapshots are done periodically, not on a regular basis, but when changes happen and the Tomcat team deems a new snapshot might + useful. + </p> + </div></div> + <div class="subsection"><h4 id="Tomcat_Releases">Tomcat Releases</h4><div class="text"> + <p> + Stable releases are published to the + <a href="http://repo2.maven.org/maven2/org/apache/tomcat/">Central + Maven Repositories</a>. The URL for this is + </p> + <div class="codeBox"><pre><code>http://repo2.maven.org/maven2/org/apache/tomcat/</code></pre></div> + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/mbeans-descriptors-howto.html b/src/tomcat/webapps/docs/mbeans-descriptors-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..9eae818e7ab9cb20c8807496dcf4ca8bdeeab2e3 --- /dev/null +++ b/src/tomcat/webapps/docs/mbeans-descriptors-howto.html @@ -0,0 +1,94 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - MBeans Descriptors How To</title><meta name="author" content="Amy Roh"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/mbeans-descriptors-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>MBeans Descriptors How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Adding_MBean_descriptions">Adding MBean descriptions</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>Tomcat uses JMX MBeans as the technology for implementing +manageability of Tomcat.</p> + +<p>The descriptions of JMX MBeans for Catalina are in the mbeans-descriptors.xml +file in each package.</p> + +<p>You will need to add MBean descriptions for your custom components +in order to avoid a "ManagedBean is not found" exception.</p> + +</div><h3 id="Adding_MBean_descriptions">Adding MBean descriptions</h3><div class="text"> + +<p>You may also add MBean descriptions for custom components in +a mbeans-descriptors.xml file, located in the same package as the class files +it describes.</p> + +<p>The permitted syntax for the mbeans-descriptors.xml is defined by +the <a href="mbeans-descriptors.dtd">DTD</a> file.</p> + +<p>The entries for a custom LDAP authentication Realm may look like this:</p> + +<div class="codeBox"><pre><code> <mbean name="LDAPRealm" + className="org.apache.catalina.mbeans.ClassNameMBean" + description="Custom LDAPRealm" + domain="Catalina" + group="Realm" + type="com.myfirm.mypackage.LDAPRealm"> + + <attribute name="className" + description="Fully qualified class name of the managed object" + type="java.lang.String" + writeable="false"/> + + <attribute name="debug" + description="The debugging detail level for this component" + type="int"/> + . + . + . + + </mbean></code></pre></div> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/mbeans-descriptors.dtd b/src/tomcat/webapps/docs/mbeans-descriptors.dtd new file mode 100644 index 0000000000000000000000000000000000000000..f12b8fe318a819bd1599ee8993dedbda2fcc38f2 --- /dev/null +++ b/src/tomcat/webapps/docs/mbeans-descriptors.dtd @@ -0,0 +1,247 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + + +<!-- + DTD for the Model MBeans Configuration File + + To support validation of your configuration file, include the following + DOCTYPE element at the beginning (after the "xml" declaration): + + <!DOCTYPE mbeans-descriptors PUBLIC + "-//Apache Software Foundation//DTD Model MBeans Configuration File" + "http://jakarta.apache.org/commons/dtds/mbeans-descriptors.dtd"> +--> + + +<!-- ========== Defined Types ============================================= --> + + +<!-- A "Boolean" is the string representation of a boolean (true or false) + variable. +--> +<!ENTITY % Boolean "(true|false|yes|no)"> + + +<!-- A "ClassName" is the fully qualified name of a Java class that is + instantiated to provide the functionality of the enclosing element. +--> +<!ENTITY % ClassName "CDATA"> + + +<!-- A "MethodName" is the name of a constructor or method, which must + be legal according to the syntax requirements of the Java language. +--> +<!ENTITY % MethodName "CDATA"> + + +<!-- A "VariableName" is the name of a variable or parameter, which must + be legal according to the syntax requirements of the Java language. +--> +<!ENTITY % VariableName "CDATA"> + + +<!-- ========== Element Definitions ======================================= --> + + +<!-- The "mbeans-descriptors" element is the root of the configuration file + hierarchy, and contains nested elements for all of the other + configuration settings. Remaining element definitions are listed + in alphabetical order. +--> +<!ELEMENT mbeans-descriptors (mbean*)> +<!ATTLIST mbeans-descriptors id ID #IMPLIED> + + +<!-- The "attribute" element describes a JavaBeans property of an MBean. + The following attributes are supported: + + description Human-readable description of this attribute. + + displayName Display name of this attribute. + + getMethod Name of the property getter method, if it does + not follow standard JavaBeans naming patterns. + + is Boolean value indicating whether or not this + attribute is a boolean with an "is" getter method. + By default, this is set to "false". + + name Name of this JavaBeans property, conforming to + standard naming design patterns. + + readable Boolean value indicating whether or not this + attribute is readable by management applications. + By default, this is set to "true". + + setMethod Name of the property setter method, if it does + not follow standard JavaBeans naming patterns. + + type Fully qualified Java class name of this attribute. + + writeable Boolean value indicating whether or not this + attribute is writeable by management applications. + By default, this is set to "true". +--> +<!ELEMENT attribute (descriptor?)> +<!ATTLIST attribute id ID #IMPLIED> +<!ATTLIST attribute description CDATA #IMPLIED> +<!ATTLIST attribute displayName CDATA #IMPLIED> +<!ATTLIST attribute getMethod %MethodName; #IMPLIED> +<!ATTLIST attribute is %Boolean; #IMPLIED> +<!ATTLIST attribute name %VariableName; #IMPLIED> +<!ATTLIST attribute readable %Boolean; #IMPLIED> +<!ATTLIST attribute setMethod %MethodName; #IMPLIED> +<!ATTLIST attribute type %ClassName; #IMPLIED> +<!ATTLIST attribute writeable %Boolean; #IMPLIED> + + +<!-- The "constructor" element describes a public constructor for the + underlying actual class. It may contain nested "parameter" elements + for the various arguments to this constructor. The following attributes + are supported: + + displayName Display name of this constructor. + + name Name of this constructor (by Java convention, this must + be the same as the base class name). +--> +<!ELEMENT constructor (descriptor?, parameter*)> +<!ATTLIST constructor id ID #IMPLIED> +<!ATTLIST constructor displayName CDATA #IMPLIED> +<!ATTLIST constructor name %VariableName; #IMPLIED> + + +<!-- The "descriptor" element groups a set of descriptor fields whose + values will be included in the Descriptor for the corresponding + metadata info classes. +--> +<!ELEMENT descriptor (field*)> +<!ATTLIST descriptor id ID #IMPLIED> + + +<!-- The "field" element represents a single name/value pair that will + be included in the Descriptor corresponding to our enclosing + "descriptor" element. The following attributes are supported: + + name Field name of the field to be included + + value Field value of the field to be included + (will be stored as a String) +--> +<!ELEMENT field EMPTY> +<!ATTLIST field id ID #IMPLIED> +<!ATTLIST field name CDATA #REQUIRED> +<!ATTLIST field value CDATA #REQUIRED> + + + +<!-- The "mbean" element describes a particular JMX ModelMBean implementation, + including the information necessary to construct the corresponding + ModelMBeanInfo structures. The following attributes are supported: + + className Fully qualified Java class name of the ModelMBean + implementation class. If not specified, the standard + implementation provided by JMX will be utilized. + + description Human-readable description of this managed bean. + + domain The JMX MBeanServer domain in which the ModelMBean + created by this managed bean should be registered, + when creating its ObjectName. + + group Optional name of a "grouping classification" that can + be used to select groups of similar MBean implementation + classes. + + name Unique name of this MBean (normally corresponds to the + base class name of the corresponding server component). + + type Fully qualified Java class name of the underlying + managed resource implementation class. +--> +<!ELEMENT mbean (descriptor?, attribute*, constructor*, notification*, operation*)> +<!ATTLIST mbean id ID #IMPLIED> +<!ATTLIST mbean className %ClassName; #IMPLIED> +<!ATTLIST mbean description CDATA #IMPLIED> +<!ATTLIST mbean domain CDATA #IMPLIED> +<!ATTLIST mbean group CDATA #IMPLIED> +<!ATTLIST mbean name %MethodName; #IMPLIED> +<!ATTLIST mbean type %ClassName; #IMPLIED> + + +<!-- The "notification" element describes the notification types that are + generated by a particular managed bean. The following attributes + are supported: + + description Human-readable description of these notification events. + + name Name of this set of notification event types. +--> +<!ELEMENT notification (descriptor?, notification-type*)> +<!ATTLIST notification id ID #IMPLIED> +<!ATTLIST notification description CDATA #IMPLIED> +<!ATTLIST notification name %VariableName; #IMPLIED> + + +<!-- The nested content of the "notification-type" element is the event string + of an event that can be emitted by this MBean. +--> +<!ELEMENT notification-type (#PCDATA)> +<!ATTLIST notification-type id ID #IMPLIED> + + +<!-- The "operation" element describes a the signature of a public method + that is accessible to management applications. The following attributes + are supported: + + description Human-readable description of this operation. + + impact Indication of the impact of this method: + ACTION (write like), ACTION-INFO (write+read like) + INFO (read like), or UNKNOWN. + + name Name of this public method. + + returnType Fully qualified Java class name of the return + type of this method. +--> +<!ELEMENT operation (descriptor?, parameter*)> +<!ATTLIST operation id ID #IMPLIED> +<!ATTLIST operation description CDATA #IMPLIED> +<!ATTLIST operation impact CDATA #IMPLIED> +<!ATTLIST operation name %VariableName; #IMPLIED> +<!ATTLIST operation returnType %ClassName; #IMPLIED> + + +<!-- The "parameter" element describes a single argument that will be passed + to a constructor or operation. The following attributes are supported: + + description Human-readable description of this parameter. + + name Java language name of this parameter. + + type Fully qualified Java class name of this parameter. +--> +<!ELEMENT parameter EMPTY> +<!ATTLIST parameter id ID #IMPLIED> +<!ATTLIST parameter description CDATA #IMPLIED> +<!ATTLIST parameter name %VariableName; #IMPLIED> +<!ATTLIST parameter type %ClassName; #IMPLIED> + + diff --git a/src/tomcat/webapps/docs/monitoring.html b/src/tomcat/webapps/docs/monitoring.html new file mode 100644 index 0000000000000000000000000000000000000000..e242511196427c67cb761cf7c3218f2857f7acb9 --- /dev/null +++ b/src/tomcat/webapps/docs/monitoring.html @@ -0,0 +1,1136 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Monitoring and Managing Tomcat</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/monitoring"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Monitoring and Managing Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Enabling_JMX_Remote">Enabling JMX Remote</a></li><li><a href="#Manage_Tomcat_with_JMX_remote_Ant_Tasks">Manage Tomcat with JMX remote Ant Tasks</a></li><li><a href="#JMXAccessorOpenTask_-_JMX_open_connection_task">JMXAccessorOpenTask - JMX open connection task</a></li><li><a href="#JMXAccessorGetTask:__get_attribute_value_Ant_task">JMXAccessorGetTask: get attribute value Ant task</a></li><li><a href="#JMXAccessorSetTask:__set_attribute_value_Ant_task">JMXAccessorSetTask: set attribute value Ant task</a></li><li><a href="#JMXAccessorInvokeTask:__invoke_MBean_operation_Ant_task">JMXAccessorInvokeTask: invoke MBean operation Ant task</a></li><li><a href="#JMXAccessorQueryTask:__query_MBean_Ant_task">JMXAccessorQueryTask: query MBean Ant task</a></li><li><a href="#JMXAccessorCreateTask:__remote_create_MBean_Ant_task">JMXAccessorCreateTask: remote create MBean Ant task</a></li><li><a href="#JMXAccessorUnregisterTask:__remote_unregister_MBean_Ant_task">JMXAccessorUnregisterTask: remote unregister MBean Ant task</a></li><li><a href="#JMXAccessorCondition:__express_condition">JMXAccessorCondition: express condition</a></li><li><a href="#JMXAccessorEqualsCondition:__equals_MBean_Ant_condition">JMXAccessorEqualsCondition: equals MBean Ant condition</a></li><li><a href="#Using_the_JMXProxyServlet">Using the JMXProxyServlet</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>Monitoring is a key aspect of system administration. Looking inside a + running server, obtaining some statistics or reconfiguring some aspects of + an application are all daily administration tasks.</p> + + </div><h3 id="Enabling_JMX_Remote">Enabling JMX Remote</h3><div class="text"> + + <p><strong>Note:</strong> This configuration is needed only if you are + going to monitor Tomcat remotely. It is not needed if you are going + to monitor it locally, using the same user that Tomcat runs with.</p> + + <p>The Oracle website includes the list of options and how to configure + JMX Remote on Java 6: + <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html"> + http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html</a>. + </p> + <p>The following is a quick configuration guide for Java 6:</p> + <p>Add the following parameters to <code>setenv.bat</code> script of your + Tomcat (see <a href="RUNNING.txt">RUNNING.txt</a> for details).<br> + <em>Note:</em> This syntax is for Microsoft Windows. The command has + to be on the same line. It is wrapped to be more readable. If Tomcat is + running as a Windows service, use its configuration dialog to set + java options for the service. + For un*xes remove <code>"set "</code> from beginning of the line. + </p> +<div class="codeBox"><pre><code>set CATALINA_OPTS=-Dcom.sun.management.jmxremote + -Dcom.sun.management.jmxremote.port=%my.jmx.port% + -Dcom.sun.management.jmxremote.ssl=false + -Dcom.sun.management.jmxremote.authenticate=false</code></pre></div> + + <ol> + <li>If you require authorization, add and change this: +<div class="codeBox"><pre><code> -Dcom.sun.management.jmxremote.authenticate=true + -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password + -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access</code></pre></div> + </li> + <li>edit the access authorization file <em>$CATALINA_BASE/conf/jmxremote.access</em>: +<div class="codeBox"><pre><code>monitorRole readonly +controlRole readwrite</code></pre></div> + </li> + <li>edit the password file <em>$CATALINA_BASE/conf/jmxremote.password</em>: +<div class="codeBox"><pre><code>monitorRole tomcat +controlRole tomcat</code></pre></div> + <b>Tip</b>: The password file should be read-only and only accessible by the + operating system user Tomcat is running as. + </li> + </ol> + <p><strong>Note:</strong> The JSR 160 JMX-Adaptor opens a second data channel + on a random port. That is a problem when you have a local firewall installed. + To fix it, configure a <code>JmxRemoteLifecycleListener</code>, as described + in <a href="config/listeners.html">listeners</a> documentation. + </p> + + </div><h3 id="Manage_Tomcat_with_JMX_remote_Ant_Tasks">Manage Tomcat with JMX remote Ant Tasks</h3><div class="text"> + <p>To simplify JMX usage with Ant 1.6.x, a set of tasks is provided that may + be used with antlib.</p> + <p><b>antlib</b>: Copy your catalina-ant.jar from $CATALINA_HOME/lib to $ANT_HOME/lib.</p> + <p>The following example shows the JMX Accessor usage:<br> + <em>Note:</em> The <code>name</code> attribute value was wrapped here to be + more readable. It has to be all on the same line, without spaces.</p> + <div class="codeBox"><pre><code><project name="Catalina Ant JMX" + xmlns:jmx="antlib:org.apache.catalina.ant.jmx" + default="state" + basedir="."> + <property name="jmx.server.name" value="localhost" /> + <property name="jmx.server.port" value="9012" /> + <property name="cluster.server.address" value="192.168.1.75" /> + <property name="cluster.server.port" value="9025" /> + + <target name="state" description="Show JMX Cluster state"> + <jmx:open + host="${jmx.server.name}" + port="${jmx.server.port}" + username="controlRole" + password="tomcat"/> + <jmx:get + name= +"Catalina:type=IDataSender,host=localhost, +senderAddress=${cluster.server.address},senderPort=${cluster.server.port}" + attribute="connected" + resultproperty="IDataSender.backup.connected" + echo="false" + /> + <jmx:get + name="Catalina:type=ClusterSender,host=localhost" + attribute="senderObjectNames" + resultproperty="senderObjectNames" + echo="false" + /> + <!-- get current maxActiveSession from ClusterTest application + echo it to Ant output and store at + property <em>clustertest.maxActiveSessions.orginal</em> + --> + <jmx:get + name="Catalina:type=Manager,context=/ClusterTest,host=localhost" + attribute="maxActiveSessions" + resultproperty="clustertest.maxActiveSessions.orginal" + echo="true" + /> + <!-- set maxActiveSession to 100 + --> + <jmx:set + name="Catalina:type=Manager,context=/ClusterTest,host=localhost" + attribute="maxActiveSessions" + value="100" + type="int" + /> + <!-- get all sessions and split result as delimiter <em>SPACE</em> for easy + access all session ids directly with Ant property sessions.[0..n]. + --> + <jmx:invoke + name="Catalina:type=Manager,context=/ClusterTest,host=localhost" + operation="listSessionIds" + resultproperty="sessions" + echo="false" + delimiter=" " + /> + <!-- Access session attribute <em>Hello</em> from first session. + --> + <jmx:invoke + name="Catalina:type=Manager,context=/ClusterTest,host=localhost" + operation="getSessionAttribute" + resultproperty="Hello" + echo="false" + > + <arg value="${sessions.0}"/> + <arg value="Hello"/> + </jmx:invoke> + <!-- Query for all application manager.of the server from all hosts + and bind all attributes from all found manager MBeans. + --> + <jmx:query + name="Catalina:type=Manager,*" + resultproperty="manager" + echo="true" + attributebinding="true" + /> + <!-- echo the create properties --> +<echo> +senderObjectNames: ${senderObjectNames.0} +IDataSender.backup.connected: ${IDataSender.backup.connected} +session: ${sessions.0} +manager.length: ${manager.length} +manager.0.name: ${manager.0.name} +manager.1.name: ${manager.1.name} +hello: ${Hello} +manager.ClusterTest.0.name: ${manager.ClusterTest.0.name} +manager.ClusterTest.0.activeSessions: ${manager.ClusterTest.0.activeSessions} +manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED: + ${manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED} +manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS: + ${manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS} +</echo> + + </target> + +</project></code></pre></div> + <p><b>import:</b> Import the JMX Accessor Project with + <em><import file="${CATALINA.HOME}/bin/catalina-tasks.xml" /></em> and + reference the tasks with <em>jmxOpen</em>, <em>jmxSet</em>, <em>jmxGet</em>, + <em>jmxQuery</em>, <em>jmxInvoke</em>, <em>jmxEquals</em> and <em>jmxCondition</em>.</p> + + </div><h3 id="JMXAccessorOpenTask_-_JMX_open_connection_task">JMXAccessorOpenTask - JMX open connection task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>url</td> + <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em> + </td> + <td></td> + </tr> + + <tr> + <td>host</td> + <td>Set the host, shortcut the very long URL syntax. + </td> + <td><code class="noHighlight">localhost</code></td> + </tr> + + <tr> + <td>port</td> + <td>Set the remote connection port + </td> + <td><code class="noHighlight">8050</code></td> + </tr> + + <tr> + <td>username</td> + <td>remote JMX connection user name. + </td> + <td></td> + </tr> + + <tr> + <td>password</td> + <td>remote JMX connection password. + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>Name of the internal connection reference. With this attribute you can + configure more the one connection inside the same Ant project. + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo the command usage (for access analysis or debugging) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>if</td> + <td>Only execute if a property of the given name <b>exists</b> in the current project. + </td> + <td></td> + </tr> + + <tr> + <td>unless</td> + <td>Only execute if a property of the given name <b>not exists</b> in the current project. + </td> + <td></td> + </tr> + +</table> + +<p> +Example to open a new JMX connection +</p> +<div class="codeBox"><pre><code> <jmx:open + host="${jmx.server.name}" + port="${jmx.server.port}" + /></code></pre></div> + +<p> +Example to open a JMX connection from URL, with authorization and +store at other reference +</p> +<div class="codeBox"><pre><code> <jmx:open + url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi" + ref="jmx.server.9024" + username="controlRole" + password="tomcat" + /></code></pre></div> + +<p> +Example to open a JMX connection from URL, with authorization and +store at other reference, but only when property <em>jmx.if</em> exists and +<em>jmx.unless</em> not exists +</p> +<div class="codeBox"><pre><code> <jmx:open + url="service:jmx:rmi:///jndi/rmi://localhost:9024/jmxrmi" + ref="jmx.server.9024" + username="controlRole" + password="tomcat" + if="jmx.if" + unless="jmx.unless" + /></code></pre></div> + +<p><b>Note</b>: All properties from <em>jmxOpen</em> task also exists at all +other tasks and conditions. +</p> + +</div><h3 id="JMXAccessorGetTask:__get_attribute_value_Ant_task">JMXAccessorGetTask: get attribute value Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em> + </td> + <td></td> + </tr> + + <tr> + <td>attribute</td> + <td>Existing MBean attribute (see Tomcat MBean description above) + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>resultproperty</td> + <td>Save result at this project property + </td> + <td></td> + </tr> + + <tr> + <td>delimiter</td> + <td>Split result with delimiter (java.util.StringTokenizer) + and use resultproperty as prefix to store tokens. + </td> + <td></td> + </tr> + + <tr> + <td>separatearrayresults</td> + <td>When return value is an array, save result as property list + (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>) + </td> + <td><code class="noHighlight">true</code></td> + </tr> + +</table> + +<p> +Example to get remote MBean attribute from default JMX connection +</p> +<div class="codeBox"><pre><code> <jmx:get + name="Catalina:type=Manager,context=/servlets-examples,host=localhost" + attribute="maxActiveSessions" + resultproperty="servlets-examples.maxActiveSessions" + /></code></pre></div> + +<p> +Example to get and result array and split it at separate properties +</p> +<div class="codeBox"><pre><code> <jmx:get + name="Catalina:type=ClusterSender,host=localhost" + attribute="senderObjectNames" + resultproperty="senderObjectNames" + /></code></pre></div> +<p> +Access the senderObjectNames properties with: +</p> +<div class="codeBox"><pre><code> ${senderObjectNames.length} give the number of returned sender list. + ${senderObjectNames.[0..N]} found all sender object names</code></pre></div> + + +<p> +Example to get IDataSender attribute connected only when cluster is configured.<br> +<em>Note:</em> The <code>name</code> attribute value was wrapped here to be +more readable. It has to be all on the same line, without spaces. +</p> +<div class="codeBox"><pre><code> + <jmx:query + failonerror="false" + name="Catalina:type=Cluster,host=${tomcat.application.host}" + resultproperty="cluster" + /> + <jmx:get + name= +"Catalina:type=IDataSender,host=${tomcat.application.host}, +senderAddress=${cluster.backup.address},senderPort=${cluster.backup.port}" + attribute="connected" + resultproperty="datasender.connected" + if="cluster.0.name" /></code></pre></div> + +</div><h3 id="JMXAccessorSetTask:__set_attribute_value_Ant_task">JMXAccessorSetTask: set attribute value Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em> + </td> + <td></td> + </tr> + + <tr> + <td>attribute</td> + <td>Existing MBean attribute (see Tomcat MBean description above) + </td> + <td></td> + </tr> + + <tr> + <td>value</td> + <td>value that set to attribute + </td> + <td></td> + </tr> + + <tr> + <td>type</td> + <td>type of the attribute. + </td> + <td><code class="noHighlight">java.lang.String</code></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + +</table> + +<p> +Example to set remote MBean attribute value +</p> +<div class="codeBox"><pre><code> <jmx:set + name="Catalina:type=Manager,context=/servlets-examples,host=localhost" + attribute="maxActiveSessions" + value="500" + type="int" + /></code></pre></div> + + +</div><h3 id="JMXAccessorInvokeTask:__invoke_MBean_operation_Ant_task">JMXAccessorInvokeTask: invoke MBean operation Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em> + </td> + <td></td> + </tr> + + <tr> + <td>operation</td> + <td>Existing MBean operation (see Tomcat + <a href="funcspecs/fs-admin-opers.html">funcspecs/fs-admin-opers.html</a>). + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>resultproperty</td> + <td>Save result at this project property + </td> + <td></td> + </tr> + + <tr> + <td>delimiter</td> + <td>Split result with delimiter (java.util.StringTokenizer) + and use resultproperty as prefix to store tokens. + </td> + <td></td> + </tr> + + <tr> + <td>separatearrayresults</td> + <td>When return value is an array, save result as property list + (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>) + </td> + <td><code class="noHighlight">true</code></td> + </tr> + +</table> + +<p> +stop an application +</p> +<div class="codeBox"><pre><code> <jmx:invoke + name="Catalina:type=Manager,context=/servlets-examples,host=localhost" + operation="stop"/></code></pre></div> +<p> +Now you can find the sessionid at <em>${sessions.[0..N}</em> properties and access the count +with ${sessions.length} property. +</p> +<p> +Example to get all sessionids +</p> +<div class="codeBox"><pre><code> <jmx:invoke + name="Catalina:type=Manager,context=/servlets-examples,host=localhost" + operation="listSessionIds" + resultproperty="sessions" + delimiter=" " + /></code></pre></div> +<p> +Now you can find the sessionid at <em>${sessions.[0..N}</em> properties and access the count +with ${sessions.length} property. +</p> +<p> +Example to get remote MBean session attribute from session ${sessionid.0} +</p> +<div class="codeBox"><pre><code> <jmx:invoke + name="Catalina:type=Manager,context=/ClusterTest,host=localhost" + operation="getSessionAttribute" + resultproperty="hello"> + <arg value="${sessionid.0}"/> + <arg value="Hello" /> + </jmx:invoke></code></pre></div> + +<p> +Example to create a new access logger valve at vhost <em>localhost</em> +</p> +<div class="codeBox"><pre><code> <jmx:invoke + name="Catalina:type=MBeanFactory" + operation="createAccessLoggerValve" + resultproperty="accessLoggerObjectName" + > + <arg value="Catalina:type=Host,host=localhost"/> + </jmx:invoke></code></pre></div> +<p> +Now you can find new MBean with name stored at <em>${accessLoggerObjectName}</em> +property. +</p> + +</div><h3 id="JMXAccessorQueryTask:__query_MBean_Ant_task">JMXAccessorQueryTask: query MBean Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>JMX ObjectName query string -- <em>Catalina:type=Manager,*</em> + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>resultproperty</td> + <td>Prefix project property name to all founded MBeans (<em>mbeans.[0..N].objectname</em>) + </td> + <td></td> + </tr> + + <tr> + <td>attributebinding</td> + <td>bind ALL MBean attributes in addition to <em>name</em> + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>delimiter</td> + <td>Split result with delimiter (java.util.StringTokenizer) + and use resultproperty as prefix to store tokens. + </td> + <td></td> + </tr> + + <tr> + <td>separatearrayresults</td> + <td>When return value is an array, save result as property list + (<em>$resultproperty.[0..N]</em> and <em>$resultproperty.length</em>) + </td> + <td><code class="noHighlight">true</code></td> + </tr> + +</table> + +<p> +Get all Manager ObjectNames from all services and Hosts +</p> +<div class="codeBox"><pre><code> <jmx:query + name="Catalina:type=Manager,* + resultproperty="manager" /></code></pre></div> +<p> +Now you can find the Session Manager at <em>${manager.[0..N].name}</em> +properties and access the result object counter with ${manager.length} property. +</p> +<p> +Example to get the Manager from <em>servlet-examples</em> application an bind all MBean properties +</p> +<div class="codeBox"><pre><code> <jmx:query + name="Catalina:type=Manager,context=/servlet-examples,host=localhost*" + attributebinding="true" + resultproperty="manager.servletExamples" /></code></pre></div> +<p> +Now you can find the manager at <em>${manager.servletExamples.0.name}</em> property +and can access all properties from this manager with <em>${manager.servletExamples.0.[manager attribute names]</em>}. +The result object counter from MBeans is stored ad ${manager.length} property. +</p> + +<p> +Example to get all MBeans from a server and store inside an external XML property file +</p> +<div class="codeBox"><pre><code><project name="jmx.query" + xmlns:jmx="antlib:org.apache.catalina.ant.jmx" + default="query-all" basedir="."> +<property name="jmx.host" value="localhost"/> +<property name="jmx.port" value="8050"/> +<property name="jmx.username" value="controlRole"/> +<property name="jmx.password" value="tomcat"/> + +<target name="query-all" description="Query all MBeans of a server"> + <!-- Configure connection --> + <jmx:open + host="${jmx.host}" + port="${jmx.port}" + ref="jmx.server" + username="${jmx.username}" + password="${jmx.password}"/> + + <!-- Query MBean list --> + <jmx:query + name="*:*" + resultproperty="mbeans" + attributebinding="false"/> + + <echoproperties + destfile="mbeans.properties" + prefix="mbeans." + format="xml"/> + + <!-- Print results --> + <echo message= + "Number of MBeans in server ${jmx.host}:${jmx.port} is ${mbeans.length}"/> +</target> +</project></code></pre></div> +<p> +Now you can find all MBeans inside the file <em>mbeans.properties</em>. +</p> + +</div><h3 id="JMXAccessorCreateTask:__remote_create_MBean_Ant_task">JMXAccessorCreateTask: remote create MBean Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=MBeanFactory</em> + </td> + <td></td> + </tr> + + <tr> + <td>className</td> + <td>Existing MBean full qualified class name (see Tomcat MBean description above) + </td> + <td></td> + </tr> + + <tr> + <td>classLoader</td> + <td>ObjectName of server or web application classloader <br> + ( <em>Catalina:type=ServerClassLoader,name=[server,common,shared]</em> or<br> + <em>Catalina:type=WebappClassLoader,context=/myapps,host=localhost</em>) + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + +</table> + +<p> +Example to create remote MBean +</p> +<div class="codeBox"><pre><code> <jmx:create + ref="${jmx.reference}" + name="Catalina:type=MBeanFactory" + className="org.apache.commons.modeler.BaseModelMBean" + classLoader="Catalina:type=ServerClassLoader,name=server"> + <arg value="org.apache.catalina.mbeans.MBeanFactory" /> + </jmx:create></code></pre></div> + +<p> + <b>Warning</b>: Many Tomcat MBeans can't be linked to their parent once<br> + created. The Valve, Cluster and Realm MBeans are not automatically<br> + connected with their parent. Use the <em>MBeanFactory</em> create<br> + operation instead. +</p> + +</div><h3 id="JMXAccessorUnregisterTask:__remote_unregister_MBean_Ant_task">JMXAccessorUnregisterTask: remote unregister MBean Ant task</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=MBeanFactory</em> + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>JMX Connection reference + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo command usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + +</table> + +<p> +Example to unregister remote MBean +</p> +<div class="codeBox"><pre><code> <jmx:unregister + name="Catalina:type=MBeanFactory" + /></code></pre></div> + +<p> + <b>Warning</b>: A lot of Tomcat MBeans can't be unregister.<br> + The MBeans are not unlinked from their parent. Use <em>MBeanFactory</em><br> + remove operation instead. +</p> + +</div><h3 id="JMXAccessorCondition:__express_condition">JMXAccessorCondition: express condition</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>url</td> + <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em> + </td> + <td></td> + </tr> + + <tr> + <td>host</td> + <td>Set the host, shortcut the very long URL syntax. + </td> + <td><code class="noHighlight">localhost</code></td> + </tr> + + <tr> + <td>port</td> + <td>Set the remote connection port + </td> + <td><code class="noHighlight">8050</code></td> + </tr> + + <tr> + <td>username</td> + <td>remote JMX connection user name. + </td> + <td></td> + </tr> + + <tr> + <td>password</td> + <td>remote JMX connection password. + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>Name of the internal connection reference. With this attribute you can + configure more the one connection inside the same Ant project. + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em> + </td> + <td></td> + </tr> + + <tr> + <td>echo</td> + <td>Echo condition usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + + <tr> + <td>if</td> + <td>Only execute if a property of the given name <b>exists</b> in the current project. + </td> + <td></td> + </tr> + + <tr> + <td>unless</td> + <td>Only execute if a property of the given name <b>not exists</b> in the current project. + </td> + <td></td> + </tr> + + <tr> + <td>value (required)</td> + <td>Second arg for operation + </td> + <td></td> + </tr> + + <tr> + <td>type</td> + <td>Value type to express operation (support <em>long</em> and <em>double</em>) + </td> + <td><code class="noHighlight">long</code></td> + </tr> + + <tr> + <td>operation</td> + <td> express one + <ul> + <li>== equals</li> + <li>!= not equals</li> + <li>> greater than (&gt;)</li> + <li>>= greater than or equals (&gt;=)</li> + <li>< lesser than (&lt;)</li> + <li><= lesser than or equals (&lt;=)</li> + </ul> + </td> + <td><code class="noHighlight">==</code></td> + </tr> + +</table> + +<p> +Wait for server connection and that cluster backup node is accessable +</p> +<div class="codeBox"><pre><code><target name="wait"> + <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" > + <and> + <socket server="${server.name}" port="${server.port}"/> + <http url="${url}"/> + <jmx:condition + operation="==" + host="localhost" + port="9014" + username="controlRole" + password="tomcat" + name= +"Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025" + attribute="connected" + value="true" + /> + </and> + </waitfor> + <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" /> + <echo message="Server ${url} alive" /> +</target></code></pre></div> + +</div><h3 id="JMXAccessorEqualsCondition:__equals_MBean_Ant_condition">JMXAccessorEqualsCondition: equals MBean Ant condition</h3><div class="text"> +<p> +List of Attributes +</p> +<table class="defaultTable"> + + <tr> + <th>Attribute</th> + <th>Description</th> + <th>Default value</th> + </tr> + + <tr> + <td>url</td> + <td>Set JMX connection URL - <em>service:jmx:rmi:///jndi/rmi://localhost:8050/jmxrmi</em> + </td> + <td></td> + </tr> + + <tr> + <td>host</td> + <td>Set the host, shortcut the very long URL syntax. + </td> + <td><code class="noHighlight">localhost</code></td> + </tr> + + <tr> + <td>port</td> + <td>Set the remote connection port + </td> + <td><code class="noHighlight">8050</code></td> + </tr> + + <tr> + <td>username</td> + <td>remote JMX connection user name. + </td> + <td></td> + </tr> + + <tr> + <td>password</td> + <td>remote JMX connection password. + </td> + <td></td> + </tr> + + <tr> + <td>ref</td> + <td>Name of the internal connection reference. With this attribute you can + configure more the one connection inside the same Ant project. + </td> + <td><code class="noHighlight">jmx.server</code></td> + </tr> + + <tr> + <td>name</td> + <td>Full qualified JMX ObjectName -- <em>Catalina:type=Server</em> + </td> + <td></td> + </tr> + + + <tr> + <td>echo</td> + <td>Echo condition usage (access and result) + </td> + <td><code class="noHighlight">false</code></td> + </tr> + +</table> + +<p> +Wait for server connection and that cluster backup node is accessible +</p> +<div class="codeBox"><pre><code><target name="wait"> + <waitfor maxwait="${maxwait}" maxwaitunit="second" timeoutproperty="server.timeout" > + <and> + <socket server="${server.name}" port="${server.port}"/> + <http url="${url}"/> + <jmx:equals + host="localhost" + port="9014" + username="controlRole" + password="tomcat" + name= +"Catalina:type=IDataSender,host=localhost,senderAddress=192.168.111.1,senderPort=9025" + attribute="connected" + value="true" + /> + </and> + </waitfor> + <fail if="server.timeout" message="Server ${url} don't answer inside ${maxwait} sec" /> + <echo message="Server ${url} alive" /> +</target></code></pre></div> + +</div><h3 id="Using_the_JMXProxyServlet">Using the JMXProxyServlet</h3><div class="text"> + + <p> + Tomcat offers an alternative to using remote (or even local) JMX + connections while still giving you access to everything JMX has to offer: + Tomcat's + <a href="api/org/apache/catalina/manager/JMXProxyServlet.html">JMXProxyServlet</a>. + </p> + + <p> + The JMXProxyServlet allows a client to issue JMX queries via an HTTP + interface. This technique offers the following advantages over using + JMX directly from a client program: + </p> + + <ul> + <li>You don't have to launch a full JVM and make a remote JMX connection + just to ask for one small piece of data from a running server</li> + <li>You don't have to know how to work with JMX connections</li> + <li>You don't need any of the complex configuration covered in the rest + of this page</li> + <li>Your client program does not have to be written in Java</li> + </ul> + + <p> + A perfect example of JMX overkill can be seen in the case of popular + server-monitoring software such as Nagios or Icinga: if you want to + monitor 10 items via JMX, you will have to launch 10 JVMs, make 10 JMX + connections, and then shut them all down every few minutes. With the + JMXProxyServlet, you can make 10 HTTP connections and be done with it. + </p> + + <p> + You can find out more information about the JMXProxyServlet in the + documentation for the + <a href="manager-howto.html#Using_the_JMX_Proxy_Servlet">Tomcat + manager</a>. + </p> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/proxy-howto.html b/src/tomcat/webapps/docs/proxy-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..1cf91d98a5524ef1c82faa424232cc4d0846b925 --- /dev/null +++ b/src/tomcat/webapps/docs/proxy-howto.html @@ -0,0 +1,155 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Proxy Support HOW-TO</title><meta name="author" content="Craig R. McClanahan"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/proxy-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Proxy Support HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Apache_1.3_Proxy_Support">Apache 1.3 Proxy Support</a></li><li><a href="#Apache_2.0_Proxy_Support">Apache 2.0 Proxy Support</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>Using standard configurations of Tomcat, web applications can ask for +the server name and port number to which the request was directed for +processing. When Tomcat is running standalone with the +<a href="config/http.html">HTTP/1.1 Connector</a>, it will generally +report the server name specified in the request, and the port number on +which the <strong>Connector</strong> is listening. The servlet API +calls of interest, for this purpose, are:</p> +<ul> +<li><code>ServletRequest.getServerName()</code>: Returns the host name of the server to which the request was sent.</li> +<li><code>ServletRequest.getServerPort()</code>: Returns the port number of the server to which the request was sent.</li> +<li><code>ServletRequest.getLocalName()</code>: Returns the host name of the Internet Protocol (IP) interface on which the request was received.</li> +<li><code>ServletRequest.getLocalPort()</code>: Returns the Internet Protocol (IP) port number of the interface on which the request was received.</li> +</ul> + +<p>When you are running behind a proxy server (or a web server that is +configured to behave like a proxy server), you will sometimes prefer to +manage the values returned by these calls. In particular, you will +generally want the port number to reflect that specified in the original +request, not the one on which the <strong>Connector</strong> itself is +listening. You can use the <code>proxyName</code> and <code>proxyPort</code> +attributes on the <code><Connector></code> element to configure +these values.</p> + +<p>Proxy support can take many forms. The following sections describe +proxy configurations for several common cases.</p> + +</div><h3 id="Apache_1.3_Proxy_Support">Apache 1.3 Proxy Support</h3><div class="text"> + +<p>Apache 1.3 supports an optional module (<code>mod_proxy</code>) that +configures the web server to act as a proxy server. This can be used to +forward requests for a particular web application to a Tomcat instance, +without having to configure a web connector such as <code>mod_jk</code>. +To accomplish this, you need to perform the following tasks:</p> +<ol> +<li><p>Configure your copy of Apache so that it includes the + <code>mod_proxy</code> module. If you are building from source, + the easiest way to do this is to include the + <code>--enable-module=proxy</code> directive on the + <code>./configure</code> command line.</p></li> +<li><p>If not already added for you, make sure that you are loading the + <code>mod_proxy</code> module at Apache startup time, by using the + following directives in your <code>httpd.conf</code> file:</p> +<div class="codeBox"><pre><code>LoadModule proxy_module {path-to-modules}/mod_proxy.so +AddModule mod_proxy.c</code></pre></div></li> +<li><p>Include two directives in your <code>httpd.conf</code> file for + each web application that you wish to forward to Tomcat. For + example, to forward an application at context path <code>/myapp</code>:</p> +<div class="codeBox"><pre><code>ProxyPass /myapp http://localhost:8081/myapp +ProxyPassReverse /myapp http://localhost:8081/myapp</code></pre></div> + <p>which tells Apache to forward URLs of the form + <code>http://localhost/myapp/*</code> to the Tomcat connector + listening on port 8081.</p></li> +<li><p>Configure your copy of Tomcat to include a special + <code><Connector></code> element, with appropriate + proxy settings, for example:</p> +<div class="codeBox"><pre><code><Connector port="8081" ... + proxyName="www.mycompany.com" + proxyPort="80"/></code></pre></div> + <p>which will cause servlets inside this web application to think that + all proxied requests were directed to <code>www.mycompany.com</code> + on port 80.</p></li> +<li><p>It is legal to omit the <code>proxyName</code> attribute from the + <code><Connector></code> element. If you do so, the value + returned by <code>request.getServerName()</code> will by the host + name on which Tomcat is running. In the example above, it would be + <code>localhost</code>.</p></li> +<li><p>If you also have a <code><Connector></code> listening on port + 8080 (nested within the same <a href="config/service.html">Service</a> + element), the requests to either port will share the same set of + virtual hosts and web applications.</p></li> +<li><p>You might wish to use the IP filtering features of your operating + system to restrict connections to port 8081 (in this example) to + be allowed <strong>only</strong> from the server that is running + Apache.</p></li> +<li><p>Alternatively, you can set up a series of web applications that are + only available via proxying, as follows:</p> + <ul> + <li>Configure another <code><Service></code> that contains + only a <code><Connector></code> for the proxy port.</li> + <li>Configure appropriate <a href="config/engine.html">Engine</a>, + <a href="config/host.html">Host</a>, and + <a href="config/context.html">Context</a> elements for the virtual hosts + and web applications accessible via proxying.</li> + <li>Optionally, protect port 8081 with IP filters as described + earlier.</li> + </ul></li> +<li><p>When requests are proxied by Apache, the web server will be recording + these requests in its access log. Therefore, you will generally want to + disable any access logging performed by Tomcat itself.</p></li> +</ol> + +<p>When requests are proxied in this manner, <strong>all</strong> requests +for the configured web applications will be processed by Tomcat (including +requests for static content). You can improve performance by using the +<code>mod_jk</code> web connector instead of <code>mod_proxy</code>. +<code>mod_jk</code> can be configured so that the web server serves static +content that is not processed by filters or security constraints defined +within the web application's deployment descriptor +(<code>/WEB-INF/web.xml</code>).</p> + +</div><h3 id="Apache_2.0_Proxy_Support">Apache 2.0 Proxy Support</h3><div class="text"> +The same instructions hold true as for 1.3. (Except in Apache 2.0, +you may omit <code>AddModule mod_proxy.c</code>) +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/realm-howto.html b/src/tomcat/webapps/docs/realm-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..409086c1318afe8e451d114ecd7df1bf528ab44a --- /dev/null +++ b/src/tomcat/webapps/docs/realm-howto.html @@ -0,0 +1,1223 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Realm Configuration HOW-TO</title><meta name="author" content="Craig R. McClanahan"><meta name="author" content="Yoav Shapira"><meta name="author" content="Andrew R. Jaquith"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/realm-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Realm Configuration HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#Overview">Overview</a><ol><li><a href="#What_is_a_Realm?">What is a Realm?</a></li><li><a href="#Configuring_a_Realm">Configuring a Realm</a></li></ol></li><li><a href="#Common_Features">Common Features</a><ol><li><a href="#Digested_Passwords">Digested Passwords</a></li><li><a href="#Example_Application">Example Application</a></li><li><a href="#Manager_Application">Manager Application</a></li><li><a href="#Realm_Logging">Realm Logging</a></li></ol></li><li><a href="#Standard_Realm_Implementations">Standard Realm Implementations</a><ol><li><a href="#JDBCRealm">JDBCRealm</a></li><li><a href="#DataSourceRealm">DataSourceRealm</a></li><li><a href="#JNDIRealm">JNDIRealm</a></li><li><a href="#UserDatabaseRealm">UserDatabaseRealm</a></li><li><a href="#MemoryRealm">MemoryRealm</a></li><li><a href="#JAASRealm">JAASRealm</a></li><li><a href="#CombinedRealm">CombinedRealm</a></li><li><a href="#LockOutRealm">LockOutRealm</a></li></ol></li></ul> +</div><h3 id="Quick_Start">Quick Start</h3><div class="text"> + +<p>This document describes how to configure Tomcat to support <em>container +managed security</em>, by connecting to an existing "database" of usernames, +passwords, and user roles. You only need to care about this if you are using +a web application that includes one or more +<code><security-constraint></code> elements, and a +<code><login-config></code> element defining how users are required +to authenticate themselves. If you are not utilizing these features, you can +safely skip this document.</p> + +<p>For fundamental background information about container managed security, +see the <a href="http://wiki.apache.org/tomcat/Specifications">Servlet +Specification (Version 2.4)</a>, Section 12.</p> + +<p>For information about utilizing the <em>Single Sign On</em> feature of +Tomcat (allowing a user to authenticate themselves once across the entire +set of web applications associated with a virtual host), see +<a href="config/host.html#Single_Sign_On">here</a>.</p> + +</div><h3 id="Overview">Overview</h3><div class="text"> + + +<div class="subsection"><h4 id="What_is_a_Realm?">What is a Realm?</h4><div class="text"> + +<p>A <strong>Realm</strong> is a "database" of usernames and passwords that +identify valid users of a web application (or set of web applications), plus +an enumeration of the list of <em>roles</em> associated with each valid user. +You can think of roles as similar to <em>groups</em> in Unix-like operating +systems, because access to specific web application resources is granted to +all users possessing a particular role (rather than enumerating the list of +associated usernames). A particular user can have any number of roles +associated with their username.</p> + +<p>Although the Servlet Specification describes a portable mechanism for +applications to <em>declare</em> their security requirements (in the +<code>web.xml</code> deployment descriptor), there is no portable API +defining the interface between a servlet container and the associated user +and role information. In many cases, however, it is desirable to "connect" +a servlet container to some existing authentication database or mechanism +that already exists in the production environment. Therefore, Tomcat +defines a Java interface (<code>org.apache.catalina.Realm</code>) that +can be implemented by "plug in" components to establish this connection. +Six standard plug-ins are provided, supporting connections to various +sources of authentication information:</p> +<ul> +<li><a href="#JDBCRealm">JDBCRealm</a> - Accesses authentication information + stored in a relational database, accessed via a JDBC driver.</li> +<li><a href="#DataSourceRealm">DataSourceRealm</a> - Accesses authentication + information stored in a relational database, accessed via a named JNDI + JDBC DataSource.</li> +<li><a href="#JNDIRealm">JNDIRealm</a> - Accesses authentication information + stored in an LDAP based directory server, accessed via a JNDI provider. + </li> +<li><a href="#UserDatabaseRealm">UserDatabaseRealm</a> - Accesses authentication + information stored in an UserDatabase JNDI resource, which is typically + backed by an XML document (<code>conf/tomcat-users.xml</code>).</li> +<li><a href="#MemoryRealm">MemoryRealm</a> - Accesses authentication + information stored in an in-memory object collection, which is initialized + from an XML document (<code>conf/tomcat-users.xml</code>).</li> +<li><a href="#JAASRealm">JAASRealm</a> - Accesses authentication information + through the Java Authentication & Authorization Service (JAAS) + framework.</li> +</ul> + +<p>It is also possible to write your own <code>Realm</code> implementation, +and integrate it with Tomcat. To do so, you need to:</p> +<ul> + <li>Implement <code>org.apache.catalina.Realm</code>,</li> + <li>Place your compiled realm in $CATALINA_HOME/lib,</li> + <li>Declare your realm as described in the "Configuring a Realm" section below,</li> + <li>Declare your realm to the <a href="mbeans-descriptors-howto.html">MBeans Descriptors</a>.</li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="Configuring_a_Realm">Configuring a Realm</h4><div class="text"> + +<p>Before getting into the details of the standard Realm implementations, it is +important to understand, in general terms, how a Realm is configured. In +general, you will be adding an XML element to your <code>conf/server.xml</code> +configuration file, that looks something like this:</p> + +<div class="codeBox"><pre><code><Realm className="... class name for this implementation" + ... other attributes for this implementation .../></code></pre></div> + +<p>The <code><Realm></code> element can be nested inside any one of +of the following <code>Container</code> elements. The location of the +Realm element has a direct impact on the "scope" of that Realm +(i.e. which web applications will share the same authentication information): +</p> +<ul> +<li><em>Inside an <Engine> element</em> - This Realm will be shared + across ALL web applications on ALL virtual hosts, UNLESS it is overridden + by a Realm element nested inside a subordinate <code><Host></code> + or <code><Context></code> element.</li> +<li><em>Inside a <Host> element</em> - This Realm will be shared across + ALL web applications for THIS virtual host, UNLESS it is overridden + by a Realm element nested inside a subordinate <code><Context></code> + element.</li> +<li><em>Inside a <Context> element</em> - This Realm will be used ONLY + for THIS web application.</li> +</ul> + + +</div></div> + + +</div><h3 id="Common_Features">Common Features</h3><div class="text"> + + +<div class="subsection"><h4 id="Digested_Passwords">Digested Passwords</h4><div class="text"> + +<p>For each of the standard <code>Realm</code> implementations, the +user's password (by default) is stored in clear text. In many +environments, this is undesirable because casual observers of the +authentication data can collect enough information to log on +successfully, and impersonate other users. To avoid this problem, the +standard implementations support the concept of <em>digesting</em> +user passwords. This allows the stored version of the passwords to be +encoded (in a form that is not easily reversible), but that the +<code>Realm</code> implementation can still utilize for +authentication.</p> + +<p>When a standard realm authenticates by retrieving the stored +password and comparing it with the value presented by the user, you +can select digested passwords by placing a <a href="config/credentialhandler.html"> +<code>CredentialHandler</code></a> element inside your <code><Realm></code> +element. An easy choice to support one of the algorithms SSHA, SHA or MD5 +would be the usage of the <code>MessageDigestCredentialHandler</code>. +This element must be configured to one of the digest algorithms supported +by the <code>java.security.MessageDigest</code> class (SSHA, SHA or MD5). +When you select this option, the contents of the password that is stored +in the <code>Realm</code> must be the cleartext version of the password, +as digested by the specified algorithm.</p> + +<p>When the <code>authenticate()</code> method of the Realm is called, the +(cleartext) password specified by the user is itself digested by the same +algorithm, and the result is compared with the value returned by the +<code>Realm</code>. An equal match implies that the cleartext version of the +original password is the same as the one presented by the user, so that this +user should be authorized.</p> + +<p>To calculate the digested value of a cleartext password, two convenience +techniques are supported:</p> +<ul> +<li>If you are writing an application that needs to calculate digested + passwords dynamically, call the static <code>Digest()</code> method of the + <code>org.apache.catalina.realm.RealmBase</code> class, passing the + cleartext password, the digest algorithm name and the encoding as arguments. + This method will return the digested password.</li> +<li>If you want to execute a command line utility to calculate the digested + password, simply execute +<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password}</code></pre></div> + and the digested version of this cleartext password will be returned to + standard output.</li> +</ul> + +<p>If using digested passwords with DIGEST authentication, the cleartext used + to generate the digest is different and the digest must use one iteration of + the MD5 algorithm with no salt. In the examples above + <code>{cleartext-password}</code> must be replaced with + <code>{username}:{realm}:{cleartext-password}</code>. For example, in a + development environment this might take the form + <code>testUser:Authentication required:testPassword</code>. The value for + <code>{realm}</code> is taken from the <code><realm-name></code> + element of the web application's <code><login-config></code>. If + not specified in web.xml, the default value of <code>Authentication + required</code> is used.</p> + +<p>Usernames and/or passwords using encodings other than the platform default +are supported using</p> +<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} -e {encoding} {input}</code></pre></div> +<p>but care is required to ensure that the input is correctly passed to the +digester. The digester returns <code>{input}:{digest}</code>. If the input +appears corrupted in the return, the digest will be invalid.</p> + +<p>The output format of the digest is <code>{salt}${iterations}${digest}</code>. +If the salt length is zero and the iteration count is one, the output is +simplified to <code>{digest}</code>.</p> + +<p>The full syntax of <code>CATALINA_HOME/bin/digest.[bat|sh]</code> is:</p> +<div class="codeBox"><pre><code>CATALINA_HOME/bin/digest.[bat|sh] [-a <algorithm>] [-e <encoding>] + [-i <iterations>] [-s <salt-length>] [-k <key-length>] + [-h <handler-class-name>] <credentials> +</code></pre></div> +<ul> +<li><b>-a</b> - The algorithm to use to generate the stored + credential. If not specified, the default for the handler will + be used. If neither handler nor algorithm is specified then a + default of <code>SHA-512</code> will be used</li> +<li><b>-e</b> - The encoding to use for any byte to/from character + conversion that may be necessary. If not specified, the + system encoding (<code>Charset#defaultCharset()</code>) will + be used.</li> +<li><b>-i</b> - The number of iterations to use when generating the + stored credential. If not specified, the default for the + CredentialHandler will be used.</li> +<li><b>-s</b> - The length (in bytes) of salt to generate and store as + part of the credential. If not specified, the default for + the CredentialHandler will be used.</li> +<li><b>-k</b> - The length (in bits) of the key(s), if any, created while + generating the credential. If not specified, the default + for the CredentialHandler will be used.</li> +<li><b>-h</b> - The fully qualified class name of the CredentialHandler + to use. If not specified, the built-in handlers will be + tested in turn (MessageDigestCredentialHandler then + SecretKeyCredentialHandler) and the first one to accept the + specified algorithm will be used.</li> +</ul> +</div></div> + + + +<div class="subsection"><h4 id="Example_Application">Example Application</h4><div class="text"> + +<p>The example application shipped with Tomcat includes an area that is +protected by a security constraint, utilizing form-based login. To access it, +point your browser at +<a href="http://localhost:8080/examples/jsp/security/protected/">http://localhost:8080/examples/jsp/security/protected/</a> +and log on with one of the usernames and passwords described for the default +<a href="#UserDatabaseRealm">UserDatabaseRealm</a>.</p> + +</div></div> + + +<div class="subsection"><h4 id="Manager_Application">Manager Application</h4><div class="text"> + +<p>If you wish to use the <a href="manager-howto.html">Manager Application</a> +to deploy and undeploy applications in a running Tomcat installation, you +MUST add the "manager-gui" role to at least one username in your selected +Realm implementation. This is because the manager web application itself uses a +security constraint that requires role "manager-gui" to access ANY request URI +within the HTML interface of that application.</p> + +<p>For security reasons, no username in the default Realm (i.e. using +<code>conf/tomcat-users.xml</code> is assigned the "manager-gui" role. +Therefore, no one will be able to utilize the features of this application +until the Tomcat administrator specifically assigns this role to one or more +users.</p> + +</div></div> + +<div class="subsection"><h4 id="Realm_Logging">Realm Logging</h4><div class="text"> + +<p>Debugging and exception messages logged by a <code>Realm</code> will + be recorded by the logging configuration associated with the container + for the realm: its surrounding <a href="config/context.html">Context</a>, + <a href="config/host.html">Host</a>, or + <a href="config/engine.html">Engine</a>.</p> + +</div></div> + +</div><h3 id="Standard_Realm_Implementations">Standard Realm Implementations</h3><div class="text"> + +<div class="subsection"><h4 id="JDBCRealm">JDBCRealm</h4><div class="text"> + +<h5>Introduction</h5> + +<p><strong>JDBCRealm</strong> is an implementation of the Tomcat +<code>Realm</code> interface that looks up users in a relational database +accessed via a JDBC driver. There is substantial configuration flexibility +that lets you adapt to existing table and column names, as long as your +database structure conforms to the following requirements:</p> +<ul> +<li>There must be a table, referenced below as the <em>users</em> table, + that contains one row for every valid user that this <code>Realm</code> + should recognize.</li> +<li>The <em>users</em> table must contain at least two columns (it may + contain more if your existing applications required it): + <ul> + <li>Username to be recognized by Tomcat when the user logs in.</li> + <li>Password to be recognized by Tomcat when the user logs in. + This value may in cleartext or digested - see below for more + information.</li> + </ul></li> +<li>There must be a table, referenced below as the <em>user roles</em> table, + that contains one row for every valid role that is assigned to a + particular user. It is legal for a user to have zero, one, or more than + one valid role.</li> +<li>The <em>user roles</em> table must contain at least two columns (it may + contain more if your existing applications required it): + <ul> + <li>Username to be recognized by Tomcat (same value as is specified + in the <em>users</em> table).</li> + <li>Role name of a valid role associated with this user.</li> + </ul></li> +</ul> + +<h5>Quick Start</h5> + +<p>To set up Tomcat to use JDBCRealm, you will need to follow these steps:</p> +<ol> +<li>If you have not yet done so, create tables and columns in your database + that conform to the requirements described above.</li> +<li>Configure a database username and password for use by Tomcat, that has + at least read only access to the tables described above. (Tomcat will + never attempt to write to these tables.)</li> +<li>Place a copy of the JDBC driver you will be using inside the + <code>$CATALINA_HOME/lib</code> directory. + Note that <strong>only</strong> JAR files are recognized!</li> +<li>Set up a <code><Realm></code> element, as described below, in your + <code>$CATALINA_BASE/conf/server.xml</code> file.</li> +<li>Restart Tomcat if it is already running.</li> +</ol> + +<h5>Realm Element Attributes</h5> + +<p>To configure JDBCRealm, you will create a <code><Realm></code> +element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file, +as described <a href="#Configuring_a_Realm">above</a>. The attributes for the +JDBCRealm are defined in the <a href="config/realm.html">Realm</a> configuration +documentation.</p> + +<h5>Example</h5> + +<p>An example SQL script to create the needed tables might look something +like this (adapt the syntax as required for your particular database):</p> +<div class="codeBox"><pre><code>create table users ( + user_name varchar(15) not null primary key, + user_pass varchar(15) not null +); + +create table user_roles ( + user_name varchar(15) not null, + role_name varchar(15) not null, + primary key (user_name, role_name) +);</code></pre></div> + +<p>Example <code>Realm</code> elements are included (commented out) in the +default <code>$CATALINA_BASE/conf/server.xml</code> file. Here's an example +for using a MySQL database called "authority", configured with the tables +described above, and accessed with username "dbuser" and password "dbpass":</p> +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JDBCRealm" + driverName="org.gjt.mm.mysql.Driver" + connectionURL="jdbc:mysql://localhost/authority?user=dbuser&amp;password=dbpass" + userTable="users" userNameCol="user_name" userCredCol="user_pass" + userRoleTable="user_roles" roleNameCol="role_name"/></code></pre></div> + +<h5>Additional Notes</h5> + +<p>JDBCRealm operates according to the following rules:</p> +<ul> +<li>When a user attempts to access a protected resource for the first time, + Tomcat will call the <code>authenticate()</code> method of this + <code>Realm</code>. Thus, any changes you have made to the database + directly (new users, changed passwords or roles, etc.) will be immediately + reflected.</li> +<li>Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is <strong>not</strong> saved and + restored across sessions serialisations. Any changes to the database + information for an already authenticated user will <strong>not</strong> be + reflected until the next time that user logs on again.</li> +<li>Administering the information in the <em>users</em> and <em>user roles</em> + table is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.</li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="DataSourceRealm">DataSourceRealm</h4><div class="text"> + +<h5>Introduction</h5> + +<p><strong>DataSourceRealm</strong> is an implementation of the Tomcat +<code>Realm</code> interface that looks up users in a relational database +accessed via a JNDI named JDBC DataSource. There is substantial configuration +flexibility that lets you adapt to existing table and column names, as long +as your database structure conforms to the following requirements:</p> +<ul> +<li>There must be a table, referenced below as the <em>users</em> table, + that contains one row for every valid user that this <code>Realm</code> + should recognize.</li> +<li>The <em>users</em> table must contain at least two columns (it may + contain more if your existing applications required it): + <ul> + <li>Username to be recognized by Tomcat when the user logs in.</li> + <li>Password to be recognized by Tomcat when the user logs in. + This value may in cleartext or digested - see below for more + information.</li> + </ul></li> +<li>There must be a table, referenced below as the <em>user roles</em> table, + that contains one row for every valid role that is assigned to a + particular user. It is legal for a user to have zero, one, or more than + one valid role.</li> +<li>The <em>user roles</em> table must contain at least two columns (it may + contain more if your existing applications required it): + <ul> + <li>Username to be recognized by Tomcat (same value as is specified + in the <em>users</em> table).</li> + <li>Role name of a valid role associated with this user.</li> + </ul></li> +</ul> + +<h5>Quick Start</h5> + +<p>To set up Tomcat to use DataSourceRealm, you will need to follow these steps:</p> +<ol> +<li>If you have not yet done so, create tables and columns in your database + that conform to the requirements described above.</li> +<li>Configure a database username and password for use by Tomcat, that has + at least read only access to the tables described above. (Tomcat will + never attempt to write to these tables.)</li> +<li>Configure a JNDI named JDBC DataSource for your database. Refer to the + <a href="jndi-datasource-examples-howto.html">JNDI DataSource Example + HOW-TO</a> for information on how to configure a JNDI named JDBC DataSource. + Be sure to set the <code>Realm</code>'s <code>localDataSource</code> + attribute appropriately, depending on where the JNDI DataSource is + defined.</li> +<li>Set up a <code><Realm></code> element, as described below, in your + <code>$CATALINA_BASE/conf/server.xml</code> file.</li> +<li>Restart Tomcat if it is already running.</li> +</ol> + +<h5>Realm Element Attributes</h5> + +<p>To configure DataSourceRealm, you will create a <code><Realm></code> +element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file, +as described <a href="#Configuring_a_Realm">above</a>. The attributes for the +DataSourceRealm are defined in the <a href="config/realm.html">Realm</a> +configuration documentation.</p> + +<h5>Example</h5> + +<p>An example SQL script to create the needed tables might look something +like this (adapt the syntax as required for your particular database):</p> +<div class="codeBox"><pre><code>create table users ( + user_name varchar(15) not null primary key, + user_pass varchar(15) not null +); + +create table user_roles ( + user_name varchar(15) not null, + role_name varchar(15) not null, + primary key (user_name, role_name) +);</code></pre></div> + +<p>Here is an example for using a MySQL database called "authority", configured +with the tables described above, and accessed with the JNDI JDBC DataSource with +name "java:/comp/env/jdbc/authority".</p> +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.DataSourceRealm" + dataSourceName="jdbc/authority" + userTable="users" userNameCol="user_name" userCredCol="user_pass" + userRoleTable="user_roles" roleNameCol="role_name"/></code></pre></div> + +<h5>Additional Notes</h5> + +<p>DataSourceRealm operates according to the following rules:</p> +<ul> +<li>When a user attempts to access a protected resource for the first time, + Tomcat will call the <code>authenticate()</code> method of this + <code>Realm</code>. Thus, any changes you have made to the database + directly (new users, changed passwords or roles, etc.) will be immediately + reflected.</li> +<li>Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is <strong>not</strong> saved and + restored across sessions serialisations. Any changes to the database + information for an already authenticated user will <strong>not</strong> be + reflected until the next time that user logs on again.</li> +<li>Administering the information in the <em>users</em> and <em>user roles</em> + table is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.</li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="JNDIRealm">JNDIRealm</h4><div class="text"> + +<h5>Introduction</h5> + +<p><strong>JNDIRealm</strong> is an implementation of the Tomcat +<code>Realm</code> interface that looks up users in an LDAP directory +server accessed by a JNDI provider (typically, the standard LDAP +provider that is available with the JNDI API classes). The realm +supports a variety of approaches to using a directory for +authentication.</p> + +<h6>Connecting to the directory</h6> + +<p>The realm's connection to the directory is defined by the +<strong>connectionURL</strong> configuration attribute. This is a URL +whose format is defined by the JNDI provider. It is usually an LDAP +URL that specifies the domain name of the directory server to connect +to, and optionally the port number and distinguished name (DN) of the +required root naming context.</p> + +<p>If you have more than one provider you can configure an +<strong>alternateURL</strong>. If a socket connection cannot be +made to the provider at the <strong>connectionURL</strong> an +attempt will be made to use the <strong>alternateURL</strong>.</p> + +<p>When making a connection in order to search the directory and +retrieve user and role information, the realm authenticates itself to +the directory with the username and password specified by the +<strong>connectionName</strong> and +<strong>connectionPassword</strong> properties. If these properties +are not specified the connection is anonymous. This is sufficient in +many cases. +</p> + + +<h6>Selecting the user's directory entry</h6> + +<p>Each user that can be authenticated must be represented in the +directory by an individual entry that corresponds to an element in the +initial <code>DirContext</code> defined by the +<strong>connectionURL</strong> attribute. This user entry must have an +attribute containing the username that is presented for +authentication.</p> + +<p>Often the distinguished name of the user's entry contains the +username presented for authentication but is otherwise the same for +all users. In this case the <strong>userPattern</strong> attribute may +be used to specify the DN, with "{0}" marking where +the username should be substituted.</p> + +<p>Otherwise the realm must search the directory to find a unique entry +containing the username. The following attributes configure this +search:</p> + + <ul> + <li><strong>userBase</strong> - the entry that is the base of + the subtree containing users. If not specified, the search + base is the top-level context.</li> + + <li><strong>userSubtree</strong> - the search scope. Set to + <code>true</code> if you wish to search the entire subtree + rooted at the <strong>userBase</strong> entry. The default value + of <code>false</code> requests a single-level search + including only the top level.</li> + + <li><strong>userSearch</strong> - pattern specifying the LDAP + search filter to use after substitution of the username.</li> + + </ul> + + +<h6>Authenticating the user</h6> + +<ul> +<li> +<p><b>Bind mode</b></p> + +<p>By default the realm authenticates a user by binding to +the directory with the DN of the entry for that user and the password +presented by the user. If this simple bind succeeds the user is considered to +be authenticated.</p> + +<p>For security reasons a directory may store a digest of the user's +password rather than the clear text version (see +<a href="#Digested_Passwords">Digested Passwords</a> for more information). In that case, +as part of the simple bind operation the directory automatically +computes the correct digest of the plaintext password presented by the +user before validating it against the stored value. In bind mode, +therefore, the realm is not involved in digest processing. The +<strong>digest</strong> attribute is not used, and will be ignored if +set.</p> +</li> + +<li> +<p><b>Comparison mode</b></p> +<p>Alternatively, the realm may retrieve the stored +password from the directory and compare it explicitly with the value +presented by the user. This mode is configured by setting the +<strong>userPassword</strong> attribute to the name of a directory +attribute in the user's entry that contains the password.</p> + +<p>Comparison mode has some disadvantages. First, the +<strong>connectionName</strong> and +<strong>connectionPassword</strong> attributes must be configured to +allow the realm to read users' passwords in the directory. For +security reasons this is generally undesirable; indeed many directory +implementations will not allow even the directory manager to read +these passwords. In addition, the realm must handle password digests +itself, including variations in the algorithms used and ways of +representing password hashes in the directory. However, the realm may +sometimes need access to the stored password, for example to support +HTTP Digest Access Authentication (RFC 2069). (Note that HTTP digest +authentication is different from the storage of password digests in +the repository for user information as discussed above). +</p> +</li> +</ul> + +<h6>Assigning roles to the user</h6> + +<p>The directory realm supports two approaches to the representation +of roles in the directory:</p> + +<ul> +<li> +<p><b>Roles as explicit directory entries</b></p> + +<p>Roles may be represented by explicit directory entries. A role +entry is usually an LDAP group entry with one attribute +containing the name of the role and another whose values are the +distinguished names or usernames of the users in that role. The +following attributes configure a directory search to +find the names of roles associated with the authenticated user:</p> + +<ul> +<li><strong>roleBase</strong> - the base entry for the role search. + If not specified, the search base is the top-level directory + context.</li> + +<li><strong>roleSubtree</strong> - the search + scope. Set to <code>true</code> if you wish to search the entire + subtree rooted at the <code>roleBase</code> entry. The default + value of <code>false</code> requests a single-level search + including the top level only.</li> + +<li><strong>roleSearch</strong> - the LDAP search filter for + selecting role entries. It optionally includes pattern + replacements "{0}" for the distinguished name and/or "{1}" for the + username and/or "{2}" for an attribute from user's directory entry, + of the authenticated user. Use <strong>userRoleAttribute</strong> to + specify the name of the attribute that provides the value for "{2}".</li> + +<li><strong>roleName</strong> - the attribute in a role entry + containing the name of that role.</li> + +<li><strong>roleNested</strong> - enable nested roles. Set to + <code>true</code> if you want to nest roles in roles. If configured, then + every newly found roleName and distinguished + Name will be recursively tried for a new role search. + The default value is <code>false</code>.</li> + +</ul> + +</li> +</ul> + +<ul> +<li> +<p><b>Roles as an attribute of the user entry</b></p> + +<p>Role names may also be held as the values of an attribute in the +user's directory entry. Use <strong>userRoleName</strong> to specify +the name of this attribute.</p> + +</li> +</ul> +<p>A combination of both approaches to role representation may be used.</p> + +<h5>Quick Start</h5> + +<p>To set up Tomcat to use JNDIRealm, you will need to follow these steps:</p> +<ol> +<li>Make sure your directory server is configured with a schema that matches + the requirements listed above.</li> +<li>If required, configure a username and password for use by Tomcat, that has + read only access to the information described above. (Tomcat will + never attempt to modify this information.)</li> +<li>Set up a <code><Realm></code> element, as described below, in your + <code>$CATALINA_BASE/conf/server.xml</code> file.</li> +<li>Restart Tomcat if it is already running.</li> +</ol> + +<h5>Realm Element Attributes</h5> + +<p>To configure JNDIRealm, you will create a <code><Realm></code> +element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file, +as described <a href="#Configuring_a_Realm">above</a>. The attributes for the +JNDIRealm are defined in the <a href="config/realm.html">Realm</a> configuration +documentation.</p> + +<h5>Example</h5> + +<p>Creation of the appropriate schema in your directory server is beyond the +scope of this document, because it is unique to each directory server +implementation. In the examples below, we will assume that you are using a +distribution of the OpenLDAP directory server (version 2.0.11 or later), which +can be downloaded from +<a href="http://www.openldap.org">http://www.openldap.org</a>. Assume that +your <code>slapd.conf</code> file contains the following settings +(among others):</p> +<div class="codeBox"><pre><code>database ldbm +suffix dc="mycompany",dc="com" +rootdn "cn=Manager,dc=mycompany,dc=com" +rootpw secret</code></pre></div> + +<p>We will assume for <code>connectionURL</code> that the directory +server runs on the same machine as Tomcat. See <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html"> +http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html</a> +for more information about configuring and using the JNDI LDAP +provider.</p> + +<p>Next, assume that this directory server has been populated with elements +as shown below (in LDIF format):</p> + +<div class="codeBox"><pre><code># Define top-level entry +dn: dc=mycompany,dc=com +objectClass: dcObject +dc:mycompany + +# Define an entry to contain people +# searches for users are based on this entry +dn: ou=people,dc=mycompany,dc=com +objectClass: organizationalUnit +ou: people + +# Define a user entry for Janet Jones +dn: uid=jjones,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: jjones +sn: jones +cn: janet jones +mail: j.jones@mycompany.com +userPassword: janet + +# Define a user entry for Fred Bloggs +dn: uid=fbloggs,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: fbloggs +sn: bloggs +cn: fred bloggs +mail: f.bloggs@mycompany.com +userPassword: fred + +# Define an entry to contain LDAP groups +# searches for roles are based on this entry +dn: ou=groups,dc=mycompany,dc=com +objectClass: organizationalUnit +ou: groups + +# Define an entry for the "tomcat" role +dn: cn=tomcat,ou=groups,dc=mycompany,dc=com +objectClass: groupOfUniqueNames +cn: tomcat +uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com +uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com + +# Define an entry for the "role1" role +dn: cn=role1,ou=groups,dc=mycompany,dc=com +objectClass: groupOfUniqueNames +cn: role1 +uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com</code></pre></div> + +<p>An example <code>Realm</code> element for the OpenLDAP directory +server configured as described above might look like this, assuming +that users use their uid (e.g. jjones) to login to the +application and that an anonymous connection is sufficient to search +the directory and retrieve role information:</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm" + connectionURL="ldap://localhost:389" + userPattern="uid={0},ou=people,dc=mycompany,dc=com" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/></code></pre></div> + +<p>With this configuration, the realm will determine the user's +distinguished name by substituting the username into the +<code>userPattern</code>, authenticate by binding to the directory +with this DN and the password received from the user, and search the +directory to find the user's roles.</p> + +<p>Now suppose that users are expected to enter their email address +rather than their userid when logging in. In this case the realm must +search the directory for the user's entry. (A search is also necessary +when user entries are held in multiple subtrees corresponding perhaps +to different organizational units or company locations).</p> + +<p>Further, suppose that in addition to the group entries you want to +use an attribute of the user's entry to hold roles. Now the entry for +Janet Jones might read as follows:</p> + +<div class="codeBox"><pre><code>dn: uid=jjones,ou=people,dc=mycompany,dc=com +objectClass: inetOrgPerson +uid: jjones +sn: jones +cn: janet jones +mail: j.jones@mycompany.com +memberOf: role2 +memberOf: role3 +userPassword: janet</code></pre></div> + +<p> This realm configuration would satisfy the new requirements:</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm" + connectionURL="ldap://localhost:389" + userBase="ou=people,dc=mycompany,dc=com" + userSearch="(mail={0})" + userRoleName="memberOf" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/></code></pre></div> + +<p>Now when Janet Jones logs in as "j.jones@mycompany.com", the realm +searches the directory for a unique entry with that value as its mail +attribute and attempts to bind to the directory as +<code>uid=jjones,ou=people,dc=mycompany,dc=com</code> with the given +password. If authentication succeeds, she is assigned three roles: +"role2" and "role3", the values of the "memberOf" attribute in her +directory entry, and "tomcat", the value of the "cn" attribute in the +only group entry of which she is a member.</p> + +<p>Finally, to authenticate the user by retrieving +the password from the directory and making a local comparison in the +realm, you might use a realm configuration like this:</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JNDIRealm" + connectionName="cn=Manager,dc=mycompany,dc=com" +connectionPassword="secret" + connectionURL="ldap://localhost:389" + userPassword="userPassword" + userPattern="uid={0},ou=people,dc=mycompany,dc=com" + roleBase="ou=groups,dc=mycompany,dc=com" + roleName="cn" + roleSearch="(uniqueMember={0})" +/></code></pre></div> + +<p>However, as discussed above, the default bind mode for +authentication is usually to be preferred.</p> + +<h5>Additional Notes</h5> + +<p>JNDIRealm operates according to the following rules:</p> +<ul> +<li>When a user attempts to access a protected resource for the first time, + Tomcat will call the <code>authenticate()</code> method of this + <code>Realm</code>. Thus, any changes you have made to the directory + (new users, changed passwords or roles, etc.) will be immediately + reflected.</li> +<li>Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is <strong>not</strong> saved and + restored across sessions serialisations. Any changes to the directory + information for an already authenticated user will <strong>not</strong> be + reflected until the next time that user logs on again.</li> +<li>Administering the information in the directory server + is the responsibility of your own applications. Tomcat does not + provide any built-in capabilities to maintain users and roles.</li> +</ul> + +</div></div> + + +<div class="subsection"><h4 id="UserDatabaseRealm">UserDatabaseRealm</h4><div class="text"> + +<h5>Introduction</h5> + +<p><strong>UserDatabaseRealm</strong> is an implementation of the Tomcat +<code>Realm</code> interface that uses a JNDI resource to store user +information. By default, the JNDI resource is backed by an XML file. It is not +designed for large-scale production use. At startup time, the UserDatabaseRealm +loads information about all users, and their corresponding roles, from an XML +document (by default, this document is loaded from +<code>$CATALINA_BASE/conf/tomcat-users.xml</code>). The users, their passwords +and their roles may all be editing dynamically, typically via JMX. Changes may +be saved and will be reflected in the XML file.</p> + +<h5>Realm Element Attributes</h5> + +<p>To configure UserDatabaseRealm, you will create a <code><Realm></code> +element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file, +as described <a href="#Configuring_a_Realm">above</a>. The attributes for the +UserDatabaseRealm are defined in the <a href="config/realm.html">Realm</a> +configuration documentation.</p> + +<h5>User File Format</h5> + +<p>The users file uses the same format as the +<a href="#MemoryRealm">MemoryRealm</a>.</p> + +<h5>Example</h5> + +<p>The default installation of Tomcat is configured with a UserDatabaseRealm +nested inside the <code><Engine></code> element, so that it applies +to all virtual hosts and web applications. The default contents of the +<code>conf/tomcat-users.xml</code> file is:</p> +<div class="codeBox"><pre><code><tomcat-users> + <user username="tomcat" password="tomcat" roles="tomcat" /> + <user username="role1" password="tomcat" roles="role1" /> + <user username="both" password="tomcat" roles="tomcat,role1" /> +</tomcat-users></code></pre></div> + +<h5>Additional Notes</h5> + +<p>UserDatabaseRealm operates according to the following rules:</p> +<ul> +<li>When Tomcat first starts up, it loads all defined users and their + associated information from the users file. Changes made to the data in + this file will <strong>not</strong> be recognized until Tomcat is + restarted. Changes may be made via the UserDatabase resource. Tomcat + provides MBeans that may be accessed via JMX for this purpose.</li> +<li>When a user attempts to access a protected resource for the first time, + Tomcat will call the <code>authenticate()</code> method of this + <code>Realm</code>.</li> +<li>Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is <strong>not</strong> saved and + restored across sessions serialisations.</li> +</ul> + + +</div></div> + + +<div class="subsection"><h4 id="MemoryRealm">MemoryRealm</h4><div class="text"> + +<h5>Introduction</h5> + +<p><strong>MemoryRealm</strong> is a simple demonstration implementation of the +Tomcat <code>Realm</code> interface. It is not designed for production use. +At startup time, MemoryRealm loads information about all users, and their +corresponding roles, from an XML document (by default, this document is loaded +from <code>$CATALINA_BASE/conf/tomcat-users.xml</code>). Changes to the data +in this file are not recognized until Tomcat is restarted.</p> + +<h5>Realm Element Attributes</h5> + +<p>To configure MemoryRealm, you will create a <code><Realm></code> +element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> file, +as described <a href="#Configuring_a_Realm">above</a>. The attributes for the +MemoryRealm are defined in the <a href="config/realm.html">Realm</a> +configuration documentation.</p> + +<h5>User File Format</h5> + +<p>The users file (by default, <code>conf/tomcat-users.xml</code> must be an +XML document, with a root element <code><tomcat-users></code>. Nested +inside the root element will be a <code><user></code> element for each +valid user, consisting of the following attributes:</p> +<ul> +<li><strong>name</strong> - Username this user must log on with.</li> +<li><strong>password</strong> - Password this user must log on with (in + clear text if the <code>digest</code> attribute was not set on the + <code><Realm></code> element, or digested appropriately as + described <a href="#Digested_Passwords">here</a> otherwise).</li> +<li><strong>roles</strong> - Comma-delimited list of the role names + associated with this user.</li> +</ul> + +<h5>Additional Notes</h5> + +<p>MemoryRealm operates according to the following rules:</p> +<ul> +<li>When Tomcat first starts up, it loads all defined users and their + associated information from the users file. Changes to the data in + this file will <strong>not</strong> be recognized until Tomcat is + restarted.</li> +<li>When a user attempts to access a protected resource for the first time, + Tomcat will call the <code>authenticate()</code> method of this + <code>Realm</code>.</li> +<li>Once a user has been authenticated, the user (and his or her associated + roles) are cached within Tomcat for the duration of the user's login. + (For FORM-based authentication, that means until the session times out or + is invalidated; for BASIC authentication, that means until the user + closes their browser). The cached user is <strong>not</strong> saved and + restored across sessions serialisations.</li> +<li>Administering the information in the users file is the responsibility + of your application. Tomcat does not + provide any built-in capabilities to maintain users and roles.</li> +</ul> + + +</div></div> + + +<div class="subsection"><h4 id="JAASRealm">JAASRealm</h4><div class="text"> + +<h5>Introduction</h5> + + <p><strong>JAASRealm</strong> is an implementation of the Tomcat +<code>Realm</code> interface that authenticates users through the Java +Authentication & Authorization Service (JAAS) framework which is now +provided as part of the standard Java SE API.</p> + <p>Using JAASRealm gives the developer the ability to combine +practically any conceivable security realm with Tomcat's CMA. </p> + <p>JAASRealm is prototype for Tomcat of the JAAS-based +J2EE authentication framework for J2EE v1.4, based on the <a href="http://www.jcp.org/en/jsr/detail?id=196">JCP Specification +Request 196</a> to enhance container-managed security and promote +'pluggable' authentication mechanisms whose implementations would be +container-independent. + </p> + <p>Based on the JAAS login module and principal (see <code>javax.security.auth.spi.LoginModule</code> +and <code>javax.security.Principal</code>), you can develop your own +security mechanism or wrap another third-party mechanism for +integration with the CMA as implemented by Tomcat. + </p> + + <h5>Quick Start</h5> + <p>To set up Tomcat to use JAASRealm with your own JAAS login module, + you will need to follow these steps:</p> + <ol> + <li>Write your own LoginModule, User and Role classes based +on JAAS (see +<a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html"> +the JAAS Authentication Tutorial</a> and +<a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/JAASLMDevGuide.html"> +the JAAS Login Module Developer's Guide</a>) to be managed by the JAAS Login +Context (<code>javax.security.auth.login.LoginContext</code>) +When developing your LoginModule, note that JAASRealm's built-in <code>CallbackHandler</code> +only recognizes the <code>NameCallback</code> and <code>PasswordCallback</code> at present. + </li> + <li>Although not specified in JAAS, you should create +separate classes to distinguish between users and roles, extending <code>javax.security.Principal</code>, +so that Tomcat can tell which Principals returned from your login +module are users and which are roles (see <code>org.apache.catalina.realm.JAASRealm</code>). +Regardless, the first Principal returned is <em>always</em> treated as the user Principal. + </li> + <li>Place the compiled classes on Tomcat's classpath + </li> + <li>Set up a login.config file for Java (see <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/tutorials/LoginConfigFile.html"> +JAAS LoginConfig file</a>) and tell Tomcat where to find it by specifying +its location to the JVM, for instance by setting the environment +variable: <code>JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config</code></li> + + <li>Configure your security-constraints in your web.xml for +the resources you want to protect</li> + <li>Configure the JAASRealm module in your server.xml </li> + <li>Restart Tomcat if it is already running.</li> + </ol> + <h5>Realm Element Attributes</h5> + <p>To configure JAASRealm as for step 6 above, you create +a <code><Realm></code> element and nest it in your +<code>$CATALINA_BASE/conf/server.xml</code> +file within your <code><Engine></code> node. The attributes for the +JAASRealm are defined in the <a href="config/realm.html">Realm</a> +configuration documentation.</p> + +<h5>Example</h5> + +<p>Here is an example of how your server.xml snippet should look.</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.JAASRealm" + appName="MyFooRealm" + userClassNames="org.foobar.realm.FooUser" + roleClassNames="org.foobar.realm.FooRole"/></code></pre></div> + +<p>It is the responsibility of your login module to create and save User and +Role objects representing Principals for the user +(<code>javax.security.auth.Subject</code>). If your login module doesn't +create a user object but also doesn't throw a login exception, then the +Tomcat CMA will break and you will be left at the +http://localhost:8080/myapp/j_security_check URI or at some other +unspecified location.</p> + + <p>The flexibility of the JAAS approach is two-fold: </p> + <ul> + <li>you can carry out whatever processing you require behind +the scenes in your own login module.</li> + <li>you can plug in a completely different LoginModule by changing the configuration +and restarting the server, without any code changes to your application.</li> + </ul> + + <h5>Additional Notes</h5> + <ul> + <li>When a user attempts to access a protected resource for + the first time, Tomcat will call the <code>authenticate()</code> + method of this <code>Realm</code>. Thus, any changes you have made in + the security mechanism directly (new users, changed passwords or + roles, etc.) will be immediately reflected.</li> + <li>Once a user has been authenticated, the user (and his or + her associated roles) are cached within Tomcat for the duration of + the user's login. For FORM-based authentication, that means until + the session times out or is invalidated; for BASIC authentication, + that means until the user closes their browser. Any changes to the + security information for an already authenticated user will <strong>not</strong> + be reflected until the next time that user logs on again.</li> + <li>As with other <code>Realm</code> implementations, digested passwords + are supported if the <code><Realm></code> element in <code>server.xml</code> + contains a <code>digest</code> attribute; JAASRealm's <code>CallbackHandler</code> + will digest the password prior to passing it back to the <code>LoginModule</code></li> + </ul> + +</div></div> + + +<div class="subsection"><h4 id="CombinedRealm">CombinedRealm</h4><div class="text"> + + <h5>Introduction</h5> + + <p><strong>CombinedRealm</strong> is an implementation of the Tomcat + <code>Realm</code> interface that authenticates users through one or more + sub-Realms.</p> + + <p>Using CombinedRealm gives the developer the ability to combine multiple + Realms of the same or different types. This can be used to authenticate + against different sources, provide fall back in case one Realm fails or for + any other purpose that requires multiple Realms.</p> + + <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the + <code>Realm</code> element that defines the CombinedRealm. Authentication + will be attempted against each <code>Realm</code> in the order they are + listed. Authentication against any Realm will be sufficient to authenticate + the user.</p> + + <h5>Realm Element Attributes</h5> + <p>To configure a CombinedRealm, you create a <code><Realm></code> + element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> + file within your <code><Engine></code> or <code><Host></code>. + You can also nest inside a <code><Context></code> node in a + <code>context.xml</code> file.</p> + +<h5>Example</h5> + +<p>Here is an example of how your server.xml snippet should look to use a +UserDatabase Realm and a DataSource Realm.</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.CombinedRealm" > + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase"/> + <Realm className="org.apache.catalina.realm.DataSourceRealm" + dataSourceName="jdbc/authority" + userTable="users" userNameCol="user_name" userCredCol="user_pass" + userRoleTable="user_roles" roleNameCol="role_name"/> +</Realm></code></pre></div> + +</div></div> + +<div class="subsection"><h4 id="LockOutRealm">LockOutRealm</h4><div class="text"> + + <h5>Introduction</h5> + + <p><strong>LockOutRealm</strong> is an implementation of the Tomcat + <code>Realm</code> interface that extends the CombinedRealm to provide lock + out functionality to provide a user lock out mechanism if there are too many + failed authentication attempts in a given period of time.</p> + + <p>To ensure correct operation, there is a reasonable degree of + synchronisation in this Realm.</p> + + <p>This Realm does not require modification to the underlying Realms or the + associated user storage mechanisms. It achieves this by recording all failed + logins, including those for users that do not exist. To prevent a DOS by + deliberating making requests with invalid users (and hence causing this + cache to grow) the size of the list of users that have failed authentication + is limited.</p> + + <p>Sub-realms are defined by nesting <code>Realm</code> elements inside the + <code>Realm</code> element that defines the LockOutRealm. Authentication + will be attempted against each <code>Realm</code> in the order they are + listed. Authentication against any Realm will be sufficient to authenticate + the user.</p> + + <h5>Realm Element Attributes</h5> + <p>To configure a LockOutRealm, you create a <code><Realm></code> + element and nest it in your <code>$CATALINA_BASE/conf/server.xml</code> + file within your <code><Engine></code> or <code><Host></code>. + You can also nest inside a <code><Context></code> node in a + <code>context.xml</code> file. The attributes for the + LockOutRealm are defined in the <a href="config/realm.html">Realm</a> + configuration documentation.</p> + +<h5>Example</h5> + +<p>Here is an example of how your server.xml snippet should look to add lock out +functionality to a UserDatabase Realm.</p> + +<div class="codeBox"><pre><code><Realm className="org.apache.catalina.realm.LockOutRealm" > + <Realm className="org.apache.catalina.realm.UserDatabaseRealm" + resourceName="UserDatabase"/> +</Realm></code></pre></div> + +</div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/rewrite.html b/src/tomcat/webapps/docs/rewrite.html new file mode 100644 index 0000000000000000000000000000000000000000..af033fdb9725f9d5d697e0fa2ec66d8602598f01 --- /dev/null +++ b/src/tomcat/webapps/docs/rewrite.html @@ -0,0 +1,717 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - The rewrite Valve</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/rewrite"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>The rewrite Valve</h2><h3 id="Introduction">Introduction</h3><div class="text"> + + <p>The rewrite valve implements URL rewrite functionality in a way that is + very similar to mod_rewrite from Apache HTTP Server.</p> + +</div><h3 id="Configuration">Configuration</h3><div class="text"> + + <p>The rewrite valve is configured as a valve using the <code>org.apache.catalina.valves.rewrite.RewriteValve</code> + class name.</p> + + <p>The rewrite valve can be configured as a valve added in a Host. + See <a href="config/host.html">virtual-server</a> documentation for + informations how to configure it. It will use a <code>rewrite.config</code> file + containing the rewrite directives, it must be placed in the Host configuration + folder. + </p> + + <p>It can also be in the context.xml of a webapp. + The valve will then use a <code>rewrite.config</code> file containing the + rewrite directives, it must be placed in the WEB-INF folder of the web application + </p> + +</div><h3 id="Directives">Directives</h3><div class="text"> + + <p>The rewrite.config file contains a list of directives which closely + resemble the directives used by mod_rewrite, in particular the central + RewriteRule and RewriteCond directives. Lines that start with a + <code>#</code> character are treated as comments and will be ignored.</p> + + <p>Note: This section is a modified version of the mod_rewrite documentation, + which is Copyright 1995-2006 The Apache Software Foundation, and licensed under the + under the Apache License, Version 2.0.</p> + + <div class="subsection"><h4 id="RewriteCond">RewriteCond</h4><div class="text"> + + <p>Syntax: <code>RewriteCond TestString CondPattern</code></p> + + <p>The RewriteCond directive defines a rule condition. One or more RewriteCond + can precede a RewriteRule directive. The following rule is then only used if both + the current state of the URI matches its pattern, and if these conditions are met.</p> + + <p><em>TestString</em> is a string which can contain the + following expanded constructs in addition to plain text:</p> + + <ul> + <li> + <strong>RewriteRule backreferences</strong>: These are + backreferences of the form <strong><code>$N</code></strong> + (0 <= N <= 9), which provide access to the grouped + parts (in parentheses) of the pattern, from the + <code>RewriteRule</code> which is subject to the current + set of <code>RewriteCond</code> conditions.. + </li> + <li> + <strong>RewriteCond backreferences</strong>: These are + backreferences of the form <strong><code>%N</code></strong> + (1 <= N <= 9), which provide access to the grouped + parts (again, in parentheses) of the pattern, from the last matched + <code>RewriteCond</code> in the current set + of conditions. + </li> + <li> + <strong>RewriteMap expansions</strong>: These are + expansions of the form <strong><code>${mapname:key|default}</code></strong>. + See <a href="#mapfunc">the documentation for + RewriteMap</a> for more details. + </li> + <li> + <strong>Server-Variables</strong>: These are variables of + the form + <strong><code>%{</code> <em>NAME_OF_VARIABLE</em> + <code>}</code></strong> + where <em>NAME_OF_VARIABLE</em> can be a string taken + from the following list: + + <ul> + <li> + <p><b>HTTP headers:</b></p> + <p> + HTTP_USER_AGENT<br> + HTTP_REFERER<br> + HTTP_COOKIE<br> + HTTP_FORWARDED<br> + HTTP_HOST<br> + HTTP_PROXY_CONNECTION<br> + HTTP_ACCEPT<br> + </p> + </li> + <li> + <p><b>connection & request:</b></p> + <p> + REMOTE_ADDR<br> + REMOTE_HOST<br> + REMOTE_PORT<br> + REMOTE_USER<br> + REMOTE_IDENT<br> + REQUEST_METHOD<br> + SCRIPT_FILENAME<br> + REQUEST_PATH<br> + CONTEXT_PATH<br> + SERVLET_PATH<br> + PATH_INFO<br> + QUERY_STRING<br> + AUTH_TYPE<br> + </p> + </li> + <li> + <p><b>server internals:</b></p> + <p> + DOCUMENT_ROOT<br> + SERVER_NAME<br> + SERVER_ADDR<br> + SERVER_PORT<br> + SERVER_PROTOCOL<br> + SERVER_SOFTWARE<br> + </p> + </li> + <li> + <p><b>date and time:</b></p> + <p> + TIME_YEAR<br> + TIME_MON<br> + TIME_DAY<br> + TIME_HOUR<br> + TIME_MIN<br> + TIME_SEC<br> + TIME_WDAY<br> + TIME<br> + </p> + </li> + <li> + <p><b>specials:</b></p> + <p> + THE_REQUEST<br> + REQUEST_URI<br> + REQUEST_FILENAME<br> + HTTPS<br> + </p> + </li> + </ul> + + <p>These variables all + correspond to the similarly named HTTP + MIME-headers and Servlet API methods. + Most are documented elsewhere in the Manual or in + the CGI specification. Those that are special to + the rewrite valve include those below.</p> + + <dl> + + <dt><code>REQUEST_PATH</code></dt> + + <dd>Corresponds to the full path that is used for mapping.</dd> + + <dt><code>CONTEXT_PATH</code></dt> + + <dd>Corresponds to the path of the mapped context.</dd> + + <dt><code>SERVLET_PATH</code></dt> + + <dd>Corresponds to the servlet path.</dd> + + <dt><code>THE_REQUEST</code></dt> + + <dd>The full HTTP request line sent by the + browser to the server (e.g., "<code>GET + /index.html HTTP/1.1</code>"). This does not + include any additional headers sent by the + browser.</dd> + + <dt><code>REQUEST_URI</code></dt> + + <dd>The resource requested in the HTTP request + line. (In the example above, this would be + "/index.html".)</dd> + + <dt><code>REQUEST_FILENAME</code></dt> + + <dd>The full local file system path to the file or + script matching the request.</dd> + + <dt><code>HTTPS</code></dt> + + <dd>Will contain the text "on" if the connection is + using SSL/TLS, or "off" otherwise.</dd> + + </dl> + + </li> + </ul> + + <p>Other things you should be aware of:</p> + + <ol> + <li>The variables SCRIPT_FILENAME and REQUEST_FILENAME + contain the same value - the value of the + <code>filename</code> field of the internal + <code>request_rec</code> structure of the Apache server. + The first name is the commonly known CGI variable name + while the second is the appropriate counterpart of + REQUEST_URI (which contains the value of the + <code>uri</code> field of <code>request_rec</code>).</li> + + <li> + <code>%{ENV:variable}</code>, where <em>variable</em> can be + any Java system property, is also available.</li> + + <li> + <code>%{SSL:variable}</code>, where <em>variable</em> is the + name of an SSL environment + variable, are not implemented yet. Example: + <code>%{SSL:SSL_CIPHER_USEKEYSIZE}</code> may expand to + <code>128</code>.</li> + + <li> + <code>%{HTTP:header}</code>, where <em>header</em> can be + any HTTP MIME-header name, can always be used to obtain the + value of a header sent in the HTTP request. + Example: <code>%{HTTP:Proxy-Connection}</code> is + the value of the HTTP header + ``<code>Proxy-Connection:</code>''.</li> + + </ol> + + <p><em>CondPattern</em> is the condition pattern, + a regular expression which is applied to the + current instance of the <em>TestString</em>. + <em>TestString</em> is first evaluated, before being matched against + <em>CondPattern</em>.</p> + + <p><strong>Remember:</strong> <em>CondPattern</em> is a + <em>perl compatible regular expression</em> with some + additions:</p> + + <ol> + <li>You can prefix the pattern string with a + '<code>!</code>' character (exclamation mark) to specify a + <strong>non</strong>-matching pattern.</li> + + <li> + There are some special variants of <em>CondPatterns</em>. + Instead of real regular expression strings you can also + use one of the following: + + <ul> + <li>'<strong><CondPattern</strong>' (lexicographically + precedes)<br> + Treats the <em>CondPattern</em> as a plain string and + compares it lexicographically to <em>TestString</em>. True if + <em>TestString</em> lexicographically precedes + <em>CondPattern</em>.</li> + + <li>'<strong>>CondPattern</strong>' (lexicographically + follows)<br> + Treats the <em>CondPattern</em> as a plain string and + compares it lexicographically to <em>TestString</em>. True if + <em>TestString</em> lexicographically follows + <em>CondPattern</em>.</li> + + <li>'<strong>=CondPattern</strong>' (lexicographically + equal)<br> + Treats the <em>CondPattern</em> as a plain string and + compares it lexicographically to <em>TestString</em>. True if + <em>TestString</em> is lexicographically equal to + <em>CondPattern</em> (the two strings are exactly + equal, character for character). If <em>CondPattern</em> + is <code>""</code> (two quotation marks) this + compares <em>TestString</em> to the empty string.</li> + + <li>'<strong>-d</strong>' (is + <strong>d</strong>irectory)<br> + Treats the <em>TestString</em> as a pathname and tests + whether or not it exists, and is a directory.</li> + + <li>'<strong>-f</strong>' (is regular + <strong>f</strong>ile)<br> + Treats the <em>TestString</em> as a pathname and tests + whether or not it exists, and is a regular file.</li> + + <li>'<strong>-s</strong>' (is regular file, with + <strong>s</strong>ize)<br> + Treats the <em>TestString</em> as a pathname and tests + whether or not it exists, and is a regular file with size greater + than zero.</li> + + </ul> + +<strong>Note:</strong> + All of these tests can + also be prefixed by an exclamation mark ('!') to + negate their meaning. + + </li> + + <li>You can also set special flags for + <em>CondPattern</em> by appending + <strong><code>[</code><em>flags</em><code>]</code></strong> + as the third argument to the <code>RewriteCond</code> + directive, where <em>flags</em> is a comma-separated list of any of the + following flags: + + <ul> + <li>'<strong><code>nocase|NC</code></strong>' + (<strong>n</strong>o <strong>c</strong>ase)<br> + This makes the test case-insensitive - differences + between 'A-Z' and 'a-z' are ignored, both in the + expanded <em>TestString</em> and the <em>CondPattern</em>. + This flag is effective only for comparisons between + <em>TestString</em> and <em>CondPattern</em>. It has no + effect on file system and subrequest checks.</li> + + <li> + '<strong><code>ornext|OR</code></strong>' + (<strong>or</strong> next condition)<br> + Use this to combine rule conditions with a local OR + instead of the implicit AND. Typical example: + +<div class="codeBox"><pre><code>RewriteCond %{REMOTE_HOST} ^host1.* [OR] +RewriteCond %{REMOTE_HOST} ^host2.* [OR] +RewriteCond %{REMOTE_HOST} ^host3.* +RewriteRule ...some special stuff for any of these hosts...</code></pre></div> + + Without this flag you would have to write the condition/rule + pair three times. + </li> + </ul> + </li> + </ol> + + <p><strong>Example:</strong></p> + + <p>To rewrite the Homepage of a site according to the + ``<code>User-Agent:</code>'' header of the request, you can + use the following: </p> + +<div class="codeBox"><pre><code>RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* +RewriteRule ^/$ /homepage.max.html [L] + +RewriteCond %{HTTP_USER_AGENT} ^Lynx.* +RewriteRule ^/$ /homepage.min.html [L] + +RewriteRule ^/$ /homepage.std.html [L]</code></pre></div> + + <p>Explanation: If you use a browser which identifies itself + as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you + get the max homepage (which could include frames, or other special + features). + If you use the Lynx browser (which is terminal-based), then + you get the min homepage (which could be a version designed for + easy, text-only browsing). + If neither of these conditions apply (you use any other browser, + or your browser identifies itself as something non-standard), you get + the std (standard) homepage.</p> + + </div></div> + + <div class="subsection"><h4 id="RewriteMap">RewriteMap</h4><div class="text"> + + <p>Syntax: <code>RewriteMap name rewriteMapClassName optionalParameters</code></p> + + <p>The maps are implemented using an interface that users must implement. Its class + name is <code>org.apache.catalina.valves.rewrite.RewriteMap</code>, and its code is:</p> + +<div class="codeBox"><pre><code>package org.apache.catalina.valves.rewrite; + +public interface RewriteMap { + public String setParameters(String params); + public String lookup(String key); +}</code></pre></div> + + </div></div> + + <div class="subsection"><h4 id="RewriteRule">RewriteRule</h4><div class="text"> + + <p>Syntax: <code>RewriteRule Pattern Substitution</code></p> + + <p>The RewriteRule directive is the real + rewriting workhorse. The directive can occur more than once, + with each instance defining a single rewrite rule. The + order in which these rules are defined is important - this is the order + in which they will be applied at run-time.</p> + + <p>Pattern is a perl compatible regular + expression, which is applied to the current URL. + ``Current'' means the value of the URL when this rule is + applied. This may not be the originally requested URL, + which may already have matched a previous rule, and have been + altered.</p> + + <p>Some hints on the syntax of regular + expressions:</p> + + +<pre> +<strong>Text:</strong> + <strong><code>.</code></strong> Any single character + <strong><code>[</code></strong>chars<strong><code>]</code></strong> Character class: Any character of the class ``chars'' + <strong><code>[^</code></strong>chars<strong><code>]</code></strong> Character class: Not a character of the class ``chars'' + text1<strong><code>|</code></strong>text2 Alternative: text1 or text2 + +<strong>Quantifiers:</strong> + <strong><code>?</code></strong> 0 or 1 occurrences of the preceding text + <strong><code>*</code></strong> 0 or N occurrences of the preceding text (N > 0) + <strong><code>+</code></strong> 1 or N occurrences of the preceding text (N > 1) + +<strong>Grouping:</strong> + <strong><code>(</code></strong>text<strong><code>)</code></strong> Grouping of text + (used either to set the borders of an alternative as above, or + to make backreferences, where the <strong>N</strong>th group can + be referred to on the RHS of a RewriteRule as <code>$</code><strong>N</strong>) + +<strong>Anchors:</strong> + <strong><code>^</code></strong> Start-of-line anchor + <strong><code>$</code></strong> End-of-line anchor + +<strong>Escaping:</strong> + <strong><code>\</code></strong>char escape the given char + (for instance, to specify the chars "<code>.[]()</code>" <em>etc.</em>) +</pre> + + <p>For more information about regular expressions, have a look at the + perl regular expression manpage ("<a href="http://www.perldoc.com/perl5.6.1/pod/perlre.html">perldoc + perlre</a>"). If you are interested in more detailed + information about regular expressions and their variants + (POSIX regex etc.) the following book is dedicated to this topic:</p> + + <p class="indent"> + <em>Mastering Regular Expressions, 2nd Edition</em><br> + Jeffrey E.F. Friedl<br> + O'Reilly & Associates, Inc. 2002<br> + ISBN 978-0-596-00289-3<br> + </p> + + <p>In the rules, the NOT character + ('<code>!</code>') is also available as a possible pattern + prefix. This enables you to negate a pattern; to say, for instance: + ``<em>if the current URL does <strong>NOT</strong> match this + pattern</em>''. This can be used for exceptional cases, where + it is easier to match the negative pattern, or as a last + default rule.</p> + +<p> +Note: When using the NOT character to negate a pattern, you cannot include +grouped wildcard parts in that pattern. This is because, when the +pattern does NOT match (i.e., the negation matches), there are no +contents for the groups. Thus, if negated patterns are used, you +cannot use <code>$N</code> in the substitution string! +</p> + + <p>The <em id="rhs">substitution</em> of a + rewrite rule is the string which is substituted for (or + replaces) the original URL which <em>Pattern</em> + matched. In addition to plain text, it can include</p> + + <ol> + <li>back-references (<code>$N</code>) to the RewriteRule + pattern</li> + + <li>back-references (<code>%N</code>) to the last matched + RewriteCond pattern</li> + + <li>server-variables as in rule condition test-strings + (<code>%{VARNAME}</code>)</li> + + <li><a href="#mapfunc">mapping-function</a> calls + (<code>${mapname:key|default}</code>)</li> + </ol> + <p>Back-references are identifiers of the form + <code>$</code><strong>N</strong> + (<strong>N</strong>=0..9), which will be replaced + by the contents of the <strong>N</strong>th group of the + matched <em>Pattern</em>. The server-variables are the same + as for the <em>TestString</em> of a <code>RewriteCond</code> + directive. The mapping-functions come from the + <code>RewriteMap</code> directive and are explained there. + These three types of variables are expanded in the order above.</p> + + <p>As already mentioned, all rewrite rules are + applied to the <em>Substitution</em> (in the order in which + they are defined + in the config file). The URL is <strong>completely + replaced</strong> by the <em>Substitution</em> and the + rewriting process continues until all rules have been applied, + or it is explicitly terminated by a + <code><strong>L</strong></code> flag.</p> + + <p>The special characters <code>$</code> and <code>%</code> can + be quoted by prepending them with a backslash character + <code>\</code>.</p> + + <p>There is a special substitution string named + '<code>-</code>' which means: <strong>NO + substitution</strong>! This is useful in providing + rewriting rules which <strong>only</strong> match + URLs but do not substitute anything for them. It is commonly used + in conjunction with the <strong>C</strong> (chain) flag, in order + to apply more than one pattern before substitution occurs.</p> + + <p>Unlike newer mod_rewrite versions, the Tomcat rewrite valve does + not automatically support absolute URLs (the specific redirect flag + must be used to be able to specify an absolute URLs, see below) + or direct file serving.</p> + + <p>Additionally you can set special <span id="rewriteflags">flags</span> for <em>Substitution</em> by + appending <strong><code>[</code><em>flags</em><code>]</code></strong> + as the third argument to the <code>RewriteRule</code> + directive. <em>Flags</em> is a comma-separated list of any of the + following flags: </p> + + <ul> + <li>'<strong><code>chain|C</code></strong>' + (<strong>c</strong>hained with next rule)<br> + This flag chains the current rule with the next rule + (which itself can be chained with the following rule, + and so on). This has the following effect: if a rule + matches, then processing continues as usual - + the flag has no effect. If the rule does + <strong>not</strong> match, then all following chained + rules are skipped. For instance, it can be used to remove the + ``<code>.www</code>'' part, inside a per-directory rule set, + when you let an external redirect happen (where the + ``<code>.www</code>'' part should not occur!).</li> + + <li> + '<strong><code>cookie|CO=</code></strong><em>NAME</em>:<em>VAL</em>:<em>domain</em>[:<em>lifetime</em>[:<em>path</em>]]' + (set <strong>co</strong>okie)<br> + This sets a cookie in the client's browser. The cookie's name + is specified by <em>NAME</em> and the value is + <em>VAL</em>. The <em>domain</em> field is the domain of the + cookie, such as '.apache.org', the optional <em>lifetime</em> + is the lifetime of the cookie in minutes, and the optional + <em>path</em> is the path of the cookie</li> + + <li> + '<strong><code>env|E=</code></strong><em>VAR</em>:<em>VAL</em>' + (set <strong>e</strong>nvironment variable)<br> + This forces a request attribute named <em>VAR</em> to + be set to the value <em>VAL</em>, where <em>VAL</em> can + contain regexp backreferences (<code>$N</code> and + <code>%N</code>) which will be expanded. You can use this + flag more than once, to set more than one variable.</li> + + <li>'<strong><code>forbidden|F</code></strong>' (force URL + to be <strong>f</strong>orbidden)<br> + This forces the current URL to be forbidden - it immediately + sends back a HTTP response of 403 (FORBIDDEN). + Use this flag in conjunction with + appropriate RewriteConds to conditionally block some + URLs.</li> + + <li>'<strong><code>gone|G</code></strong>' (force URL to be + <strong>g</strong>one)<br> + This forces the current URL to be gone - it + immediately sends back a HTTP response of 410 (GONE). Use + this flag to mark pages which no longer exist as gone.</li> + + <li> + '<strong><code>host|H</code></strong>=<em>Host</em>' + (apply rewriting to <strong>h</strong>ost)<br> + Rather that rewrite the URL, the virtual host will be + rewritten.</li> + + <li>'<strong><code>last|L</code></strong>' + (<strong>l</strong>ast rule)<br> + Stop the rewriting process here and don't apply any more + rewrite rules. This corresponds to the Perl + <code>last</code> command or the <code>break</code> command + in C. Use this flag to prevent the currently + rewritten URL from being rewritten further by following + rules. For example, use it to rewrite the root-path URL + ('<code>/</code>') to a real one, <em>e.g.</em>, + '<code>/e/www/</code>'.</li> + + <li>'<strong><code>next|N</code></strong>' + (<strong>n</strong>ext round)<br> + Re-run the rewriting process (starting again with the + first rewriting rule). This time, the URL to match is no longer + the original URL, but rather the URL returned by the last rewriting rule. + This corresponds to the Perl <code>next</code> command or + the <code>continue</code> command in C. Use + this flag to restart the rewriting process - + to immediately go to the top of the loop.<br> + <strong>Be careful not to create an infinite + loop!</strong></li> + + <li>'<strong><code>nocase|NC</code></strong>' + (<strong>n</strong>o <strong>c</strong>ase)<br> + This makes the <em>Pattern</em> case-insensitive, + ignoring difference between 'A-Z' and + 'a-z' when <em>Pattern</em> is matched against the current + URL.</li> + + <li> + '<strong><code>noescape|NE</code></strong>' + (<strong>n</strong>o URI <strong>e</strong>scaping of + output)<br> + This flag prevents the rewrite valve from applying the usual URI + escaping rules to the result of a rewrite. Ordinarily, + special characters (such as '%', '$', ';', and so on) + will be escaped into their hexcode equivalents ('%25', + '%24', and '%3B', respectively); this flag prevents this + from happening. This allows percent symbols to appear in + the output, as in + <div class="codeBox"><pre><code>RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]</code></pre></div> + which would turn '<code>/foo/zed</code>' into a safe + request for '<code>/bar?arg=P1=zed</code>'. + </li> + + + + <li>'<strong><code>qsappend|QSA</code></strong>' + (<strong>q</strong>uery <strong>s</strong>tring + <strong>a</strong>ppend)<br> + This flag forces the rewrite engine to append a query + string part of the substitution string to the existing string, + instead of replacing it. Use this when you want to add more + data to the query string via a rewrite rule.</li> + + <li>'<strong><code>redirect|R</code> + [=<em>code</em>]</strong>' (force <span id="redirect"> + <strong>r</strong>edirect</span>)<br> + Prefix <em>Substitution</em> with + <code>http://thishost[:thisport]/</code> (which makes the + new URL a URI) to force a external redirection. If no + <em>code</em> is given, a HTTP response of 302 (FOUND, previously MOVED + TEMPORARILY) will be returned. If you want to use other response + codes in the range 300-399, simply specify the appropriate number + or use one of the following symbolic names: + <code>temp</code> (default), <code>permanent</code>, + <code>seeother</code>. Use this for rules to + canonicalize the URL and return it to the client - to + translate ``<code>/~</code>'' into + ``<code>/u/</code>'', or to always append a slash to + <code>/u/</code><em>user</em>, etc.<br> + <strong>Note:</strong> When you use this flag, make + sure that the substitution field is a valid URL! Otherwise, + you will be redirecting to an invalid location. Remember + that this flag on its own will only prepend + <code>http://thishost[:thisport]/</code> to the URL, and rewriting + will continue. Usually, you will want to stop rewriting at this point, + and redirect immediately. To stop rewriting, you should add + the 'L' flag. + </li> + + <li>'<strong><code>skip|S</code></strong>=<em>num</em>' + (<strong>s</strong>kip next rule(s))<br> + This flag forces the rewriting engine to skip the next + <em>num</em> rules in sequence, if the current rule + matches. Use this to make pseudo if-then-else constructs: + The last rule of the then-clause becomes + <code>skip=N</code>, where N is the number of rules in the + else-clause. (This is <strong>not</strong> the same as the + 'chain|C' flag!)</li> + + <li> + '<strong><code>type|T</code></strong>=<em>MIME-type</em>' + (force MIME <strong>t</strong>ype)<br> + Force the MIME-type of the target file to be + <em>MIME-type</em>. This can be used to + set up the content-type based on some conditions. + For example, the following snippet allows <code>.php</code> files to + be <em>displayed</em> by <code>mod_php</code> if they are called with + the <code>.phps</code> extension: + <div class="codeBox"><pre><code>RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]</code></pre></div> + </li> + </ul> + + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/security-howto.html b/src/tomcat/webapps/docs/security-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..a353353c004966f575b6725829260b8a933628b4 --- /dev/null +++ b/src/tomcat/webapps/docs/security-howto.html @@ -0,0 +1,523 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Security Considerations</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/security-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Security Considerations</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Non-Tomcat_settings">Non-Tomcat settings</a><ol><li><a href="#JMX">JMX</a></li></ol></li><li><a href="#Default_web_applications">Default web applications</a><ol><li><a href="#Default_web_applications/General">General</a></li><li><a href="#ROOT">ROOT</a></li><li><a href="#Documentation">Documentation</a></li><li><a href="#Examples">Examples</a></li><li><a href="#Default_web_applications/Manager">Manager</a></li><li><a href="#Host_Manager">Host Manager</a></li><li><a href="#Securing_Management_Applications">Securing Management Applications</a></li></ol></li><li><a href="#Security_manager">Security manager</a></li><li><a href="#server.xml">server.xml</a><ol><li><a href="#server.xml/General">General</a></li><li><a href="#Server">Server</a></li><li><a href="#Listeners">Listeners</a></li><li><a href="#Connectors">Connectors</a></li><li><a href="#Host">Host</a></li><li><a href="#Context">Context</a></li><li><a href="#Valves">Valves</a></li><li><a href="#Realms">Realms</a></li><li><a href="#server.xml/Manager">Manager</a></li><li><a href="#Cluster">Cluster</a></li></ol></li><li><a href="#System_Properties">System Properties</a></li><li><a href="#web.xml">web.xml</a></li><li><a href="#General">General</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p>Tomcat is configured to be reasonably secure for most use cases by + default. Some environments may require more, or less, secure configurations. + This page is to provide a single point of reference for configuration + options that may impact security and to offer some commentary on the + expected impact of changing those options. The intention is to provide a + list of configuration options that should be considered when assessing the + security of a Tomcat installation.</p> + + <p><strong>Note</strong>: Reading this page is not a substitute for reading + and understanding the detailed configuration documentation. Fuller + descriptions of these attributes may be found in the relevant documentation + pages.</p> + </div><h3 id="Non-Tomcat_settings">Non-Tomcat settings</h3><div class="text"> + <p>Tomcat configuration should not be the only line of defense. The other + components in the system (operating system, network, database, etc.) should + also be secured.</p> + <p>Tomcat should not be run under the root user. Create a dedicated user for + the Tomcat process and provide that user with the minimum necessary + permissions for the operating system. For example, it should not be possible + to log on remotely using the Tomcat user.</p> + <p>File permissions should also be suitably restricted. In the + <code>.tar.gz</code> distribution, files and directories are not world + readable and the group does not have write access. On Unix like operating + systems, Tomcat runs with a default umask of <code>0027</code> to maintain + these permissions for files created while Tomcat is running (e.g. log files, + expanded WARs, etc.).</p> + <p>Taking the Tomcat instances at the ASF as an example (where + auto-deployment is disabled and web applications are deployed as exploded + directories), the standard configuration is to have all Tomcat files owned + by root with group Tomcat and whilst owner has read/write privileges, group + only has read and world has no permissions. The exceptions are the logs, + temp and work directory that are owned by the Tomcat user rather than root. + This means that even if an attacker compromises the Tomcat process, they + can't change the Tomcat configuration, deploy new web applications or + modify existing web applications. The Tomcat process runs with a umask of + 007 to maintain these permissions.</p> + <p>At the network level, consider using a firewall to limit both incoming + and outgoing connections to only those connections you expect to be + present.</p> + + <div class="subsection"><h4 id="JMX">JMX</h4><div class="text"> + <p>The security of the JMX connection is dependent on the implementation + provided by the JRE and therefore falls outside the control of Tomcat.</p> + + <p>Typically, access control is very limited (either read-only to + everything or read-write to everything). Tomcat exposes a large amount + of internal information and control via JMX to aid debugging, monitoring + and management. Given the limited access control available, JMX access + should be treated as equivalent to local root/admin access and restricted + accordingly.</p> + + <p>The JMX access control provided by most (all?) JRE vendors does not + log failed authentication attempts, nor does it provide an account + lock-out feature after repeated failed authentications. This makes a + brute force attack easy to mount and difficult to detect.</p> + + <p>Given all of the above, care should be taken to ensure that, if used, + the JMX interface is appropriately secured. Options you may wish to + consider to secure the JMX interface include:</p> + + <ul> + <li>configuring a strong password for all JMX users;</li> + <li>binding the JMX listener only to an internal network;</li> + <li>limiting network access to the JMX port to trusted clients; and</li> + <li>providing an application specific health page for use by external + monitoring systems.</li> + </ul> + </div></div> + + </div><h3 id="Default_web_applications">Default web applications</h3><div class="text"> + + <div class="subsection"><h4 id="Default_web_applications/General">General</h4><div class="text"> + <p>Tomcat ships with a number of web applications that are enabled by + default. Vulnerabilities have been discovered in these applications in the + past. Applications that are not required should be removed so the system + will not be at risk if another vulnerability is discovered.</p> + </div></div> + + <div class="subsection"><h4 id="ROOT">ROOT</h4><div class="text"> + <p>The ROOT web application presents a very low security risk but it does + include the version of Tomcat that is being used. The ROOT web application + should normally be removed from a publicly accessible Tomcat instance, not + for security reasons, but so that a more appropriate default page is shown + to users.</p> + </div></div> + + <div class="subsection"><h4 id="Documentation">Documentation</h4><div class="text"> + <p>The documentation web application presents a very low security risk but + it does identify the version of Tomcat that is being used. It should + normally be removed from a publicly accessible Tomcat instance.</p> + </div></div> + + <div class="subsection"><h4 id="Examples">Examples</h4><div class="text"> + <p>The examples web application should always be removed from any security + sensitive installation. While the examples web application does not + contain any known vulnerabilities, it is known to contain features + (particularly the cookie examples that display the contents of all + received and allow new cookies to be set) that may be used by an attacker + in conjunction with a vulnerability in another application deployed on the + Tomcat instance to obtain additional information that would otherwise be + unavailable.</p> + </div></div> + + <div class="subsection"><h4 id="Default_web_applications/Manager">Manager</h4><div class="text"> + <p>The Manager application allows the remote deployment of web + applications and is frequently targeted by attackers due to the widespread + use of weak passwords and publicly accessible Tomcat instances with the + Manager application enabled. The Manager application is not accessible by + default as no users are configured with the necessary access. If the + Manager application is enabled then guidance in the section + <strong>Securing Management Applications</strong> section should be + followed.</p> + </div></div> + + <div class="subsection"><h4 id="Host_Manager">Host Manager</h4><div class="text"> + <p>The Host Manager application allows the creation and management of + virtual hosts - including the enabling of the Manager application for a + virtual host. The Host Manager application is not accessible by default + as no users are configured with the necessary access. If the Host Manager + application is enabled then guidance in the section <strong>Securing + Management Applications</strong> section should be followed.</p> + </div></div> + + <div class="subsection"><h4 id="Securing_Management_Applications">Securing Management Applications</h4><div class="text"> + <p>When deploying a web application that provides management functions for + the Tomcat instance, the following guidelines should be followed:</p> + <ul> + <li>Ensure that any users permitted to access the management application + have strong passwords.</li> + <li>Do not remove the use of the <a href="config/realm.html#LockOut_Realm_-_org.apache.catalina.realm.LockOutRealm">LockOutRealm</a> + which prevents brute force attacks against user passwords.</li> + <li>Configure the <a href="config/valve.html#Remote_Address_Valve">RemoteAddrValve</a> + in the <a href="config/context.html">context.xml</a> file for the + management application which limits access to localhost by default. + If remote access is required, limit it to specific IP addresses using + this valve.</li> + </ul> + </div></div> + </div><h3 id="Security_manager">Security manager</h3><div class="text"> + <p>Enabling the security manager causes web applications to be run in a + sandbox, significantly limiting a web application's ability to perform + malicious actions such as calling System.exit(), establishing network + connections or accessing the file system outside of the web application's + root and temporary directories. However, it should be noted that there are + some malicious actions, such as triggering high CPU consumption via an + infinite loop, that the security manager cannot prevent.</p> + + <p>Enabling the security manager is usually done to limit the potential + impact, should an attacker find a way to compromise a trusted web + application . A security manager may also be used to reduce the risks of + running untrusted web applications (e.g. in hosting environments) but it + should be noted that the security manager only reduces the risks of + running untrusted web applications, it does not eliminate them. If running + multiple untrusted web applications, it is recommended that each web + application is deployed to a separate Tomcat instance (and ideally separate + hosts) to reduce the ability of a malicious web application impacting the + availability of other applications.</p> + + <p>Tomcat is tested with the security manager enabled; but the majority of + Tomcat users do not run with a security manager, so Tomcat is not as well + user-tested in this configuration. There have been, and continue to be, + bugs reported that are triggered by running under a security manager.</p> + + <p>The restrictions imposed by a security manager are likely to break most + applications if the security manager is enabled. The security manager should + not be used without extensive testing. Ideally, the use of a security + manager should be introduced at the start of the development cycle as it can + be time-consuming to track down and fix issues caused by enabling a security + manager for a mature application.</p> + + <p>Enabling the security manager changes the defaults for the following + settings:</p> + <ul> + <li>The default value for the <strong>deployXML</strong> attribute of the + <strong>Host</strong> element is changed to <code>false</code>.</li> + </ul> + </div><h3 id="server.xml">server.xml</h3><div class="text"> + <div class="subsection"><h4 id="server.xml/General">General</h4><div class="text"> + <p>The default server.xml contains a large number of comments, including + some example component definitions that are commented out. Removing these + comments makes it considerably easier to read and comprehend + server.xml.</p> + <p>If a component type is not listed, then there are no settings for that + type that directly impact security.</p> + </div></div> + + <div class="subsection"><h4 id="Server">Server</h4><div class="text"> + <p>Setting the <strong>port</strong> attribute to <code>-1</code> disables + the shutdown port.</p> + <p>If the shutdown port is not disabled, a strong password should be + configured for <strong>shutdown</strong>.</p> + </div></div> + + <div class="subsection"><h4 id="Listeners">Listeners</h4><div class="text"> + <p>The APR Lifecycle Listener is not stable if compiled on Solaris using + gcc. If using the APR/native connector on Solaris, compile it with the + Sun Studio compiler.</p> + + <p>The Security Listener should be enabled and configured as appropriate. + </p> + </div></div> + + <div class="subsection"><h4 id="Connectors">Connectors</h4><div class="text"> + <p>By default, an HTTP and an AJP connector are configured. Connectors + that will not be used should be removed from server.xml.</p> + + <p>The <strong>address</strong> attribute may be used to control which IP + address the connector listens on for connections. By default, the + connector listens on all configured IP addresses.</p> + + <p>The <strong>allowTrace</strong> attribute may be used to enable TRACE + requests which can be useful for debugging. Due to the way some browsers + handle the response from a TRACE request (which exposes the browser to an + XSS attack), support for TRACE requests is disabled by default.</p> + + <p>The <strong>maxPostSize</strong> attribute controls the maximum size + of a POST request that will be parsed for parameters. The parameters are + cached for the duration of the request so this is limited to 2MB by + default to reduce exposure to a DOS attack.</p> + + <p>The <strong>maxSavePostSize</strong> attribute controls the saving of + POST requests during FORM and CLIENT-CERT authentication. The parameters + are cached for the duration of the authentication (which may be many + minutes) so this is limited to 4KB by default to reduce exposure to a DOS + attack.</p> + + <p>The <strong>maxParameterCount</strong> attribute controls the + maximum number of parameter and value pairs (GET plus POST) that can + be parsed and stored in the request. Excessive parameters are ignored. + If you want to reject such requests, configure a + <a href="config/filter.html">FailedRequestFilter</a>.</p> + + <p>The <strong>xpoweredBy</strong> attribute controls whether or not the + X-Powered-By HTTP header is sent with each request. If sent, the value of + the header contains the Servlet and JSP specification versions, the full + Tomcat version (e.g. Apache Tomcat/9.0), the name of + the JVM vendor and + the version of the JVM. This header is disabled by default. This header + can provide useful information to both legitimate clients and attackers. + </p> + + <p>The <strong>server</strong> attribute controls the value of the Server + HTTP header. The default value of this header for Tomcat 4.1.x to + 9.0.x is Apache-Coyote/1.1. This header can provide + limited information to both legitimate clients and attackers.</p> + + <p>The <strong>SSLEnabled</strong>, <strong>scheme</strong> and + <strong>secure</strong> attributes may all be independently set. These are + normally used when Tomcat is located behind a reverse proxy and the proxy + is connecting to Tomcat via HTTP or HTTPS. They allow Tomcat to see the + SSL attributes of the connections between the client and the proxy rather + than the proxy and Tomcat. For example, the client may connect to the + proxy over HTTPS but the proxy connects to Tomcat using HTTP. If it is + necessary for Tomcat to be able to distinguish between secure and + non-secure connections received by a proxy, the proxy must use separate + connectors to pass secure and non-secure requests to Tomcat. If the + proxy uses AJP then the SSL attributes of the client connection are + passed via the AJP protocol and separate connectors are not needed.</p> + + <p>The <strong>tomcatAuthentication</strong> and + <strong>tomcatAuthorization</strong> attributes are used with the + AJP connectors to determine if Tomcat should handle all authentication and + authorisation or if authentication should be delegated to the reverse + proxy (the authenticated user name is passed to Tomcat as part of the AJP + protocol) with the option for Tomcat to still perform authorization.</p> + + <p>The <strong>requiredSecret</strong> attribute in AJP connectors + configures shared secret between Tomcat and reverse proxy in front of + Tomcat. It is used to prevent unauthorized connections over AJP protocol.</p> + </div></div> + + <div class="subsection"><h4 id="Host">Host</h4><div class="text"> + <p>The host element controls deployment. Automatic deployment allows for + simpler management but also makes it easier for an attacker to deploy a + malicious application. Automatic deployment is controlled by the + <strong>autoDeploy</strong> and <strong>deployOnStartup</strong> + attributes. If both are <code>false</code>, only Contexts defined in + server.xml will be deployed and any changes will require a Tomcat restart. + </p> + + <p>In a hosted environment where web applications may not be trusted, set + the <strong>deployXML</strong> attribute to <code>false</code> to ignore + any context.xml packaged with the web application that may try to assign + increased privileges to the web application. Note that if the security + manager is enabled that the <strong>deployXML</strong> attribute will + default to <code>false</code>.</p> + </div></div> + + <div class="subsection"><h4 id="Context">Context</h4><div class="text"> + <p>This applies to <a href="config/context.html">Context</a> + elements in all places where they can be defined: + <code>server.xml</code> file, + default <code>context.xml</code> file, + per-host <code>context.xml.default</code> file, + web application context file in per-host configuration directory + or inside the web application.</p> + + <p>The <strong>crossContext</strong> attribute controls if a context is + allowed to access the resources of another context. It is + <code>false</code> by default and should only be changed for trusted web + applications.</p> + + <p>The <strong>privileged</strong> attribute controls if a context is + allowed to use container provided servlets like the Manager servlet. It is + <code>false</code> by default and should only be changed for trusted web + applications.</p> + + <p>The <strong>allowLinking</strong> attribute of a nested + <a href="config/resources.html">Resources</a> element controls if a context + is allowed to use linked files. If enabled and the context is undeployed, + the links will be followed when deleting the context resources. Changing + this setting from the default of <code>false</code> on case insensitive + operating systems (this includes Windows) will disable a number of + security measures and allow, among other things, direct access to the + WEB-INF directory.</p> + + <p>The <strong>sessionCookiePathUsesTrailingSlash</strong> can be used to + work around a bug in a number of browsers (Internet Explorer, Safari and + Edge) to prevent session cookies being exposed across applications when + applications share a common path prefix. However, enabling this option + can create problems for applications with Servlets mapped to + <code>/*</code>. It should also be noted the RFC6265 section 8.5 makes it + clear that different paths should not be considered sufficient to isolate + cookies from other applications.</p> + </div></div> + + <div class="subsection"><h4 id="Valves">Valves</h4><div class="text"> + <p>It is strongly recommended that an AccessLogValve is configured. The + default Tomcat configuration includes an AccessLogValve. These are + normally configured per host but may also be configured per engine or per + context as required.</p> + + <p>Any administrative application should be protected by a + RemoteAddrValve. (Note that this Valve is also available as a Filter.) + The <strong>allow</strong> attribute should be used to limit access to a + set of known trusted hosts.</p> + + <p>The default ErrorReportValve includes the Tomcat version number in the + response sent to clients. To avoid this, custom error handling can be + configured within each web application. Alternatively, you can explicitly + configure an <a href="config/valve.html">ErrorReportValve</a> and set its + <strong>showServerInfo</strong> attribute to <code>false</code>. + Alternatively, the version number can be changed by creating the file + CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties with + content as follows:</p> + <div class="codeBox"><pre><code>server.info=Apache Tomcat/9.0.x</code></pre></div> + <p>Modify the values as required. Note that this will also change the version + number reported in some of the management tools and may make it harder to + determine the real version installed. The CATALINA_HOME/bin/version.bat|sh + script will still report the version number.</p> + + <p>The default ErrorReportValve can display stack traces and/or JSP + source code to clients when an error occurs. To avoid this, custom error + handling can be configured within each web application. Alternatively, you + can explicitly configure an <a href="config/valve.html">ErrorReportValve</a> + and set its <strong>showReport</strong> attribute to <code>false</code>.</p> + </div></div> + + <div class="subsection"><h4 id="Realms">Realms</h4><div class="text"> + <p>The MemoryRealm is not intended for production use as any changes to + tomcat-users.xml require a restart of Tomcat to take effect.</p> + + <p>The JDBCRealm is not recommended for production use as it is single + threaded for all authentication and authorization options. Use the + DataSourceRealm instead.</p> + + <p>The UserDatabaseRealm is not intended for large-scale installations. It + is intended for small-scale, relatively static environments.</p> + + <p>The JAASRealm is not widely used and therefore the code is not as + mature as the other realms. Additional testing is recommended before using + this realm.</p> + + <p>By default, the realms do not implement any form of account lock-out. + This means that brute force attacks can be successful. To prevent a brute + force attack, the chosen realm should be wrapped in a LockOutRealm.</p> + </div></div> + + <div class="subsection"><h4 id="server.xml/Manager">Manager</h4><div class="text"> + <p>The manager component is used to generate session IDs.</p> + + <p>The class used to generate random session IDs may be changed with + the <strong>randomClass</strong> attribute.</p> + + <p>The length of the session ID may be changed with the + <strong>sessionIdLength</strong> attribute.</p> + </div></div> + + <div class="subsection"><h4 id="Cluster">Cluster</h4><div class="text"> + <p>The cluster implementation is written on the basis that a secure, + trusted network is used for all of the cluster related network traffic. It + is not safe to run a cluster on a insecure, untrusted network.</p> + </div></div> + </div><h3 id="System_Properties">System Properties</h3><div class="text"> + <p>Setting <strong>org.apache.catalina.connector.RECYCLE_FACADES</strong> + system property to <code>true</code> will cause a new facade object to be + created for each request. This reduces the chances of a bug in an + application exposing data from one request to another.</p> + + <p>The <strong> + org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH</strong> and + <strong>org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH</strong> + system properties allow non-standard parsing of the request URI. Using + these options when behind a reverse proxy may enable an attacker to bypass + any security constraints enforced by the proxy.</p> + + <p>The <strong> + org.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER + </strong> system property has security implications if disabled. Many user + agents, in breach of RFC2616, try to guess the character encoding of text + media types when the specification-mandated default of ISO-8859-1 should be + used. Some browsers will interpret as UTF-7 a response containing characters + that are safe for ISO-8859-1 but trigger an XSS vulnerability if interpreted + as UTF-7.</p> + </div><h3 id="web.xml">web.xml</h3><div class="text"> + <p>This applies to the default <code>conf/web.xml</code> file, the + <code>/WEB-INF/tomcat-web.xml</code> and the <code>/WEB-INF/web.xml</code> + files in web applications if they define the components mentioned here.</p> + + <p>The <a href="default-servlet.html">DefaultServlet</a> is configured + with <strong>readonly</strong> set to + <code>true</code>. Changing this to <code>false</code> allows clients to + delete or modify static resources on the server and to upload new + resources. This should not normally be changed without requiring + authentication.</p> + + <p>The DefaultServlet is configured with <strong>listings</strong> set to + <code>false</code>. This isn't because allowing directory listings is + considered unsafe but because generating listings of directories with + thousands of files can consume significant CPU leading to a DOS attack. + </p> + + <p>The DefaultServlet is configured with <strong>showServerInfo</strong> + set to <code>true</code>. When the directory listings is enabled the Tomcat + version number is included in the response sent to clients. To avoid this, + you can explicitly configure a DefaultServlet and set its + <strong>showServerInfo</strong> attribute to false. + Alternatively, the version number can be changed by creating the file + CATALINA_BASE/lib/org/apache/catalina/util/ServerInfo.properties with + content as follows:</p> + <div class="codeBox"><pre><code>server.info=Apache Tomcat/9.0.x</code></pre></div> + <p>Modify the values as required. Note that this will also change the version + number reported in some of the management tools and may make it harder to + determine the real version installed. The CATALINA_HOME/bin/version.bat|sh + script will still report the version number. + </p> + + <p>The CGI Servlet is disabled by default. If enabled, the debug + initialisation parameter should not be set to <code>10</code> or higher on a + production system because the debug page is not secure.</p> + + <p><a href="config/filter.html">FailedRequestFilter</a> + can be configured and used to reject requests that had errors during + request parameter parsing. Without the filter the default behaviour is + to ignore invalid or excessive parameters.</p> + + <p><a href="config/filter.html">HttpHeaderSecurityFilter</a> can be + used to add headers to responses to improve security. If clients access + Tomcat directly, then you probably want to enable this filter and all the + headers it sets unless your application is already setting them. If Tomcat + is accessed via a reverse proxy, then the configuration of this filter needs + to be co-ordinated with any headers that the reverse proxy sets.</p> + </div><h3 id="General">General</h3><div class="text"> + <p>BASIC and FORM authentication pass user names and passwords in clear + text. Web applications using these authentication mechanisms with clients + connecting over untrusted networks should use SSL.</p> + + <p>The session cookie for a session with an authenticated user are nearly + as useful as the user's password to an attacker and in nearly all + circumstances should be afforded the same level of protection as the + password itself. This usually means authenticating over SSL and continuing + to use SSL until the session ends.</p> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/security-manager-howto.html b/src/tomcat/webapps/docs/security-manager-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..b0df93a940876f37ce5549d6193e7d38e271c775 --- /dev/null +++ b/src/tomcat/webapps/docs/security-manager-howto.html @@ -0,0 +1,519 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Security Manager HOW-TO</title><meta name="author" content="Glenn Nielsen"><meta name="author" content="Jean-Francois Arcand"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/security-manager-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Security Manager HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Background">Background</a></li><li><a href="#Permissions">Permissions</a><ol><li><a href="#Standard_Permissions">Standard Permissions</a></li></ol></li><li><a href="#Configuring_Tomcat_With_A_SecurityManager">Configuring Tomcat With A SecurityManager</a><ol><li><a href="#Permissions_for_packed_WAR_files">Permissions for packed WAR files</a></li></ol></li><li><a href="#Configuring_Package_Protection_in_Tomcat">Configuring Package Protection in Tomcat</a></li><li><a href="#Troubleshooting">Troubleshooting</a></li></ul> +</div><h3 id="Background">Background</h3><div class="text"> + + <p>The Java <strong>SecurityManager</strong> is what allows a web browser + to run an applet in its own sandbox to prevent untrusted code from + accessing files on the local file system, connecting to a host other + than the one the applet was loaded from, and so on. In the same way + the SecurityManager protects you from an untrusted applet running in + your browser, use of a SecurityManager while running Tomcat can protect + your server from trojan servlets, JSPs, JSP beans, and tag libraries. + Or even inadvertent mistakes.</p> + + <p>Imagine if someone who is authorized to publish JSPs on your site + inadvertently included the following in their JSP:</p> +<div class="codeBox"><pre><code><% System.exit(1); %></code></pre></div> + + <p>Every time this JSP was executed by Tomcat, Tomcat would exit. + Using the Java SecurityManager is just one more line of defense a + system administrator can use to keep the server secure and reliable.</p> + + <p><strong>WARNING</strong> - A security audit + have been conducted using the Tomcat codebase. Most of the critical + package have been protected and a new security package protection mechanism + has been implemented. Still, make sure that you are satisfied with your SecurityManager + configuration before allowing untrusted users to publish web applications, + JSPs, servlets, beans, or tag libraries. <strong>However, running with a + SecurityManager is definitely better than running without one.</strong></p> + +</div><h3 id="Permissions">Permissions</h3><div class="text"> + + <p>Permission classes are used to define what Permissions a class loaded + by Tomcat will have. There are a number of Permission classes that are + a standard part of the JDK, and you can create your own Permission class + for use in your own web applications. Both techniques are used in + Tomcat.</p> + + + <div class="subsection"><h4 id="Standard_Permissions">Standard Permissions</h4><div class="text"> + + <p>This is just a short summary of the standard system SecurityManager + Permission classes applicable to Tomcat. See + <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/"> + http://docs.oracle.com/javase/7/docs/technotes/guides/security/</a> + for more information.</p> + + <ul> + <li><strong>java.util.PropertyPermission</strong> - Controls read/write + access to JVM properties such as <code>java.home</code>.</li> + <li><strong>java.lang.RuntimePermission</strong> - Controls use of + some System/Runtime functions like <code>exit()</code> and + <code>exec()</code>. Also control the package access/definition.</li> + <li><strong>java.io.FilePermission</strong> - Controls read/write/execute + access to files and directories.</li> + <li><strong>java.net.SocketPermission</strong> - Controls use of + network sockets.</li> + <li><strong>java.net.NetPermission</strong> - Controls use of + multicast network connections.</li> + <li><strong>java.lang.reflect.ReflectPermission</strong> - Controls + use of reflection to do class introspection.</li> + <li><strong>java.security.SecurityPermission</strong> - Controls access + to Security methods.</li> + <li><strong>java.security.AllPermission</strong> - Allows access to all + permissions, just as if you were running Tomcat without a + SecurityManager.</li> + </ul> + + </div></div> + +</div><h3 id="Configuring_Tomcat_With_A_SecurityManager">Configuring Tomcat With A SecurityManager</h3><div class="text"> + + <h3>Policy File Format</h3> + + <p>The security policies implemented by the Java SecurityManager are + configured in the <code>$CATALINA_BASE/conf/catalina.policy</code> file. + This file completely replaces the <code>java.policy</code> file present + in your JDK system directories. The <code>catalina.policy</code> file + can be edited by hand, or you can use the + <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/PolicyGuide.html">policytool</a> + application that comes with Java 1.2 or later.</p> + + <p>Entries in the <code>catalina.policy</code> file use the standard + <code>java.policy</code> file format, as follows:</p> +<div class="codeBox"><pre><code>// Example policy file entry + +grant [signedBy <signer>,] [codeBase <code source>] { + permission <class> [<name> [, <action list>]]; +};</code></pre></div> + + <p>The <strong>signedBy</strong> and <strong>codeBase</strong> entries are + optional when granting permissions. Comment lines begin with "//" and + end at the end of the current line. The <code>codeBase</code> is in the + form of a URL, and for a file URL can use the <code>${java.home}</code> + and <code>${catalina.home}</code> properties (which are expanded out to + the directory paths defined for them by the <code>JAVA_HOME</code>, + <code>CATALINA_HOME</code> and <code>CATALINA_BASE</code> environment + variables).</p> + + <h3>The Default Policy File</h3> + + <p>The default <code>$CATALINA_BASE/conf/catalina.policy</code> file + looks like this:</p> + + +<div class="codeBox"><pre><code>// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// ============================================================================ +// catalina.policy - Security Policy Permissions for Tomcat +// +// This file contains a default set of security policies to be enforced (by the +// JVM) when Catalina is executed with the "-security" option. In addition +// to the permissions granted here, the following additional permissions are +// granted to each web application: +// +// * Read access to the web application's document root directory +// * Read, write and delete access to the web application's working directory +// ============================================================================ + + +// ========== SYSTEM CODE PERMISSIONS ========================================= + + +// These permissions apply to javac +grant codeBase "file:${java.home}/lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions +grant codeBase "file:${java.home}/jre/lib/ext/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/../lib/-" { + permission java.security.AllPermission; +}; + +// These permissions apply to all shared system extensions when +// ${java.home} points at $JAVA_HOME/jre +grant codeBase "file:${java.home}/lib/ext/-" { + permission java.security.AllPermission; +}; + + +// ========== CATALINA CODE PERMISSIONS ======================================= + + +// These permissions apply to the daemon code +grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the logging API +// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home}, +// update this section accordingly. +// grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..} +grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" { + permission java.io.FilePermission + "${java.home}${file.separator}lib${file.separator}logging.properties", "read"; + + permission java.io.FilePermission + "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read"; + permission java.io.FilePermission + "${catalina.base}${file.separator}logs", "read, write"; + permission java.io.FilePermission + "${catalina.base}${file.separator}logs${file.separator}*", "read, write, delete"; + + permission java.lang.RuntimePermission "shutdownHooks"; + permission java.lang.RuntimePermission "getClassLoader"; + permission java.lang.RuntimePermission "setContextClassLoader"; + + permission java.lang.management.ManagementPermission "monitor"; + + permission java.util.logging.LoggingPermission "control"; + + permission java.util.PropertyPermission "java.util.logging.config.class", "read"; + permission java.util.PropertyPermission "java.util.logging.config.file", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncLoggerPollInterval", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncMaxRecordCount", "read"; + permission java.util.PropertyPermission "org.apache.juli.AsyncOverflowDropType", "read"; + permission java.util.PropertyPermission "org.apache.juli.ClassLoaderLogManager.debug", "read"; + permission java.util.PropertyPermission "catalina.base", "read"; + + // Note: To enable per context logging configuration, permit read access to + // the appropriate file. Be sure that the logging configuration is + // secure before enabling such access. + // E.g. for the examples web application (uncomment and unwrap + // the following to be on a single line): + // permission java.io.FilePermission "${catalina.base}${file.separator} + // webapps${file.separator}examples${file.separator}WEB-INF + // ${file.separator}classes${file.separator}logging.properties", "read"; +}; + +// These permissions apply to the server startup code +grant codeBase "file:${catalina.home}/bin/bootstrap.jar" { + permission java.security.AllPermission; +}; + +// These permissions apply to the servlet API classes +// and those that are shared across all class loaders +// located in the "lib" directory +grant codeBase "file:${catalina.home}/lib/-" { + permission java.security.AllPermission; +}; + + +// If using a per instance lib directory, i.e. ${catalina.base}/lib, +// then the following permission will need to be uncommented +// grant codeBase "file:${catalina.base}/lib/-" { +// permission java.security.AllPermission; +// }; + + +// ========== WEB APPLICATION PERMISSIONS ===================================== + + +// These permissions are granted by default to all web applications +// In addition, a web application will be given a read FilePermission +// for all files and directories in its document root. +grant { + // Required for JNDI lookup of named JDBC DataSource's and + // javamail named MimePart DataSource used to send mail + permission java.util.PropertyPermission "java.home", "read"; + permission java.util.PropertyPermission "java.naming.*", "read"; + permission java.util.PropertyPermission "javax.sql.*", "read"; + + // OS Specific properties to allow read access + permission java.util.PropertyPermission "os.name", "read"; + permission java.util.PropertyPermission "os.version", "read"; + permission java.util.PropertyPermission "os.arch", "read"; + permission java.util.PropertyPermission "file.separator", "read"; + permission java.util.PropertyPermission "path.separator", "read"; + permission java.util.PropertyPermission "line.separator", "read"; + + // JVM properties to allow read access + permission java.util.PropertyPermission "java.version", "read"; + permission java.util.PropertyPermission "java.vendor", "read"; + permission java.util.PropertyPermission "java.vendor.url", "read"; + permission java.util.PropertyPermission "java.class.version", "read"; + permission java.util.PropertyPermission "java.specification.version", "read"; + permission java.util.PropertyPermission "java.specification.vendor", "read"; + permission java.util.PropertyPermission "java.specification.name", "read"; + + permission java.util.PropertyPermission "java.vm.specification.version", "read"; + permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; + permission java.util.PropertyPermission "java.vm.specification.name", "read"; + permission java.util.PropertyPermission "java.vm.version", "read"; + permission java.util.PropertyPermission "java.vm.vendor", "read"; + permission java.util.PropertyPermission "java.vm.name", "read"; + + // Required for OpenJMX + permission java.lang.RuntimePermission "getAttribute"; + + // Allow read of JAXP compliant XML parser debug + permission java.util.PropertyPermission "jaxp.debug", "read"; + + // All JSPs need to be able to read this package + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat"; + + // Precompiled JSPs need access to these packages. + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime"; + permission java.lang.RuntimePermission + "accessClassInPackage.org.apache.jasper.runtime.*"; + + // Precompiled JSPs need access to these system properties. + permission java.util.PropertyPermission + "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read"; + permission java.util.PropertyPermission + "org.apache.el.parser.COERCE_TO_ZERO", "read"; + + // The cookie code needs these. + permission java.util.PropertyPermission + "org.apache.catalina.STRICT_SERVLET_COMPLIANCE", "read"; + permission java.util.PropertyPermission + "org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING", "read"; + permission java.util.PropertyPermission + "org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR", "read"; + + // Applications using WebSocket need to be able to access these packages + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server"; +}; + + +// The Manager application needs access to the following packages to support the +// session display functionality. It also requires the custom Tomcat +// DeployXmlPermission to enable the use of META-INF/context.xml +// These settings support the following configurations: +// - default CATALINA_HOME == CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME +grant codeBase "file:${catalina.base}/webapps/manager/-" { + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util"; + permission org.apache.catalina.security.DeployXmlPermission "manager"; +}; +grant codeBase "file:${catalina.home}/webapps/manager/-" { + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util"; + permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util"; + permission org.apache.catalina.security.DeployXmlPermission "manager"; +}; + +// The Host Manager application needs the custom Tomcat DeployXmlPermission to +// enable the use of META-INF/context.xml +// These settings support the following configurations: +// - default CATALINA_HOME == CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, per instance Host Manager in CATALINA_BASE +// - CATALINA_HOME != CATALINA_BASE, shared Host Manager in CATALINA_HOME +grant codeBase "file:${catalina.base}/webapps/host-manager/-" { + permission org.apache.catalina.security.DeployXmlPermission "host-manager"; +}; +grant codeBase "file:${catalina.home}/webapps/host-manager/-" { + permission org.apache.catalina.security.DeployXmlPermission "host-manager"; +}; + + +// You can assign additional permissions to particular web applications by +// adding additional "grant" entries here, based on the code base for that +// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files. +// +// Different permissions can be granted to JSP pages, classes loaded from +// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/ +// directory, or even to individual jar files in the /WEB-INF/lib/ directory. +// +// For instance, assume that the standard "examples" application +// included a JDBC driver that needed to establish a network connection to the +// corresponding database and used the scrape taglib to get the weather from +// the NOAA web server. You might create a "grant" entries like this: +// +// The permissions granted to the context root directory apply to JSP pages. +// grant codeBase "file:${catalina.base}/webapps/examples/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; +// +// The permissions granted to the context WEB-INF/classes directory +// grant codeBase "file:${catalina.base}/webapps/examples/WEB-INF/classes/-" { +// }; +// +// The permission granted to your JDBC driver +// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-" { +// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; +// }; +// The permission granted to the scrape taglib +// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-" { +// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; +// }; + +// To grant permissions for web applications using packed WAR files, use the +// Tomcat specific WAR url scheme. +// +// The permissions granted to the entire web application +// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" { +// }; +// +// The permissions granted to a specific JAR +// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" { +// };</code></pre></div> + + <h3>Starting Tomcat With A SecurityManager</h3> + + <p>Once you have configured the <code>catalina.policy</code> file for use + with a SecurityManager, Tomcat can be started with a SecurityManager in + place by using the "-security" option:</p> +<div class="codeBox"><pre><code>$CATALINA_HOME/bin/catalina.sh start -security (Unix) +%CATALINA_HOME%\bin\catalina start -security (Windows)</code></pre></div> + + <div class="subsection"><h4 id="Permissions_for_packed_WAR_files">Permissions for packed WAR files</h4><div class="text"> + + <p>When using packed WAR files, it is necessary to use Tomcat's custom war + URL protocol to assign permissions to web application code.</p> + + <p>To assign permissions to the entire web application the entry in the + policy file would look like this:</p> + +<div class="codeBox"><pre><code>// Example policy file entry +grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" { + ... +}; +</code></pre></div> + + <p>To assign permissions to a single JAR within the web application the + entry in the policy file would look like this:</p> + +<div class="codeBox"><pre><code>// Example policy file entry +grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" { + ... +}; +</code></pre></div> + + </div></div> + +</div><h3 id="Configuring_Package_Protection_in_Tomcat">Configuring Package Protection in Tomcat</h3><div class="text"> + <p>Starting with Tomcat 5, it is now possible to configure which Tomcat + internal package are protected against package definition and access. See + <a href="http://www.oracle.com/technetwork/java/seccodeguide-139067.html"> + http://www.oracle.com/technetwork/java/seccodeguide-139067.html</a> + for more information.</p> + + + <p><strong>WARNING</strong>: Be aware that removing the default package protection + could possibly open a security hole</p> + + <h3>The Default Properties File</h3> + + <p>The default <code>$CATALINA_BASE/conf/catalina.properties</code> file + looks like this:</p> +<div class="codeBox"><pre><code># +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageAccess unless the +# corresponding RuntimePermission ("accessClassInPackage."+package) has +# been granted. +package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat., +org.apache.jasper. +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when +# passed to checkPackageDefinition unless the +# corresponding RuntimePermission ("defineClassInPackage."+package) has +# been granted. +# +# by default, no packages are restricted for definition, and none of +# the class loaders supplied with the JDK call checkPackageDefinition. +# +package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote., +org.apache.tomcat.,org.apache.jasper.</code></pre></div> + <p>Once you have configured the <code>catalina.properties</code> file for use + with a SecurityManager, remember to re-start Tomcat.</p> +</div><h3 id="Troubleshooting">Troubleshooting</h3><div class="text"> + + <p>If your web application attempts to execute an operation that is + prohibited by lack of a required Permission, it will throw an + <code>AccessControLException</code> or a <code>SecurityException</code> + when the SecurityManager detects the violation. Debugging the permission + that is missing can be challenging, and one option is to turn on debug + output of all security decisions that are made during execution. This + is done by setting a system property before starting Tomcat. The easiest + way to do this is via the <code>CATALINA_OPTS</code> environment variable. + Execute this command:</p> +<div class="codeBox"><pre><code>export CATALINA_OPTS=-Djava.security.debug=all (Unix) +set CATALINA_OPTS=-Djava.security.debug=all (Windows)</code></pre></div> + + <p>before starting Tomcat.</p> + + <p><strong>WARNING</strong> - This will generate <em>many megabytes</em> + of output! However, it can help you track down problems by searching + for the word "FAILED" and determining which permission was being checked + for. See the Java security documentation for more options that you can + specify here as well.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/servletapi/index.html b/src/tomcat/webapps/docs/servletapi/index.html new file mode 100644 index 0000000000000000000000000000000000000000..ae91f58a226b534a82c0cb4cacfa30c8ad2779fe --- /dev/null +++ b/src/tomcat/webapps/docs/servletapi/index.html @@ -0,0 +1,34 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8" /> + <title>API docs</title> +</head> + +<body> + +The Servlet Javadoc is not installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +<a href="http://tomcat.apache.org/tomcat-9.0-doc/"> +documentation bundle</a>. + +</body> +</html> diff --git a/src/tomcat/webapps/docs/setup.html b/src/tomcat/webapps/docs/setup.html new file mode 100644 index 0000000000000000000000000000000000000000..b67fb6b22a6f239ce8290a5d20782aef93dcc763 --- /dev/null +++ b/src/tomcat/webapps/docs/setup.html @@ -0,0 +1,201 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Tomcat Setup</title><meta name="author" content="Remy Maucherat"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/setup"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Tomcat Setup</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Windows">Windows</a></li><li><a href="#Unix_daemon">Unix daemon</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + <p> + There are several ways to set up Tomcat for running on different + platforms. The main documentation for this is a file called + <a href="RUNNING.txt">RUNNING.txt</a>. We encourage you to refer to that + file if the information below does not answer some of your questions. + </p> + </div><h3 id="Windows">Windows</h3><div class="text"> + + <p> + Installing Tomcat on Windows can be done easily using the Windows + installer. Its interface and functionality is similar to other wizard + based installers, with only a few items of interest. + </p> + + + <ul> + <li><strong>Installation as a service</strong>: Tomcat will be + installed as a Windows service no matter what setting is selected. + Using the checkbox on the component page sets the service as "auto" + startup, so that Tomcat is automatically started when Windows + starts. For optimal security, the service should be run as a + separate user, with reduced permissions (see the Windows Services + administration tool and its documentation).</li> + <li><strong>Java location</strong>: The installer will provide a default + JRE to use to run the service. The installer uses the registry to + determine the base path of a Java 7 or later JRE, including the JRE + installed as part of the full JDK. When running on a 64-bit + operating system, the installer will first look for a 64-bit JRE and + only look for a 32-bit JRE if a 64-bit JRE is not found. It is not + mandatory to use the default JRE detected by the installer. Any + installed Java 7 or later JRE (32-bit or 64-bit) may be used.</li> + <li><strong>Tray icon</strong>: When Tomcat is run as a service, there + will not be any tray icon present when Tomcat is running. Note that + when choosing to run Tomcat at the end of installation, the tray + icon will be used even if Tomcat was installed as a service.</li> + <li><strong>Defaults</strong>: The defaults used by the installer may be + overridden by use of the <code>/C=<config file></code> command + line argument. The configuration file uses the format + <code>name=value</code> with each pair on a separate line. The names + of the available configuration options are: + <ul> + <li>JavaHome</li> + <li>TomcatPortShutdown</li> + <li>TomcatPortHttp</li> + <li>TomcatPortAjp</li> + <li>TomcatMenuEntriesEnable</li> + <li>TomcatShortcutAllUsers</li> + <li>TomcatServiceDefaultName</li> + <li>TomcatServiceName</li> + <li>TomcatServiceFileName</li> + <li>TomcatServiceManagerFileName</li> + <li>TomcatAdminEnable</li> + <li>TomcatAdminUsername</li> + <li>TomcatAdminPassword</li> + <li>TomcatAdminRoles</li> + </ul> + By using <code>/C=...</code> along with <code>/S</code> and + <code>/D=</code> it is possible to perform fully configured + unattended installs of Apache Tomact. + </li> + <li>Refer to the + <a href="windows-service-howto.html">Windows Service HOW-TO</a> + for information on how to manage Tomcat as a Windows service. + </li> + </ul> + + + <p>The installer will create shortcuts allowing starting and configuring + Tomcat. It is important to note that the Tomcat administration web + application can only be used when Tomcat is running.</p> + + </div><h3 id="Unix_daemon">Unix daemon</h3><div class="text"> + + <p>Tomcat can be run as a daemon using the jsvc tool from the + commons-daemon project. Source tarballs for jsvc are included with the + Tomcat binaries, and need to be compiled. Building jsvc requires + a C ANSI compiler (such as GCC), GNU Autoconf, and a JDK.</p> + + <p>Before running the script, the <code>JAVA_HOME</code> environment + variable should be set to the base path of the JDK. Alternately, when + calling the <code>./configure</code> script, the path of the JDK may + be specified using the <code>--with-java</code> parameter, such as + <code>./configure --with-java=/usr/java</code>.</p> + + <p>Using the following commands should result in a compiled jsvc binary, + located in the <code>$CATALINA_HOME/bin</code> folder. This assumes + that GNU TAR is used, and that <code>CATALINA_HOME</code> is an + environment variable pointing to the base path of the Tomcat + installation.</p> + + <p>Please note that you should use the GNU make (gmake) instead of + the native BSD make on FreeBSD systems.</p> + +<div class="codeBox"><pre><code>cd $CATALINA_HOME/bin +tar xvfz commons-daemon-native.tar.gz +cd commons-daemon-1.1.x-native-src/unix +./configure +make +cp jsvc ../.. +cd ../..</code></pre></div> + + <p>Tomcat can then be run as a daemon using the following commands.</p> + +<div class="codeBox"><pre><code>CATALINA_BASE=$CATALINA_HOME +cd $CATALINA_HOME +./bin/jsvc \ + -classpath $CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar \ + -outfile $CATALINA_BASE/logs/catalina.out \ + -errfile $CATALINA_BASE/logs/catalina.err \ + -Dcatalina.home=$CATALINA_HOME \ + -Dcatalina.base=$CATALINA_BASE \ + -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \ + -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \ + org.apache.catalina.startup.Bootstrap</code></pre></div> + + <p>When runnong on Java 9 you will need to additionally specify the + following when starting jsvc to avoid warnings on shutdown.</p> +<div class="codeBox"><pre><code>... +--add-opens=java.base/java.lang=ALL-UNNAMED \ +--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED \ +... +</code></pre></div> + + <p>You may also need to specify <code>-jvm server</code> if the JVM defaults + to using a server VM rather than a client VM. This has been observed on + OSX.</p> + + <p>jsvc has other useful parameters, such as <code>-user</code> which + causes it to switch to another user after the daemon initialization is + complete. This allows, for example, running Tomcat as a non privileged + user while still being able to use privileged ports. Note that if you + use this option and start Tomcat as root, you'll need to disable the + <code>org.apache.catalina.security.SecurityListener</code> check that + prevents Tomcat starting when running as root.</p> + + <p><code>jsvc --help</code> will return the full jsvc usage + information. In particular, the <code>-debug</code> option is useful + to debug issues running jsvc.</p> + + <p>The file <code>$CATALINA_HOME/bin/daemon.sh</code> can be used as a + template for starting Tomcat automatically at boot time from + <code>/etc/init.d</code> with jsvc.</p> + + <p>Note that the Commons-Daemon JAR file must be on your runtime classpath + to run Tomcat in this manner. The Commons-Daemon JAR file is in the + Class-Path entry of the bootstrap.jar manifest, but if you get a + ClassNotFoundException or a NoClassDefFoundError for a Commons-Daemon + class, add the Commons-Daemon JAR to the -cp argument when launching + jsvc.</p> + + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/ssi-howto.html b/src/tomcat/webapps/docs/ssi-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..6f8ba0aab63d4ad32456dff6a9ae32c707daf2f6 --- /dev/null +++ b/src/tomcat/webapps/docs/ssi-howto.html @@ -0,0 +1,398 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - SSI How To</title><meta name="author" content="Glenn L. Nielsen"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/ssi-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>SSI How To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Introduction">Introduction</a></li><li><a href="#Installation">Installation</a></li><li><a href="#Servlet_Configuration">Servlet Configuration</a></li><li><a href="#Filter_Configuration">Filter Configuration</a></li><li><a href="#Directives">Directives</a></li><li><a href="#Variables">Variables</a></li></ul> +</div><h3 id="Introduction">Introduction</h3><div class="text"> + +<p>SSI (Server Side Includes) are directives that are placed in HTML pages, +and evaluated on the server while the pages are being served. They let you +add dynamically generated content to an existing HTML page, without having +to serve the entire page via a CGI program, or other dynamic technology. +</p> + +<p>Within Tomcat SSI support can be added when using Tomcat as your +HTTP server and you require SSI support. Typically this is done +during development when you don't want to run a web server like Apache.</p> + +<p>Tomcat SSI support implements the same SSI directives as Apache. See the +<a href="http://httpd.apache.org/docs/howto/ssi.html#basicssidirectives"> +Apache Introduction to SSI</a> for information on using SSI directives.</p> + +<p>SSI support is available as a servlet and as a filter. You should use one +or the other to provide SSI support but not both.</p> + +<p>Servlet based SSI support is implemented using the class +<code>org.apache.catalina.ssi.SSIServlet</code>. Traditionally, this servlet +is mapped to the URL pattern "*.shtml".</p> + +<p>Filter based SSI support is implemented using the class +<code>org.apache.catalina.ssi.SSIFilter</code>. Traditionally, this filter +is mapped to the URL pattern "*.shtml", though it can be mapped to "*" as +it will selectively enable/disable SSI processing based on mime types. The +contentType init param allows you to apply SSI processing to JSP pages, +javascript, or any other content you wish.</p> +<p>By default SSI support is disabled in Tomcat.</p> +</div><h3 id="Installation">Installation</h3><div class="text"> + +<p><strong>CAUTION</strong> - SSI directives can be used to execute programs +external to the Tomcat JVM. If you are using the Java SecurityManager this +will bypass your security policy configuration in <code>catalina.policy.</code> +</p> + +<p>To use the SSI servlet, remove the XML comments from around the SSI servlet +and servlet-mapping configuration in +<code>$CATALINA_BASE/conf/web.xml</code>.</p> + +<p>To use the SSI filter, remove the XML comments from around the SSI filter +and filter-mapping configuration in +<code>$CATALINA_BASE/conf/web.xml</code>.</p> + +<p>Only Contexts which are marked as privileged may use SSI features (see the +privileged property of the Context element).</p> + +</div><h3 id="Servlet_Configuration">Servlet Configuration</h3><div class="text"> + +<p>There are several servlet init parameters which can be used to +configure the behaviour of the SSI servlet.</p> +<ul> +<li><strong>buffered</strong> - Should output from this servlet be buffered? +(0=false, 1=true) Default 0 (false).</li> +<li><strong>debug</strong> - Debugging detail level for messages logged +by this servlet. Default 0.</li> +<li><strong>expires</strong> - The number of seconds before a page with SSI +directives will expire. Default behaviour is for all SSI directives to be +evaluated for every request.</li> +<li><strong>isVirtualWebappRelative</strong> - Should "virtual" SSI directive +paths be interpreted as relative to the context root, instead of the server +root? Default false.</li> +<li><strong>inputEncoding</strong> - The encoding to be assumed for SSI +resources if one cannot be determined from the resource itself. Default is +the default platform encoding.</li> +<li><strong>outputEncoding</strong> - The encoding to be used for the result +of the SSI processing. Default is UTF-8.</li> +<li><strong>allowExec</strong> - Is the exec command enabled? Default is +false.</li> +</ul> + + +</div><h3 id="Filter_Configuration">Filter Configuration</h3><div class="text"> + +<p>There are several filter init parameters which can be used to +configure the behaviour of the SSI filter.</p> +<ul> +<li><strong>contentType</strong> - A regex pattern that must be matched before +SSI processing is applied. When crafting your own pattern, don't forget that a +mime content type may be followed by an optional character set in the form +"mime/type; charset=set" that you must take into account. Default is +"text/x-server-parsed-html(;.*)?".</li> +<li><strong>debug</strong> - Debugging detail level for messages logged +by this servlet. Default 0.</li> +<li><strong>expires</strong> - The number of seconds before a page with SSI +directives will expire. Default behaviour is for all SSI directives to be +evaluated for every request.</li> +<li><strong>isVirtualWebappRelative</strong> - Should "virtual" SSI directive +paths be interpreted as relative to the context root, instead of the server +root? Default false.</li> +<li><strong>allowExec</strong> - Is the exec command enabled? Default is +false.</li> +</ul> + + +</div><h3 id="Directives">Directives</h3><div class="text"> +<p>Server Side Includes are invoked by embedding SSI directives in an HTML document + whose type will be processed by the SSI servlet. The directives take the form of an HTML + comment. The directive is replaced by the results of interpreting it before sending the + page to the client. The general form of a directive is: </p> +<p> <code><!--#directive [parm=value] --></code></p> +<p>The directives are:</p> +<ul> +<li> +<strong>config</strong> - <code><!--#config timefmt="%B %Y" --></code> +Used to set the format of dates and other items processed by SSI +</li> +<li> +<strong>echo</strong> - <code><!--#echo var="VARIABLE_NAME" --></code> +will be replaced by the value of the variable. +</li> +<li> +<strong>exec</strong> - Used to run commands on the host system. +</li> +<li> +<strong>include</strong> - <code><!--#include virtual="file-name" --></code> +inserts the contents +</li> +<li> +<strong>flastmod</strong> - <code><!--#flastmod file="filename.shtml" --></code> +Returns the time that a file was lost modified. +</li> +<li> +<strong>fsize</strong> - <code><!--#fsize file="filename.shtml" --></code> +Returns the size of a file. +</li> +<li> +<strong>printenv</strong> - <code><!--#printenv --></code> +Returns the list of all the defined variables. +</li> +<li> +<strong>set</strong> - <code><!--#set var="foo" value="Bar" --></code> +is used to assign a value to a user-defined variable. +</li> +<li> +<strong>if elif endif else</strong> - Used to create conditional sections. For example: +<div class="codeBox"><pre><code><!--#config timefmt="%A" --> +<!--#if expr="$DATE_LOCAL = /Monday/" --> +<p>Meeting at 10:00 on Mondays</p> +<!--#elif expr="$DATE_LOCAL = /Friday/" --> +<p>Turn in your time card</p> +<!--#else --> +<p>Yoga class at noon.</p> +<!--#endif --></code></pre></div> +</li> +</ul> +<p> +See the +<a href="http://httpd.apache.org/docs/howto/ssi.html#basicssidirectives"> +Apache Introduction to SSI</a> for more information on using SSI directives.</p> +</div><h3 id="Variables">Variables</h3><div class="text"> +<p>The SSI servlet currently implements the following variables: +</p> +<table class="defaultTable"> +<tr> +<th>Variable Name</th> +<th>Description</th> +</tr> + +<tr> +<td>AUTH_TYPE</td> +<td> + The type of authentication used for this user: BASIC, FORM, etc.</td> +</tr> + +<tr> +<td>CONTENT_LENGTH</td> +<td> + The length of the data (in bytes or the number of + characters) passed from a form.</td> +</tr> + +<tr> +<td>CONTENT_TYPE</td> +<td> + The MIME type of the query data, such as "text/html".</td> +</tr> + +<tr> +<td>DATE_GMT</td> +<td> +Current date and time in GMT</td> +</tr> + +<tr> +<td>DATE_LOCAL</td> +<td> +Current date and time in the local time zone</td> +</tr> +<tr> +<td>DOCUMENT_NAME</td> +<td> +The current file</td> +</tr> +<tr> +<td>DOCUMENT_URI</td> +<td> +Virtual path to the file</td> +</tr> + +<tr> +<td>GATEWAY_INTERFACE</td> +<td> + The revision of the Common Gateway Interface that the + server uses if enabled: "CGI/1.1".</td> +</tr> + +<tr> +<td>HTTP_ACCEPT</td> +<td> + A list of the MIME types that the client can accept.</td> +</tr> + +<tr> +<td>HTTP_ACCEPT_ENCODING</td> +<td> + A list of the compression types that the client can accept.</td> +</tr> + +<tr> +<td>HTTP_ACCEPT_LANGUAGE</td> +<td> + A list of the languages that the client can accept.</td> +</tr> +<tr> +<td>HTTP_CONNECTION</td> +<td> + The way that the connection from the client is being managed: + "Close" or "Keep-Alive".</td> +</tr> +<tr> +<td>HTTP_HOST</td> +<td> + The web site that the client requested.</td> +</tr> +<tr> +<td>HTTP_REFERER</td> +<td> + The URL of the document that the client linked from.</td> +</tr> +<tr> +<td>HTTP_USER_AGENT</td> +<td> + The browser the client is using to issue the request.</td> +</tr> +<tr> +<td>LAST_MODIFIED</td> +<td> +Last modification date and time for current file</td> +</tr> +<tr> +<td>PATH_INFO</td> +<td> + Extra path information passed to a servlet.</td> +</tr> +<tr> +<td>PATH_TRANSLATED</td> +<td> + The translated version of the path given by the + variable PATH_INFO.</td> +</tr> +<tr> +<td>QUERY_STRING</td> +<td> +The query string that follows the "?" in the URL. +</td> +</tr> +<tr> +<td>QUERY_STRING_UNESCAPED</td> +<td> +Undecoded query string with all shell metacharacters escaped +with "\"</td> +</tr> +<tr> +<td>REMOTE_ADDR</td> +<td> + The remote IP address of the user making the request.</td> +</tr> +<tr> +<td>REMOTE_HOST</td> +<td> + The remote hostname of the user making the request.</td> +</tr> +<tr> +<td>REMOTE_PORT</td> +<td> + The port number at remote IP address of the user making the request.</td> +</tr> +<tr> +<td>REMOTE_USER</td> +<td> + The authenticated name of the user.</td> +</tr> +<tr> +<td>REQUEST_METHOD</td> +<td> + The method with which the information request was + issued: "GET", "POST" etc.</td> +</tr> +<tr> +<td>REQUEST_URI</td> +<td> + The web page originally requested by the client.</td> +</tr> +<tr> +<td>SCRIPT_FILENAME</td> +<td> + The location of the current web page on the server.</td> +</tr> +<tr> +<td>SCRIPT_NAME</td> +<td> + The name of the web page.</td> +</tr> +<tr> +<td>SERVER_ADDR</td> +<td> + The server's IP address.</td> +</tr> +<tr> +<td>SERVER_NAME</td> +<td> + The server's hostname or IP address.</td> +</tr> +<tr> +<td>SERVER_PORT</td> +<td> + The port on which the server received the request.</td> +</tr> +<tr> +<td>SERVER_PROTOCOL</td> +<td> + The protocol used by the server. E.g. "HTTP/1.1".</td> +</tr> +<tr> +<td>SERVER_SOFTWARE</td> +<td> + The name and version of the server software that is + answering the client request.</td> +</tr> +<tr> +<td>UNIQUE_ID</td> +<td> + A token used to identify the current session if one + has been established.</td> +</tr> +</table> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/ssl-howto.html b/src/tomcat/webapps/docs/ssl-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..45a25bcee272544912f562510289288e6918701b --- /dev/null +++ b/src/tomcat/webapps/docs/ssl-howto.html @@ -0,0 +1,687 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - SSL/TLS Configuration HOW-TO</title><meta name="author" content="Christopher Cain"><meta name="author" content="Yoav Shapira"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/ssl-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>SSL/TLS Configuration HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#Introduction_to_SSL">Introduction to SSL/TLS</a></li><li><a href="#SSL_and_Tomcat">SSL/TLS and Tomcat</a></li><li><a href="#Certificates">Certificates</a></li><li><a href="#General_Tips_on_Running_SSL">General Tips on Running SSL</a></li><li><a href="#Configuration">Configuration</a><ol><li><a href="#Prepare_the_Certificate_Keystore">Prepare the Certificate Keystore</a></li><li><a href="#Edit_the_Tomcat_Configuration_File">Edit the Tomcat Configuration File</a></li></ol></li><li><a href="#Installing_a_Certificate_from_a_Certificate_Authority">Installing a Certificate from a Certificate Authority</a><ol><li><a href="#Create_a_local_Certificate_Signing_Request_(CSR)">Create a local Certificate Signing Request (CSR)</a></li><li><a href="#Importing_the_Certificate">Importing the Certificate</a></li></ol></li><li><a href="#Using_OCSP_Certificates">Using OCSP Certificates</a><ol><li><a href="#Generating_OCSP-Enabled_Certificates">Generating OCSP-Enabled Certificates</a></li><li><a href="#Configuring_OCSP_Connector">Configuring OCSP Connector</a></li><li><a href="#Starting_OCSP_Responder">Starting OCSP Responder</a></li></ol></li><li><a href="#Troubleshooting">Troubleshooting</a></li><li><a href="#Using_the_SSL_for_session_tracking_in_your_application">Using the SSL for session tracking in your application</a></li><li><a href="#Miscellaneous_Tips_and_Bits">Miscellaneous Tips and Bits</a></li></ul> +</div><h3 id="Quick_Start">Quick Start</h3><div class="text"> + + <p><em>The description below uses the variable name $CATALINA_BASE to refer the + base directory against which most relative paths are resolved. If you have + not configured Tomcat for multiple instances by setting a CATALINA_BASE + directory, then $CATALINA_BASE will be set to the value of $CATALINA_HOME, + the directory into which you have installed Tomcat.</em></p> + +<p>To install and configure SSL/TLS support on Tomcat, you need to follow +these simple steps. For more information, read the rest of this HOW-TO.</p> +<ol> +<li><p>Create a keystore file to store the server's private key and +self-signed certificate by executing the following command:</p> +<p>Windows:</p> +<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA</code></pre></div> +<p>Unix:</p> +<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA</code></pre></div> + +<p>and specify a password value of "changeit".</p></li> +<li><p>Uncomment the "SSL HTTP/1.1 Connector" entry in + <code>$CATALINA_BASE/conf/server.xml</code> and modify as described in + the <a href="#Configuration">Configuration section</a> below.</p></li> + +</ol> + + +</div><h3 id="Introduction_to_SSL">Introduction to SSL/TLS</h3><div class="text"> + +<p>Transport Layer Security (TLS) and its predecessor, Secure Sockets Layer +(SSL), are technologies which allow web browsers and web servers to communicate +over a secured connection. This means that the data being sent is encrypted by +one side, transmitted, then decrypted by the other side before processing. +This is a two-way process, meaning that both the server AND the browser encrypt +all traffic before sending out data.</p> + +<p>Another important aspect of the SSL/TLS protocol is Authentication. This means +that during your initial attempt to communicate with a web server over a secure +connection, that server will present your web browser with a set of +credentials, in the form of a "Certificate", as proof the site is who and what +it claims to be. In certain cases, the server may also request a Certificate +from your web browser, asking for proof that <em>you</em> are who you claim +to be. This is known as "Client Authentication," although in practice this is +used more for business-to-business (B2B) transactions than with individual +users. Most SSL-enabled web servers do not request Client Authentication.</p> + +</div><h3 id="SSL_and_Tomcat">SSL/TLS and Tomcat</h3><div class="text"> + +<p>It is important to note that configuring Tomcat to take advantage of +secure sockets is usually only necessary when running it as a stand-alone +web server. Details can be found in the +<a href="security-howto.html">Security Considerations Document</a>. +When running Tomcat primarily as a Servlet/JSP container behind +another web server, such as Apache or Microsoft IIS, it is usually necessary +to configure the primary web server to handle the SSL connections from users. +Typically, this server will negotiate all SSL-related functionality, then +pass on any requests destined for the Tomcat container only after decrypting +those requests. Likewise, Tomcat will return cleartext responses, that will +be encrypted before being returned to the user's browser. In this environment, +Tomcat knows that communications between the primary web server and the +client are taking place over a secure connection (because your application +needs to be able to ask about this), but it does not participate in the +encryption or decryption itself.</p> + +</div><h3 id="Certificates">Certificates</h3><div class="text"> + +<p>In order to implement SSL, a web server must have an associated Certificate +for each external interface (IP address) that accepts secure connections. +The theory behind this design is that a server should provide some kind of +reasonable assurance that its owner is who you think it is, particularly +before receiving any sensitive information. While a broader explanation of +Certificates is beyond the scope of this document, think of a Certificate as a +"digital passport" for an Internet address. It states which organisation the +site is associated with, along with some basic contact information about the +site owner or administrator.</p> + +<p>This certificate is cryptographically signed by its owner, and is +therefore extremely difficult for anyone else to forge. For the certificate to +work in the visitors browsers without warnings, it needs to be signed by a +trusted third party. These are called <em>Certificate Authorities</em> (CAs). To +obtain a signed certificate, you need to choose a CA and follow the instructions +your chosen CA provides to obtain your certificate. A range of CAs is available +including some that offer certificates at no cost.</p> + +<p>Java provides a relatively simple command-line tool, called +<code>keytool</code>, which can easily create a "self-signed" Certificate. +Self-signed Certificates are simply user generated Certificates which have not +been signed by a well-known CA and are, therefore, not really guaranteed to be +authentic at all. While self-signed certificates can be useful for some testing +scenarios, they are not suitable for any form of production use.</p> + +</div><h3 id="General_Tips_on_Running_SSL">General Tips on Running SSL</h3><div class="text"> + +<p>When securing a website with SSL it's important to make sure that all assets +that the site uses are served over SSL, so that an attacker can't bypass +the security by injecting malicious content in a javascript file or similar. To +further enhance the security of your website, you should evaluate to use the +HSTS header. It allows you to communicate to the browser that your site should +always be accessed over https.</p> + +<p>Using name-based virtual hosts on a secured connection requires careful +configuration of the names specified in a single certificate or Tomcat 8.5 +onwards where Server Name Indication (SNI) support is available. SNI allows +multiple certificates with different names to be associated with a single TLS +connector.</p> + +</div><h3 id="Configuration">Configuration</h3><div class="text"> + +<div class="subsection"><h4 id="Prepare_the_Certificate_Keystore">Prepare the Certificate Keystore</h4><div class="text"> + +<p>Tomcat currently operates only on <code>JKS</code>, <code>PKCS11</code> or +<code>PKCS12</code> format keystores. The <code>JKS</code> format +is Java's standard "Java KeyStore" format, and is the format created by the +<code>keytool</code> command-line utility. This tool is included in the JDK. +The <code>PKCS12</code> format is an internet standard, and can be manipulated +via (among other things) OpenSSL and Microsoft's Key-Manager. +</p> + +<p>Each entry in a keystore is identified by an alias string. Whilst many +keystore implementations treat aliases in a case insensitive manner, case +sensitive implementations are available. The <code>PKCS11</code> specification, +for example, requires that aliases are case sensitive. To avoid issues related +to the case sensitivity of aliases, it is not recommended to use aliases that +differ only in case. +</p> + +<p>To import an existing certificate into a <code>JKS</code> keystore, please read the +documentation (in your JDK documentation package) about <code>keytool</code>. +Note that OpenSSL often adds readable comments before the key, but +<code>keytool</code> does not support that. So if your certificate has +comments before the key data, remove them before importing the certificate with +<code>keytool</code>. +</p> +<p>To import an existing certificate signed by your own CA into a <code>PKCS12</code> +keystore using OpenSSL you would execute a command like:</p> +<div class="codeBox"><pre><code>openssl pkcs12 -export -in mycert.crt -inkey mykey.key + -out mycert.p12 -name tomcat -CAfile myCA.crt + -caname root -chain</code></pre></div> +<p>For more advanced cases, consult the +<a href="http://www.openssl.org/" rel="nofollow">OpenSSL documentation</a>.</p> + +<p>To create a new <code>JKS</code> keystore from scratch, containing a single +self-signed Certificate, execute the following from a terminal command line:</p> +<p>Windows:</p> +<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA</code></pre></div> +<p>Unix:</p> +<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA</code></pre></div> + +<p>(The RSA algorithm should be preferred as a secure algorithm, and this +also ensures general compatibility with other servers and components.)</p> + +<p>This command will create a new file, in the home directory of the user +under which you run it, named "<code>.keystore</code>". To specify a +different location or filename, add the <code>-keystore</code> parameter, +followed by the complete pathname to your keystore file, +to the <code>keytool</code> command shown above. You will also need to +reflect this new location in the <code>server.xml</code> configuration file, +as described later. For example:</p> +<p>Windows:</p> +<div class="codeBox"><pre><code>"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA + -keystore \path\to\my\keystore</code></pre></div> +<p>Unix:</p> +<div class="codeBox"><pre><code>$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA + -keystore /path/to/my/keystore</code></pre></div> + +<p>After executing this command, you will first be prompted for the keystore +password. The default password used by Tomcat is "<code>changeit</code>" +(all lower case), although you can specify a custom password if you like. +You will also need to specify the custom password in the +<code>server.xml</code> configuration file, as described later.</p> + +<p>Next, you will be prompted for general information about this Certificate, +such as company, contact name, and so on. This information will be displayed +to users who attempt to access a secure page in your application, so make +sure that the information provided here matches what they will expect.</p> + +<p>Finally, you will be prompted for the <em>key password</em>, which is the +password specifically for this Certificate (as opposed to any other +Certificates stored in the same keystore file). The <code>keytool</code> prompt +will tell you that pressing the ENTER key automatically uses the same password +for the key as the keystore. You are free to use the same password or to select +a custom one. If you select a different password to the keystore password, you +will also need to specify the custom password in the <code>server.xml</code> +configuration file.</p> + +<p>If everything was successful, you now have a keystore file with a +Certificate that can be used by your server.</p> + +</div></div> + +<div class="subsection"><h4 id="Edit_the_Tomcat_Configuration_File">Edit the Tomcat Configuration File</h4><div class="text"> +<p> +Tomcat can use three different implementations of SSL: +</p> +<ul> +<li>JSSE implementation provided as part of the Java runtime</li> +<li>JSSE implementation that uses OpenSSL</li> +<li>APR implementation, which uses the OpenSSL engine by default</li> +</ul> +<p> +The exact configuration details depend on which implementation is being used. +If you configured Connector by specifying generic +<code>protocol="HTTP/1.1"</code> then the implementation used by Tomcat is +chosen automatically. If the installation uses <a href="apr.html">APR</a> +- i.e. you have installed the Tomcat native library - +then it will use the JSSE OpenSSL implementation, otherwise it will use the Java +JSSE implementation. +</p> + +<p> +Auto-selection of implementation can be avoided if needed. It is done by specifying a classname +in the <b>protocol</b> attribute of the <a href="config/http.html">Connector</a>.</p> + +<p>To define a Java (JSSE) connector, regardless of whether the APR library is +loaded or not, use one of the following:</p> +<div class="codeBox"><pre><code><!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO implementation --> +<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" + sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" + port="8443" .../> + +<!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation --> +<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol" + sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" + port="8443" .../></code></pre></div> + +<p>The OpenSSL JSSE implementation can also be configured explicitly if needed. If the APR library +is installed (as for using the APR connector), using the sslImplementationName attribute +allows enabling it. When using the OpenSSL JSSE implementation, the configuration can use +either the JSSE attributes or +the OpenSSL attributes (as used for the APR connector), but must not mix attributes from +both types in the same SSLHostConfig or Connector element.</p> +<div class="codeBox"><pre><code><!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO implementation and OpenSSL --> +<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" + sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation" + .../></code></pre></div> + +<p>Alternatively, to specify an APR connector (the APR library must be available) use:</p> +<div class="codeBox"><pre><code><!-- Define a HTTP/1.1 Connector on port 8443, APR implementation --> +<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" + port="8443" .../></code></pre></div> + +<p>If you are using APR or JSSE OpenSSL, you have the option of configuring an alternative engine to OpenSSL.</p> +<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener" + SSLEngine="someengine" SSLRandomSeed="somedevice" /></code></pre></div> +<p>The default value is</p> +<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener" + SSLEngine="on" SSLRandomSeed="builtin" /></code></pre></div> +<p>Also the <code>useAprConnector</code> attribute may be used to have Tomcat default to +using the APR connector rather than the NIO connector:</p> +<div class="codeBox"><pre><code><Listener className="org.apache.catalina.core.AprLifecycleListener" + useAprConnector="true" SSLEngine="on" SSLRandomSeed="builtin" /></code></pre></div> +<p> +So to enable OpenSSL, make sure the SSLEngine attribute is set to something other than <code>off</code>. +The default value is <code>on</code> and if you specify another value, +it has to be a valid OpenSSL engine name. +</p> + +<p> +SSLRandomSeed allows to specify a source of entropy. Productive system needs a reliable source of entropy +but entropy may need a lot of time to be collected therefore test systems could use no blocking entropy +sources like "/dev/urandom" that will allow quicker starts of Tomcat. +</p> + +<p>The final step is to configure the Connector in the +<code>$CATALINA_BASE/conf/server.xml</code> file, where +<code>$CATALINA_BASE</code> represents the base directory for the +Tomcat instance. An example <code><Connector></code> element +for an SSL connector is included in the default <code>server.xml</code> +file installed with Tomcat. To configure an SSL connector that uses JSSE, you +will need to remove the comments and edit it so it looks something like +this:</p> +<div class="codeBox"><pre><code><!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --> +<Connector + protocol="org.apache.coyote.http11.Http11NioProtocol" + port="8443" maxThreads="200" + scheme="https" secure="true" SSLEnabled="true" + keystoreFile="${user.home}/.keystore" keystorePass="changeit" + clientAuth="false" sslProtocol="TLS"/></code></pre></div> +<p> + Note: If tomcat-native is installed, the configuration will use JSSE with + an OpenSSL implementation, which supports either this configuration or the APR + configuration example given below.</p> +<p> + The APR connector uses different attributes for many SSL settings, + particularly keys and certificates. An example of an APR configuration is:</p> +<div class="codeBox"><pre><code><!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --> +<Connector + protocol="org.apache.coyote.http11.Http11AprProtocol" + port="8443" maxThreads="200" + scheme="https" secure="true" SSLEnabled="true" + SSLCertificateFile="/usr/local/ssl/server.crt" + SSLCertificateKeyFile="/usr/local/ssl/server.pem" + SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/></code></pre></div> + + +<p>The configuration options and information on which attributes +are mandatory, are documented in the SSL Support section of the +<a href="config/http.html#SSL_Support">HTTP connector</a> configuration +reference. Make sure that you use the correct attributes for the connector you +are using. The NIO and NIO2 connectors use JSSE unless the JSSE OpenSSL implementation is +installed (in which case it supports either the JSSE or OpenSSL configuration styles), +whereas the APR/native connector uses APR.</p> + +<p>The <code>port</code> attribute is the TCP/IP +port number on which Tomcat will listen for secure connections. You can +change this to any port number you wish (such as to the default port for +<code>https</code> communications, which is 443). However, special setup +(outside the scope of this document) is necessary to run Tomcat on port +numbers lower than 1024 on many operating systems.</p> + + <p><em>If you change the port number here, you should also change the + value specified for the <code>redirectPort</code> attribute on the + non-SSL connector. This allows Tomcat to automatically redirect + users who attempt to access a page with a security constraint specifying + that SSL is required, as required by the Servlet Specification.</em></p> + +<p>After completing these configuration changes, you must restart Tomcat as +you normally do, and you should be in business. You should be able to access +any web application supported by Tomcat via SSL. For example, try:</p> +<div class="codeBox"><pre><code>https://localhost:8443/</code></pre></div> +<p>and you should see the usual Tomcat splash page (unless you have modified +the ROOT web application). If this does not work, the following section +contains some troubleshooting tips.</p> + +</div></div> + +</div><h3 id="Installing_a_Certificate_from_a_Certificate_Authority">Installing a Certificate from a Certificate Authority</h3><div class="text"> +<p>To obtain and install a Certificate from a Certificate Authority (like verisign.com, thawte.com +or trustcenter.de), read the previous section and then follow these instructions:</p> + +<div class="subsection"><h4 id="Create_a_local_Certificate_Signing_Request_(CSR)">Create a local Certificate Signing Request (CSR)</h4><div class="text"> +<p>In order to obtain a Certificate from the Certificate Authority of your choice +you have to create a so called Certificate Signing Request (CSR). That CSR will be used +by the Certificate Authority to create a Certificate that will identify your website +as "secure". To create a CSR follow these steps:</p> +<ul> +<li>Create a local self-signed Certificate (as described in the previous section): + <div class="codeBox"><pre><code>keytool -genkey -alias tomcat -keyalg RSA + -keystore <your_keystore_filename></code></pre></div> + Note: In some cases you will have to enter the domain of your website (i.e. <code>www.myside.org</code>) + in the field "first- and lastname" in order to create a working Certificate. +</li> +<li>The CSR is then created with: + <div class="codeBox"><pre><code>keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr + -keystore <your_keystore_filename></code></pre></div> +</li> +</ul> +<p>Now you have a file called <code>certreq.csr</code> that you can submit to the Certificate Authority (look at the +documentation of the Certificate Authority website on how to do this). In return you get a Certificate.</p> +</div></div> + +<div class="subsection"><h4 id="Importing_the_Certificate">Importing the Certificate</h4><div class="text"> +<p>Now that you have your Certificate you can import it into you local keystore. +First of all you have to import a so called Chain Certificate or Root Certificate into your keystore. +After that you can proceed with importing your Certificate.</p> + +<ul> +<li>Download a Chain Certificate from the Certificate Authority you obtained the Certificate from.<br> + For Verisign.com commercial certificates go to: + http://www.verisign.com/support/install/intermediate.html<br> + For Verisign.com trial certificates go to: + http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html<br> + For Trustcenter.de go to: + http://www.trustcenter.de/certservices/cacerts/en/en.htm#server<br> + For Thawte.com go to: + http://www.thawte.com/certs/trustmap.html<br> +</li> +<li>Import the Chain Certificate into your keystore + <div class="codeBox"><pre><code>keytool -import -alias root -keystore <your_keystore_filename> + -trustcacerts -file <filename_of_the_chain_certificate></code></pre></div> +</li> +<li>And finally import your new Certificate + <div class="codeBox"><pre><code>keytool -import -alias tomcat -keystore <your_keystore_filename> + -file <your_certificate_filename></code></pre></div> +</li> +</ul> +</div></div> +</div><h3 id="Using_OCSP_Certificates">Using OCSP Certificates</h3><div class="text"> +<p>To use Online Certificate Status Protocol (OCSP) with Apache Tomcat, ensure + you have downloaded, installed, and configured the + <a href="https://tomcat.apache.org/download-native.cgi"> + Tomcat Native Connector</a>. +Furthermore, if you use the Windows platform, ensure you download the +ocsp-enabled connector.</p> +<p>To use OCSP, you require the following:</p> + +<ul> + <li>OCSP-enabled certificates</li> + <li>Tomcat with SSL APR connector</li> + <li>Configured OCSP responder</li> +</ul> + +<div class="subsection"><h4 id="Generating_OCSP-Enabled_Certificates">Generating OCSP-Enabled Certificates</h4><div class="text"> +<p>Apache Tomcat requires the OCSP-enabled certificate to have the OCSP + responder location encoded in the certificate. The basic OCSP-related + certificate authority settings in the <code>openssl.cnf</code> file could look + as follows:</p> + +<div class="codeBox"><pre><code> +#... omitted for brevity + +[x509] +x509_extensions = v3_issued + +[v3_issued] +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid,issuer +# The address of your responder +authorityInfoAccess = OCSP;URI:http://127.0.0.1:8088 +keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement,keyCertSign,cRLSign,encipherOnly,decipherOnly +basicConstraints=critical,CA:FALSE +nsComment="Testing OCSP Certificate" + +#... omitted for brevity +</code></pre></div> + +<p>The settings above encode the OCSP responder address + <code>127.0.0.1:8088</code> into the certificate. Note that for the following + steps, you must have <code>openssl.cnf</code> and other configuration of + your CA ready. To generate an OCSP-enabled certificate:</p> + +<ul> + <li> + Create a private key: + <div class="codeBox"><pre><code>openssl genrsa -aes256 -out ocsp-cert.key 4096</code></pre></div> + </li> + <li> + Create a signing request (CSR): + <div class="codeBox"><pre><code>openssl req -config openssl.cnf -new -sha256 \ + -key ocsp-cert.key -out ocsp-cert.csr</code></pre></div></li> + <li> + Sign the CSR: + <div class="codeBox"><pre><code>openssl ca -openssl.cnf -extensions ocsp -days 375 -notext \ + -md sha256 -in ocsp-cert.csr -out ocsp-cert.crt</code></pre></div> + </li> + <li> + You may verify the certificate: + <div class="codeBox"><pre><code>openssl x509 -noout -text -in ocsp-cert.crt</code></pre></div> + </li> +</ul> +</div></div> + +<div class="subsection"><h4 id="Configuring_OCSP_Connector">Configuring OCSP Connector</h4><div class="text"> + +<p>To configure the OCSP connector, first verify that you are loading the Tomcat + APR library. Check the <a href="apr.html#Installation"> + Apache Portable Runtime (APR) based Native library for Tomcat</a> +for more information about installation of APR. A basic OCSP-enabled connector + definition in the <code>server.xml</code> file looks as follows:</p> +<div class="codeBox"><pre><code> +<Connector + port="8443" + protocol="org.apache.coyote.http11.Http11AprProtocol" + secure="true" + scheme="https" + SSLEnabled="true" + <SSLHostConfig + caCertificateFile="/path/to/ca.pem" + certificateVerification="require" + certificateVerificationDepth="10" > + <Certificate + certificateFile="/path/to/ocsp-cert.crt" + certificateKeyFile="/path/to/ocsp-cert.key" /> + </SSLHostConfig> +</code></pre></div> +</div></div> + +<div class="subsection"><h4 id="Starting_OCSP_Responder">Starting OCSP Responder</h4><div class="text"> + <p>Apache Tomcat will query an OCSP responder server to get the certificate + status. When testing, an easy way to create an OCSP responder is by executing + the following: + <div class="codeBox"><pre><code>openssl ocsp -port 127.0.0.1:8088 \ + -text -sha256 -index index.txt \ + -CA ca-chain.cert.pem -rkey ocsp-cert.key \ + -rsigner ocsp-cert.crt</code></pre></div> </p> + + <p>Do note that when using OCSP, the responder encoded in the connector + certificate must be running. For further information, see + <a href="https://www.openssl.org/docs/man1.1.0/apps/ocsp.html"> + OCSP documentation + </a>. + </p> + +</div></div> + +</div><h3 id="Troubleshooting">Troubleshooting</h3><div class="text"> + +<p>Here is a list of common problems that you may encounter when setting up +SSL communications, and what to do about them.</p> + +<ul> + +<li>When Tomcat starts up, I get an exception like + "java.io.FileNotFoundException: {some-directory}/{some-file} not found". + + <p>A likely explanation is that Tomcat cannot find the keystore file + where it is looking. By default, Tomcat expects the keystore file to + be named <code>.keystore</code> in the user home directory under which + Tomcat is running (which may or may not be the same as yours :-). If + the keystore file is anywhere else, you will need to add a + <code>keystoreFile</code> attribute to the <code><Connector></code> + element in the <a href="#Edit_the_Tomcat_Configuration_File">Tomcat + configuration file</a>.</p> + </li> + +<li>When Tomcat starts up, I get an exception like + "java.io.FileNotFoundException: Keystore was tampered with, or + password was incorrect". + + <p>Assuming that someone has not <em>actually</em> tampered with + your keystore file, the most likely cause is that Tomcat is using + a different password than the one you used when you created the + keystore file. To fix this, you can either go back and + <a href="#Prepare_the_Certificate_Keystore">recreate the keystore + file</a>, or you can add or update the <code>keystorePass</code> + attribute on the <code><Connector></code> element in the + <a href="#Edit_the_Tomcat_Configuration_File">Tomcat configuration + file</a>. <strong>REMINDER</strong> - Passwords are case sensitive!</p> + </li> + +<li>When Tomcat starts up, I get an exception like + "java.net.SocketException: SSL handshake error javax.net.ssl.SSLException: No + available certificate or key corresponds to the SSL cipher suites which are + enabled." + + <p>A likely explanation is that Tomcat cannot find the alias for the server + key within the specified keystore. Check that the correct + <code>keystoreFile</code> and <code>keyAlias</code> are specified in the + <code><Connector></code> element in the + <a href="#Edit_the_Tomcat_Configuration_File">Tomcat configuration file</a>. + <strong>REMINDER</strong> - <code>keyAlias</code> values may be case + sensitive!</p> + </li> + +<li>My Java-based client aborts handshakes with exceptions such as + "java.lang.RuntimeException: Could not generate DH keypair" and + "java.security.InvalidAlgorithmParameterException: Prime size must be multiple + of 64, and can only range from 512 to 1024 (inclusive)" + + <p>If you are using the APR/native connector or the JSSE OpenSSL implementation, + it will determine the strength of ephemeral DH keys from the key size of + your RSA certificate. For example a 2048 bit RSA key will result in + using a 2048 bit prime for the DH keys. Unfortunately Java 6 only supports + 768 bit and Java 7 only supports 1024 bit. So if your certificate has a + stronger key, old Java clients might produce such handshake failures. + As a mitigation you can either try to force them to use another cipher by + configuring an appropriate <code>SSLCipherSuite</code> and activate + <code>SSLHonorCipherOrder</code>, or embed weak DH params in your + certificate file. The latter approach is not recommended because it weakens + the SSL security (logjam attack).</p> + </li> + +</ul> + +<p>If you are still having problems, a good source of information is the +<strong>TOMCAT-USER</strong> mailing list. You can find pointers to archives +of previous messages on this list, as well as subscription and unsubscription +information, at +<a href="http://tomcat.apache.org/lists.html">http://tomcat.apache.org/lists.html</a>.</p> + +</div><h3 id="Using_the_SSL_for_session_tracking_in_your_application">Using the SSL for session tracking in your application</h3><div class="text"> + <p>This is a new feature in the Servlet 3.0 specification. Because it uses the + SSL session ID associated with the physical client-server connection there + are some limitations. They are:</p> + <ul> + <li>Tomcat must have a connector with the attribute + <strong>isSecure</strong> set to <code>true</code>.</li> + <li>If SSL connections are managed by a proxy or a hardware accelerator + they must populate the SSL request headers (see the + <a href="config/valve.html">SSLValve</a>) so that + the SSL session ID is visible to Tomcat.</li> + <li>If Tomcat terminates the SSL connection, it will not be possible to use + session replication as the SSL session IDs will be different on each + node.</li> + </ul> + + <p> + To enable SSL session tracking you need to use a context listener to set the + tracking mode for the context to be just SSL (if any other tracking mode is + enabled, it will be used in preference). It might look something like:</p> + <div class="codeBox"><pre><code>package org.apache.tomcat.example; + +import java.util.EnumSet; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.SessionTrackingMode; + +public class SessionTrackingModeListener implements ServletContextListener { + + @Override + public void contextDestroyed(ServletContextEvent event) { + // Do nothing + } + + @Override + public void contextInitialized(ServletContextEvent event) { + ServletContext context = event.getServletContext(); + EnumSet<SessionTrackingMode> modes = + EnumSet.of(SessionTrackingMode.SSL); + + context.setSessionTrackingModes(modes); + } + +}</code></pre></div> + + <p>Note: SSL session tracking is implemented for the NIO and NIO2 connectors. + It is not yet implemented for the APR connector.</p> + +</div><h3 id="Miscellaneous_Tips_and_Bits">Miscellaneous Tips and Bits</h3><div class="text"> + +<p>To access the SSL session ID from the request, use:</p> + + <div class="codeBox"><pre><code>String sslID = (String)request.getAttribute("javax.servlet.request.ssl_session_id");</code></pre></div> +<p> +For additional discussion on this area, please see +<a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=22679">Bugzilla</a>. +</p> + + <p>To terminate an SSL session, use:</p> + <div class="codeBox"><pre><code>// Standard HTTP session invalidation +session.invalidate(); + +// Invalidate the SSL Session +org.apache.tomcat.util.net.SSLSessionManager mgr = + (org.apache.tomcat.util.net.SSLSessionManager) + request.getAttribute("javax.servlet.request.ssl_session_mgr"); +mgr.invalidateSession(); + +// Close the connection since the SSL session will be active until the connection +// is closed +response.setHeader("Connection", "close");</code></pre></div> + <p> + Note that this code is Tomcat specific due to the use of the + SSLSessionManager class. This is currently only available for the NIO and + NIO2 connectors, not the APR/native connector. + </p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/developers.html b/src/tomcat/webapps/docs/tribes/developers.html new file mode 100644 index 0000000000000000000000000000000000000000..6c78e863394fbacb4ecf30b23f34b54e074fd61c --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/developers.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Developers</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/developers"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Developers</h2><h3 id="Developers">Developers</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/faq.html b/src/tomcat/webapps/docs/tribes/faq.html new file mode 100644 index 0000000000000000000000000000000000000000..e3bb01d7fa4816078197fbf45eaa511102652427 --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/faq.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Frequently Asked Questions</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/faq"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Frequently Asked Questions</h2><h3 id="Frequently_Asked_Questions">Frequently Asked Questions</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/interceptors.html b/src/tomcat/webapps/docs/tribes/interceptors.html new file mode 100644 index 0000000000000000000000000000000000000000..75d45ce1981e04d2974cae5c1156e58a7db3595d --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/interceptors.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Interceptors</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/interceptors"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Interceptors</h2><h3 id="Interceptors">Interceptors</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/introduction.html b/src/tomcat/webapps/docs/tribes/introduction.html new file mode 100644 index 0000000000000000000000000000000000000000..925b71d10f4cd636d3400e49f338aec1ad2bddc6 --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/introduction.html @@ -0,0 +1,277 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Introduction</title><meta name="author" content="Filip Hanik"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/introduction"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Introduction</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Quick_Start">Quick Start</a></li><li><a href="#What_is_Tribes">What is Tribes</a></li><li><a href="#Why_another_messaging_framework">Why another messaging framework</a></li><li><a href="#Feature_Overview">Feature Overview</a></li><li><a href="#Where_can_I_get_Tribes">Where can I get Tribes</a></li></ul> +</div><h3 id="Quick_Start">Quick Start</h3><div class="text"> + + <p>Apache Tribes is a group or peer-to-peer communication framework that enables you to easily connect + your remote objects to communicate with each other. + </p> + <ul> + <li>Import: <code>org.apache.catalina.tribes.Channel</code></li> + <li>Import: <code>org.apache.catalina.tribes.Member</code></li> + <li>Import: <code>org.apache.catalina.tribes.MembershipListener</code></li> + <li>Import: <code>org.apache.catalina.tribes.ChannelListener</code></li> + <li>Import: <code>org.apache.catalina.tribes.group.GroupChannel</code></li> + <li>Create a class that implements: <code>org.apache.catalina.tribes.ChannelListener</code></li> + <li>Create a class that implements: <code>org.apache.catalina.tribes.MembershipListener</code></li> + <li>Simple class to demonstrate how to send a message: + <div class="codeBox"><pre><code>//create a channel +Channel myChannel = new GroupChannel(); + +//create my listeners +ChannelListener msgListener = new MyMessageListener(); +MembershipListener mbrListener = new MyMemberListener(); + +//attach the listeners to the channel +myChannel.addMembershipListener(mbrListener); +myChannel.addChannelListener(msgListener); + +//start the channel +myChannel.start(Channel.DEFAULT); + +//create a message to be sent, message must implement java.io.Serializable +//for performance reasons you probably want them to implement java.io.Externalizable +Serializable myMsg = new MyMessage(); + +//retrieve my current members +Member[] group = myChannel.getMembers(); + +//send the message +myChannel.send(group,myMsg,Channel.SEND_OPTIONS_DEFAULT);</code></pre></div> + </li> + </ul> + <p> + Simple yeah? There is a lot more to Tribes than we have shown, hopefully the docs will be able + to explain more to you. Remember, that we are always interested in suggestions, improvements, bug fixes + and anything that you think would help this project. + </p> + <p> + Note: Tribes is currently built for JDK1.5, you can run on JDK1.4 by a small modifications to locks used from the <code>java.util.concurrent</code> package. + </p> +</div><h3 id="What_is_Tribes">What is Tribes</h3><div class="text"> + <p> + Tribes is a messaging framework with group communication abilities. Tribes allows you to send and receive + messages over a network, it also allows for dynamic discovery of other nodes in the network.<br> + And that is the short story, it really is as simple as that. What makes Tribes useful and unique will be + described in the section below.<br> + </p> + <p> + The Tribes module was started early 2006 and a small part of the code base comes from the clustering module + that has been existing since 2003 or 2004. + The current cluster implementation has several short comings and many workarounds were created due + to the complexity in group communication. Long story short, what should have been two modules a long time + ago, will be now. Tribes takes out the complexity of messaging from the replication module and becomes + a fully independent and highly flexible group communication module.<br> + </p> + <p> + In Tomcat the old <code>modules/cluster</code> has now become <code>modules/groupcom</code>(Tribes) and + <code>modules/ha</code> (replication). This will allow development to proceed and let the developers + focus on the issues they are actually working on rather than getting boggled down in details of a module + they are not interested in. The understanding is that both communication and replication are complex enough, + and when trying to develop them in the same module, well you know, it becomes a cluster :)<br> + </p> + <p> + Tribes allows for guaranteed messaging, and can be customized in many ways. Why is this important?<br> + Well, you as a developer want to know that the messages you are sending are reaching their destination. + More than that, if a message doesn't reach its destination, the application on top of Tribes will be notified + that the message was never sent, and what node it failed. + </p> + +</div><h3 id="Why_another_messaging_framework">Why another messaging framework</h3><div class="text"> + <p> + I am a big fan of reusing code and would never dream of developing something if someone else has already + done it and it was available to me and the community I try to serve.<br> + When I did my research to improve the clustering module I was constantly faced with a few obstacles:<br> + 1. The framework wasn't flexible enough<br> + 2. The framework was licensed in a way that neither I nor the community could use it<br> + 3. Several features that I needed were missing<br> + 4. Messaging was guaranteed, but no feedback was reported to me<br> + 5. The semantics of my message delivery had to be configured before runtime<br> + And the list continues... + </p> + <p> + So I came up with Tribes, to address these issues and other issues that came along. + When designing Tribes I wanted to make sure I didn't lose any of the flexibility and + delivery semantics that the existing frameworks already delivered. The goal was to create a framework + that could do everything that the others already did, but to provide more flexibility for the application + developer. In the next section will give you the high level overview of what features tribes offers or will offer. + </p> +</div><h3 id="Feature_Overview">Feature Overview</h3><div class="text"> + <p> + To give you an idea of the feature set I will list it out here. + Some of the features are not yet completed, if that is the case they are marked accordingly. + </p> + <p> + <b>Pluggable modules</b><br> + Tribes is built using interfaces. Any of the modules or components that are part of Tribes can be swapped out + to customize your own Tribes implementation. + </p> + <p> + <b>Guaranteed Messaging</b><br> + In the default implementation of Tribes uses TCP or UDP for messaging. TCP already has guaranteed message delivery + and flow control built in. I believe that the performance of Java TCP, will outperform an implementation of + Java/UDP/flow-control/message guarantee since the logic happens further down the stack. UDP messaging has been added in for + sending messages over UDP instead of TCP when desired. The same guarantee scenarios as described below are still available + over UDP, however, when a UDP message is lost, it's considered failed.<br> + Tribes supports both non-blocking and blocking IO operations. The recommended setting is to use non blocking + as it promotes better parallelism when sending and receiving messages. The blocking implementation is available + for those platforms where NIO is still a trouble child. + </p> + <p> + <b>Different Guarantee Levels</b><br> + There are three different levels of delivery guarantee when a message is sent. + </p> + <ol> + <li>IO Based send guarantee. - fastest, least reliable<br> + This means that Tribes considers the message transfer to be successful + if the message was sent to the socket send buffer and accepted.<br> + On blocking IO, this would be <code>socket.getOutputStream().write(msg)</code><br> + On non blocking IO, this would be <code>socketChannel.write()</code>, and the buffer byte buffer gets emptied + followed by a <code>socketChannel.read()</code> to ensure the channel still open. + The <code>read()</code> has been added since <code>write()</code> will succeed if the connection has been "closed" + when using NIO. + </li> + <li>ACK based. - recommended, guaranteed delivery<br> + When the message has been received on a remote node, an ACK is sent back to the sender, + indicating that the message was received successfully. + </li> + <li>SYNC_ACK based. - guaranteed delivery, guaranteed processed, slowest<br> + When the message has been received on a remote node, the node will process + the message and if the message was processed successfully, an ACK is sent back to the sender + indicating that the message was received and processed successfully. + If the message was received, but processing it failed, an ACK_FAIL will be sent back + to the sender. This is a unique feature that adds an incredible amount value to the application + developer. Most frameworks here will tell you that the message was delivered, and the application + developer has to build in logic on whether the message was actually processed properly by the application + on the remote node. If configured, Tribes will throw an exception when it receives an ACK_FAIL + and associate that exception with the member that didn't process the message. + </li> + </ol> + <p> + You can of course write even more sophisticated guarantee levels, and some of them will be mentioned later on + in the documentation. One mentionable level would be a 2-Phase-Commit, where the remote applications don't receive + the message until all nodes have received the message. Sort of like a all-or-nothing protocol. + </p> + <p> + <b>Per Message Delivery Attributes</b><br> + Perhaps the feature that makes Tribes stand out from the crowd of group communication frameworks. + Tribes enables you to send to decide what delivery semantics a message transfer should have on a per + message basis. Meaning, that your messages are not delivered based on some static configuration + that remains fixed after the message framework has been started.<br> + To give you an example of how powerful this feature is, I'll try to illustrate it with a simple example. + Imagine you need to send 10 different messages, you could send them the following way: + </p> + <div class="codeBox"><pre><code>Message_1 - asynchronous and fast, no guarantee required, fire and forget +Message_2 - all-or-nothing, either all receivers get it, or none. +Message_3 - encrypted and SYNC_ACK based +Message_4 - asynchronous, SYNC_ACK and call back when the message is processed on the remote nodes +Message_5 - totally ordered, this message should be received in the same order on all nodes that have been + send totally ordered +Message_6 - asynchronous and totally ordered +Message_7 - RPC message, send a message, wait for all remote nodes to reply before returning +Message_8 - RPC message, wait for the first reply +Message_9 - RPC message, asynchronous, don't wait for a reply, collect them via a callback +Message_10- sent to a member that is not part of this group</code></pre></div> + <p> + As you can imagine by now, these are just examples. The number of different semantics you can apply on a + per-message-basis is almost limitless. Tribes allows you to set up to 28 different on a message + and then configure Tribes to what flag results in what action on the message.<br> + Imagine a shared transactional cache, probably >90% are reads, and the dirty reads should be completely + unordered and delivered as fast as possible. But transactional writes on the other hand, have to + be ordered so that no cache gets corrupted. With tribes you would send the write messages totally ordered, + while the read messages you simple fire to achieve highest throughput.<br> + There are probably better examples on how this powerful feature can be used, so use your imagination and + your experience to think of how this could benefit you in your application. + </p> + <p> + <b>Interceptor based message processing</b><br> + Tribes uses a customizable interceptor stack to process messages that are sent and received.<br> + <i>So what, all frameworks have this!</i><br> + Yes, but in Tribes interceptors can react to a message based on the per-message-attributes + that are sent runtime. Meaning, that if you add a encryption interceptor that encrypts message + you can decide if this interceptor will encrypt all messages, or only certain messages that are decided + by the applications running on top of Tribes.<br> + This is how Tribes is able to send some messages totally ordered and others fire and forget style + like the example above.<br> + The number of interceptors that are available will keep growing, and we would appreciate any contributions + that you might have. + </p> + <p> + <b>Threadless Interceptor stack</b> + The interceptor don't require any separate threads to perform their message manipulation.<br> + Messages that are sent will piggy back on the thread that is sending them all the way through transmission. + The exception is the <code>MessageDispatchInterceptor</code> that will queue up the message + and send it on a separate thread for asynchronous message delivery. + Messages received are controlled by a thread pool in the <code>receiver</code> component.<br> + The channel object can send a <code>heartbeat()</code> through the interceptor stack to allow + for timeouts, cleanup and other events.<br> + The <code>MessageDispatchInterceptor</code> is the only interceptor that is configured by default. + </p> + <p> + <b>Parallel Delivery</b><br> + Tribes support parallel delivery of messages. Meaning that node_A could send three messages to node_B in + parallel. This feature becomes useful when sending messages with different delivery semantics. + Otherwise if Message_1 was sent totally ordered, Message_2 would have to wait for that message to complete.<br> + Through NIO, Tribes is also able to send a message to several receivers at the same time on the same thread. + </p> + <p> + <b>Silent Member Messaging</b><br> + With Tribes you are able to send messages to members that are not in your group. + So by default, you can already send messages over a wide area network, even though the dynamic discover + module today is limited to local area networks by using multicast for dynamic node discovery. + Of course, the membership component will be expanded to support WAN memberships in the future. + But this is very useful, when you want to hide members from the rest of the group and only communicate with them + </p> +</div><h3 id="Where_can_I_get_Tribes">Where can I get Tribes</h3><div class="text"> + <p> + Tribes ships as a module with Tomcat, and is released as part of the Apache Tomcat release. + </p> + + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/membership.html b/src/tomcat/webapps/docs/tribes/membership.html new file mode 100644 index 0000000000000000000000000000000000000000..95a69813e0f88f827fb1fb1f4beeeef5f5e83899 --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/membership.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Membership</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/membership"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Membership</h2><h3 id="Membership">Membership</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/setup.html b/src/tomcat/webapps/docs/tribes/setup.html new file mode 100644 index 0000000000000000000000000000000000000000..b08d03e0b38207456c4550c41bbf38e4674849fa --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/setup.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Configuration</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/setup"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Configuration</h2><h3 id="Configuration_Overview">Configuration Overview</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/status.html b/src/tomcat/webapps/docs/tribes/status.html new file mode 100644 index 0000000000000000000000000000000000000000..750b829607680a072db5b25cfc42803ad2db41c6 --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/status.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Status</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/status"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Status</h2><h3 id="Status">Status</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/tribes/transport.html b/src/tomcat/webapps/docs/tribes/transport.html new file mode 100644 index 0000000000000000000000000000000000000000..dafcb99eaccdf8f97f2617088a150712392be483 --- /dev/null +++ b/src/tomcat/webapps/docs/tribes/transport.html @@ -0,0 +1,50 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="../images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tribes - The Tomcat Cluster Communication Module (9.0.6) - Apache Tribes - Transport</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/tribes/transport"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="../images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="../images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tribes - The Tomcat Cluster Communication Module</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="../index.html">Docs Home</a></li><li><a href="introduction.html">Tribes Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="faq.html">3) FAQ</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="../api/org/apache/catalina/tribes/package-summary.html">JavaDoc</a></li></ul></div><div><h2>Apache Tribes Development</h2><ul><li><a href="membership.html">Membership</a></li><li><a href="transport.html">Transport</a></li><li><a href="interceptors.html">Interceptors</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Apache Tribes - Transport</h2><h3 id="Transport">Transport</h3><div class="text"> + <p>TODO</p> +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="../comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/virtual-hosting-howto.html b/src/tomcat/webapps/docs/virtual-hosting-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..593a3b70f4ef4ffa52802ba2cd05545a3b1354bf --- /dev/null +++ b/src/tomcat/webapps/docs/virtual-hosting-howto.html @@ -0,0 +1,140 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Virtual Hosting and Tomcat</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/virtual-hosting-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Virtual Hosting and Tomcat</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Assumptions">Assumptions</a></li><li><a href="#server.xml">server.xml</a></li><li><a href="#Webapps_Directory">Webapps Directory</a></li><li><a href="#Configuring_Your_Contexts">Configuring Your Contexts</a><ol><li><a href="#General">General</a></li><li><a href="#context.xml_-_approach__1">context.xml - approach #1</a></li><li><a href="#context.xml_-_approach__2">context.xml - approach #2</a></li><li><a href="#Further_Information">Further Information</a></li></ol></li></ul> +</div><h3 id="Assumptions">Assumptions</h3><div class="text"> + <p> + For the sake of this how-to, assume you have a development host with two + host names, <code>ren</code> and <code>stimpy</code>. Let's also assume + one instance of Tomcat running, so <code>$CATALINA_HOME</code> refers to + wherever it's installed, perhaps <code>/usr/local/tomcat</code>. + </p> + <p> + Also, this how-to uses Unix-style path separators and commands; if you're + on Windows modify accordingly. + </p> + </div><h3 id="server.xml">server.xml</h3><div class="text"> + <p> + At the simplest, edit the <a href="config/engine.html">Engine</a> portion + of your <code>server.xml</code> file to look like this: + </p> + <div class="codeBox"><pre><code><Engine name="Catalina" defaultHost="ren"> + <Host name="ren" appBase="renapps"/> + <Host name="stimpy" appBase="stimpyapps"/> +</Engine></code></pre></div> + <p> + Note that the directory structures under the appBase for each host should + not overlap each other. + </p> + <p> + Consult the configuration documentation for other attributes of the + <a href="config/engine.html">Engine</a> and <a href="config/host.html"> + Host</a> elements. + </p> + </div><h3 id="Webapps_Directory">Webapps Directory</h3><div class="text"> + <p> + Create directories for each of the virtual hosts: + </p> + <div class="codeBox"><pre><code>mkdir $CATALINA_HOME/renapps +mkdir $CATALINA_HOME/stimpyapps</code></pre></div> + </div><h3 id="Configuring_Your_Contexts">Configuring Your Contexts</h3><div class="text"> + <div class="subsection"><h4 id="General">General</h4><div class="text"> + <p>Contexts are normally located underneath the appBase directory. For + example, to deploy the <code>foobar</code> context as a war file in + the <code>ren</code> host, use + <code>$CATALINA_HOME/renapps/foobar.war</code>. Note that the + default or ROOT context for <code>ren</code> would be deployed as + <code>$CATALINA_HOME/renapps/ROOT.war</code> (WAR) or + <code>$CATALINA_HOME/renapps/ROOT</code> (directory). + </p> + <p><strong>NOTE: The <code>docBase</code> for a context should never be + the same as the <code>appBase</code> for a host.</strong> + </p> + </div></div> + <div class="subsection"><h4 id="context.xml_-_approach__1">context.xml - approach #1</h4><div class="text"> + <p> + Within your Context, create a <code>META-INF</code> directory and then + place your Context definition in it in a file named + <code>context.xml</code>. i.e. + <code>$CATALINA_HOME/renapps/ROOT/META-INF/context.xml</code> + This makes deployment easier, particularly if you're distributing a WAR + file. + </p> + </div></div> + <div class="subsection"><h4 id="context.xml_-_approach__2">context.xml - approach #2</h4><div class="text"> + <p> + Create a structure under <code>$CATALINA_HOME/conf/Catalina</code> + corresponding to your virtual hosts, e.g.: + </p> + <div class="codeBox"><pre><code>mkdir $CATALINA_HOME/conf/Catalina/ren +mkdir $CATALINA_HOME/conf/Catalina/stimpy</code></pre></div> + <p> + Note that the ending directory name "Catalina" represents the + <code>name</code> attribute of the + <a href="config/engine.html">Engine</a> element as shown above. + </p> + <p> + Now, for your default webapps, add: + </p> + <div class="codeBox"><pre><code>$CATALINA_HOME/conf/Catalina/ren/ROOT.xml +$CATALINA_HOME/conf/Catalina/stimpy/ROOT.xml</code></pre></div> + <p> + If you want to use the Tomcat manager webapp for each host, you'll also + need to add it here: + </p> + <div class="codeBox"><pre><code>cd $CATALINA_HOME/conf/Catalina +cp localhost/manager.xml ren/ +cp localhost/manager.xml stimpy/</code></pre></div> + </div></div> + <div class="subsection"><h4 id="Further_Information">Further Information</h4><div class="text"> + <p> + Consult the configuration documentation for other attributes of the + <a href="config/context.html">Context</a> element. + </p> + </div></div> + </div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/web-socket-howto.html b/src/tomcat/webapps/docs/web-socket-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..1d48e2a09a243738cbaa5519f7fe8094e47359c5 --- /dev/null +++ b/src/tomcat/webapps/docs/web-socket-howto.html @@ -0,0 +1,133 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - WebSocket How-To</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/web-socket-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>WebSocket How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a></li><li><a href="#Application_development">Application development</a></li><li><a href="#Tomcat_WebSocket_specific_configuration">Tomcat WebSocket specific configuration</a></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> +<p>Tomcat provides support for WebSocket as defined by + <a href="http://tools.ietf.org/html/rfc6455">RFC 6455</a>.</p> +</div><h3 id="Application_development">Application development</h3><div class="text"> +<p>Tomcat implements the Java WebSocket 1.1 API defined by <a href="http://www.jcp.org/en/jsr/detail?id=356">JSR-356</a>.</p> + +<p>There are several example applications that demonstrate how the WebSocket API + can be used. You will need to look at both the client side <a href="http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/websocket/"> + HTML</a> and the server side <a href="http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/"> + code</a>.</p> +</div><h3 id="Tomcat_WebSocket_specific_configuration">Tomcat WebSocket specific configuration</h3><div class="text"> + +<p>Tomcat provides a number of Tomcat specific configuration options for + WebSocket. It is anticipated that these will be absorbed into the WebSocket + specification over time.</p> + +<p>The write timeout used when sending WebSocket messages in blocking mode + defaults to 20000 milliseconds (20 seconds). This may be changed by setting + the property <code>org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT</code> + in the user properties collection attached to the WebSocket session. The + value assigned to this property should be a <code>Long</code> and represents + the timeout to use in milliseconds. For an infinite timeout, use + <code>-1</code>.</p> + +<p>If the application does not define a <code>MessageHandler.Partial</code> for + incoming binary messages, any incoming binary messages must be buffered so + the entire message can be delivered in a single call to the registered + <code>MessageHandler.Whole</code> for binary messages. The default buffer + size for binary messages is 8192 bytes. This may be changed for a web + application by setting the servlet context initialization parameter + <code>org.apache.tomcat.websocket.binaryBufferSize</code> to the desired + value in bytes.</p> + +<p>If the application does not define a <code>MessageHandler.Partial</code> for + incoming text messages, any incoming text messages must be buffered so the + entire message can be delivered in a single call to the registered + <code>MessageHandler.Whole</code> for text messages. The default buffer size + for text messages is 8192 bytes. This may be changed for a web application by + setting the servlet context initialization parameter + <code>org.apache.tomcat.websocket.textBufferSize</code> to the desired value + in bytes.</p> + +<p>The Java WebSocket specification 1.0 does not permit programmatic deployment + after the first endpoint has started a WebSocket handshake. By default, + Tomcat continues to permit additional programmatic deployment. This + behavior is controlled by the + <code>org.apache.tomcat.websocket.noAddAfterHandshake</code> servlet context + initialization parameter. The default may be changed by setting the + <code>org.apache.tomcat.websocket.STRICT_SPEC_COMPLIANCE</code> system + property to <code>true</code> but any explicit setting on the servlet context + will always take priority.</p> + +<p>When using the WebSocket client to connect to server endpoints, the timeout + for IO operations while establishing the connection is controlled by the + <code>userProperties</code> of the provided + <code>javax.websocket.ClientEndpointConfig</code>. The property is + <code>org.apache.tomcat.websocket.IO_TIMEOUT_MS</code> and is the + timeout as a <code>String</code> in milliseconds. The default is 5000 (5 + seconds).</p> + +<p>When using the WebSocket client to connect to secure server endpoints, the + client SSL configuration is controlled by the <code>userProperties</code> + of the provided <code>javax.websocket.ClientEndpointConfig</code>. The + following user properties are supported:</p> + <ul> + <li><code>org.apache.tomcat.websocket.SSL_CONTEXT</code></li> + <li><code>org.apache.tomcat.websocket.SSL_PROTOCOLS</code></li> + <li><code>org.apache.tomcat.websocket.SSL_TRUSTSTORE</code></li> + <li><code>org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD</code></li> + </ul> + <p>The default truststore password is <code>changeit</code>.</p> + <p>If the <code>org.apache.tomcat.websocket.SSL_CONTEXT</code> property is + set then the <code>org.apache.tomcat.websocket.SSL_TRUSTSTORE</code> and + <code>org.apache.tomcat.websocket.SSL_TRUSTSTORE_PWD</code> properties + will be ignored.</p> + +<p>When using the WebSocket client to connect to server endpoints, the number of + HTTP redirects that the client will follow is controlled by the + <code>userProperties</code> of the provided + <code>javax.websocket.ClientEndpointConfig</code>. The property is + <ocde>org.apache.tomcat.websocket.MAX_REDIRECTIONS</ocde>. The default value + is 20. Redirection support can be disabled by configuring a value of zero.</p> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/websocketapi/index.html b/src/tomcat/webapps/docs/websocketapi/index.html new file mode 100644 index 0000000000000000000000000000000000000000..759c5a9680e10c4a564f9eff39ea8ec81e4ae5b1 --- /dev/null +++ b/src/tomcat/webapps/docs/websocketapi/index.html @@ -0,0 +1,34 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8" /> + <title>API docs</title> +</head> + +<body> + +The WebSocket Javadoc is not installed by default. Download and install +the "fulldocs" package to get it. + +You can also access the javadoc online in the Tomcat +<a href="http://tomcat.apache.org/tomcat-9.0-doc/"> +documentation bundle</a>. + +</body> +</html> diff --git a/src/tomcat/webapps/docs/windows-auth-howto.html b/src/tomcat/webapps/docs/windows-auth-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..203200e12a3e574eab0a09eab3195ea96a34b333 --- /dev/null +++ b/src/tomcat/webapps/docs/windows-auth-howto.html @@ -0,0 +1,340 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Windows Authentication How-To</title><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/windows-auth-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Windows Authentication How-To</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Overview">Overview</a></li><li><a href="#Built-in_Tomcat_support">Built-in Tomcat support</a><ol><li><a href="#Domain_Controller">Domain Controller</a></li><li><a href="#Tomcat_instance_(Windows_server)">Tomcat instance (Windows server)</a></li><li><a href="#Tomcat_instance_(Linux_server)">Tomcat instance (Linux server)</a></li><li><a href="#Web_application">Web application</a></li><li><a href="#Client">Client</a></li><li><a href="#References">References</a></li></ol></li><li><a href="#Third_party_libraries">Third party libraries</a><ol><li><a href="#Waffle">Waffle</a></li><li><a href="#Spring_Security_-_Kerberos_Extension">Spring Security - Kerberos Extension</a></li><li><a href="#SPNEGO_project_at_SourceForge">SPNEGO project at SourceForge</a></li><li><a href="#Jespa">Jespa</a></li></ol></li><li><a href="#Reverse_proxies">Reverse proxies</a><ol><li><a href="#Microsoft_IIS">Microsoft IIS</a></li><li><a href="#Apache_httpd">Apache httpd</a></li></ol></li></ul> +</div><h3 id="Overview">Overview</h3><div class="text"> +<p>Integrated Windows authentication is most frequently used within intranet +environments since it requires that the server performing the authentication and +the user being authenticated are part of the same domain. For the user to be +authenticated automatically, the client machine used by the user must also be +part of the domain.</p> +<p>There are several options for implementing integrated Windows authentication +with Apache Tomcat. They are:</p> +<ul> +<li>Built-in Tomcat support.</li> +<li>Use a third party library such as Waffle.</li> +<li>Use a reverse proxy that supports Windows authentication to perform the +authentication step such as IIS or httpd.</li> +</ul> +<p>The configuration of each of these options is discussed in the following +sections.</p> +</div><h3 id="Built-in_Tomcat_support">Built-in Tomcat support</h3><div class="text"> +<p>Kerberos (the basis for integrated Windows authentication) requires careful +configuration. If the steps in this guide are followed exactly, then a working +configuration will result. It is important that the steps below are followed +exactly. There is very little scope for flexibility in the configuration. From +the testing to date it is known that:</p> +<ul> +<li>The host name used to access the Tomcat server must match the host name in +the SPN exactly else authentication will fail. A checksum error may be reported +in the debug logs in this case.</li> +<li>The client must be of the view that the server is part of the local trusted +intranet.</li> +<li>The SPN must be HTTP/<hostname> and it must be exactly the same in all +the places it is used.</li> +<li>The port number must not be included in the SPN.</li> +<li>No more than one SPN may be mapped to a domain user.</li> +<li>Tomcat must run as the domain account with which the SPN has been associated +or as domain admin. It is <strong>NOT</strong> recommended to run Tomcat under a +domain admin user.</li> +<li>The domain name (<code>DEV.LOCAL</code>) is not case sensitive when used in +the ktpass command, nor when used in jaas.conf</li> +<li>The domain must be specified when using the ktpass command</li> +</ul> +<p>There are four components to the configuration of the built-in Tomcat +support for Windows authentication. The domain controller, the server hosting +Tomcat, the web application wishing to use Windows authentication and the client +machine. The following sections describe the configuration required for each +component.</p> +<p>The names of the three machines used in the configuration examples below are +win-dc01.dev.local (the domain controller), win-tc01.dev.local (the Tomcat +instance) and win-pc01.dev.local (client). All are members of the DEV.LOCAL +domain.</p> +<p>Note: In order to use the passwords in the steps below, the domain password +policy had to be relaxed. This is not recommended for production environments. +</p> + + <div class="subsection"><h4 id="Domain_Controller">Domain Controller</h4><div class="text"> + <p>These steps assume that the server has already been configured to act as a + domain controller. Configuration of a Windows server as a domain controller is + outside the scope of this how-to. The steps to configure the domain controller + to enable Tomcat to support Windows authentication are as follows: + </p> + <ul> + <li>Create a domain user that will be mapped to the service name used by the + Tomcat server. In this how-to, this user is called <code>tc01</code> and has a + password of <code>tc01pass</code>.</li> + <li>Map the service principal name (SPN) to the user account. SPNs take the + form <code> + <service class>/<host>:<port>/<service name></code>. + The SPN used in this how-to is <code>HTTP/win-tc01.dev.local</code>. To + map the user to the SPN, run the following: + <div class="codeBox"><pre><code>setspn -A HTTP/win-tc01.dev.local tc01</code></pre></div> + </li> + <li>Generate the keytab file that the Tomcat server will use to authenticate + itself to the domain controller. This file contains the Tomcat private key for + the service provider account and should be protected accordingly. To generate + the file, run the following command (all on a single line): + <div class="codeBox"><pre><code>ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL + /princ HTTP/win-tc01.dev.local@DEV.LOCAL + /pass tc01pass /kvno 0</code></pre></div></li> + <li>Create a domain user to be used on the client. In this how-to the domain + user is <code>test</code> with a password of <code>testpass</code>.</li> + </ul> + <p>The above steps have been tested on a domain controller running Windows + Server 2008 R2 64-bit Standard using the Windows Server 2003 functional level + for both the forest and the domain. + </p> + </div></div> + + <div class="subsection"><h4 id="Tomcat_instance_(Windows_server)">Tomcat instance (Windows server)</h4><div class="text"> + <p>These steps assume that Tomcat and a Java 6 JDK/JRE have already been + installed and configured and that Tomcat is running as the tc01@DEV.LOCAL + user. The steps to configure the Tomcat instance for Windows authentication + are as follows: + </p> + <ul> + <li>Copy the <code>tomcat.keytab</code> file created on the domain controller + to <code>$CATALINA_BASE/conf/tomcat.keytab</code>.</li> + <li>Create the kerberos configuration file + <code>$CATALINA_BASE/conf/krb5.ini</code>. The file used in this how-to + contained:<div class="codeBox"><pre><code>[libdefaults] +default_realm = DEV.LOCAL +default_keytab_name = FILE:c:\apache-tomcat-9.0.x\conf\tomcat.keytab +default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96 +default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96 +forwardable=true + +[realms] +DEV.LOCAL = { + kdc = win-dc01.dev.local:88 +} + +[domain_realm] +dev.local= DEV.LOCAL +.dev.local= DEV.LOCAL</code></pre></div> + The location of this file can be changed by setting the + <code>java.security.krb5.conf</code> system property.</li> + <li>Create the JAAS login configuration file + <code>$CATALINA_BASE/conf/jaas.conf</code>. The file used in this how-to + contained:<div class="codeBox"><pre><code>com.sun.security.jgss.krb5.initiate { + com.sun.security.auth.module.Krb5LoginModule required + doNotPrompt=true + principal="HTTP/win-tc01.dev.local@DEV.LOCAL" + useKeyTab=true + keyTab="c:/apache-tomcat-9.0.x/conf/tomcat.keytab" + storeKey=true; +}; + +com.sun.security.jgss.krb5.accept { + com.sun.security.auth.module.Krb5LoginModule required + doNotPrompt=true + principal="HTTP/win-tc01.dev.local@DEV.LOCAL" + useKeyTab=true + keyTab="c:/apache-tomcat-9.0.x/conf/tomcat.keytab" + storeKey=true; +};</code></pre></div> + The location of this file can be changed by setting the + <code>java.security.auth.login.config</code> system property. The LoginModule + used is a JVM specific one so ensure that the LoginModule specified matches + the JVM being used. The name of the login configuration must match the + value used by the <a href="config/valve.html#SPNEGO_Valve">authentication + valve</a>.</li> + </ul> + <p>The SPNEGO authenticator will work with any <a href="config/realm.html"> + Realm</a> but if used with the JNDI Realm, by default the JNDI Realm will use + the user's delegated credentials to connect to the Active Directory. + </p> + <p>The above steps have been tested on a Tomcat server running Windows Server + 2008 R2 64-bit Standard with an Oracle 1.6.0_24 64-bit JDK.</p> + </div></div> + + <div class="subsection"><h4 id="Tomcat_instance_(Linux_server)">Tomcat instance (Linux server)</h4><div class="text"> + <p>This was tested with:</p> + <ul> + <li>Java 1.7.0, update 45, 64-bit</li> + <li>Ubuntu Server 12.04.3 LTS 64-bit</li> + <li>Tomcat 8.0.x (r1546570)</li> + </ul> + <p>It should work with any Tomcat 8 release although it is recommended that + the latest stable release is used.</p> + <p>The configuration is the same as for Windows but with the following + changes:</p> + <ul> + <li>The Linux server does not have to be part of the Windows domain.</li> + <li>The path to the keytab file in krb5.ini and jaas.conf should be updated + to reflect the path to the keytab file on the Linux server using Linux + style file paths (e.g. /usr/local/tomcat/...).</li> + </ul> + </div></div> + + <div class="subsection"><h4 id="Web_application">Web application</h4><div class="text"> + <p>The web application needs to be configured to the use Tomcat specific + authentication method of <code>SPNEGO</code> (rather than BASIC etc.) in + web.xml. As with the other authenticators, behaviour can be customised by + explicitly configuring the <a href="config/valve.html#SPNEGO_Valve"> + authentication valve</a> and setting attributes on the Valve.</p> + </div></div> + + <div class="subsection"><h4 id="Client">Client</h4><div class="text"> + <p>The client must be configured to use Kerberos authentication. For Internet + Explorer this means making sure that the Tomcat instance is in the "Local + intranet" security domain and that it is configured (Tools > Internet + Options > Advanced) with integrated Windows authentication enabled. Note that + this <strong>will not</strong> work if you use the same machine for the client + and the Tomcat instance as Internet Explorer will use the unsupported NTLM + protocol.</p> + </div></div> + + <div class="subsection"><h4 id="References">References</h4><div class="text"> + <p>Correctly configuring Kerberos authentication can be tricky. The following + references may prove helpful. Advice is also always available from the + <a href="http://tomcat.apache.org/lists.html#tomcat-users">Tomcat users + mailing list</a>.</p> + <ol> + <li><a href="http://www.adopenstatic.com/cs/blogs/ken/archive/2006/10/19/512.aspx"> + IIS and Kerberos</a></li> + <li><a href="http://spnego.sourceforge.net/index.html"> + SPNEGO project at SourceForge</a></li> + <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/index.html"> + Oracle Java GSS-API tutorial (Java 7)</a></li> + <li><a href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/Troubleshooting.html"> + Oracle Java GSS-API tutorial - Troubleshooting (Java 7)</a></li> + <li><a href="https://cwiki.apache.org/confluence/display/GMOxDOC21/Using+SPNEGO+in+Geronimo#UsingSPNEGOinGeronimo-SettinguptheDomainControllerMachine"> + Geronimo configuration for Windows authentication</a></li> + <li><a href="http://blogs.msdn.com/b/openspecification/archive/2010/11/17/encryption-type-selection-in-kerberos-exchanges.aspx"> + Encryption Selection in Kerberos Exchanges</a></li> + <li><a href="http://support.microsoft.com/kb/977321">Supported Kerberos Cipher + Suites</a></li> + </ol> + </div></div> + +</div><h3 id="Third_party_libraries">Third party libraries</h3><div class="text"> + + <div class="subsection"><h4 id="Waffle">Waffle</h4><div class="text"> + <p>Full details of this solution can be found through the + <a href="http://waffle.codeplex.com/" rel="nofollow">Waffle web site</a>. The + key features are:</p> + <ul> + <li>Drop-in solution</li> + <li>Simple configuration (no JAAS or Kerberos keytab configuration required) + </li> + <li>Uses a native library</li> + </ul> + </div></div> + + <div class="subsection"><h4 id="Spring_Security_-_Kerberos_Extension">Spring Security - Kerberos Extension</h4><div class="text"> + <p>Full details of this solution can be found through the + <a href="http://static.springsource.org/spring-security/site/extensions/krb/index.html" rel="nofollow"> Kerberos extension web site</a>. The key features are:</p> + <ul> + <li>Extension to Spring Security</li> + <li>Requires a Kerberos keytab file to be generated</li> + <li>Pure Java solution</li> + </ul> + </div></div> + + <div class="subsection"><h4 id="SPNEGO_project_at_SourceForge">SPNEGO project at SourceForge</h4><div class="text"> + <p>Full details of this solution can be found through the + <a href="http://spnego.sourceforge.net/index.html/" rel="nofollow">project + site</a>. The key features are:</p> + <ul> + <li>Uses Kerberos</li> + <li>Pure Java solution</li> + </ul> + </div></div> + + <div class="subsection"><h4 id="Jespa">Jespa</h4><div class="text"> + <p>Full details of this solution can be found through the + <a href="http://www.ioplex.com/" rel="nofollow">project web site</a>The key + features are:</p> + <ul> + <li>Pure Java solution</li> + <li>Advanced Active Directory integration</li> + </ul> + </div></div> +</div><h3 id="Reverse_proxies">Reverse proxies</h3><div class="text"> + + <div class="subsection"><h4 id="Microsoft_IIS">Microsoft IIS</h4><div class="text"> + <p>There are three steps to configuring IIS to provide Windows authentication. + They are:</p> + <ol> + <li>Configure IIS as a reverse proxy for Tomcat (see the + <a href="http://tomcat.apache.org/connectors-doc/webserver_howto/iis.html"> + IIS Web Server How-To)</a>.</li> + <li>Configure IIS to use Windows authentication</li> + <li>Configure Tomcat to use the authentication user information from IIS by + setting the tomcatAuthentication attribute on the <a href="config/ajp.html"> + AJP connector</a> to <code>false</code>. Alternatively, set the + tomcatAuthorization attribute to <code>true</code> to allow IIS to + authenticate, while Tomcat performs the authorization.</li> + </ol> + </div></div> + + <div class="subsection"><h4 id="Apache_httpd">Apache httpd</h4><div class="text"> + <p>Apache httpd does not support Windows authentication out of the box but + there are a number of third-party modules that can be used. These include:</p> + <ol> + <li><a href="http://sourceforge.net/projects/mod-auth-sspi/" rel="nofollow">mod_auth_sspi</a> for use on Windows platforms.</li> + <li><a href="http://adldap.sourceforge.net/wiki/doku.php?id=mod_auth_ntlm_winbind" rel="nofollow">mod_auth_ntlm_winbind</a> for non-Windows platforms. Known to + work with httpd 2.0.x on 32-bit platforms. Some users have reported stability + issues with both httpd 2.2.x builds and 64-bit Linux builds.</li> + </ol> + <p>There are three steps to configuring httpd to provide Windows + authentication. They are:</p> + <ol> + <li>Configure httpd as a reverse proxy for Tomcat (see the + <a href="http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html"> + Apache httpd Web Server How-To)</a>.</li> + <li>Configure httpd to use Windows authentication</li> + <li>Configure Tomcat to use the authentication user information from httpd by + setting the tomcatAuthentication attribute on the <a href="config/ajp.html"> + AJP connector</a> to <code>false</code>.</li> + </ol> + </div></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/docs/windows-service-howto.html b/src/tomcat/webapps/docs/windows-service-howto.html new file mode 100644 index 0000000000000000000000000000000000000000..8f9b9d92bfc152ccf14633cd7c78da7eaccb692d --- /dev/null +++ b/src/tomcat/webapps/docs/windows-service-howto.html @@ -0,0 +1,483 @@ +<!DOCTYPE html SYSTEM "about:legacy-compat"> +<html lang="en"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link href="./images/docs-stylesheet.css" rel="stylesheet" type="text/css"><title>Apache Tomcat 9 (9.0.6) - Windows service HOW-TO</title><meta name="author" content="Mladen Turk"><script type="application/javascript" data-comments-identifier="tomcat-9.0-doc/windows-service-howto"> + "use strict"; // Enable strict mode + + (function() { + var thisScript = document.currentScript; + if (!thisScript) { // Workaround for IE <= 11 + var scripts = document.getElementsByTagName("script"); + thisScript = scripts[scripts.length - 1]; + } + document.addEventListener("DOMContentLoaded", (function() { + var commentsDiv = document.getElementById("comments_thread"); + var commentsShortname = "tomcat"; + var commentsIdentifier = "http://tomcat.apache.org/" + + thisScript.getAttribute("data-comments-identifier") + ".html"; + + (function(w, d) { + if (w.location.hostname.toLowerCase() == "tomcat.apache.org") { + var s = d.createElement("script"); + s.type = "application/javascript"; + s.async = true; + s.src = "https://comments.apache.org/show_comments.lua?site=" + + encodeURIComponent(commentsShortname) + + "&page=" + encodeURIComponent(commentsIdentifier); + d.head.appendChild(s); + } else { + commentsDiv.appendChild(d.createTextNode("Comments are disabled for this page at the moment.")); + } + })(window, document); + }), false); + })(); + </script></head><body><div id="wrapper"><header><div id="header"><div><div><div class="logo noPrint"><a href="http://tomcat.apache.org/"><img alt="Tomcat Home" src="./images/tomcat.png"></a></div><div style="height: 1px;"></div><div class="asfLogo noPrint"><a href="http://www.apache.org/" target="_blank"><img src="./images/asf-logo.svg" alt="The Apache Software Foundation" style="width: 266px; height: 83px;"></a></div><h1>Apache Tomcat 9</h1><div class="versionInfo"> + Version 9.0.6, + <time datetime="2018-03-05">Mar 5 2018</time></div><div style="height: 1px;"></div><div style="clear: left;"></div></div></div></div></header><div id="middle"><div><div id="mainLeft" class="noprint"><div><nav><div><h2>Links</h2><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://wiki.apache.org/tomcat/FAQ">FAQ</a></li><li><a href="#comments_section">User Comments</a></li></ul></div><div><h2>User Guide</h2><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="host-manager-howto.html">6) Host Manager</a></li><li><a href="realm-howto.html">7) Realms and AAA</a></li><li><a href="security-manager-howto.html">8) Security Manager</a></li><li><a href="jndi-resources-howto.html">9) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">10) JDBC DataSources</a></li><li><a href="class-loader-howto.html">11) Classloading</a></li><li><a href="jasper-howto.html">12) JSPs</a></li><li><a href="ssl-howto.html">13) SSL/TLS</a></li><li><a href="ssi-howto.html">14) SSI</a></li><li><a href="cgi-howto.html">15) CGI</a></li><li><a href="proxy-howto.html">16) Proxy Support</a></li><li><a href="means-descriptors-howto.html">17) MBeans Descriptors</a></li><li><a href="default-servlet.html">18) Default Servlet</a></li><li><a href="cluster-howto.html">19) Clustering</a></li><li><a href="balancer-howto.html">20) Load Balancer</a></li><li><a href="connectors.html">21) Connectors</a></li><li><a href="monitoring.html">22) Monitoring and Management</a></li><li><a href="logging.html">23) Logging</a></li><li><a href="apr.html">24) APR/Native</a></li><li><a href="virtual-hosting-howto.html">25) Virtual Hosting</a></li><li><a href="aio.html">26) Advanced IO</a></li><li><a href="extras.html">27) Additional Components</a></li><li><a href="maven-jars.html">28) Mavenized</a></li><li><a href="security-howto.html">29) Security Considerations</a></li><li><a href="windows-service-howto.html">30) Windows Service</a></li><li><a href="windows-auth-howto.html">31) Windows Authentication</a></li><li><a href="jdbc-pool.html">32) Tomcat's JDBC Pool</a></li><li><a href="web-socket-howto.html">33) WebSocket</a></li><li><a href="rewrite.html">34) Rewrite</a></li></ul></div><div><h2>Reference</h2><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Tomcat Javadocs</a></li><li><a href="servletapi/index.html">Servlet Javadocs</a></li><li><a href="jspapi/index.html">JSP 2.3 Javadocs</a></li><li><a href="elapi/index.html">EL 3.0 Javadocs</a></li><li><a href="websocketapi/index.html">WebSocket 1.1 Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul></div><div><h2>Apache Tomcat Development</h2><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="http://wiki.apache.org/tomcat/TomcatVersions">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li><li><a href="tribes/introduction.html">Tribes</a></li></ul></div></nav></div></div><div id="mainRight"><div id="content"><h2>Windows service HOW-TO</h2><h3 id="Table_of_Contents">Table of Contents</h3><div class="text"> +<ul><li><a href="#Tomcat_service_application">Tomcat service application</a></li><li><a href="#Tomcat_monitor_application">Tomcat monitor application</a></li><li><a href="#Command_line_arguments">Command line arguments</a></li><li><a href="#Command_line_parameters">Command line parameters</a></li><li><a href="#Installing_services">Installing services</a></li><li><a href="#Updating_services">Updating services</a></li><li><a href="#Removing_services">Removing services</a></li><li><a href="#Debugging_services">Debugging services</a></li><li><a href="#Multiple_Instances">Multiple Instances</a></li></ul> +</div><h3 id="Tomcat_service_application">Tomcat service application</h3><div class="text"> +<p> + <b>Tomcat9</b> is a service application for running Tomcat + 9 as a Windows service. +</p> +</div><h3 id="Tomcat_monitor_application">Tomcat monitor application</h3><div class="text"> +<p> + <b>Tomcat9w</b> is a GUI application for monitoring and + configuring Tomcat services. +</p> + <p>The available command line options are:</p> + + <table class="defaultTable"> + <tr><td><b>//ES//</b></td> + <td>Edit service configuration</td> + <td>This is the default operation. It is called if the no option is + provided but the executable is renamed to <b>servicenameW.exe</b></td> + </tr> + <tr><td><b>//MS//</b></td> + <td>Monitor service</td> + <td>Put the icon in the system tray</td> + </tr> + </table> + +</div><h3 id="Command_line_arguments">Command line arguments</h3><div class="text"> +<p> + Each command line directive is in the form of <b>//XX//ServiceName</b> +</p> + <p>The available command line options are:</p> + + <table class="defaultTable"> + <tr><td><b>//TS//</b></td> + <td>Run the service as console application</td> + <td>This is the default operation. It is called if the no option is + provided. The ServiceName is the name of the executable without + exe suffix, meaning Tomcat9</td> + </tr> + <tr><td><b>//RS//</b></td> + <td>Run the service</td> + <td>Called only from ServiceManager</td> + </tr> + <tr><td><b>//SS//</b></td> + <td>Stop the service</td> + <td></td> + </tr> + <tr><td><b>//US//</b></td> + <td>Update service parameters</td> + <td></td> + </tr> + <tr><td><b>//IS//</b></td> + <td>Install service</td> + <td></td> + </tr> + <tr><td><b>//DS//</b></td> + <td>Delete service</td> + <td>Stops the service if running</td> + </tr> + </table> + +</div><h3 id="Command_line_parameters">Command line parameters</h3><div class="text"> +<p> + Each command line parameter is prefixed with <b>--</b>. If the command line + parameter is prefixed with <b>++</b> then it's value will be appended to the + existing option. + If the environment variable with the same name as command line parameter but + prefixed with <code>PR_</code> exists it will take precedence. + For example:</p> +<div class="codeBox"><pre><code>set PR_CLASSPATH=xx.jar</code></pre></div> + +<p>is equivalent to providing</p> +<div class="codeBox"><pre><code>--Classpath=xx.jar</code></pre></div> +<p> as command line parameter.</p> + + <table class="defaultTable"> + <tr> + <th>ParameterName</th> + <th>Default</th> + <th>Description</th> + </tr> + <tr> + <td>--Description</td> + <td></td> + <td>Service name description (maximum 1024 characters)</td> + </tr> + <tr> + <td>--DisplayName</td> + <td>ServiceName</td> + <td>Service display name</td> + </tr> + <tr> + <td>--Install</td> + <td>procrun.exe //RS//ServiceName</td> + <td>Install image</td> + </tr> + <tr> + <td>--Startup</td> + <td>manual</td> + <td>Service startup mode can be either <b>auto</b> or <b>manual</b></td> + </tr> + <tr> + <td>--DependsOn</td> + <td></td> + <td>List of services that this service depend on. Dependent services + are separated using either <b>#</b> or <b>;</b> characters</td> + </tr> + <tr> + <td>--Environment</td> + <td></td> + <td>List of environment variables that will be provided to the service + in the form <b>key=value</b>. They are separated using either + <b>#</b> or <b>;</b> characters. If you need to use either the <b>#</b> + or <b>;</b> character within a value then the entire value must be + enclosed inside single quotes.</td> + </tr> + <tr> + <td>--User</td> + <td></td> + <td>User account used for running executable. It is used only for + StartMode <b>java</b> or <b>exe</b> and enables running applications + as service under account without LogonAsService privilege.</td> + </tr> + <tr> + <td>--Password</td> + <td></td> + <td>Password for user account set by --User parameter</td> + </tr> + <tr> + <td>--JavaHome</td> + <td>JAVA_HOME</td> + <td>Set a different JAVA_HOME than defined by JAVA_HOME environment + variable</td> + </tr> + <tr> + <td>--Jvm</td> + <td>auto</td> + <td>Use either <b>auto</b> (i.e. find the JVM from the Windows registry) + or specify the full path to the <b>jvm.dll</b>. + You can use the environment variable expansion here.</td> + </tr> + <tr> + <td>--JvmOptions</td> + <td>-Xrs</td> + <td>List of options in the form of <b>-D</b> or <b>-X</b> that will be + passed to the JVM. The options are separated using either + <b>#</b> or <b>;</b> characters. If you need to embed either <b>#</b> or + <b>;</b> characters, put them inside single quotes. (Not used in + <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--JvmOptions9</td> + <td></td> + <td>List of options in the form of <b>-D</b> or <b>-X</b> that will be + passed to the JVM when running on Java 9 or later. The options are + separated using either <b>#</b> or <b>;</b> characters. If you need to + embed either <b>#</b> or <b>;</b> characters, put them inside single + quotes. (Not used in <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--Classpath</td> + <td></td> + <td>Set the Java classpath. (Not used in <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--JvmMs</td> + <td></td> + <td>Initial memory pool size in MB. (Not used in <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--JvmMx</td> + <td></td> + <td>Maximum memory pool size in MB. (Not used in <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--JvmSs</td> + <td></td> + <td>Thread stack size in KB. (Not used in <b>exe</b> mode.)</td> + </tr> + <tr> + <td>--StartMode</td> + <td></td> + <td>One of <b>jvm</b>, <b>Java</b> or <b>exe</b>. The modes are: + <ul> + <li>jvm - start Java in-process. Depends on jvm.dll, see <b>--Jvm</b>.</li> + <li>Java - same as exe, but automatically uses the default Java + executable, i.e. %JAVA_HOME%\bin\java.exe. Make sure JAVA_HOME is set + correctly, or use --JavaHome to provide the correct location. + If neither is set, procrun will try to find the default JDK (not JRE) + from the Windows registry.</li> + <li>exe - run the image as a separate process</li> + </ul> + </td> + </tr> + <tr> + <td>--StartImage</td> + <td></td> + <td>Executable that will be run. Only applies to <b>exe</b> mode.</td> + </tr> + <tr> + <td>--StartPath</td> + <td></td> + <td>Working path for the start image executable.</td> + </tr> + <tr> + <td>--StartClass</td> + <td>Main</td> + <td>Class that contains the startup method. Applies to the <b>jvm</b> and + <b>Java</b> modes. (Not used in <b>exe</b> mode.) </td> + </tr> + <tr> + <td>--StartMethod</td> + <td>main</td> + <td>Method name if differs then main</td> + </tr> + <tr> + <td>--StartParams</td> + <td></td> + <td>List of parameters that will be passed to either StartImage or + StartClass. Parameters are separated using either <b>#</b> or + <b>;</b> character.</td> + </tr> + <tr> + <td>--StopMode</td> + <td></td> + <td>One of <b>jvm</b>, <b>Java</b> or <b>exe</b>. See <b>--StartMode</b> + for further details. </td> + </tr> + <tr> + <td>--StopImage</td> + <td></td> + <td>Executable that will be run on Stop service signal. Only applies to + <b>exe</b> mode.</td> + </tr> + <tr> + <td>--StopPath</td> + <td></td> + <td>Working path for the stop image executable. Does not apply to <b>jvm</b> + mode.</td> + </tr> + <tr> + <td>--StopClass</td> + <td>Main</td> + <td>Class that will be used on Stop service signal. Applies to the + <b>jvm</b> and <b>Java</b> modes. </td> + </tr> + <tr> + <td>--StopMethod</td> + <td>main</td> + <td>Method name if differs then main</td> + </tr> + <tr> + <td>--StopParams</td> + <td></td> + <td>List of parameters that will be passed to either StopImage or + StopClass. Parameters are separated using either <b>#</b> or + <b>;</b> character.</td> + </tr> + <tr> + <td>--StopTimeout</td> + <td>No Timeout</td> + <td>Defines the timeout in seconds that procrun waits for service to + exit gracefully.</td> + </tr> + <tr> + <td>--LogPath</td> + <td>%SystemRoot%\System32\LogFiles\Apache</td> + <td>Defines the path for logging. Creates the directory if necessary.</td> + </tr> + <tr> + <td>--LogPrefix</td> + <td>commons-daemon</td> + <td>Defines the service log filename prefix. The log file is created in the + LogPath directory with <code>.YEAR-MONTH-DAY.log</code> suffix</td> + </tr> + <tr> + <td>--LogLevel</td> + <td>Info</td> + <td>Defines the logging level and can be either <b>Error</b>, + <b>Info</b>, <b>Warn</b> or <b>Debug</b>. (Case insensitive).</td> + </tr> + <tr> + <td>--StdOutput</td> + <td></td> + <td>Redirected stdout filename. + If named <b>auto</b> then file is created inside <b>LogPath</b> with the + name <b>service-stdout.YEAR-MONTH-DAY.log</b>.</td> + </tr> + <tr> + <td>--StdError</td> + <td></td> + <td>Redirected stderr filename. + If named <b>auto</b> then file is created inside <b>LogPath</b> with the + name <b>service-stderr.YEAR-MONTH-DAY.log</b>.</td> + </tr> + <tr> + <td>--PidFile</td> + <td></td> + <td>Defines the file name for storing the running process id. Actual file is + created in the <b>LogPath</b> directory</td> + </tr> + </table> + +</div><h3 id="Installing_services">Installing services</h3><div class="text"> +<p> +The safest way to manually install the service is to use the provided +<b>service.bat</b> script. Administrator privileges are required to run this +script. If necessary, you can use the <code>/user</code> switch to specify +a user to use for the installation of the service. +</p> +<p> +<strong>NOTE:</strong> On Windows Vista or any later operating system with User +Account Control (UAC) enabled you will be asked for additional privileges +when 'Tomcat9.exe' is launched by the script.<br> +If you want to pass additional options to service installer as +<code>PR_*</code> environment variables, you have to either configure them +globally in OS, or launch the program that sets them with elevated privileges +(e.g. right-click on cmd.exe and select "Run as administrator"; on Windows 8 +(or later) or Windows Server 2012 (or later), you can open an elevated command +prompt for the current directory from the Explorer +by clicking on the "File" menu bar). See issue <a href="http://bz.apache.org/bugzilla/show_bug.cgi?id=56143">56143</a> for details. +</p> + +<div class="codeBox"><pre><code>Install the service named 'Tomcat9' +C:\> service.bat install</code></pre></div> + +<p>There is a 2nd optional parameter that lets you specify the name of the +service, as displayed in Windows services.</p> + +<div class="codeBox"><pre><code>Install the service named 'MyService' +C:\> service.bat install MyService</code></pre></div> + +<p> +If using tomcat9.exe, you need to use the <b>//IS//</b> parameter.</p> + +<div class="codeBox"><pre><code>Install the service named 'Tomcat9' +C:\> tomcat9 //IS//Tomcat9 --DisplayName="Apache Tomcat 9" ^ + --Install="C:\Program Files\Tomcat\bin\tomcat9.exe" --Jvm=auto ^ + --StartMode=jvm --StopMode=jvm ^ + --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start ^ + --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop</code></pre></div> + +</div><h3 id="Updating_services">Updating services</h3><div class="text"> +<p> +To update the service parameters, you need to use the <b>//US//</b> parameter. +</p> + +<div class="codeBox"><pre><code>Update the service named 'Tomcat9' +C:\> tomcat9 //US//Tomcat9 --Description="Apache Tomcat Server - http://tomcat.apache.org/ " ^ + --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar</code></pre></div> + +<p>If you gave the service an optional name, you need to specify it like this: +</p> + +<div class="codeBox"><pre><code>Update the service named 'MyService' +C:\> tomcat9 //US//MyService --Description="Apache Tomcat Server - http://tomcat.apache.org/ " ^ + --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar</code></pre></div> + +</div><h3 id="Removing_services">Removing services</h3><div class="text"> +<p> +To remove the service, you need to use the <b>//DS//</b> parameter.<br> +If the service is running it will be stopped and then deleted.</p> + +<div class="codeBox"><pre><code>Remove the service named 'Tomcat9' +C:\> tomcat9 //DS//Tomcat9</code></pre></div> + +<p>If you gave the service an optional name, you need to specify it like this: +</p> + +<div class="codeBox"><pre><code>Remove the service named 'MyService' +C:\> tomcat9 //DS//MyService</code></pre></div> + +</div><h3 id="Debugging_services">Debugging services</h3><div class="text"> +<p> +To run the service in console mode, you need to use the <b>//TS//</b> parameter. +The service shutdown can be initiated by pressing <b>CTRL+C</b> or +<b>CTRL+BREAK</b>. +If you rename the tomcat9.exe to testservice.exe then you can just execute the +testservice.exe and this command mode will be executed by default.</p> + +<div class="codeBox"><pre><code>Run the service named 'Tomcat9' in console mode +C:\> tomcat9 //TS//Tomcat9 [additional arguments] +Or simply execute: +C:\> tomcat9</code></pre></div> + +</div><h3 id="Multiple_Instances">Multiple Instances</h3><div class="text"> +<p> +Tomcat supports installation of multiple instances. You can have a single +installation of Tomcat with multiple instances running on different IP/port +combinations, or multiple Tomcat versions, each running one or more instances on +different IP/ports.</p> +<p> +Each instance folder will need the following structure: +</p> +<ul> +<li>conf</li> +<li>logs</li> +<li>temp</li> +<li>webapps</li> +<li>work</li> +</ul> +<p> +At a minimum, conf should contain a copy of the following files from +CATALINA_HOME\conf\. Any files not copied and edited, will be picked up by +default from CATALINA_HOME\conf, i.e. CATALINA_BASE\conf files override defaults +from CATALINA_HOME\conf.</p> +<ul> +<li>server.xml</li> +<li>web.xml</li> +</ul> +<p> +You must edit CATALINA_BASE\conf\server.xml to specify a unique IP/port for the +instance to listen on. Find the line that contains +<code><Connector port="8080" ...</code> and add an address attribute and/or +update the port number so as to specify a unique IP/port combination.</p> +<p> +To install an instance, first set the CATALINA_HOME environment variable to the +name of the Tomcat installation directory. Then create a second environment +variable CATALINA_BASE and point this to the instance folder. Then run "service +install" command specifying a service name.</p> + +<div class="codeBox"><pre><code>set CATALINA_HOME=c:\tomcat_9 +set CATALINA_BASE=c:\tomcat_9\instances\instance1 +service install instance1</code></pre></div> + +<p> +To modify the service settings, you can run <b>tomcat9w //ES//instance1</b>. +</p> +<p> +For additional instances, create additional instance folder, update the +CATALINA_BASE environment variable, and run the service install again.</p> + +<div class="codeBox"><pre><code>set CATALINA_BASE=c:\tomcat_9\instances\instance2 +service install instance2</code></pre></div> + +</div><div class="noprint"><h3 id="comments_section"> + Comments + </h3><div class="text"><p class="notice"><strong>Notice: </strong>This comments section collects your suggestions + on improving documentation for Apache Tomcat.<br><br> + If you have trouble and need help, read + <a href="http://tomcat.apache.org/findhelp.html">Find Help</a> page + and ask your question on the tomcat-users + <a href="http://tomcat.apache.org/lists.html">mailing list</a>. + Do not ask such questions here. This is not a Q&A section.<br><br> + The Apache Comments System is explained <a href="./comments.html">here</a>. + Comments may be removed by our moderators if they are either + implemented or considered invalid/off-topic. + </p><div id="comments_thread"></div></div></div></div></div></div></div><footer><div id="footer"> + Copyright © 1999-2018, The Apache Software Foundation + </div></footer></div></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class new file mode 100644 index 0000000000000000000000000000000000000000..3eaa6cf3e322ff2e63c9b8158933272fb782c5d2 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java new file mode 100644 index 0000000000000000000000000000000000000000..c62463becd1574da613243a21868c92db4625dd4 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/CookieExample.java @@ -0,0 +1,142 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import util.CookieFilter; +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson <duncan@eng.sun.com> + */ + +public class CookieExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings"); + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + + String cookieName = request.getParameter("cookiename"); + String cookieValue = request.getParameter("cookievalue"); + Cookie aCookie = null; + if (cookieName != null && cookieValue != null) { + aCookie = new Cookie(cookieName, cookieValue); + aCookie.setPath(request.getContextPath() + "/"); + response.addCookie(aCookie); + } + + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + String title = RB.getString("cookies.title"); + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // relative links + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../cookies.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + + out.println("<h3>" + title + "</h3>"); + + Cookie[] cookies = request.getCookies(); + if ((cookies != null) && (cookies.length > 0)) { + HttpSession session = request.getSession(false); + String sessionId = null; + if (session != null) { + sessionId = session.getId(); + } + out.println(RB.getString("cookies.cookies") + "<br>"); + for (int i = 0; i < cookies.length; i++) { + Cookie cookie = cookies[i]; + String cName = cookie.getName(); + String cValue = cookie.getValue(); + out.print("Cookie Name: " + HTMLFilter.filter(cName) + "<br>"); + out.println(" Cookie Value: " + + HTMLFilter.filter(CookieFilter.filter(cName, cValue, sessionId)) + + "<br><br>"); + } + } else { + out.println(RB.getString("cookies.no-cookies")); + } + + if (aCookie != null) { + out.println("<P>"); + out.println(RB.getString("cookies.set") + "<br>"); + out.print(RB.getString("cookies.name") + " " + + HTMLFilter.filter(cookieName) + "<br>"); + out.print(RB.getString("cookies.value") + " " + + HTMLFilter.filter(cookieValue)); + } + + out.println("<P>"); + out.println(RB.getString("cookies.make-cookie") + "<br>"); + out.print("<form action=\""); + out.println("CookieExample\" method=POST>"); + out.print(RB.getString("cookies.name") + " "); + out.println("<input type=text length=20 name=cookiename><br>"); + out.print(RB.getString("cookies.value") + " "); + out.println("<input type=text length=20 name=cookievalue><br>"); + out.println("<input type=submit></form>"); + + + out.println("</body>"); + out.println("</html>"); + } + + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class new file mode 100644 index 0000000000000000000000000000000000000000..700988e4da0489883096bf8144ee1df8807042ec Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java new file mode 100644 index 0000000000000000000000000000000000000000..1a5ea5a68dc930f2eb4108792029cd9ae9b904d6 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/HelloWorldExample.java @@ -0,0 +1,79 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * The simplest possible servlet. + * + * @author James Duncan Davidson + */ + +public class HelloWorldExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + ResourceBundle rb = + ResourceBundle.getBundle("LocalStrings",request.getLocale()); + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + PrintWriter out = response.getWriter(); + + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + String title = rb.getString("helloworld.title"); + + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // note that all links are created to be relative. this + // ensures that we can move the web application that this + // servlet belongs to to a different place in the url + // tree and not have any harmful side effects. + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../helloworld.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + out.println("<h1>" + title + "</h1>"); + out.println("</body>"); + out.println("</html>"); + } +} + + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties new file mode 100644 index 0000000000000000000000000000000000000000..a3f97e54742e527395666b430e4d3f68eb0b74fe --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings.properties @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Default localized resources for example servlets +# This locale is en_US + +helloworld.title=Hello World! + +requestinfo.title=Request Information Example +requestinfo.label.method=Method: +requestinfo.label.requesturi=Request URI: +requestinfo.label.protocol=Protocol: +requestinfo.label.pathinfo=Path Info: +requestinfo.label.remoteaddr=Remote Address: + +requestheader.title=Request Header Example + +requestparams.title=Request Parameters Example +requestparams.params-in-req=Parameters in this request: +requestparams.no-params=No Parameters, Please enter some +requestparams.firstname=First Name: +requestparams.lastname=Last Name: + +cookies.title=Cookies Example +cookies.cookies=Your browser is sending the following cookies: +cookies.no-cookies=Your browser isn't sending any cookies +cookies.make-cookie=Create a cookie to send to your browser +cookies.name=Name: +cookies.value=Value: +cookies.set=You just sent the following cookie to your browser: + +sessions.title=Sessions Example +sessions.id=Session ID: +sessions.created=Created: +sessions.lastaccessed=Last Accessed: +sessions.data=The following data is in your session: +sessions.adddata=Add data to your session +sessions.dataname=Name of Session Attribute: +sessions.datavalue=Value of Session Attribute: diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_en.properties b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..a3f97e54742e527395666b430e4d3f68eb0b74fe --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_en.properties @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Default localized resources for example servlets +# This locale is en_US + +helloworld.title=Hello World! + +requestinfo.title=Request Information Example +requestinfo.label.method=Method: +requestinfo.label.requesturi=Request URI: +requestinfo.label.protocol=Protocol: +requestinfo.label.pathinfo=Path Info: +requestinfo.label.remoteaddr=Remote Address: + +requestheader.title=Request Header Example + +requestparams.title=Request Parameters Example +requestparams.params-in-req=Parameters in this request: +requestparams.no-params=No Parameters, Please enter some +requestparams.firstname=First Name: +requestparams.lastname=Last Name: + +cookies.title=Cookies Example +cookies.cookies=Your browser is sending the following cookies: +cookies.no-cookies=Your browser isn't sending any cookies +cookies.make-cookie=Create a cookie to send to your browser +cookies.name=Name: +cookies.value=Value: +cookies.set=You just sent the following cookie to your browser: + +sessions.title=Sessions Example +sessions.id=Session ID: +sessions.created=Created: +sessions.lastaccessed=Last Accessed: +sessions.data=The following data is in your session: +sessions.adddata=Add data to your session +sessions.dataname=Name of Session Attribute: +sessions.datavalue=Value of Session Attribute: diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties new file mode 100644 index 0000000000000000000000000000000000000000..025a3ff757110ee25ef57a4f7cfa362cff378e5b --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_es.properties @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +helloworld.title = Hola Mundo! +requestinfo.title = Ejemplo de Informacion de Requerimiento: +requestinfo.label.method = M\u00E9todo: +requestinfo.label.requesturi = URI de Requerimiento: +requestinfo.label.protocol = Protocolo: +requestinfo.label.pathinfo = Info de Ruta: +requestinfo.label.remoteaddr = Direccion Remota: +requestheader.title = Ejemplo de Cabecera de Requerimiento: +requestparams.title = Ejemplo de par\u00E1metros de Requerimiento: +requestparams.params-in-req = Par\u00E1metros en este Request: +requestparams.no-params = No hay p\u00E1rametro. Por favor, usa alguno +requestparams.firstname = Nombre: +requestparams.lastname = Apellidos: +cookies.title = Ejemplo de Cookies +cookies.cookies = Tu navegador est\u00E1 enviando los siguientes cookies: +cookies.no-cookies = Tu navegador no est\u00E1 enviando cookies +cookies.make-cookie = Crea un cookie para enviarlo a tu navegador +cookies.name = Nombre: +cookies.value = Valor: +cookies.set = Acabas de enviar a tu navegador estos cookies: +sessions.title = Ejemplo de Sesiones +sessions.id = ID de Sesi\u00F3n: +sessions.created = Creado: +sessions.lastaccessed = Ultimo Acceso: +sessions.data = Lo siguientes datos est\u00E1n en tu sesi\u00F3n: +sessions.adddata = A\u00F1ade datos a tu sesi\u00F3n: +sessions.dataname = Nombre del atributo de sesi\u00F3n: +sessions.datavalue = Valor del atributo de sesi\u00F3n: diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b6b9a3f5950c6175114c0687f3746b1b8428b8a6 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Default localized resources for example servlets +# This locale is fr_FR + +helloworld.title=Salut le Monde! + +requestinfo.title=Exemple d''information sur la requ\u00eate +requestinfo.label.method=M\u00e9thode: +requestinfo.label.requesturi=URI de requ\u00eate: +requestinfo.label.protocol=Protocole: +requestinfo.label.pathinfo=Info de chemin: +requestinfo.label.remoteaddr=Adresse distante: + +requestheader.title=Exemple d''information sur les ent\u00eate de requ\u00eate + +requestparams.title=Exemple de requ\u00eate avec param\u00eatres +requestparams.params-in-req=Param\u00eatres dans la requ\u00eate: +requestparams.no-params=Pas de param\u00eatre, merci dans saisir quelqu'uns +requestparams.firstname=Pr\u00e9nom: +requestparams.lastname=Nom: + +cookies.title=Exemple d''utilisation de Cookies +cookies.cookies=Votre navigateur retourne les cookies suivant: +cookies.no-cookies=Votre navigateur ne retourne aucun cookie +cookies.make-cookie=Cr\u00e9ation d''un cookie \u00e0 retourner \u00e0 votre navigateur +cookies.name=Nom: +cookies.value=Valeur: +cookies.set=Vous venez d''envoyer le cookie suivant \u00e0 votre navigateur: + +sessions.title=Exemple de Sessions +sessions.id=ID de Session: +sessions.created=Cr\u00e9e le: +sessions.lastaccessed=Dernier acc\u00e8s: +sessions.data=Les donn\u00e9es existantes dans votre session: +sessions.adddata=Ajouter des donn\u00e9es \u00e0 votre session +sessions.dataname=Nom de l''Attribut de Session: +sessions.datavalue=Valeur de l''Attribut de Session: diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties new file mode 100644 index 0000000000000000000000000000000000000000..919643e7eb4a5e98527c15376159ff981f2852fd --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Default localized resources for example servlets +# This locale is pt_PT + +helloworld.title=Ola Mundo! + +requestinfo.title=Exemplo da Informacao do Pedido +requestinfo.label.method=Metodo: +requestinfo.label.requesturi=URI do Pedido: +requestinfo.label.protocol=Protocolo: +requestinfo.label.pathinfo=Informacao do Caminho: +requestinfo.label.remoteaddr=Endereco Remoto: + +requestheader.title=Exemplo da Cebeceira do Pedido + +requestparams.title=Examplo de Parametros do Pedido +requestparams.params-in-req=Parametros neste pedido: +requestparams.no-params=Sem Parametros, Por favor entre alguns +requestparams.firstname=Primeiro Nome: +requestparams.lastname=Apelido: + +cookies.title=CExamplo de Cookies +cookies.cookies=O se browser esta a enviar os seguintes cookies: +cookies.no-cookies=O seu browser nao esta a enviar nenhuns cookies +cookies.make-cookie=Crie um cookie para enviar para o seu browser +cookies.name=Nome: +cookies.value=Valor: +cookies.set=Acabou de enviar o seguinte cookie para o seu browser: + +sessions.title=Examplo de sessoes +sessions.id=Identificador da Sessao: +sessions.created=Criada: +sessions.lastaccessed=Ultima vez acedida: +sessions.data=Os seguintes dados fazem parte da sua sessao: +sessions.adddata=Adicione data a sua sessao +sessions.dataname=Nome do atributo da sessao: +sessions.datavalue=Valor do atributo da Sessao: diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class new file mode 100644 index 0000000000000000000000000000000000000000..a171788b8c2cbc8bf33cecc9c9ea40fbe5356d91 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java new file mode 100644 index 0000000000000000000000000000000000000000..79e7bac116b77e379afce92b1075cf333f403300 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/RequestHeaderExample.java @@ -0,0 +1,109 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; +import java.util.Locale; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import util.CookieFilter; +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson <duncan@eng.sun.com> + */ + +public class RequestHeaderExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings"); + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + String title = RB.getString("requestheader.title"); + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // all links relative + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../reqheaders.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + + out.println("<h3>" + title + "</h3>"); + out.println("<table border=0>"); + Enumeration<String> e = request.getHeaderNames(); + while (e.hasMoreElements()) { + String headerName = e.nextElement(); + String headerValue = request.getHeader(headerName); + out.println("<tr><td bgcolor=\"#CCCCCC\">"); + out.println(HTMLFilter.filter(headerName)); + out.println("</td><td>"); + if (headerName.toLowerCase(Locale.ENGLISH).contains("cookie")) { + HttpSession session = request.getSession(false); + String sessionId = null; + if (session != null) { + sessionId = session.getId(); + } + out.println(HTMLFilter.filter(CookieFilter.filter(headerValue, sessionId))); + } else { + out.println(HTMLFilter.filter(headerValue)); + } + out.println("</td></tr>"); + } + out.println("</table>"); + } + + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class new file mode 100644 index 0000000000000000000000000000000000000000..736ef4fce82cd7e913105352d7bd46a2bb8581dc Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java new file mode 100644 index 0000000000000000000000000000000000000000..952e5012fbf1a463b838dc85a98aa4a15943345d --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/RequestInfoExample.java @@ -0,0 +1,118 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import util.HTMLFilter; + +/** + * Example servlet showing request information. + * + * @author James Duncan Davidson <duncan@eng.sun.com> + */ + +public class RequestInfoExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings"); + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + String title = RB.getString("requestinfo.title"); + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // img stuff not req'd for source code html showing + // all links relative! + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../reqinfo.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + + out.println("<h3>" + title + "</h3>"); + out.println("<table border=0><tr><td>"); + out.println(RB.getString("requestinfo.label.method")); + out.println("</td><td>"); + out.println(HTMLFilter.filter(request.getMethod())); + out.println("</td></tr><tr><td>"); + out.println(RB.getString("requestinfo.label.requesturi")); + out.println("</td><td>"); + out.println(HTMLFilter.filter(request.getRequestURI())); + out.println("</td></tr><tr><td>"); + out.println(RB.getString("requestinfo.label.protocol")); + out.println("</td><td>"); + out.println(HTMLFilter.filter(request.getProtocol())); + out.println("</td></tr><tr><td>"); + out.println(RB.getString("requestinfo.label.pathinfo")); + out.println("</td><td>"); + out.println(HTMLFilter.filter(request.getPathInfo())); + out.println("</td></tr><tr><td>"); + out.println(RB.getString("requestinfo.label.remoteaddr")); + out.println("</td><td>"); + out.println(HTMLFilter.filter(request.getRemoteAddr())); + out.println("</td></tr>"); + + String cipherSuite= + (String)request.getAttribute("javax.servlet.request.cipher_suite"); + if(cipherSuite!=null){ + out.println("<tr><td>"); + out.println("SSLCipherSuite:"); + out.println("</td><td>"); + out.println(HTMLFilter.filter(cipherSuite)); + out.println("</td></tr>"); + } + + out.println("</table>"); + } + + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class new file mode 100644 index 0000000000000000000000000000000000000000..e725b08a06b5e3738a7c9fc84e4336a60f26e827 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java new file mode 100644 index 0000000000000000000000000000000000000000..be07415add464680d9458576ab3ab820330f29d7 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/RequestParamExample.java @@ -0,0 +1,111 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson <duncan@eng.sun.com> + */ + +public class RequestParamExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings"); + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + String title = RB.getString("requestparams.title"); + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // img stuff not req'd for source code html showing + + // all links relative + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../reqparams.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + + out.println("<h3>" + title + "</h3>"); + String firstName = request.getParameter("firstname"); + String lastName = request.getParameter("lastname"); + out.println(RB.getString("requestparams.params-in-req") + "<br>"); + if (firstName != null || lastName != null) { + out.println(RB.getString("requestparams.firstname")); + out.println(" = " + HTMLFilter.filter(firstName) + "<br>"); + out.println(RB.getString("requestparams.lastname")); + out.println(" = " + HTMLFilter.filter(lastName)); + } else { + out.println(RB.getString("requestparams.no-params")); + } + out.println("<P>"); + out.print("<form action=\""); + out.print("RequestParamExample\" "); + out.println("method=POST>"); + out.println(RB.getString("requestparams.firstname")); + out.println("<input type=text size=20 name=firstname>"); + out.println("<br>"); + out.println(RB.getString("requestparams.lastname")); + out.println("<input type=text size=20 name=lastname>"); + out.println("<br>"); + out.println("<input type=submit>"); + out.println("</form>"); + + out.println("</body>"); + out.println("</html>"); + } + + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class b/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class new file mode 100644 index 0000000000000000000000000000000000000000..19e1f65ac5b77862fb4ca9631f9aeb43c3b72d2f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java b/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java new file mode 100644 index 0000000000000000000000000000000000000000..53faba2e5f470776cb60e43e26f7ab2838b31656 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/ServletToJsp.java @@ -0,0 +1,39 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ServletToJsp extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + public void doGet (HttpServletRequest request, + HttpServletResponse response) { + + try { + // Set the attribute and Forward to hello.jsp + request.setAttribute ("servletName", "servletToJsp"); + getServletConfig().getServletContext().getRequestDispatcher( + "/jsp/jsptoserv/hello.jsp").forward(request, response); + } catch (Exception ex) { + ex.printStackTrace (); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class b/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class new file mode 100644 index 0000000000000000000000000000000000000000..c5aaed9b6e7bc3fc4ba501b96bfafca71ed42670 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java b/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java new file mode 100644 index 0000000000000000000000000000000000000000..471b66bd68fc1f647c9cce760ff7301088d16afd --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/SessionExample.java @@ -0,0 +1,147 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Date; +import java.util.Enumeration; +import java.util.ResourceBundle; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson <duncan@eng.sun.com> + */ + +public class SessionExample extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final ResourceBundle RB = ResourceBundle.getBundle("LocalStrings"); + + @Override + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.println("<!DOCTYPE html><html>"); + out.println("<head>"); + out.println("<meta charset=\"UTF-8\" />"); + + + String title = RB.getString("sessions.title"); + out.println("<title>" + title + "</title>"); + out.println("</head>"); + out.println("<body bgcolor=\"white\">"); + + // img stuff not req'd for source code html showing + // relative links everywhere! + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println("<a href=\"../sessions.html\">"); + out.println("<img src=\"../images/code.gif\" height=24 " + + "width=24 align=right border=0 alt=\"view code\"></a>"); + out.println("<a href=\"../index.html\">"); + out.println("<img src=\"../images/return.gif\" height=24 " + + "width=24 align=right border=0 alt=\"return\"></a>"); + + out.println("<h3>" + title + "</h3>"); + + HttpSession session = request.getSession(true); + out.println(RB.getString("sessions.id") + " " + session.getId()); + out.println("<br>"); + out.println(RB.getString("sessions.created") + " "); + out.println(new Date(session.getCreationTime()) + "<br>"); + out.println(RB.getString("sessions.lastaccessed") + " "); + out.println(new Date(session.getLastAccessedTime())); + + String dataName = request.getParameter("dataname"); + String dataValue = request.getParameter("datavalue"); + if (dataName != null && dataValue != null) { + session.setAttribute(dataName, dataValue); + } + + out.println("<P>"); + out.println(RB.getString("sessions.data") + "<br>"); + Enumeration<String> names = session.getAttributeNames(); + while (names.hasMoreElements()) { + String name = names.nextElement(); + String value = session.getAttribute(name).toString(); + out.println(HTMLFilter.filter(name) + " = " + + HTMLFilter.filter(value) + "<br>"); + } + + out.println("<P>"); + out.print("<form action=\""); + out.print(response.encodeURL("SessionExample")); + out.print("\" "); + out.println("method=POST>"); + out.println(RB.getString("sessions.dataname")); + out.println("<input type=text size=20 name=dataname>"); + out.println("<br>"); + out.println(RB.getString("sessions.datavalue")); + out.println("<input type=text size=20 name=datavalue>"); + out.println("<br>"); + out.println("<input type=submit>"); + out.println("</form>"); + + out.println("<P>GET based form:<br>"); + out.print("<form action=\""); + out.print(response.encodeURL("SessionExample")); + out.print("\" "); + out.println("method=GET>"); + out.println(RB.getString("sessions.dataname")); + out.println("<input type=text size=20 name=dataname>"); + out.println("<br>"); + out.println(RB.getString("sessions.datavalue")); + out.println("<input type=text size=20 name=datavalue>"); + out.println("<br>"); + out.println("<input type=submit>"); + out.println("</form>"); + + out.print("<p><a href=\""); + out.print(HTMLFilter.filter(response.encodeURL("SessionExample?dataname=foo&datavalue=bar"))); + out.println("\" >URL encoded </a>"); + + out.println("</body>"); + out.println("</html>"); + } + + @Override + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8acd1a2e156f95005782f7a830446f0a8876131c Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class new file mode 100644 index 0000000000000000000000000000000000000000..85dc797627630a1ebe7b1d83f7bb6faf368c5554 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java new file mode 100644 index 0000000000000000000000000000000000000000..5bc0ee49acbe8fb92d2e105d512e516580f9ee3e --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async0.java @@ -0,0 +1,71 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package async; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +public class Async0 extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(Async0.class); + + @Override + protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { + if (Boolean.TRUE.equals(req.getAttribute("dispatch"))) { + log.info("Received dispatch, completing on the worker thread."); + log.info("After complete called started:"+req.isAsyncStarted()); + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); + resp.getWriter().write("Async dispatch worked: " + sdf.format(date) + "\n"); + } else { + resp.setContentType("text/plain"); + final AsyncContext actx = req.startAsync(); + actx.setTimeout(Long.MAX_VALUE); + Runnable run = new Runnable() { + @Override + public void run() { + try { + req.setAttribute("dispatch", Boolean.TRUE); + Thread.currentThread().setName("Async0-Thread"); + log.info("Putting AsyncThread to sleep"); + Thread.sleep(2*1000); + log.info("Dispatching"); + actx.dispatch(); + }catch (InterruptedException x) { + log.error("Async1",x); + }catch (IllegalStateException x) { + log.error("Async1",x); + } + } + }; + Thread t = new Thread(run); + t.start(); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b0a213b4037df84a9a8a8557fe40fc859e4b5828 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class new file mode 100644 index 0000000000000000000000000000000000000000..782d9060da6643a6252ad8e70277fdffb9f8a6b5 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java new file mode 100644 index 0000000000000000000000000000000000000000..dc0dc5912e881bd0ddb15de5d1b0df6a1d6cd0b9 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async1.java @@ -0,0 +1,62 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package async; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +public class Async1 extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(Async1.class); + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final AsyncContext actx = req.startAsync(); + actx.setTimeout(30*1000); + Runnable run = new Runnable() { + @Override + public void run() { + try { + String path = "/jsp/async/async1.jsp"; + Thread.currentThread().setName("Async1-Thread"); + log.info("Putting AsyncThread to sleep"); + Thread.sleep(2*1000); + log.info("Dispatching to "+path); + actx.dispatch(path); + }catch (InterruptedException x) { + log.error("Async1",x); + }catch (IllegalStateException x) { + log.error("Async1",x); + } + } + }; + Thread t = new Thread(run); + t.start(); + } + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class new file mode 100644 index 0000000000000000000000000000000000000000..5ec6697f00e8279e757114d40775fbc94f6a7955 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class new file mode 100644 index 0000000000000000000000000000000000000000..93b0ffe171b6182fc9b4ca501738f1e427f7b1f2 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java new file mode 100644 index 0000000000000000000000000000000000000000..0682d62116ab49713f18e01c6f570b43b3eccea2 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async2.java @@ -0,0 +1,70 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package async; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +public class Async2 extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(Async2.class); + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + final AsyncContext actx = req.startAsync(); + actx.setTimeout(30*1000); + Runnable run = new Runnable() { + @Override + public void run() { + try { + Thread.currentThread().setName("Async2-Thread"); + log.info("Putting AsyncThread to sleep"); + Thread.sleep(2*1000); + log.info("Writing data."); + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); + actx.getResponse().getWriter().write( + "Output from background thread. Time: " + sdf.format(date) + "\n"); + actx.complete(); + }catch (InterruptedException x) { + log.error("Async2",x); + }catch (IllegalStateException x) { + log.error("Async2",x); + }catch (IOException x) { + log.error("Async2",x); + } + } + }; + Thread t = new Thread(run); + t.start(); + } + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class new file mode 100644 index 0000000000000000000000000000000000000000..dc2870effd5b3e43524708c348083bae1c23d022 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java new file mode 100644 index 0000000000000000000000000000000000000000..e1ff5e0411b48259d50bb74cb13ca1b6100eaa65 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/Async3.java @@ -0,0 +1,39 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package async; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class Async3 extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final AsyncContext actx = req.startAsync(); + actx.setTimeout(30*1000); + actx.dispatch("/jsp/async/async3.jsp"); + } + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class new file mode 100644 index 0000000000000000000000000000000000000000..a0d089c7a09b0c9abe35910141dab5173a85790a Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java new file mode 100644 index 0000000000000000000000000000000000000000..685ac239fb2822c24ff184ff5724d108f4ded2c4 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockContextListener.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package async; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/* + * Ensures the Stockticker is shut down cleanly when the context stops. This + * also covers the case when the server shuts down. + */ +public class AsyncStockContextListener implements ServletContextListener { + + public static final String STOCK_TICKER_KEY = "StockTicker"; + + @Override + public void contextInitialized(ServletContextEvent sce) { + Stockticker stockticker = new Stockticker(); + ServletContext sc = sce.getServletContext(); + sc.setAttribute(STOCK_TICKER_KEY, stockticker); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + ServletContext sc = sce.getServletContext(); + Stockticker stockticker = (Stockticker) sc.getAttribute(STOCK_TICKER_KEY); + stockticker.shutdown(); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class new file mode 100644 index 0000000000000000000000000000000000000000..c0ee6aebbb9cf314f7d1a9b6256d2160b4d3b093 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..8b3ac152a1ebfe7d384064addf00f84e62e97719 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/AsyncStockServlet.java @@ -0,0 +1,149 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package async; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Iterator; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.servlet.AsyncContext; +import javax.servlet.AsyncEvent; +import javax.servlet.AsyncListener; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +import async.Stockticker.Stock; +import async.Stockticker.TickListener; + +public class AsyncStockServlet extends HttpServlet implements TickListener, AsyncListener{ + + private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(AsyncStockServlet.class); + + private static final ConcurrentLinkedQueue<AsyncContext> clients = + new ConcurrentLinkedQueue<>(); + private static final AtomicInteger clientcount = new AtomicInteger(0); + + public AsyncStockServlet() { + log.info("AsyncStockServlet created"); + } + + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if (req.isAsyncStarted()) { + req.getAsyncContext().complete(); + } else if (req.isAsyncSupported()) { + AsyncContext actx = req.startAsync(); + actx.addListener(this); + resp.setContentType("text/plain"); + clients.add(actx); + if (clientcount.incrementAndGet()==1) { + Stockticker ticker = (Stockticker) req.getServletContext().getAttribute( + AsyncStockContextListener.STOCK_TICKER_KEY); + ticker.addTickListener(this); + } + } else { + new Exception("Async Not Supported").printStackTrace(); + resp.sendError(400,"Async is not supported."); + } + } + + + @Override + public void tick(Stock stock) { + Iterator<AsyncContext> it = clients.iterator(); + while (it.hasNext()) { + AsyncContext actx = it.next(); + try { + writeStock(actx, stock); + } catch (Exception e) { + // Ignore. The async error handling will deal with this. + } + } + } + + + public void writeStock(AsyncContext actx, Stock stock) throws IOException { + HttpServletResponse response = (HttpServletResponse)actx.getResponse(); + PrintWriter writer = response.getWriter(); + writer.write("STOCK#");//make client parsing easier + writer.write(stock.getSymbol()); + writer.write("#"); + writer.write(stock.getValueAsString()); + writer.write("#"); + writer.write(stock.getLastChangeAsString()); + writer.write("#"); + writer.write(String.valueOf(stock.getCnt())); + writer.write("\n"); + writer.flush(); + response.flushBuffer(); + } + + + @Override + public void shutdown() { + // The web application is shutting down. Complete any AsyncContexts + // associated with an active client. + Iterator<AsyncContext> it = clients.iterator(); + while (it.hasNext()) { + AsyncContext actx = it.next(); + try { + actx.complete(); + } catch (Exception e) { + // Ignore. The async error handling will deal with this. + } + } + } + + + @Override + public void onComplete(AsyncEvent event) throws IOException { + if (clients.remove(event.getAsyncContext()) && clientcount.decrementAndGet()==0) { + ServletContext sc = event.getAsyncContext().getRequest().getServletContext(); + Stockticker ticker = (Stockticker) sc.getAttribute( + AsyncStockContextListener.STOCK_TICKER_KEY); + ticker.removeTickListener(this); + } + } + + @Override + public void onError(AsyncEvent event) throws IOException { + event.getAsyncContext().complete(); + } + + @Override + public void onTimeout(AsyncEvent event) throws IOException { + event.getAsyncContext().complete(); + } + + + @Override + public void onStartAsync(AsyncEvent event) throws IOException { + // NOOP + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class new file mode 100644 index 0000000000000000000000000000000000000000..28b82bb492956bd86b8da0bedcc40d79e22074d3 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$Stock.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class new file mode 100644 index 0000000000000000000000000000000000000000..3b67fbb23eec7f47bd4c2ddba785973411ec83f0 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker$TickListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class new file mode 100644 index 0000000000000000000000000000000000000000..c3235e61bbef13841a227d9e24341ec58f6abdb4 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java new file mode 100644 index 0000000000000000000000000000000000000000..e87744e357e43025795c2172f9c3c48a99dc02a4 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/async/Stockticker.java @@ -0,0 +1,207 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package async; + +import java.text.DecimalFormat; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicInteger; + +public class Stockticker implements Runnable { + public volatile boolean run = true; + protected final AtomicInteger counter = new AtomicInteger(0); + final List<TickListener> listeners = new CopyOnWriteArrayList<>(); + protected volatile Thread ticker = null; + protected volatile int ticknr = 0; + + public synchronized void start() { + run = true; + ticker = new Thread(this); + ticker.setName("Ticker Thread"); + ticker.start(); + } + + public synchronized void stop() { + // On context stop this can be called multiple times. + // NO-OP is the ticker thread is not set + // (i.e. stop() has already completed) + if (ticker == null) { + return; + } + run = false; + try { + ticker.join(); + }catch (InterruptedException x) { + Thread.interrupted(); + } + + ticker = null; + } + + public void shutdown() { + // Notify each listener of the shutdown. This enables them to + // trigger any necessary clean-up. + for (TickListener l : listeners) { + l.shutdown(); + } + // Wait for the thread to stop. This prevents warnings in the logs + // that the thread is still active when the context stops. + stop(); + } + + public void addTickListener(TickListener listener) { + if (listeners.add(listener)) { + if (counter.incrementAndGet()==1) start(); + } + + } + + public void removeTickListener(TickListener listener) { + if (listeners.remove(listener)) { + if (counter.decrementAndGet()==0) stop(); + } + } + + @Override + public void run() { + try { + + Stock[] stocks = new Stock[] { new Stock("GOOG", 435.43), + new Stock("YHOO", 27.88), new Stock("ASF", 1015.55), }; + Random r = new Random(System.currentTimeMillis()); + while (run) { + for (int j = 0; j < 1; j++) { + int i = r.nextInt() % 3; + if (i < 0) + i = i * (-1); + Stock stock = stocks[i]; + double change = r.nextDouble(); + boolean plus = r.nextBoolean(); + if (plus) { + stock.setValue(stock.getValue() + change); + } else { + stock.setValue(stock.getValue() - change); + } + stock.setCnt(++ticknr); + for (TickListener l : listeners) { + l.tick(stock); + } + + } + Thread.sleep(850); + } + } catch (InterruptedException ix) { + // Ignore + } catch (Exception x) { + x.printStackTrace(); + } + } + + + public static interface TickListener { + public void tick(Stock stock); + public void shutdown(); + } + + public static final class Stock implements Cloneable { + protected static final DecimalFormat df = new DecimalFormat("0.00"); + protected final String symbol; + protected double value = 0.0d; + protected double lastchange = 0.0d; + protected int cnt = 0; + + public Stock(String symbol, double initvalue) { + this.symbol = symbol; + this.value = initvalue; + } + + public void setCnt(int c) { + this.cnt = c; + } + + public int getCnt() { + return cnt; + } + + public String getSymbol() { + return symbol; + } + + public double getValue() { + return value; + } + + public void setValue(double value) { + double old = this.value; + this.value = value; + this.lastchange = value - old; + } + + public String getValueAsString() { + return df.format(value); + } + + public double getLastChange() { + return this.lastchange; + } + + public void setLastChange(double lastchange) { + this.lastchange = lastchange; + } + + public String getLastChangeAsString() { + return df.format(lastchange); + } + + @Override + public int hashCode() { + return symbol.hashCode(); + } + + @Override + public boolean equals(Object other) { + if (other instanceof Stock) { + return this.symbol.equals(((Stock) other).symbol); + } + + return false; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder("STOCK#"); + buf.append(getSymbol()); + buf.append("#"); + buf.append(getValueAsString()); + buf.append("#"); + buf.append(getLastChangeAsString()); + buf.append("#"); + buf.append(String.valueOf(getCnt())); + return buf.toString(); + + } + + @Override + public Object clone() { + Stock s = new Stock(this.getSymbol(), this.getValue()); + s.setLastChange(this.getLastChange()); + s.setCnt(this.cnt); + return s; + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class new file mode 100644 index 0000000000000000000000000000000000000000..7317de90e7694e563315e368b7c30544813446dd Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java new file mode 100644 index 0000000000000000000000000000000000000000..02860195e1c3a455a1f605899c444e9ba6f85c99 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entries.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cal; + +import java.util.Hashtable; + +import javax.servlet.http.HttpServletRequest; + +public class Entries { + + private final Hashtable<String, Entry> entries; + private static final String[] time = { "8am", "9am", "10am", "11am", + "12pm", "1pm", "2pm", "3pm", "4pm", "5pm", "6pm", "7pm", "8pm" }; + public static final int rows = 12; + + public Entries() { + entries = new Hashtable<>(rows); + for (int i = 0; i < rows; i++) { + entries.put(time[i], new Entry(time[i])); + } + } + + public int getRows() { + return rows; + } + + public Entry getEntry(int index) { + return this.entries.get(time[index]); + } + + public int getIndex(String tm) { + for (int i = 0; i < rows; i++) + if (tm.equals(time[i])) + return i; + return -1; + } + + public void processRequest(HttpServletRequest request, String tm) { + int index = getIndex(tm); + if (index >= 0) { + String descr = request.getParameter("description"); + entries.get(time[index]).setDescription(descr); + } + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class new file mode 100644 index 0000000000000000000000000000000000000000..faa445e3abf8355f1d9905907bac01bd31e64b83 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java new file mode 100644 index 0000000000000000000000000000000000000000..68e7fdf0fd67359d1a3cf6e52383a2c011fde197 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/cal/Entry.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cal; + +public class Entry { + + final String hour; + String description; + + public Entry(String hour) { + this.hour = hour; + this.description = ""; + + } + + public String getHour() { + return this.hour; + } + + public String getColor() { + if (description.equals("")) { + return "lightblue"; + } + return "red"; + } + + public String getDescription() { + if (description.equals("")) { + return "None"; + } + return this.description; + } + + public void setDescription(String descr) { + description = descr; + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class b/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class new file mode 100644 index 0000000000000000000000000000000000000000..62c83abcacc1cc0fd23317561325f41d2b9e6937 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java b/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java new file mode 100644 index 0000000000000000000000000000000000000000..f9cf20f05cb933c707c12f96b093661da27e5cd3 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/cal/JspCalendar.java @@ -0,0 +1,151 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package cal; + +import java.util.Calendar; +import java.util.Date; + +public class JspCalendar { + final Calendar calendar; + + public JspCalendar() { + calendar = Calendar.getInstance(); + Date trialTime = new Date(); + calendar.setTime(trialTime); + } + + + public int getYear() { + return calendar.get(Calendar.YEAR); + } + + public String getMonth() { + int m = getMonthInt(); + String[] months = new String [] { "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" }; + if (m > 12) + return "Unknown to Man"; + + return months[m - 1]; + + } + + public String getDay() { + int x = getDayOfWeek(); + String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + + if (x > 7) + return "Unknown to Man"; + + return days[x - 1]; + + } + + public int getMonthInt() { + return 1 + calendar.get(Calendar.MONTH); + } + + public String getDate() { + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + } + + public String getCurrentDate() { + Date dt = new Date (); + calendar.setTime (dt); + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + + } + + public String getNextDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() + 1); + return getDate (); + } + + public String getPrevDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() - 1); + return getDate (); + } + + public String getTime() { + return getHour() + ":" + getMinute() + ":" + getSecond(); + } + + public int getDayOfMonth() { + return calendar.get(Calendar.DAY_OF_MONTH); + } + + public int getDayOfYear() { + return calendar.get(Calendar.DAY_OF_YEAR); + } + + public int getWeekOfYear() { + return calendar.get(Calendar.WEEK_OF_YEAR); + } + + public int getWeekOfMonth() { + return calendar.get(Calendar.WEEK_OF_MONTH); + } + + public int getDayOfWeek() { + return calendar.get(Calendar.DAY_OF_WEEK); + } + + public int getHour() { + return calendar.get(Calendar.HOUR_OF_DAY); + } + + public int getMinute() { + return calendar.get(Calendar.MINUTE); + } + + + public int getSecond() { + return calendar.get(Calendar.SECOND); + } + + + public int getEra() { + return calendar.get(Calendar.ERA); + } + + public String getUSTimeZone() { + String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific", + "Mountain", "Central", "Eastern"}; + + return zones[10 + getZoneOffset()]; + } + + public int getZoneOffset() { + return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000); + } + + + public int getDSTOffset() { + return calendar.get(Calendar.DST_OFFSET)/(60*60*1000); + } + + + public int getAMPM() { + return calendar.get(Calendar.AM_PM); + } +} + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class new file mode 100644 index 0000000000000000000000000000000000000000..82894f19cbe5f9d041b1711486d5d70675e453df Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java new file mode 100644 index 0000000000000000000000000000000000000000..483bd93dd77f1d0ac4bac9c00b298544c2d98fa7 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/cal/TableBean.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cal; + +import java.util.Hashtable; + +import javax.servlet.http.HttpServletRequest; + +public class TableBean { + + final Hashtable<String, Entries> table; + final JspCalendar JspCal; + Entries entries; + String date; + String name = null; + String email = null; + boolean processError = false; + + public TableBean() { + this.table = new Hashtable<>(10); + this.JspCal = new JspCalendar(); + this.date = JspCal.getCurrentDate(); + } + + public void setName(String nm) { + this.name = nm; + } + + public String getName() { + return this.name; + } + + public void setEmail(String mail) { + this.email = mail; + } + + public String getEmail() { + return this.email; + } + + public String getDate() { + return this.date; + } + + public Entries getEntries() { + return this.entries; + } + + public void processRequest(HttpServletRequest request) { + + // Get the name and e-mail. + this.processError = false; + if (name == null || name.equals("")) + setName(request.getParameter("name")); + if (email == null || email.equals("")) + setEmail(request.getParameter("email")); + if (name == null || email == null || name.equals("") + || email.equals("")) { + this.processError = true; + return; + } + + // Get the date. + String dateR = request.getParameter("date"); + if (dateR == null) + date = JspCal.getCurrentDate(); + else if (dateR.equalsIgnoreCase("next")) + date = JspCal.getNextDate(); + else if (dateR.equalsIgnoreCase("prev")) + date = JspCal.getPrevDate(); + + entries = table.get(date); + if (entries == null) { + entries = new Entries(); + table.put(date, entries); + } + + // If time is provided add the event. + String time = request.getParameter("time"); + if (time != null) + entries.processRequest(request, time); + } + + public boolean getProcessError() { + return this.processError; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class b/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class new file mode 100644 index 0000000000000000000000000000000000000000..f89e8c18b04f25f5c68c68cb9b884388c19c7bf0 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java b/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e38269c95af5832888efaaa4f2ecae9fab013000 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java @@ -0,0 +1,31 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package checkbox; + +public class CheckTest { + + String b[] = new String[] { "1", "2", "3", "4" }; + + public String[] getFruit() { + return b; + } + + public void setFruit(String [] b) { + this.b = b; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class new file mode 100644 index 0000000000000000000000000000000000000000..4e26fba5c5d3642b19f741a1ab480461b4fe1a05 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java new file mode 100644 index 0000000000000000000000000000000000000000..7c64d94c3b9aefc6ac4ba48fab794e117d597807 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java @@ -0,0 +1,113 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package colors; + +public class ColorGameBean { + + private String background = "yellow"; + private String foreground = "red"; + private String color1 = foreground; + private String color2 = background; + private String hint = "no"; + private int attempts = 0; + private int intval = 0; + private boolean tookHints = false; + + public void processRequest() { + + // background = "yellow"; + // foreground = "red"; + + if (! color1.equals(foreground)) { + if (color1.equalsIgnoreCase("black") || + color1.equalsIgnoreCase("cyan")) { + background = color1; + } + } + + if (! color2.equals(background)) { + if (color2.equalsIgnoreCase("black") || + color2.equalsIgnoreCase("cyan")) { + foreground = color2; + } + } + + attempts++; + } + + public void setColor2(String x) { + color2 = x; + } + + public void setColor1(String x) { + color1 = x; + } + + public void setAction(String x) { + if (!tookHints) + tookHints = x.equalsIgnoreCase("Hint"); + hint = x; + } + + public String getColor2() { + return background; + } + + public String getColor1() { + return foreground; + } + + public int getAttempts() { + return attempts; + } + + public boolean getHint() { + return hint.equalsIgnoreCase("Hint"); + } + + public boolean getSuccess() { + if (background.equalsIgnoreCase("black") || + background.equalsIgnoreCase("cyan")) { + + if (foreground.equalsIgnoreCase("black") || + foreground.equalsIgnoreCase("cyan")) { + return true; + } + return false; + } + + return false; + } + + public boolean getHintTaken() { + return tookHints; + } + + public void reset() { + foreground = "red"; + background = "yellow"; + } + + public void setIntval(int value) { + intval = value; + } + + public int getIntval() { + return intval; + } +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..56a7091b7e0a924405740489de66ef60f58b036f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..fbba3c78f2eb44de6fc9fac805e956e27eceb7b5 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java @@ -0,0 +1,225 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.StringTokenizer; + +import javax.servlet.FilterChain; +import javax.servlet.GenericFilter; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Implementation of <code>javax.servlet.Filter</code> used to compress + * the ServletResponse if it is bigger than a threshold. + * + * @author Amy Roh + * @author Dmitri Valdin + */ +public class CompressionFilter extends GenericFilter { + + private static final long serialVersionUID = 1L; + + /** + * Minimal reasonable threshold. + */ + private static final int MIN_THRESHOLD = 128; + + /** + * Minimal reasonable buffer. + */ + // 8KB is what tomcat would use by default anyway + private static final int MIN_BUFFER = 8192; + + /** + * The threshold number to compress. + */ + protected int compressionThreshold = 0; + + /** + * The compression buffer size to avoid chunking. + */ + protected int compressionBuffer = 0; + + /** + * The mime types to compress. + */ + protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"}; + + /** + * Debug level for this filter. + */ + private int debug = 0; + + @Override + public void init() { + String str = getInitParameter("debug"); + if (str != null) { + debug = Integer.parseInt(str); + } + + str = getInitParameter("compressionThreshold"); + if (str != null) { + compressionThreshold = Integer.parseInt(str); + if (compressionThreshold != 0 && compressionThreshold < MIN_THRESHOLD) { + if (debug > 0) { + System.out.println("compressionThreshold should be either 0 - no compression or >= " + MIN_THRESHOLD); + System.out.println("compressionThreshold set to " + MIN_THRESHOLD); + } + compressionThreshold = MIN_THRESHOLD; + } + } + + str = getInitParameter("compressionBuffer"); + if (str != null) { + compressionBuffer = Integer.parseInt(str); + if (compressionBuffer < MIN_BUFFER) { + if (debug > 0) { + System.out.println("compressionBuffer should be >= " + MIN_BUFFER); + System.out.println("compressionBuffer set to " + MIN_BUFFER); + } + compressionBuffer = MIN_BUFFER; + } + } + + str = getInitParameter("compressionMimeTypes"); + if (str != null) { + List<String> values = new ArrayList<>(); + StringTokenizer st = new StringTokenizer(str, ","); + + while (st.hasMoreTokens()) { + String token = st.nextToken().trim(); + if (token.length() > 0) { + values.add(token); + } + } + + if (values.size() > 0) { + compressionMimeTypes = values.toArray( + new String[values.size()]); + } else { + compressionMimeTypes = null; + } + + if (debug > 0) { + System.out.println("compressionMimeTypes set to " + + Arrays.toString(compressionMimeTypes)); + } + } + } + + /** + * The <code>doFilter</code> method of the Filter is called by the container + * each time a request/response pair is passed through the chain due + * to a client request for a resource at the end of the chain. + * The FilterChain passed into this method allows the Filter to pass on the + * request and response to the next entity in the chain.<p> + * This method first examines the request to check whether the client support + * compression. <br> + * It simply just pass the request and response if there is no support for + * compression.<br> + * If the compression support is available, it creates a + * CompressionServletResponseWrapper object which compresses the content and + * modifies the header if the content length is big enough. + * It then invokes the next entity in the chain using the FilterChain object + * (<code>chain.doFilter()</code>), <br> + **/ + @Override + public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain ) + throws IOException, ServletException { + + if (debug > 0) { + System.out.println("@doFilter"); + } + + if (compressionThreshold == 0) { + if (debug > 0) { + System.out.println("doFilter got called, but compressionThreshold is set to 0 - no compression"); + } + chain.doFilter(request, response); + return; + } + + boolean supportCompression = false; + if (request instanceof HttpServletRequest) { + if (debug > 1) { + System.out.println("requestURI = " + ((HttpServletRequest)request).getRequestURI()); + } + + // Are we allowed to compress ? + String s = ((HttpServletRequest)request).getParameter("gzip"); + if ("false".equals(s)) { + if (debug > 0) { + System.out.println("got parameter gzip=false --> don't compress, just chain filter"); + } + chain.doFilter(request, response); + return; + } + + Enumeration<String> e = + ((HttpServletRequest)request).getHeaders("Accept-Encoding"); + while (e.hasMoreElements()) { + String name = e.nextElement(); + if (name.indexOf("gzip") != -1) { + if (debug > 0) { + System.out.println("supports compression"); + } + supportCompression = true; + } else { + if (debug > 0) { + System.out.println("no support for compression"); + } + } + } + } + + if (supportCompression) { + if (response instanceof HttpServletResponse) { + CompressionServletResponseWrapper wrappedResponse = + new CompressionServletResponseWrapper((HttpServletResponse)response); + wrappedResponse.setDebugLevel(debug); + wrappedResponse.setCompressionThreshold(compressionThreshold); + wrappedResponse.setCompressionBuffer(compressionBuffer); + wrappedResponse.setCompressionMimeTypes(compressionMimeTypes); + if (debug > 0) { + System.out.println("doFilter gets called with compression"); + } + try { + chain.doFilter(request, wrappedResponse); + } finally { + wrappedResponse.finishResponse(); + } + return; + } + } else { + if (debug > 0) { + System.out.println("doFilter gets called w/o compression"); + } + chain.doFilter(request, response); + return; + } + } +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class new file mode 100644 index 0000000000000000000000000000000000000000..3e30d3540dad6c08aff23605cabc7006086e30a2 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java new file mode 100644 index 0000000000000000000000000000000000000000..af1a0b9798a8f06bdf5d048c60987b641fcee296 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java @@ -0,0 +1,66 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.util.Enumeration; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Very Simple test servlet to test compression filter + * @author Amy Roh + */ +public class CompressionFilterTestServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + ServletOutputStream out = response.getOutputStream(); + response.setContentType("text/plain"); + + Enumeration<String> e = request.getHeaders("Accept-Encoding"); + while (e.hasMoreElements()) { + String name = e.nextElement(); + out.println(name); + if (name.indexOf("gzip") != -1) { + out.println("gzip supported -- able to compress"); + } + else { + out.println("gzip not supported"); + } + } + + + out.println("Compression Filter Test Servlet"); + out.println("Minimum content length for compression is 128 bytes"); + out.println("********** 32 bytes **********"); + out.println("********** 32 bytes **********"); + out.println("********** 32 bytes **********"); + out.println("********** 32 bytes **********"); + out.close(); + } + +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class new file mode 100644 index 0000000000000000000000000000000000000000..47f6ac5fa9f3df17c6929c223b63b386c1f2254f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java new file mode 100644 index 0000000000000000000000000000000000000000..ccc66073ad4fb54a427eeef0a77d4d6a8d5b8f4e --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java @@ -0,0 +1,435 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.zip.GZIPOutputStream; + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; + +/** + * Implementation of <b>ServletOutputStream</b> that works with + * the CompressionServletResponseWrapper implementation. + * + * @author Amy Roh + * @author Dmitri Valdin + */ +public class CompressionResponseStream extends ServletOutputStream { + + // ----------------------------------------------------------- Constructors + + /** + * Construct a servlet output stream associated with the specified Response. + * + * @param responseWrapper The associated response wrapper + * @param originalOutput the output stream + */ + public CompressionResponseStream( + CompressionServletResponseWrapper responseWrapper, + ServletOutputStream originalOutput) { + + super(); + closed = false; + this.response = responseWrapper; + this.output = originalOutput; + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The threshold number which decides to compress or not. + * Users can configure in web.xml to set it to fit their needs. + */ + protected int compressionThreshold = 0; + + /** + * The compression buffer size to avoid chunking + */ + protected int compressionBuffer = 0; + + /** + * The mime types to compress + */ + protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"}; + + /** + * Debug level + */ + private int debug = 0; + + /** + * The buffer through which all of our output bytes are passed. + */ + protected byte[] buffer = null; + + /** + * The number of data bytes currently in the buffer. + */ + protected int bufferCount = 0; + + /** + * The underlying gzip output stream to which we should write data. + */ + protected OutputStream gzipstream = null; + + /** + * Has this stream been closed? + */ + protected boolean closed = false; + + /** + * The response with which this servlet output stream is associated. + */ + protected final CompressionServletResponseWrapper response; + + /** + * The underlying servlet output stream to which we should write data. + */ + protected final ServletOutputStream output; + + + // --------------------------------------------------------- Public Methods + + /** + * Set debug level. + * + * @param debug The higher the number, the more detail shown. Currently the + * range 0 (none) to 3 (everything) is used. + */ + public void setDebugLevel(int debug) { + this.debug = debug; + } + + + /** + * Set the compressionThreshold number and create buffer for this size + */ + protected void setCompressionThreshold(int compressionThreshold) { + this.compressionThreshold = compressionThreshold; + buffer = new byte[this.compressionThreshold]; + if (debug > 1) { + System.out.println("compressionThreshold is set to "+ this.compressionThreshold); + } + } + + /** + * The compression buffer size to avoid chunking + */ + protected void setCompressionBuffer(int compressionBuffer) { + this.compressionBuffer = compressionBuffer; + if (debug > 1) { + System.out.println("compressionBuffer is set to "+ this.compressionBuffer); + } + } + + /** + * Set supported mime types. + * + * @param compressionMimeTypes The mimetypes that will be compressed. + */ + public void setCompressionMimeTypes(String[] compressionMimeTypes) { + this.compressionMimeTypes = compressionMimeTypes; + if (debug > 1) { + System.out.println("compressionMimeTypes is set to " + + Arrays.toString(this.compressionMimeTypes)); + } + } + + /** + * Close this output stream, causing any buffered data to be flushed and + * any further output data to throw an IOException. + */ + @Override + public void close() throws IOException { + + if (debug > 1) { + System.out.println("close() @ CompressionResponseStream"); + } + if (closed) + throw new IOException("This output stream has already been closed"); + + if (gzipstream != null) { + flushToGZip(); + gzipstream.close(); + gzipstream = null; + } else { + if (bufferCount > 0) { + if (debug > 2) { + System.out.print("output.write("); + System.out.write(buffer, 0, bufferCount); + System.out.println(")"); + } + output.write(buffer, 0, bufferCount); + bufferCount = 0; + } + } + + output.close(); + closed = true; + + } + + + /** + * Flush any buffered data for this output stream, which also causes the + * response to be committed. + */ + @Override + public void flush() throws IOException { + + if (debug > 1) { + System.out.println("flush() @ CompressionResponseStream"); + } + if (closed) { + throw new IOException("Cannot flush a closed output stream"); + } + + if (gzipstream != null) { + gzipstream.flush(); + } + + } + + public void flushToGZip() throws IOException { + + if (debug > 1) { + System.out.println("flushToGZip() @ CompressionResponseStream"); + } + if (bufferCount > 0) { + if (debug > 1) { + System.out.println("flushing out to GZipStream, bufferCount = " + bufferCount); + } + writeToGZip(buffer, 0, bufferCount); + bufferCount = 0; + } + + } + + /** + * Write the specified byte to our output stream. + * + * @param b The byte to be written + * + * @exception IOException if an input/output error occurs + */ + @Override + public void write(int b) throws IOException { + + if (debug > 1) { + System.out.println("write "+b+" in CompressionResponseStream "); + } + if (closed) + throw new IOException("Cannot write to a closed output stream"); + + if (bufferCount >= buffer.length) { + flushToGZip(); + } + + buffer[bufferCount++] = (byte) b; + + } + + + /** + * Write <code>b.length</code> bytes from the specified byte array + * to our output stream. + * + * @param b The byte array to be written + * + * @exception IOException if an input/output error occurs + */ + @Override + public void write(byte b[]) throws IOException { + + write(b, 0, b.length); + + } + + + + /** + * TODO SERVLET 3.1 + */ + @Override + public boolean isReady() { + // TODO Auto-generated method stub + return false; + } + + + /** + * TODO SERVLET 3.1 + */ + @Override + public void setWriteListener(WriteListener listener) { + // TODO Auto-generated method stub + + } + + + /** + * Write <code>len</code> bytes from the specified byte array, starting + * at the specified offset, to our output stream. + * + * @param b The byte array containing the bytes to be written + * @param off Zero-relative starting offset of the bytes to be written + * @param len The number of bytes to be written + * + * @exception IOException if an input/output error occurs + */ + @Override + public void write(byte b[], int off, int len) throws IOException { + + if (debug > 1) { + System.out.println("write, bufferCount = " + bufferCount + " len = " + len + " off = " + off); + } + if (debug > 2) { + System.out.print("write("); + System.out.write(b, off, len); + System.out.println(")"); + } + + if (closed) + throw new IOException("Cannot write to a closed output stream"); + + if (len == 0) + return; + + // Can we write into buffer ? + if (len <= (buffer.length - bufferCount)) { + System.arraycopy(b, off, buffer, bufferCount, len); + bufferCount += len; + return; + } + + // There is not enough space in buffer. Flush it ... + flushToGZip(); + + // ... and try again. Note, that bufferCount = 0 here ! + if (len <= (buffer.length - bufferCount)) { + System.arraycopy(b, off, buffer, bufferCount, len); + bufferCount += len; + return; + } + + // write direct to gzip + writeToGZip(b, off, len); + } + + public void writeToGZip(byte b[], int off, int len) throws IOException { + + if (debug > 1) { + System.out.println("writeToGZip, len = " + len); + } + if (debug > 2) { + System.out.print("writeToGZip("); + System.out.write(b, off, len); + System.out.println(")"); + } + if (gzipstream == null) { + if (debug > 1) { + System.out.println("new GZIPOutputStream"); + } + + boolean alreadyCompressed = false; + String contentEncoding = response.getHeader("Content-Encoding"); + if (contentEncoding != null) { + if (contentEncoding.contains("gzip")) { + alreadyCompressed = true; + if (debug > 0) { + System.out.println("content is already compressed"); + } + } else { + if (debug > 0) { + System.out.println("content is not compressed yet"); + } + } + } + + boolean compressibleMimeType = false; + // Check for compatible MIME-TYPE + if (compressionMimeTypes != null) { + if (startsWithStringArray(compressionMimeTypes, response.getContentType())) { + compressibleMimeType = true; + if (debug > 0) { + System.out.println("mime type " + response.getContentType() + " is compressible"); + } + } else { + if (debug > 0) { + System.out.println("mime type " + response.getContentType() + " is not compressible"); + } + } + } + + if (response.isCommitted()) { + if (debug > 1) + System.out.print("Response already committed. Using original output stream"); + gzipstream = output; + } else if (alreadyCompressed) { + if (debug > 1) + System.out.print("Response already compressed. Using original output stream"); + gzipstream = output; + } else if (!compressibleMimeType) { + if (debug > 1) + System.out.print("Response mime type is not compressible. Using original output stream"); + gzipstream = output; + } else { + response.addHeader("Content-Encoding", "gzip"); + response.setContentLength(-1); // don't use any preset content-length as it will be wrong after gzipping + response.setBufferSize(compressionBuffer); + gzipstream = new GZIPOutputStream(output); + } + } + gzipstream.write(b, off, len); + + } + + + // -------------------------------------------------------- Package Methods + + /** + * Has this response stream been closed? + * + * @return <code>true</code> if the stream has been closed, otherwise false. + */ + public boolean closed() { + return closed; + } + + + /** + * Checks if any entry in the string array starts with the specified value + * + * @param sArray the StringArray + * @param value string + */ + private boolean startsWithStringArray(String sArray[], String value) { + if (value == null) + return false; + for (int i = 0; i < sArray.length; i++) { + if (value.startsWith(sArray[i])) { + return true; + } + } + return false; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..626c503b36bbec8d9dc1cb8cc8bbe3807ba08268 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..e12859da7274390b89d95794d7b2825c64649094 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java @@ -0,0 +1,285 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * Implementation of <b>HttpServletResponseWrapper</b> that works with + * the CompressionServletResponseStream implementation.. + * + * @author Amy Roh + * @author Dmitri Valdin + */ +public class CompressionServletResponseWrapper + extends HttpServletResponseWrapper { + + // ----------------------------------------------------- Constructor + + /** + * Calls the parent constructor which creates a ServletResponse adaptor + * wrapping the given response object. + * + * @param response The response object to be wrapped. + */ + public CompressionServletResponseWrapper(HttpServletResponse response) { + super(response); + origResponse = response; + if (debug > 1) { + System.out.println("CompressionServletResponseWrapper constructor gets called"); + } + } + + + // ----------------------------------------------------- Instance Variables + + /** + * Original response + */ + protected final HttpServletResponse origResponse; + + /** + * The ServletOutputStream that has been returned by + * <code>getOutputStream()</code>, if any. + */ + protected ServletOutputStream stream = null; + + + /** + * The PrintWriter that has been returned by + * <code>getWriter()</code>, if any. + */ + protected PrintWriter writer = null; + + /** + * The threshold number to compress + */ + protected int compressionThreshold = 0; + + /** + * The compression buffer size + */ + protected int compressionBuffer = 8192; // 8KB default + + /** + * The mime types to compress + */ + protected String[] compressionMimeTypes = {"text/html", "text/xml", "text/plain"}; + + /** + * Debug level + */ + protected int debug = 0; + + /** + * keeps a copy of all headers set + */ + private final Map<String,String> headerCopies = new HashMap<>(); + + + // --------------------------------------------------------- Public Methods + + + /** + * Set threshold number. + * + * @param threshold The new compression threshold + */ + public void setCompressionThreshold(int threshold) { + if (debug > 1) { + System.out.println("setCompressionThreshold to " + threshold); + } + this.compressionThreshold = threshold; + } + + /** + * Set compression buffer. + * + * @param buffer New size of buffer to use for compressed output + */ + public void setCompressionBuffer(int buffer) { + if (debug > 1) { + System.out.println("setCompressionBuffer to " + buffer); + } + this.compressionBuffer = buffer; + } + + /** + * Set compressible mime types. + * + * @param mimeTypes The new list of mime types that will be considered for + * compression + */ + public void setCompressionMimeTypes(String[] mimeTypes) { + if (debug > 1) { + System.out.println("setCompressionMimeTypes to " + + Arrays.toString(mimeTypes)); + } + this.compressionMimeTypes = mimeTypes; + } + + /** + * Set debug level. + * + * @param debug The new debug level + */ + public void setDebugLevel(int debug) { + this.debug = debug; + } + + + /** + * Create and return a ServletOutputStream to write the content + * associated with this Response. + * + * @exception IOException if an input/output error occurs + * + * @return A new servlet output stream that compressed any data written to + * it + */ + protected ServletOutputStream createOutputStream() throws IOException { + if (debug > 1) { + System.out.println("createOutputStream gets called"); + } + + CompressionResponseStream stream = new CompressionResponseStream( + this, origResponse.getOutputStream()); + stream.setDebugLevel(debug); + stream.setCompressionThreshold(compressionThreshold); + stream.setCompressionBuffer(compressionBuffer); + stream.setCompressionMimeTypes(compressionMimeTypes); + + return stream; + } + + + /** + * Finish a response. + */ + public void finishResponse() { + try { + if (writer != null) { + writer.close(); + } else { + if (stream != null) + stream.close(); + } + } catch (IOException e) { + // Ignore + } + } + + + // ------------------------------------------------ ServletResponse Methods + + + /** + * Flush the buffer and commit this response. + * + * @exception IOException if an input/output error occurs + */ + @Override + public void flushBuffer() throws IOException { + if (debug > 1) { + System.out.println("flush buffer @ GZipServletResponseWrapper"); + } + ((CompressionResponseStream)stream).flush(); + + } + + /** + * Return the servlet output stream associated with this Response. + * + * @exception IllegalStateException if <code>getWriter</code> has + * already been called for this response + * @exception IOException if an input/output error occurs + */ + @Override + public ServletOutputStream getOutputStream() throws IOException { + + if (writer != null) + throw new IllegalStateException("getWriter() has already been called for this response"); + + if (stream == null) + stream = createOutputStream(); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getOutputStream"); + } + + return stream; + } + + /** + * Return the writer associated with this Response. + * + * @exception IllegalStateException if <code>getOutputStream</code> has + * already been called for this response + * @exception IOException if an input/output error occurs + */ + @Override + public PrintWriter getWriter() throws IOException { + + if (writer != null) + return writer; + + if (stream != null) + throw new IllegalStateException("getOutputStream() has already been called for this response"); + + stream = createOutputStream(); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getWriter"); + } + String charEnc = origResponse.getCharacterEncoding(); + if (debug > 1) { + System.out.println("character encoding is " + charEnc); + } + writer = new PrintWriter(new OutputStreamWriter(stream, charEnc)); + + return writer; + } + + @Override + public String getHeader(String name) { + return headerCopies.get(name); + } + + @Override + public void addHeader(String name, String value) { + if (headerCopies.containsKey(name)) { + String existingValue = headerCopies.get(name); + if ((existingValue != null) && (existingValue.length() > 0)) headerCopies.put(name, existingValue + "," + value); + else headerCopies.put(name, value); + } else headerCopies.put(name, value); + super.addHeader(name, value); + } + + + @Override + public void setHeader(String name, String value) { + headerCopies.put(name, value); + super.setHeader(name, value); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class b/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class new file mode 100644 index 0000000000000000000000000000000000000000..278d56278b6b768eda57ad9596265057ab2a1bed Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java b/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java new file mode 100644 index 0000000000000000000000000000000000000000..759edee10f2c15e77ef6d2b8a18c0f3daf2795d6 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/dates/JspCalendar.java @@ -0,0 +1,153 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package dates; + +import java.util.Calendar; +import java.util.Date; + +public class JspCalendar { + final Calendar calendar; + + public JspCalendar() { + calendar = Calendar.getInstance(); + Date trialTime = new Date(); + calendar.setTime(trialTime); + } + + public int getYear() { + return calendar.get(Calendar.YEAR); + } + + public String getMonth() { + int m = getMonthInt(); + String[] months = new String [] { "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" }; + if (m > 12) + return "Unknown to Man"; + + return months[m - 1]; + + } + + public String getDay() { + int x = getDayOfWeek(); + String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + + if (x > 7) + return "Unknown to Man"; + + return days[x - 1]; + + } + + public int getMonthInt() { + return 1 + calendar.get(Calendar.MONTH); + } + + public String getDate() { + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + + } + + public String getTime() { + return getHour() + ":" + getMinute() + ":" + getSecond(); + } + + public int getDayOfMonth() { + return calendar.get(Calendar.DAY_OF_MONTH); + } + + public int getDayOfYear() { + return calendar.get(Calendar.DAY_OF_YEAR); + } + + public int getWeekOfYear() { + return calendar.get(Calendar.WEEK_OF_YEAR); + } + + public int getWeekOfMonth() { + return calendar.get(Calendar.WEEK_OF_MONTH); + } + + public int getDayOfWeek() { + return calendar.get(Calendar.DAY_OF_WEEK); + } + + public int getHour() { + return calendar.get(Calendar.HOUR_OF_DAY); + } + + public int getMinute() { + return calendar.get(Calendar.MINUTE); + } + + + public int getSecond() { + return calendar.get(Calendar.SECOND); + } + + public static void main(String args[]) { + JspCalendar db = new JspCalendar(); + p("date: " + db.getDayOfMonth()); + p("year: " + db.getYear()); + p("month: " + db.getMonth()); + p("time: " + db.getTime()); + p("date: " + db.getDate()); + p("Day: " + db.getDay()); + p("DayOfYear: " + db.getDayOfYear()); + p("WeekOfYear: " + db.getWeekOfYear()); + p("era: " + db.getEra()); + p("ampm: " + db.getAMPM()); + p("DST: " + db.getDSTOffset()); + p("ZONE Offset: " + db.getZoneOffset()); + p("TIMEZONE: " + db.getUSTimeZone()); + } + + private static void p(String x) { + System.out.println(x); + } + + + public int getEra() { + return calendar.get(Calendar.ERA); + } + + public String getUSTimeZone() { + String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific", + "Mountain", "Central", "Eastern"}; + + return zones[10 + getZoneOffset()]; + } + + public int getZoneOffset() { + return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000); + } + + + public int getDSTOffset() { + return calendar.get(Calendar.DST_OFFSET)/(60*60*1000); + } + + + public int getAMPM() { + return calendar.get(Calendar.AM_PM); + } +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class b/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class new file mode 100644 index 0000000000000000000000000000000000000000..f7f8ee8dab5b79c62acfff836b182306f10e4e3f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java b/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java new file mode 100644 index 0000000000000000000000000000000000000000..82c22f6f5218c26b6933fb038b5dc80dbb9c60be --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/error/Smart.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package error; + +public class Smart { + + String name = "JSP"; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class new file mode 100644 index 0000000000000000000000000000000000000000..3be34060c2155f5b9ed86e056b209b6e8b067b19 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java new file mode 100644 index 0000000000000000000000000000000000000000..127eddf655b7eab96c9bdf3a28533192e55bed04 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java @@ -0,0 +1,74 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.BodyContent; +import javax.servlet.jsp.tagext.BodyTagSupport; +import javax.servlet.jsp.tagext.Tag; + +public abstract class ExampleTagBase extends BodyTagSupport { + + private static final long serialVersionUID = 1L; + + @Override + public void setParent(Tag parent) { + this.parent = parent; + } + + @Override + public void setBodyContent(BodyContent bodyOut) { + this.bodyOut = bodyOut; + } + + @Override + public Tag getParent() { + return this.parent; + } + + @Override + public int doStartTag() throws JspException { + return SKIP_BODY; + } + + @Override + public int doEndTag() throws JspException { + return EVAL_PAGE; + } + + + @Override + public void doInitBody() throws JspException { + // Default implementations for BodyTag methods as well + // just in case a tag decides to implement BodyTag. + } + + @Override + public int doAfterBody() throws JspException { + return SKIP_BODY; + } + + @Override + public void release() { + bodyOut = null; + pageContext = null; + parent = null; + } + + protected BodyContent bodyOut; + protected Tag parent; +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class new file mode 100644 index 0000000000000000000000000000000000000000..96da37984cde4de105a25fc85f9d5801c2b036dd Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java new file mode 100644 index 0000000000000000000000000000000000000000..f4f3050efd85f0bbd1552ab6631181d5b7784339 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTag.java @@ -0,0 +1,87 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; + +/** + * Example1: the simplest tag + * Collect attributes and call into some actions + * + * <foo att1="..." att2="...." att3="...." /> + */ + +public class FooTag extends ExampleTagBase { + + private static final long serialVersionUID = 1L; + + private final String atts[] = new String[3]; + int i = 0; + + private final void setAtt(int index, String value) { + atts[index] = value; + } + + public void setAtt1(String value) { + setAtt(0, value); + } + + public void setAtt2(String value) { + setAtt(1, value); + } + + public void setAtt3(String value) { + setAtt(2, value); + } + + /** + * Process start tag + * + * @return EVAL_BODY_INCLUDE + */ + @Override + public int doStartTag() throws JspException { + i = 0; + return EVAL_BODY_BUFFERED; + } + + @Override + public void doInitBody() throws JspException { + pageContext.setAttribute("member", atts[i]); + i++; + } + + @Override + public int doAfterBody() throws JspException { + try { + if (i == 3) { + bodyOut.writeOut(bodyOut.getEnclosingWriter()); + return SKIP_BODY; + } + + pageContext.setAttribute("member", atts[i]); + i++; + return EVAL_BODY_BUFFERED; + } catch (IOException ex) { + throw new JspTagException(ex.toString()); + } + } +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..f2b073894a0c4d83cf716e41747b8ada28f09d00 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..e3fe37118b90b88b10e9c4c2a29ad9006969f67b --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java @@ -0,0 +1,36 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import javax.servlet.jsp.tagext.TagData; +import javax.servlet.jsp.tagext.TagExtraInfo; +import javax.servlet.jsp.tagext.VariableInfo; + +public class FooTagExtraInfo extends TagExtraInfo { + @Override + public VariableInfo[] getVariableInfo(TagData data) { + return new VariableInfo[] + { + new VariableInfo("member", + "String", + true, + VariableInfo.NESTED) + }; + } +} + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class new file mode 100644 index 0000000000000000000000000000000000000000..3fcd82ce75d335f2e5b63cac64efdecd4c246356 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java new file mode 100644 index 0000000000000000000000000000000000000000..0f382804f32b52952972feac641ebb570096321c --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/LogTag.java @@ -0,0 +1,61 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; + +/** + * Log the contents of the body. Could be used to handle errors etc. + */ +public class LogTag extends ExampleTagBase { + + private static final long serialVersionUID = 1L; + + boolean toBrowser = false; + + public void setToBrowser(String value) { + if (value == null) + toBrowser = false; + else if (value.equalsIgnoreCase("true")) + toBrowser = true; + else + toBrowser = false; + } + + @Override + public int doStartTag() throws JspException { + return EVAL_BODY_BUFFERED; + } + + @Override + public int doAfterBody() throws JspException { + try { + String s = bodyOut.getString(); + System.err.println(s); + if (toBrowser) + bodyOut.writeOut(bodyOut.getEnclosingWriter()); + return SKIP_BODY; + } catch (IOException ex) { + throw new JspTagException(ex.toString()); + } + } +} + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.class new file mode 100644 index 0000000000000000000000000000000000000000..e5b66d270b4bd82a82d22161a41168e9f06f3a38 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.java new file mode 100644 index 0000000000000000000000000000000000000000..2337d7c2f892ff09b88222cf8cfd5f3a7e655e09 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ShowSource.java @@ -0,0 +1,76 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Locale; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * Display the sources of the JSP file. + */ +public class ShowSource extends TagSupport { + + private static final long serialVersionUID = 1L; + + String jspFile; + + public void setJspFile(String jspFile) { + this.jspFile = jspFile; + } + + @Override + public int doEndTag() throws JspException { + if ((jspFile.indexOf( ".." ) >= 0) || + (jspFile.toUpperCase(Locale.ENGLISH).indexOf("/WEB-INF/") != 0) || + (jspFile.toUpperCase(Locale.ENGLISH).indexOf("/META-INF/") != 0)) + throw new JspTagException("Invalid JSP file " + jspFile); + + try (InputStream in + = pageContext.getServletContext().getResourceAsStream(jspFile)) { + + if (in == null) + throw new JspTagException("Unable to find JSP file: " + jspFile); + + JspWriter out = pageContext.getOut(); + + try { + out.println("<body>"); + out.println("<pre>"); + for (int ch = in.read(); ch != -1; ch = in.read()) + if (ch == '<') + out.print("<"); + else + out.print((char) ch); + out.println("</pre>"); + out.println("</body>"); + } catch (IOException ex) { + throw new JspTagException("IOException: " + ex.toString()); + } + } catch (IOException ex2) { + throw new JspTagException("IOException: " + ex2.toString()); + } + return super.doEndTag(); + } +} + + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class new file mode 100644 index 0000000000000000000000000000000000000000..40177ee7244cfafc3fdc76d5da7d75932bc76b3f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java new file mode 100644 index 0000000000000000000000000000000000000000..b33586059d78d1b0dadeb03560f407b5b63b5435 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/examples/ValuesTag.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package examples; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * Accept and display a value. + */ +public class ValuesTag extends TagSupport { + + private static final long serialVersionUID = 1L; + + // Using "-1" as the default value, + // in the assumption that it won't be used as the value. + // Cannot use null here, because null is an important case + // that should be present in the tests. + private Object objectValue = "-1"; + private String stringValue = "-1"; + private long longValue = -1; + private double doubleValue = -1; + + public void setObject(Object objectValue) { + this.objectValue = objectValue; + } + + public void setString(String stringValue) { + this.stringValue = stringValue; + } + + public void setLong(long longValue) { + this.longValue = longValue; + } + + public void setDouble(double doubleValue) { + this.doubleValue = doubleValue; + } + + @Override + public int doEndTag() throws JspException { + JspWriter out = pageContext.getOut(); + + try { + if (!"-1".equals(objectValue)) { + out.print(objectValue); + } else if (!"-1".equals(stringValue)) { + out.print(stringValue); + } else if (longValue != -1) { + out.print(longValue); + } else if (doubleValue != -1) { + out.print(doubleValue); + } else { + out.print("-1"); + } + } catch (IOException ex) { + throw new JspTagException("IOException: " + ex.toString(), ex); + } + return super.doEndTag(); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class b/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..ef8227734b4178ddd89c91781aeaad9d018b97ed Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java b/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..3e0123b92099a0db3b795e0f4e4835fa7174c093 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java @@ -0,0 +1,102 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package filters; + + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.GenericFilter; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + + +/** + * Example filter that can be attached to either an individual servlet + * or to a URL pattern. This filter performs the following functions: + * <ul> + * <li>Attaches itself as a request attribute, under the attribute name + * defined by the value of the <code>attribute</code> initialization + * parameter.</li> + * <li>Calculates the number of milliseconds required to perform the + * servlet processing required by this request, including any + * subsequently defined filters, and logs the result to the servlet + * context log for this application. + * </ul> + * + * @author Craig McClanahan + */ +public final class ExampleFilter extends GenericFilter { + + + private static final long serialVersionUID = 1L; + + + /** + * The request attribute name under which we store a reference to ourself. + */ + private String attribute = null; + + + /** + * Time the processing that is performed by all subsequent filters in the + * current filter stack, including the ultimately invoked servlet. + * + * @param request The servlet request we are processing + * @param response The servlet response we are creating + * @param chain The filter chain we are processing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + // Store ourselves as a request attribute (if requested) + if (attribute != null) + request.setAttribute(attribute, this); + + // Time and log the subsequent processing + long startTime = System.currentTimeMillis(); + chain.doFilter(request, response); + long stopTime = System.currentTimeMillis(); + getServletContext().log(this.toString() + ": " + (stopTime - startTime) + + " milliseconds"); + } + + + @Override + public void init() throws ServletException { + this.attribute = getInitParameter("attribute"); + } + + + /** + * Return a String representation of this object. + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder("TimingFilter("); + sb.append(getFilterConfig()); + sb.append(")"); + return sb.toString(); + } +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class b/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class new file mode 100644 index 0000000000000000000000000000000000000000..f9754768350d5c5bf3ac5379061a69ed09f5ee0a Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java b/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java new file mode 100644 index 0000000000000000000000000000000000000000..edfee522bda64b2bab3c842ac0c49bff948c1a1f --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/http2/SimpleImagePush.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package http2; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.PushBuilder; + +public class SimpleImagePush extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("text/html"); + PrintWriter pw = resp.getWriter(); + + PushBuilder pb = req.newPushBuilder(); + if (pb != null) { + pb.path("servlets/images/code.gif"); + pb.push(); + pw.println("<html>"); + pw.println("<body>"); + pw.println("<p>The following image was provided via a push request.</p>"); + pw.println("<img src=\"" + req.getContextPath() + "/servlets/images/code.gif\"/>"); + pw.println("</body>"); + pw.println("</html>"); + pw.flush(); + } else { + pw.println("<html>"); + pw.println("<body>"); + pw.println("<p>Server push requests are not supported by this protocol.</p>"); + pw.println("</body>"); + pw.println("</html>"); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class new file mode 100644 index 0000000000000000000000000000000000000000..3e7c3c7872a426c187040103c6a7d35546364fec Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java new file mode 100644 index 0000000000000000000000000000000000000000..ff6a55de1a8fe038a63d16a12b53b45fb2afc09c --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java @@ -0,0 +1,44 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class BookBean { + private final String title; + private final String author; + private final String isbn; + + public BookBean( String title, String author, String isbn ) { + this.title = title; + this.author = author; + this.isbn = isbn; + } + + public String getTitle() { + return this.title; + } + + public String getAuthor() { + return this.author; + } + + public String getIsbn() { + return this.isbn; + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class new file mode 100644 index 0000000000000000000000000000000000000000..7802918f77d857539802fb00fec1b98ad8093c47 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java new file mode 100644 index 0000000000000000000000000000000000000000..4dc0a780306b286af6f4929f19d31eef93cc6034 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java @@ -0,0 +1,36 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class FooBean { + private String bar; + + public FooBean() { + bar = "Initial value"; + } + + public String getBar() { + return this.bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class new file mode 100644 index 0000000000000000000000000000000000000000..158c26160036f4e6ca3bc2d0ecb1e8bc078c1638 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java new file mode 100644 index 0000000000000000000000000000000000000000..686039c7d7fd7c1d3f220f3eb57dd4970d958baf --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/ValuesBean.java @@ -0,0 +1,52 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +/** + * Accept and display a value. + */ +public class ValuesBean { + private String string; + private double doubleValue; + private long longValue; + + public String getStringValue() { + return this.string; + } + + public void setStringValue(String string) { + this.string = string; + } + + public double getDoubleValue() { + return doubleValue; + } + + public void setDoubleValue(double doubleValue) { + this.doubleValue = doubleValue; + } + + public long getLongValue() { + return longValue; + } + + public void setLongValue(long longValue) { + this.longValue = longValue; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class new file mode 100644 index 0000000000000000000000000000000000000000..a8706a2a597968f3ee5197634c745fbf5734a37a Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java new file mode 100644 index 0000000000000000000000000000000000000000..77fdb9cff71a84542e1bdcc62bd87497bf006118 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java @@ -0,0 +1,45 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package jsp2.examples.el; + +import java.util.Locale; + +/** + * Defines the functions for the jsp2 example tag library. + * + * <p>Each function is defined as a static method.</p> + */ +public class Functions { + public static String reverse( String text ) { + return new StringBuilder( text ).reverse().toString(); + } + + public static int numVowels( String text ) { + String vowels = "aeiouAEIOU"; + int result = 0; + for( int i = 0; i < text.length(); i++ ) { + if( vowels.indexOf( text.charAt( i ) ) != -1 ) { + result++; + } + } + return result; + } + + public static String caps( String text ) { + return text.toUpperCase(Locale.ENGLISH); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class new file mode 100644 index 0000000000000000000000000000000000000000..61c5868d26db532fbfe4960aa64e249a9781ebb5 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java new file mode 100644 index 0000000000000000000000000000000000000000..c34237d6706fd02bbde0aef35f9ebb4beb650050 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java @@ -0,0 +1,58 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.DynamicAttributes; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that echoes all its attributes + */ +public class EchoAttributesTag + extends SimpleTagSupport + implements DynamicAttributes +{ + private final List<String> keys = new ArrayList<>(); + private final List<Object> values = new ArrayList<>(); + + @Override + public void doTag() throws JspException, IOException { + JspWriter out = getJspContext().getOut(); + for( int i = 0; i < keys.size(); i++ ) { + String key = keys.get( i ); + Object value = values.get( i ); + out.println( "<li>" + key + " = " + value + "</li>" ); + } + } + + @Override + public void setDynamicAttribute( String uri, String localName, + Object value ) + throws JspException + { + keys.add( localName ); + values.add( value ); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class new file mode 100644 index 0000000000000000000000000000000000000000..e0551950507db7f7166965c0aaad10d1d948834c Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java new file mode 100644 index 0000000000000000000000000000000000000000..e44d4e2fd8dee1552d5849c3f97fd80b64b8e6ea --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java @@ -0,0 +1,46 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +import jsp2.examples.BookBean; + +/** + * SimpleTag handler that pretends to search for a book, and stores + * the result in a scoped variable. + */ +public class FindBookSimpleTag extends SimpleTagSupport { + private String var; + + private static final String BOOK_TITLE = "The Lord of the Rings"; + private static final String BOOK_AUTHOR = "J. R. R. Tolkein"; + private static final String BOOK_ISBN = "0618002251"; + + @Override + public void doTag() throws JspException { + BookBean book = new BookBean( BOOK_TITLE, BOOK_AUTHOR, BOOK_ISBN ); + getJspContext().setAttribute( this.var, book ); + } + + public void setVar( String var ) { + this.var = var; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class new file mode 100644 index 0000000000000000000000000000000000000000..604018b96de2a1aa2b4551da5c477fdce81a2240 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java new file mode 100644 index 0000000000000000000000000000000000000000..f87736f9b7690620c39ecaf443a9d5b16d247f57 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java @@ -0,0 +1,34 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that prints "Hello, world!" + */ +public class HelloWorldSimpleTag extends SimpleTagSupport { + @Override + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( "Hello, world!" ); + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class new file mode 100644 index 0000000000000000000000000000000000000000..2fae40a9d97d41f0b48c956f418ca3b84caef4f1 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java new file mode 100644 index 0000000000000000000000000000000000000000..41a9f3c72a6a5fb8b31dea8e63d4fe90cf8b279b --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java @@ -0,0 +1,44 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that accepts a num attribute and + * invokes its body 'num' times. + */ +public class RepeatSimpleTag extends SimpleTagSupport { + private int num; + + @Override + public void doTag() throws JspException, IOException { + for (int i=0; i<num; i++) { + getJspContext().setAttribute("count", String.valueOf( i + 1 ) ); + getJspBody().invoke(null); + } + } + + public void setNum(int num) { + this.num = num; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class new file mode 100644 index 0000000000000000000000000000000000000000..24b2d8c1a77b8a31bcc991e98d2835ece471dbe9 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java new file mode 100644 index 0000000000000000000000000000000000000000..a39e5081683582a7aeea6dc7248f92d1bd075e14 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java @@ -0,0 +1,87 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; +import java.util.Random; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.JspFragment; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that accepts takes three attributes of type + * JspFragment and invokes then in a random order. + */ +public class ShuffleSimpleTag extends SimpleTagSupport { + // No need for this to use SecureRandom + private static final Random random = new Random(); + + private JspFragment fragment1; + private JspFragment fragment2; + private JspFragment fragment3; + + @Override + public void doTag() throws JspException, IOException { + switch(random.nextInt(6)) { + case 0: + fragment1.invoke( null ); + fragment2.invoke( null ); + fragment3.invoke( null ); + break; + case 1: + fragment1.invoke( null ); + fragment3.invoke( null ); + fragment2.invoke( null ); + break; + case 2: + fragment2.invoke( null ); + fragment1.invoke( null ); + fragment3.invoke( null ); + break; + case 3: + fragment2.invoke( null ); + fragment3.invoke( null ); + fragment1.invoke( null ); + break; + case 4: + fragment3.invoke( null ); + fragment1.invoke( null ); + fragment2.invoke( null ); + break; + case 5: + fragment3.invoke( null ); + fragment2.invoke( null ); + fragment1.invoke( null ); + break; + } + } + + public void setFragment1( JspFragment fragment1 ) { + this.fragment1 = fragment1; + } + + public void setFragment2( JspFragment fragment2 ) { + this.fragment2 = fragment2; + } + + public void setFragment3( JspFragment fragment3 ) { + this.fragment3 = fragment3; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class new file mode 100644 index 0000000000000000000000000000000000000000..1e6d797f781cb9dcc3ae30a97f93138ac63c45a6 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java new file mode 100644 index 0000000000000000000000000000000000000000..2d5db92bac348b8ff7857dcc5e5acd5127989ba0 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java @@ -0,0 +1,48 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * Displays a tile as a single cell in a table. + */ +public class TileSimpleTag extends SimpleTagSupport { + private String color; + private String label; + + @Override + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( + "<td width=\"32\" height=\"32\" bgcolor=\"" + this.color + + "\"><font color=\"#ffffff\"><center>" + this.label + + "</center></font></td>" ); + } + + public void setColor( String color ) { + this.color = color; + } + + public void setLabel( String label ) { + this.label = label; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class new file mode 100644 index 0000000000000000000000000000000000000000..5e7206733b51d20e7b430e878d35d1b2726abebe Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java new file mode 100644 index 0000000000000000000000000000000000000000..31f55452f96a830fcae154f69a19ed2f2416bafb --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/ContextListener.java @@ -0,0 +1,138 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package listeners; + + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextAttributeEvent; +import javax.servlet.ServletContextAttributeListener; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + + +/** + * Example listener for context-related application events, which were + * introduced in the 2.3 version of the Servlet API. This listener + * merely documents the occurrence of such events in the application log + * associated with our servlet context. + * + * @author Craig R. McClanahan + */ +public final class ContextListener + implements ServletContextAttributeListener, ServletContextListener { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The servlet context with which we are associated. + */ + private ServletContext context = null; + + + // --------------------------------------------------------- Public Methods + + + /** + * Record the fact that a servlet context attribute was added. + * + * @param event The servlet context attribute event + */ + @Override + public void attributeAdded(ServletContextAttributeEvent event) { + + log("attributeAdded('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was removed. + * + * @param event The servlet context attribute event + */ + @Override + public void attributeRemoved(ServletContextAttributeEvent event) { + + log("attributeRemoved('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was replaced. + * + * @param event The servlet context attribute event + */ + @Override + public void attributeReplaced(ServletContextAttributeEvent event) { + + log("attributeReplaced('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that this web application has been destroyed. + * + * @param event The servlet context event + */ + @Override + public void contextDestroyed(ServletContextEvent event) { + + log("contextDestroyed()"); + this.context = null; + + } + + + /** + * Record the fact that this web application has been initialized. + * + * @param event The servlet context event + */ + @Override + public void contextInitialized(ServletContextEvent event) { + + this.context = event.getServletContext(); + log("contextInitialized()"); + + } + + + // -------------------------------------------------------- Private Methods + + + /** + * Log a message to the servlet context application log. + * + * @param message Message to be logged + */ + private void log(String message) { + + if (context != null) + context.log("ContextListener: " + message); + else + System.out.println("ContextListener: " + message); + + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class new file mode 100644 index 0000000000000000000000000000000000000000..66b95e1992c9d69d38295b2cb7d77952de3599d1 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java new file mode 100644 index 0000000000000000000000000000000000000000..f03e48fcb2cdcc7b830624a7deb964fbba37e95b --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/listeners/SessionListener.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package listeners; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + +/** + * Example listener for context-related application events, which were + * introduced in the 2.3 version of the Servlet API. This listener merely + * documents the occurrence of such events in the application log associated + * with our servlet context. + * + * @author Craig R. McClanahan + */ +public final class SessionListener implements ServletContextListener, + HttpSessionAttributeListener, HttpSessionListener { + + // ----------------------------------------------------- Instance Variables + + /** + * The servlet context with which we are associated. + */ + private ServletContext context = null; + + // --------------------------------------------------------- Public Methods + + /** + * Record the fact that a servlet context attribute was added. + * + * @param event + * The session attribute event + */ + @Override + public void attributeAdded(HttpSessionBindingEvent event) { + + log("attributeAdded('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + /** + * Record the fact that a servlet context attribute was removed. + * + * @param event + * The session attribute event + */ + @Override + public void attributeRemoved(HttpSessionBindingEvent event) { + + log("attributeRemoved('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + /** + * Record the fact that a servlet context attribute was replaced. + * + * @param event + * The session attribute event + */ + @Override + public void attributeReplaced(HttpSessionBindingEvent event) { + + log("attributeReplaced('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + /** + * Record the fact that this web application has been destroyed. + * + * @param event + * The servlet context event + */ + @Override + public void contextDestroyed(ServletContextEvent event) { + + log("contextDestroyed()"); + this.context = null; + + } + + /** + * Record the fact that this web application has been initialized. + * + * @param event + * The servlet context event + */ + @Override + public void contextInitialized(ServletContextEvent event) { + + this.context = event.getServletContext(); + log("contextInitialized()"); + + } + + /** + * Record the fact that a session has been created. + * + * @param event + * The session event + */ + @Override + public void sessionCreated(HttpSessionEvent event) { + + log("sessionCreated('" + event.getSession().getId() + "')"); + + } + + /** + * Record the fact that a session has been destroyed. + * + * @param event + * The session event + */ + @Override + public void sessionDestroyed(HttpSessionEvent event) { + + log("sessionDestroyed('" + event.getSession().getId() + "')"); + + } + + // -------------------------------------------------------- Private Methods + + /** + * Log a message to the servlet context application log. + * + * @param message + * Message to be logged + */ + private void log(String message) { + + if (context != null) + context.log("SessionListener: " + message); + else + System.out.println("SessionListener: " + message); + + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2571444939bb866066813e811d1bd5c98386fdc4 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class new file mode 100644 index 0000000000000000000000000000000000000000..42e4e97e9e80473c55c514273703529618d91f3b Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter$CounterListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class new file mode 100644 index 0000000000000000000000000000000000000000..28abd20ac034db5770dceaa798918031d8041b27 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java new file mode 100644 index 0000000000000000000000000000000000000000..3923780216ef0a5a8b644320798ad29296c5313f --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/ByteCounter.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package nonblocking; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import javax.servlet.AsyncContext; +import javax.servlet.ReadListener; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * This doesn't do anything particularly useful - it just counts the total + * number of bytes in a request body while demonstrating how to perform + * non-blocking reads. + */ +public class ByteCounter extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + resp.getWriter().println("Try again using a POST request."); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + // Non-blocking IO requires async + AsyncContext ac = req.startAsync(); + + // Use a single listener for read and write. Listeners often need to + // share state to coordinate reads and writes and this is much easier as + // a single object. + @SuppressWarnings("unused") + CounterListener listener = new CounterListener( + ac, req.getInputStream(), resp.getOutputStream()); + } + + + /** + * Keep in mind that each call may well be on a different thread to the + * previous call. Ensure that changes in values will be visible across + * threads. There should only ever be one container thread at a time calling + * the listener. + */ + private static class CounterListener implements ReadListener, WriteListener { + + private final AsyncContext ac; + private final ServletInputStream sis; + private final ServletOutputStream sos; + + private volatile boolean readFinished = false; + private volatile long totalBytesRead = 0; + private byte[] buffer = new byte[8192]; + + private CounterListener(AsyncContext ac, ServletInputStream sis, + ServletOutputStream sos) { + this.ac = ac; + this.sis = sis; + this.sos = sos; + + // In Tomcat, the order the listeners are set controls the order + // that the first calls are made. In this case, the read listener + // will be called before the write listener. + sis.setReadListener(this); + sos.setWriteListener(this); + } + + @Override + public void onDataAvailable() throws IOException { + int read = 0; + // Loop as long as there is data to read. If isReady() returns false + // the socket will be added to the poller and onDataAvailable() will + // be called again as soon as there is more data to read. + while (sis.isReady() && read > -1) { + read = sis.read(buffer); + if (read > 0) { + totalBytesRead += read; + } + } + } + + @Override + public void onAllDataRead() throws IOException { + readFinished = true; + + // If sos is not ready to write data, the call to isReady() will + // register the socket with the poller which will trigger a call to + // onWritePossible() when the socket is ready to have data written + // to it. + if (sos.isReady()) { + onWritePossible(); + } + } + + @Override + public void onWritePossible() throws IOException { + if (readFinished) { + // Must be ready to write data if onWritePossible was called + String msg = "Total bytes written = [" + totalBytesRead + "]"; + sos.write(msg.getBytes(StandardCharsets.UTF_8)); + ac.complete(); + } + } + + @Override + public void onError(Throwable throwable) { + // Should probably log the throwable + ac.complete(); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f6b24731508674227ff818375858c9a5ae3ebe35 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class new file mode 100644 index 0000000000000000000000000000000000000000..7e41797455e4ccb024441a9264520e8ab3a0cf29 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter$NumberWriterListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class new file mode 100644 index 0000000000000000000000000000000000000000..897519b563fb1a010f7bc3ac6298c48168f56f43 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java new file mode 100644 index 0000000000000000000000000000000000000000..d7a6680a58441bc8c13e55b5c0262a9df2db3c76 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/nonblocking/NumberWriter.java @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package nonblocking; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.servlet.AsyncContext; +import javax.servlet.ReadListener; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * This doesn't do anything particularly useful - it just writes a series of + * numbers to the response body while demonstrating how to perform non-blocking + * writes. + */ +public class NumberWriter extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + // Non-blocking IO requires async + AsyncContext ac = req.startAsync(); + + // Use a single listener for read and write. Listeners often need to + // share state to coordinate reads and writes and this is much easier as + // a single object. + @SuppressWarnings("unused") + NumberWriterListener listener = new NumberWriterListener( + ac, req.getInputStream(), resp.getOutputStream()); + + } + + + /** + * Keep in mind that each call may well be on a different thread to the + * previous call. Ensure that changes in values will be visible across + * threads. There should only ever be one container thread at a time calling + * the listener. + */ + private static class NumberWriterListener implements ReadListener, + WriteListener { + + private static final int LIMIT = 10000; + + private final AsyncContext ac; + private final ServletInputStream sis; + private final ServletOutputStream sos; + private final AtomicInteger counter = new AtomicInteger(0); + + private volatile boolean readFinished = false; + private byte[] buffer = new byte[8192]; + + private NumberWriterListener(AsyncContext ac, ServletInputStream sis, + ServletOutputStream sos) { + this.ac = ac; + this.sis = sis; + this.sos = sos; + + // In Tomcat, the order the listeners are set controls the order + // that the first calls are made. In this case, the read listener + // will be called before the write listener. + sis.setReadListener(this); + sos.setWriteListener(this); + } + + @Override + public void onDataAvailable() throws IOException { + + // There should be no data to read + + int read = 0; + // Loop as long as there is data to read. If isReady() returns false + // the socket will be added to the poller and onDataAvailable() will + // be called again as soon as there is more data to read. + while (sis.isReady() && read > -1) { + read = sis.read(buffer); + if (read > 0) { + throw new IOException("Data was present in input stream"); + } + } + } + + @Override + public void onAllDataRead() throws IOException { + readFinished = true; + + // If sos is not ready to write data, the call to isReady() will + // register the socket with the poller which will trigger a call to + // onWritePossible() when the socket is ready to have data written + // to it. + if (sos.isReady()) { + onWritePossible(); + } + } + + @Override + public void onWritePossible() throws IOException { + if (readFinished) { + int i = counter.get(); + boolean ready = true; + while (i < LIMIT && ready) { + i = counter.incrementAndGet(); + String msg = String.format("%1$020d\n", Integer.valueOf(i)); + sos.write(msg.getBytes(StandardCharsets.UTF_8)); + ready = sos.isReady(); + } + + if (i == LIMIT) { + ac.complete(); + } + } + } + + @Override + public void onError(Throwable throwable) { + // Should probably log the throwable + ac.complete(); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class b/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class new file mode 100644 index 0000000000000000000000000000000000000000..61d0a650de14e33e99d3ed8536f1d35f801cba3f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java b/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java new file mode 100644 index 0000000000000000000000000000000000000000..b78bd0535827f93df8beb6ba0a381222466e9efb --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Originally written by Jason Hunter, http://www.servlets.com. + */ + +package num; + +import java.io.Serializable; +import java.util.Random; + +public class NumberGuessBean implements Serializable { + + private static final long serialVersionUID = 1L; + + private int answer; + private String hint; + private int numGuesses; + private boolean success; + private final Random random = new Random(); + + public NumberGuessBean() { + reset(); + } + + public int getAnswer() { + return answer; + } + + public void setAnswer(int answer) { + this.answer = answer; + } + + public String getHint() { + return "" + hint; + } + + public void setHint(String hint) { + this.hint = hint; + } + + public void setNumGuesses(int numGuesses) { + this.numGuesses = numGuesses; + } + + public int getNumGuesses() { + return numGuesses; + } + + public boolean getSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public void setGuess(String guess) { + numGuesses++; + + int g; + try { + g = Integer.parseInt(guess); + } catch (NumberFormatException e) { + g = -1; + } + + if (g == answer) { + success = true; + } else if (g == -1) { + hint = "a number next time"; + } else if (g < answer) { + hint = "higher"; + } else if (g > answer) { + hint = "lower"; + } + } + + public void reset() { + answer = Math.abs(random.nextInt() % 100) + 1; + success = false; + numGuesses = 0; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class b/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class new file mode 100644 index 0000000000000000000000000000000000000000..924fafe0fe50e97b585aa9f3eb9b42e1928baf8c Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java b/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java new file mode 100644 index 0000000000000000000000000000000000000000..bad0cb9c2bb744000b0e9186b899c564b18b00ea --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/sessions/DummyCart.java @@ -0,0 +1,65 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package sessions; + +import java.util.Vector; + +public class DummyCart { + final Vector<String> v = new Vector<>(); + String submit = null; + String item = null; + + private void addItem(String name) { + v.addElement(name); + } + + private void removeItem(String name) { + v.removeElement(name); + } + + public void setItem(String name) { + item = name; + } + + public void setSubmit(String s) { + submit = s; + } + + public String[] getItems() { + String[] s = new String[v.size()]; + v.copyInto(s); + return s; + } + + public void processRequest() { + // null value for submit - user hit enter instead of clicking on + // "add" or "remove" + if (submit == null || submit.equals("add")) + addItem(item); + else if (submit.equals("remove")) + removeItem(item); + + // reset at the end of the request + reset(); + } + + // reset + private void reset() { + submit = null; + item = null; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$1.class new file mode 100644 index 0000000000000000000000000000000000000000..1e51d36d89307dbf2578c0ddd68349b97a3b6195 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$TrailerFieldSupplier.class b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$TrailerFieldSupplier.class new file mode 100644 index 0000000000000000000000000000000000000000..99cf8d8787a1b83df707fea3876c4b89d075d4a0 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers$TrailerFieldSupplier.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.class b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.class new file mode 100644 index 0000000000000000000000000000000000000000..55fc7e644a29cc935d9cea2e76e52b4d9eb1962f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java new file mode 100644 index 0000000000000000000000000000000000000000..437fb7c8d495f830aad035a96d466646c2dc9835 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/trailers/ResponseTrailers.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package trailers; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * This example writes some trailer fields to the HTTP response. + */ +public class ResponseTrailers extends HttpServlet { + + private static final long serialVersionUID = 1L; + private static final Supplier<Map<String,String>> TRAILER_FIELD_SUPPLIER = + new TrailerFieldSupplier(); + + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + resp.setTrailerFields(TRAILER_FIELD_SUPPLIER); + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + + PrintWriter pw = resp.getWriter(); + + pw.print("This response should include trailer fields."); + } + + + private static class TrailerFieldSupplier implements Supplier<Map<String,String>> { + + private static final Map<String,String> trailerFields = new HashMap<>(); + + static { + trailerFields.put("x-trailer-1", "Trailer value one"); + trailerFields.put("x-trailer-2", "Trailer value two"); + } + + @Override + public Map<String, String> get() { + return trailerFields; + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class b/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..10b6a407057618932fd3fa6933761744c998048b Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java b/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..19243eeb636ecad55830de54484b02dc7a39834c --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/util/CookieFilter.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package util; + +import java.util.Locale; +import java.util.StringTokenizer; + +/** + * Processes a cookie header and attempts to obfuscate any cookie values that + * represent session IDs from other web applications. Since session cookie names + * are configurable, as are session ID lengths, this filter is not expected to + * be 100% effective. + * + * It is required that the examples web application is removed in security + * conscious environments as documented in the Security How-To. This filter is + * intended to reduce the impact of failing to follow that advice. A failure by + * this filter to obfuscate a session ID or similar value is not a security + * vulnerability. In such instances the vulnerability is the failure to remove + * the examples web application. + */ +public class CookieFilter { + + private static final String OBFUSCATED = "[obfuscated]"; + + private CookieFilter() { + // Hide default constructor + } + + public static String filter(String cookieHeader, String sessionId) { + + StringBuilder sb = new StringBuilder(cookieHeader.length()); + + // Cookie name value pairs are ';' separated. + // Session IDs don't use ; in the value so don't worry about quoted + // values that contain ; + StringTokenizer st = new StringTokenizer(cookieHeader, ";"); + + boolean first = true; + while (st.hasMoreTokens()) { + if (first) { + first = false; + } else { + sb.append(';'); + } + sb.append(filterNameValuePair(st.nextToken(), sessionId)); + } + + + return sb.toString(); + } + + private static String filterNameValuePair(String input, String sessionId) { + int i = input.indexOf('='); + if (i == -1) { + return input; + } + String name = input.substring(0, i); + String value = input.substring(i + 1, input.length()); + + return name + "=" + filter(name, value, sessionId); + } + + public static String filter(String cookieName, String cookieValue, String sessionId) { + if (cookieName.toLowerCase(Locale.ENGLISH).contains("jsessionid") && + (sessionId == null || !cookieValue.contains(sessionId))) { + cookieValue = OBFUSCATED; + } + + return cookieValue; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class b/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..c57a8ddda65e9b52b53d93ef1b3842bc2b62ce8d Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java b/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..29463fb56ea0f06d088726d966e201a0e80c3bcd --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java @@ -0,0 +1,68 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package util; + +/** + * HTML filter utility. + * + * @author Craig R. McClanahan + * @author Tim Tye + */ +public final class HTMLFilter { + + + /** + * Filter the specified message string for characters that are sensitive + * in HTML. This avoids potential attacks caused by including JavaScript + * codes in the request URL that is often reported in error messages. + * + * @param message The message string to be filtered + * + * @return the filtered version of the message + */ + public static String filter(String message) { + + if (message == null) + return null; + + char content[] = new char[message.length()]; + message.getChars(0, message.length(), content, 0); + StringBuilder result = new StringBuilder(content.length + 50); + for (int i = 0; i < content.length; i++) { + switch (content[i]) { + case '<': + result.append("<"); + break; + case '>': + result.append(">"); + break; + case '&': + result.append("&"); + break; + case '"': + result.append("""); + break; + default: + result.append(content[i]); + } + } + return result.toString(); + } + + +} + diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class b/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..53d5cb000e8f6c43428608b19f79eeca59a46445 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java b/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..596065b55300d640f94f99b5712b7debad7b7b07 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/validators/DebugValidator.java @@ -0,0 +1,84 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package validators; + + +import java.io.IOException; +import java.io.InputStream; + +import javax.servlet.jsp.tagext.PageData; +import javax.servlet.jsp.tagext.TagLibraryValidator; +import javax.servlet.jsp.tagext.ValidationMessage; + + +/** + * Example tag library validator that simply dumps the XML version of each + * page to standard output (which will typically be sent to the file + * <code>$CATALINA_HOME/logs/catalina.out</code>). To utilize it, simply + * include a <code>taglib</code> directive for this tag library at the top + * of your JSP page. + * + * @author Craig McClanahan + */ +public class DebugValidator extends TagLibraryValidator { + + + // ----------------------------------------------------- Instance Variables + + + // --------------------------------------------------------- Public Methods + + + /** + * Validate a JSP page. This will get invoked once per directive in the + * JSP page. This method will return <code>null</code> if the page is + * valid; otherwise the method should return an array of + * <code>ValidationMessage</code> objects. An array of length zero is + * also interpreted as no errors. + * + * @param prefix The value of the prefix argument in this directive + * @param uri The value of the URI argument in this directive + * @param page The page data for this page + */ + @Override + public ValidationMessage[] validate(String prefix, String uri, + PageData page) { + + System.out.println("---------- Prefix=" + prefix + " URI=" + uri + + "----------"); + + InputStream is = page.getInputStream(); + while (true) { + try { + int ch = is.read(); + if (ch < 0) + break; + System.out.print((char) ch); + } catch (IOException e) { + break; + } + } + System.out.println(); + System.out.println("-----------------------------------------------"); + return null; + + } + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..ab997d474dc2b1751a904afcc68b409e04ce615c Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..ba8c60bda32ebb8b31adbd3b7cf63d59eb07dd70 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/ExamplesConfig.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket; + +import java.util.HashSet; +import java.util.Set; + +import javax.websocket.Endpoint; +import javax.websocket.server.ServerApplicationConfig; +import javax.websocket.server.ServerEndpointConfig; + +import websocket.drawboard.DrawboardEndpoint; +import websocket.echo.EchoEndpoint; + +public class ExamplesConfig implements ServerApplicationConfig { + + @Override + public Set<ServerEndpointConfig> getEndpointConfigs( + Set<Class<? extends Endpoint>> scanned) { + + Set<ServerEndpointConfig> result = new HashSet<>(); + + if (scanned.contains(EchoEndpoint.class)) { + result.add(ServerEndpointConfig.Builder.create( + EchoEndpoint.class, + "/websocket/echoProgrammatic").build()); + } + + if (scanned.contains(DrawboardEndpoint.class)) { + result.add(ServerEndpointConfig.Builder.create( + DrawboardEndpoint.class, + "/websocket/drawboard").build()); + } + + return result; + } + + + @Override + public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) { + // Deploy all WebSocket endpoints defined by annotations in the examples + // web application. Filter out all others to avoid issues when running + // tests on Gump + Set<Class<?>> results = new HashSet<>(); + for (Class<?> clazz : scanned) { + if (clazz.getPackage().getName().startsWith("websocket.")) { + results.add(clazz); + } + } + return results; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..1431b70162de92f7ff5f0c2f1011b215f97187c0 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..d1d55234da871e234ee89c608989616690527dc9 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.chat; + +import java.io.IOException; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +import util.HTMLFilter; + +@ServerEndpoint(value = "/websocket/chat") +public class ChatAnnotation { + + private static final Log log = LogFactory.getLog(ChatAnnotation.class); + + private static final String GUEST_PREFIX = "Guest"; + private static final AtomicInteger connectionIds = new AtomicInteger(0); + private static final Set<ChatAnnotation> connections = + new CopyOnWriteArraySet<>(); + + private final String nickname; + private Session session; + + public ChatAnnotation() { + nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); + } + + + @OnOpen + public void start(Session session) { + this.session = session; + connections.add(this); + String message = String.format("* %s %s", nickname, "has joined."); + broadcast(message); + } + + + @OnClose + public void end() { + connections.remove(this); + String message = String.format("* %s %s", + nickname, "has disconnected."); + broadcast(message); + } + + + @OnMessage + public void incoming(String message) { + // Never trust the client + String filteredMessage = String.format("%s: %s", + nickname, HTMLFilter.filter(message.toString())); + broadcast(filteredMessage); + } + + + + + @OnError + public void onError(Throwable t) throws Throwable { + log.error("Chat Error: " + t.toString(), t); + } + + + private static void broadcast(String msg) { + for (ChatAnnotation client : connections) { + try { + synchronized (client) { + client.session.getBasicRemote().sendText(msg); + } + } catch (IOException e) { + log.debug("Chat Error: Failed to send message to client", e); + connections.remove(client); + try { + client.session.close(); + } catch (IOException e1) { + // Ignore + } + String message = String.format("* %s %s", + client.nickname, "has been disconnected."); + broadcast(message); + } + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class new file mode 100644 index 0000000000000000000000000000000000000000..53d2a24699452f625354a9242b94789fe787000d Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..b47067a107e432dd98d6a5588ba95e74130fff29 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java new file mode 100644 index 0000000000000000000000000000000000000000..8026bf2957deb190942f49bba779d99c289d466e --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Client.java @@ -0,0 +1,230 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard; + +import java.io.IOException; +import java.util.LinkedList; + +import javax.websocket.CloseReason; +import javax.websocket.CloseReason.CloseCodes; +import javax.websocket.RemoteEndpoint.Async; +import javax.websocket.SendHandler; +import javax.websocket.SendResult; +import javax.websocket.Session; + +import websocket.drawboard.wsmessages.AbstractWebsocketMessage; +import websocket.drawboard.wsmessages.BinaryWebsocketMessage; +import websocket.drawboard.wsmessages.CloseWebsocketMessage; +import websocket.drawboard.wsmessages.StringWebsocketMessage; + +/** + * Represents a client with methods to send messages asynchronously. + */ +public class Client { + + private final Session session; + private final Async async; + + /** + * Contains the messages wich are buffered until the previous + * send operation has finished. + */ + private final LinkedList<AbstractWebsocketMessage> messagesToSend = + new LinkedList<>(); + /** + * If this client is currently sending a messages asynchronously. + */ + private volatile boolean isSendingMessage = false; + /** + * If this client is closing. If <code>true</code>, new messages to + * send will be ignored. + */ + private volatile boolean isClosing = false; + /** + * The length of all current buffered messages, to avoid iterating + * over a linked list. + */ + private volatile long messagesToSendLength = 0; + + public Client(Session session) { + this.session = session; + this.async = session.getAsyncRemote(); + } + + /** + * Asynchronously closes the Websocket session. This will wait until all + * remaining messages have been sent to the Client and then close + * the Websocket session. + */ + public void close() { + sendMessage(new CloseWebsocketMessage()); + } + + /** + * Sends the given message asynchronously to the client. + * If there is already a async sending in progress, then the message + * will be buffered and sent when possible.<br><br> + * + * This method can be called from multiple threads. + * + * @param msg The message to send + */ + public void sendMessage(AbstractWebsocketMessage msg) { + synchronized (messagesToSend) { + if (!isClosing) { + // Check if we have a Close message + if (msg instanceof CloseWebsocketMessage) { + isClosing = true; + } + + if (isSendingMessage) { + // Check if the buffered messages exceed + // a specific amount - in that case, disconnect the client + // to prevent DoS. + // In this case we check if there are >= 1000 messages + // or length(of all messages) >= 1000000 bytes. + if (messagesToSend.size() >= 1000 + || messagesToSendLength >= 1000000) { + isClosing = true; + + // Discard the new message and close the session immediately. + CloseReason cr = new CloseReason( + CloseCodes.VIOLATED_POLICY, + "Send Buffer exceeded"); + try { + // TODO: close() may block if the remote endpoint doesn't read the data + // (eventually there will be a TimeoutException). However, this method + // (sendMessage) is intended to run asynchronous code and shouldn't + // block. Otherwise it would temporarily stop processing of messages + // from other clients. + // Maybe call this method on another thread. + // Note that when this method is called, the RemoteEndpoint.Async + // is still in the process of sending data, so there probably should + // be another way to abort the Websocket connection. + // Ideally, there should be some abort() method that cancels the + // connection immediately... + session.close(cr); + } catch (IOException e) { + // Ignore + } + + } else { + + // Check if the last message and the new message are + // String messages - in that case we concatenate them + // to reduce TCP overhead (using ";" as separator). + if (msg instanceof StringWebsocketMessage + && !messagesToSend.isEmpty() + && messagesToSend.getLast() + instanceof StringWebsocketMessage) { + + StringWebsocketMessage ms = + (StringWebsocketMessage) messagesToSend.removeLast(); + messagesToSendLength -= calculateMessageLength(ms); + + String concatenated = ms.getString() + ";" + + ((StringWebsocketMessage) msg).getString(); + msg = new StringWebsocketMessage(concatenated); + } + + messagesToSend.add(msg); + messagesToSendLength += calculateMessageLength(msg); + } + } else { + isSendingMessage = true; + internalSendMessageAsync(msg); + } + } + + } + } + + private long calculateMessageLength(AbstractWebsocketMessage msg) { + if (msg instanceof BinaryWebsocketMessage) { + return ((BinaryWebsocketMessage) msg).getBytes().capacity(); + } else if (msg instanceof StringWebsocketMessage) { + return ((StringWebsocketMessage) msg).getString().length() * 2; + } + + return 0; + } + + /** + * Internally sends the messages asynchronously. + * @param msg + */ + private void internalSendMessageAsync(AbstractWebsocketMessage msg) { + try { + if (msg instanceof StringWebsocketMessage) { + StringWebsocketMessage sMsg = (StringWebsocketMessage) msg; + async.sendText(sMsg.getString(), sendHandler); + + } else if (msg instanceof BinaryWebsocketMessage) { + BinaryWebsocketMessage bMsg = (BinaryWebsocketMessage) msg; + async.sendBinary(bMsg.getBytes(), sendHandler); + + } else if (msg instanceof CloseWebsocketMessage) { + // Close the session. + session.close(); + } + } catch (IllegalStateException|IOException ex) { + // Trying to write to the client when the session has + // already been closed. + // Ignore + } + } + + + + /** + * SendHandler that will continue to send buffered messages. + */ + private final SendHandler sendHandler = new SendHandler() { + @Override + public void onResult(SendResult result) { + if (!result.isOK()) { + // Message could not be sent. In this case, we don't + // set isSendingMessage to false because we must assume the connection + // broke (and onClose will be called), so we don't try to send + // other messages. + // As a precaution, we close the session (e.g. if a send timeout occured). + // TODO: session.close() blocks, while this handler shouldn't block. + // Ideally, there should be some abort() method that cancels the + // connection immediately... + try { + session.close(); + } catch (IOException ex) { + // Ignore + } + } + synchronized (messagesToSend) { + + if (!messagesToSend.isEmpty()) { + AbstractWebsocketMessage msg = messagesToSend.remove(); + messagesToSendLength -= calculateMessageLength(msg); + + internalSendMessageAsync(msg); + + } else { + isSendingMessage = false; + } + + } + } + }; + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class new file mode 100644 index 0000000000000000000000000000000000000000..d7c5284c8982258e32b5e2df200d74f987a04bc1 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage$ParseException.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..70b22a94f06c727f809e50adc1844787fffe4a03 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..8dceabae078b1bc283faea8a800e30728ecc7c37 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawMessage.java @@ -0,0 +1,250 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.geom.Arc2D; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; + +/** + * A message that represents a drawing action. + * Note that we use primitive types instead of Point, Color etc. + * to reduce object allocation.<br><br> + * + * TODO: But a Color objects needs to be created anyway for drawing this + * onto a Graphics2D object, so this probably does not save much. + */ +public final class DrawMessage { + + private int type; + private byte colorR, colorG, colorB, colorA; + private double thickness; + private double x1, y1, x2, y2; + + /** + * The type. + * + * @return 1: Brush<br>2: Line<br>3: Rectangle<br>4: Ellipse + */ + public int getType() { + return type; + } + public void setType(int type) { + this.type = type; + } + + public double getThickness() { + return thickness; + } + public void setThickness(double thickness) { + this.thickness = thickness; + } + + public byte getColorR() { + return colorR; + } + public void setColorR(byte colorR) { + this.colorR = colorR; + } + public byte getColorG() { + return colorG; + } + public void setColorG(byte colorG) { + this.colorG = colorG; + } + public byte getColorB() { + return colorB; + } + public void setColorB(byte colorB) { + this.colorB = colorB; + } + public byte getColorA() { + return colorA; + } + public void setColorA(byte colorA) { + this.colorA = colorA; + } + + public double getX1() { + return x1; + } + public void setX1(double x1) { + this.x1 = x1; + } + public double getX2() { + return x2; + } + public void setX2(double x2) { + this.x2 = x2; + } + public double getY1() { + return y1; + } + public void setY1(double y1) { + this.y1 = y1; + } + public double getY2() { + return y2; + } + public void setY2(double y2) { + this.y2 = y2; + } + + + public DrawMessage(int type, byte colorR, byte colorG, byte colorB, + byte colorA, double thickness, double x1, double x2, double y1, + double y2) { + + this.type = type; + this.colorR = colorR; + this.colorG = colorG; + this.colorB = colorB; + this.colorA = colorA; + this.thickness = thickness; + this.x1 = x1; + this.x2 = x2; + this.y1 = y1; + this.y2 = y2; + } + + + /** + * Draws this DrawMessage onto the given Graphics2D. + * + * @param g The target for the DrawMessage + */ + public void draw(Graphics2D g) { + + g.setStroke(new BasicStroke((float) thickness, + BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER)); + g.setColor(new Color(colorR & 0xFF, colorG & 0xFF, colorB & 0xFF, + colorA & 0xFF)); + + if (x1 == x2 && y1 == y2) { + // Always draw as arc to meet the behavior in the HTML5 Canvas. + Arc2D arc = new Arc2D.Double(x1, y1, 0, 0, + 0d, 360d, Arc2D.OPEN); + g.draw(arc); + + } else if (type == 1 || type == 2) { + // Draw a line. + Line2D line = new Line2D.Double(x1, y1, x2, y2); + g.draw(line); + + } else if (type == 3 || type == 4) { + double x1 = this.x1, x2 = this.x2, + y1 = this.y1, y2 = this.y2; + if (x1 > x2) { + x1 = this.x2; + x2 = this.x1; + } + if (y1 > y2) { + y1 = this.y2; + y2 = this.y1; + } + + // TODO: If (x1 == x2 || y1 == y2) draw as line. + + if (type == 3) { + // Draw a rectangle. + Rectangle2D rect = new Rectangle2D.Double(x1, y1, + x2 - x1, y2 - y1); + g.draw(rect); + + } else if (type == 4) { + // Draw an ellipse. + Arc2D arc = new Arc2D.Double(x1, y1, x2 - x1, y2 - y1, + 0d, 360d, Arc2D.OPEN); + g.draw(arc); + + } + } + } + + /** + * Converts this message into a String representation that + * can be sent over WebSocket.<br> + * Since a DrawMessage consists only of numbers, + * we concatenate those numbers with a ",". + */ + @Override + public String toString() { + + return type + "," + (colorR & 0xFF) + "," + (colorG & 0xFF) + "," + + (colorB & 0xFF) + "," + (colorA & 0xFF) + "," + thickness + + "," + x1 + "," + y1 + "," + x2 + "," + y2; + } + + public static DrawMessage parseFromString(String str) + throws ParseException { + + int type; + byte[] colors = new byte[4]; + double thickness; + double[] coords = new double[4]; + + try { + String[] elements = str.split(","); + + type = Integer.parseInt(elements[0]); + if (!(type >= 1 && type <= 4)) + throw new ParseException("Invalid type: " + type); + + for (int i = 0; i < colors.length; i++) { + colors[i] = (byte) Integer.parseInt(elements[1 + i]); + } + + thickness = Double.parseDouble(elements[5]); + if (Double.isNaN(thickness) || thickness < 0 || thickness > 100) + throw new ParseException("Invalid thickness: " + thickness); + + for (int i = 0; i < coords.length; i++) { + coords[i] = Double.parseDouble(elements[6 + i]); + if (Double.isNaN(coords[i])) + throw new ParseException("Invalid coordinate: " + + coords[i]); + } + + } catch (RuntimeException ex) { + throw new ParseException(ex); + } + + DrawMessage m = new DrawMessage(type, colors[0], colors[1], + colors[2], colors[3], thickness, coords[0], coords[2], + coords[1], coords[3]); + + return m; + } + + public static class ParseException extends Exception { + private static final long serialVersionUID = -6651972769789842960L; + + public ParseException(Throwable root) { + super(root); + } + + public ParseException(String message) { + super(message); + } + } + + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class new file mode 100644 index 0000000000000000000000000000000000000000..5a16a40c4dc9ab56b0f2d8ba20c78525aa608a8b Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java new file mode 100644 index 0000000000000000000000000000000000000000..ef909e8aa881c4f1d5f3c27d1b36d020449cc0b9 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardContextListener.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +public final class DrawboardContextListener implements ServletContextListener { + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // Shutdown our room. + Room room = DrawboardEndpoint.getRoom(false); + if (room != null) { + room.shutdown(); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class new file mode 100644 index 0000000000000000000000000000000000000000..609b3071dd19a41c5dd4f1dda9175110db1daac5 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class new file mode 100644 index 0000000000000000000000000000000000000000..1a0f34a8b2df5cd764e99a4dd6f3ad378c2a8790 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$2.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class new file mode 100644 index 0000000000000000000000000000000000000000..55c890a13db05f40d26df2765848993c5f9421c5 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class new file mode 100644 index 0000000000000000000000000000000000000000..339e6b11d6fada18c829f25986a6a4d7a1da1551 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint$3.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class new file mode 100644 index 0000000000000000000000000000000000000000..af6ec1d73f7b2144d20192711c639aaa92a57d75 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java new file mode 100644 index 0000000000000000000000000000000000000000..cd99f495761bb015ae215e614ebf29ec9eecf83c --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/DrawboardEndpoint.java @@ -0,0 +1,236 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard; + +import java.io.EOFException; +import java.io.IOException; + +import javax.websocket.CloseReason; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +import websocket.drawboard.DrawMessage.ParseException; +import websocket.drawboard.wsmessages.StringWebsocketMessage; + + +public final class DrawboardEndpoint extends Endpoint { + + private static final Log log = + LogFactory.getLog(DrawboardEndpoint.class); + + + /** + * Our room where players can join. + */ + private static volatile Room room = null; + private static final Object roomLock = new Object(); + + public static Room getRoom(boolean create) { + if (create) { + if (room == null) { + synchronized (roomLock) { + if (room == null) { + room = new Room(); + } + } + } + return room; + } else { + return room; + } + } + + /** + * The player that is associated with this Endpoint and the current room. + * Note that this variable is only accessed from the Room Thread.<br><br> + * + * TODO: Currently, Tomcat uses an Endpoint instance once - however + * the java doc of endpoint says: + * "Each instance of a websocket endpoint is guaranteed not to be called by + * more than one thread at a time per active connection." + * This could mean that after calling onClose(), the instance + * could be reused for another connection so onOpen() will get called + * (possibly from another thread).<br> + * If this is the case, we would need a variable holder for the variables + * that are accessed by the Room thread, and read the reference to the holder + * at the beginning of onOpen, onMessage, onClose methods to ensure the room + * thread always gets the correct instance of the variable holder. + */ + private Room.Player player; + + + @Override + public void onOpen(Session session, EndpointConfig config) { + // Set maximum messages size to 10.000 bytes. + session.setMaxTextMessageBufferSize(10000); + session.addMessageHandler(stringHandler); + final Client client = new Client(session); + + final Room room = getRoom(true); + room.invokeAndWait(new Runnable() { + @Override + public void run() { + try { + + // Create a new Player and add it to the room. + try { + player = room.createAndAddPlayer(client); + } catch (IllegalStateException ex) { + // Probably the max. number of players has been + // reached. + client.sendMessage(new StringWebsocketMessage( + "0" + ex.getLocalizedMessage())); + // Close the connection. + client.close(); + } + + } catch (RuntimeException ex) { + log.error("Unexpected exception: " + ex.toString(), ex); + } + } + }); + + } + + + @Override + public void onClose(Session session, CloseReason closeReason) { + Room room = getRoom(false); + if (room != null) { + room.invokeAndWait(new Runnable() { + @Override + public void run() { + try { + // Player can be null if it couldn't enter the room + if (player != null) { + // Remove this player from the room. + player.removeFromRoom(); + + // Set player to null to prevent NPEs when onMessage events + // are processed (from other threads) after onClose has been + // called from different thread which closed the Websocket session. + player = null; + } + } catch (RuntimeException ex) { + log.error("Unexpected exception: " + ex.toString(), ex); + } + } + }); + } + } + + + + @Override + public void onError(Session session, Throwable t) { + // Most likely cause is a user closing their browser. Check to see if + // the root cause is EOF and if it is ignore it. + // Protect against infinite loops. + int count = 0; + Throwable root = t; + while (root.getCause() != null && count < 20) { + root = root.getCause(); + count ++; + } + if (root instanceof EOFException) { + // Assume this is triggered by the user closing their browser and + // ignore it. + } else if (!session.isOpen() && root instanceof IOException) { + // IOException after close. Assume this is a variation of the user + // closing their browser (or refreshing very quickly) and ignore it. + } else { + log.error("onError: " + t.toString(), t); + } + } + + + + private final MessageHandler.Whole<String> stringHandler = + new MessageHandler.Whole<String>() { + + @Override + public void onMessage(final String message) { + // Invoke handling of the message in the room. + room.invokeAndWait(new Runnable() { + @Override + public void run() { + try { + + // Currently, the only types of messages the client will send + // are draw messages prefixed by a Message ID + // (starting with char '1'), and pong messages (starting + // with char '0'). + // Draw messages should look like this: + // ID|type,colR,colB,colG,colA,thickness,x1,y1,x2,y2,lastInChain + + boolean dontSwallowException = false; + try { + char messageType = message.charAt(0); + String messageContent = message.substring(1); + switch (messageType) { + case '0': + // Pong message. + // Do nothing. + break; + + case '1': + // Draw message + int indexOfChar = messageContent.indexOf('|'); + long msgId = Long.parseLong( + messageContent.substring(0, indexOfChar)); + + DrawMessage msg = DrawMessage.parseFromString( + messageContent.substring(indexOfChar + 1)); + + // Don't ignore RuntimeExceptions thrown by + // this method + // TODO: Find a better solution than this variable + dontSwallowException = true; + if (player != null) { + player.handleDrawMessage(msg, msgId); + } + dontSwallowException = false; + + break; + } + } catch (ParseException e) { + // Client sent invalid data + // Ignore, TODO: maybe close connection + } catch (RuntimeException e) { + // Client sent invalid data. + // Ignore, TODO: maybe close connection + if (dontSwallowException) { + throw e; + } + } + + } catch (RuntimeException ex) { + log.error("Unexpected exception: " + ex.toString(), ex); + } + } + }); + + } + }; + + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b4e50c39d222639fec4a29c48b7b586cbbb5c709 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e7a7d6bef63bc44800056bd4a8c0c4fd9b704ab6 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class new file mode 100644 index 0000000000000000000000000000000000000000..8a81c4dca709c0de496642a54cf766875e89eafe Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$2.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class new file mode 100644 index 0000000000000000000000000000000000000000..ff5527e7f4a19b60da76f43d62be03c572e6aa9e Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$MessageType.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class new file mode 100644 index 0000000000000000000000000000000000000000..e60bd5a309d3e813efd2972ae8d7bbf9c6e1ac76 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room$Player.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class new file mode 100644 index 0000000000000000000000000000000000000000..5de1465a6cda83d56113322809791331cdd1704e Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java new file mode 100644 index 0000000000000000000000000000000000000000..558273f841006bafc74ef19c46e1a879958ce162 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java @@ -0,0 +1,496 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.locks.ReentrantLock; + +import javax.imageio.ImageIO; + +import websocket.drawboard.wsmessages.BinaryWebsocketMessage; +import websocket.drawboard.wsmessages.StringWebsocketMessage; + +/** + * A Room represents a drawboard where a number of + * users participate.<br><br> + * + * Note: Instance methods should only be invoked by calling + * {@link #invokeAndWait(Runnable)} to ensure access is correctly synchronized. + */ +public final class Room { + + /** + * Specifies the type of a room message that is sent to a client.<br> + * Note: Currently we are sending simple string messages - for production + * apps, a JSON lib should be used for object-level messages.<br><br> + * + * The number (single char) will be prefixed to the string when sending + * the message. + */ + public static enum MessageType { + /** + * '0': Error: contains error message. + */ + ERROR('0'), + /** + * '1': DrawMessage: contains serialized DrawMessage(s) prefixed + * with the current Player's {@link Player#lastReceivedMessageId} + * and ",".<br> + * Multiple draw messages are concatenated with "|" as separator. + */ + DRAW_MESSAGE('1'), + /** + * '2': ImageMessage: Contains number of current players in this room. + * After this message a Binary Websocket message will follow, + * containing the current Room image as PNG.<br> + * This is the first message that a Room sends to a new Player. + */ + IMAGE_MESSAGE('2'), + /** + * '3': PlayerChanged: contains "+" or "-" which indicate a player + * was added or removed to this Room. + */ + PLAYER_CHANGED('3'); + + private final char flag; + + private MessageType(char flag) { + this.flag = flag; + } + + } + + + /** + * The lock used to synchronize access to this Room. + */ + private final ReentrantLock roomLock = new ReentrantLock(); + + /** + * Indicates if this room has already been shutdown. + */ + private volatile boolean closed = false; + + /** + * If <code>true</code>, outgoing DrawMessages will be buffered until the + * drawmessageBroadcastTimer ticks. Otherwise they will be sent + * immediately. + */ + private static final boolean BUFFER_DRAW_MESSAGES = true; + + /** + * A timer which sends buffered drawmessages to the client at once + * at a regular interval, to avoid sending a lot of very small + * messages which would cause TCP overhead and high CPU usage. + */ + private final Timer drawmessageBroadcastTimer = new Timer(); + + private static final int TIMER_DELAY = 30; + + /** + * The current active broadcast timer task. If null, then no Broadcast task is scheduled. + * The Task will be scheduled if the first player enters the Room, and + * cancelled if the last player exits the Room, to avoid unnecessary timer executions. + */ + private TimerTask activeBroadcastTimerTask; + + + /** + * The current image of the room drawboard. DrawMessages that are + * received from Players will be drawn onto this image. + */ + private final BufferedImage roomImage = + new BufferedImage(900, 600, BufferedImage.TYPE_INT_RGB); + private final Graphics2D roomGraphics = roomImage.createGraphics(); + + + /** + * The maximum number of players that can join this room. + */ + private static final int MAX_PLAYER_COUNT = 100; + + /** + * List of all currently joined players. + */ + private final List<Player> players = new ArrayList<>(); + + + + public Room() { + roomGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + // Clear the image with white background. + roomGraphics.setBackground(Color.WHITE); + roomGraphics.clearRect(0, 0, roomImage.getWidth(), + roomImage.getHeight()); + } + + private TimerTask createBroadcastTimerTask() { + return new TimerTask() { + @Override + public void run() { + invokeAndWait(new Runnable() { + @Override + public void run() { + broadcastTimerTick(); + } + }); + } + }; + } + + /** + * Creates a Player from the given Client and adds it to this room. + * + * @param client the client + * + * @return The newly created player + */ + public Player createAndAddPlayer(Client client) { + if (players.size() >= MAX_PLAYER_COUNT) { + throw new IllegalStateException("Maximum player count (" + + MAX_PLAYER_COUNT + ") has been reached."); + } + + Player p = new Player(this, client); + + // Broadcast to the other players that one player joined. + broadcastRoomMessage(MessageType.PLAYER_CHANGED, "+"); + + // Add the new player to the list. + players.add(p); + + // If currently no Broadcast Timer Task is scheduled, then we need to create one. + if (activeBroadcastTimerTask == null) { + activeBroadcastTimerTask = createBroadcastTimerTask(); + drawmessageBroadcastTimer.schedule(activeBroadcastTimerTask, + TIMER_DELAY, TIMER_DELAY); + } + + // Send him the current number of players and the current room image. + String content = String.valueOf(players.size()); + p.sendRoomMessage(MessageType.IMAGE_MESSAGE, content); + + // Store image as PNG + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + try { + ImageIO.write(roomImage, "PNG", bout); + } catch (IOException e) { /* Should never happen */ } + + + // Send the image as binary message. + BinaryWebsocketMessage msg = new BinaryWebsocketMessage( + ByteBuffer.wrap(bout.toByteArray())); + p.getClient().sendMessage(msg); + + return p; + + } + + /** + * @see Player#removeFromRoom() + * @param p + */ + private void internalRemovePlayer(Player p) { + boolean removed = players.remove(p); + assert removed; + + // If the last player left the Room, we need to cancel the Broadcast Timer Task. + if (players.size() == 0) { + // Cancel the task. + // Note that it can happen that the TimerTask is just about to execute (from + // the Timer thread) but waits until all players are gone (or even until a new + // player is added to the list), and then executes. This is OK. To prevent it, + // a TimerTask subclass would need to have some boolean "cancel" instance variable and + // query it in the invocation of Room#invokeAndWait. + activeBroadcastTimerTask.cancel(); + activeBroadcastTimerTask = null; + } + + // Broadcast that one player is removed. + broadcastRoomMessage(MessageType.PLAYER_CHANGED, "-"); + } + + /** + * @see Player#handleDrawMessage(DrawMessage, long) + * @param p + * @param msg + * @param msgId + */ + private void internalHandleDrawMessage(Player p, DrawMessage msg, + long msgId) { + p.setLastReceivedMessageId(msgId); + + // Draw the RoomMessage onto our Room Image. + msg.draw(roomGraphics); + + // Broadcast the Draw Message. + broadcastDrawMessage(msg); + } + + + /** + * Broadcasts the given drawboard message to all connected players.<br> + * Note: For DrawMessages, please use + * {@link #broadcastDrawMessage(DrawMessage)} + * as this method will buffer them and prefix them with the correct + * last received Message ID. + * @param type + * @param content + */ + private void broadcastRoomMessage(MessageType type, String content) { + for (Player p : players) { + p.sendRoomMessage(type, content); + } + } + + + /** + * Broadcast the given DrawMessage. This will buffer the message + * and the {@link #drawmessageBroadcastTimer} will broadcast them + * at a regular interval, prefixing them with the player's current + * {@link Player#lastReceivedMessageId}. + * @param msg + */ + private void broadcastDrawMessage(DrawMessage msg) { + if (!BUFFER_DRAW_MESSAGES) { + String msgStr = msg.toString(); + + for (Player p : players) { + String s = String.valueOf(p.getLastReceivedMessageId()) + + "," + msgStr; + p.sendRoomMessage(MessageType.DRAW_MESSAGE, s); + } + } else { + for (Player p : players) { + p.getBufferedDrawMessages().add(msg); + } + } + } + + + /** + * Tick handler for the broadcastTimer. + */ + private void broadcastTimerTick() { + // For each Player, send all per Player buffered + // DrawMessages, prefixing each DrawMessage with the player's + // lastReceivedMessageId. + // Multiple messages are concatenated with "|". + + for (Player p : players) { + + StringBuilder sb = new StringBuilder(); + List<DrawMessage> drawMessages = p.getBufferedDrawMessages(); + + if (drawMessages.size() > 0) { + for (int i = 0; i < drawMessages.size(); i++) { + DrawMessage msg = drawMessages.get(i); + + String s = String.valueOf(p.getLastReceivedMessageId()) + + "," + msg.toString(); + if (i > 0) + sb.append("|"); + + sb.append(s); + } + drawMessages.clear(); + + p.sendRoomMessage(MessageType.DRAW_MESSAGE, sb.toString()); + } + } + } + + /** + * A list of cached {@link Runnable}s to prevent recursive invocation of Runnables + * by one thread. This variable is only used by one thread at a time and then + * set to <code>null</code>. + */ + private List<Runnable> cachedRunnables = null; + + /** + * Submits the given Runnable to the Room Executor and waits until it + * has been executed. Currently, this simply means that the Runnable + * will be run directly inside of a synchronized() block.<br> + * Note that if a runnable recursively calls invokeAndWait() with another + * runnable on this Room, it will not be executed recursively, but instead + * cached until the original runnable is finished, to keep the behavior of + * using a Executor. + * + * @param task The task to be executed + */ + public void invokeAndWait(Runnable task) { + + // Check if the current thread already holds a lock on this room. + // If yes, then we must not directly execute the Runnable but instead + // cache it until the original invokeAndWait() has finished. + if (roomLock.isHeldByCurrentThread()) { + + if (cachedRunnables == null) { + cachedRunnables = new ArrayList<>(); + } + cachedRunnables.add(task); + + } else { + + roomLock.lock(); + try { + // Explicitly overwrite value to ensure data consistency in + // current thread + cachedRunnables = null; + + if (!closed) { + task.run(); + } + + // Run the cached runnables. + if (cachedRunnables != null) { + for (int i = 0; i < cachedRunnables.size(); i++) { + if (!closed) { + cachedRunnables.get(i).run(); + } + } + cachedRunnables = null; + } + + } finally { + roomLock.unlock(); + } + + } + + } + + /** + * Shuts down the roomExecutor and the drawmessageBroadcastTimer. + */ + public void shutdown() { + invokeAndWait(new Runnable() { + @Override + public void run() { + closed = true; + drawmessageBroadcastTimer.cancel(); + roomGraphics.dispose(); + } + }); + } + + + /** + * A Player participates in a Room. It is the interface between the + * {@link Room} and the {@link Client}.<br><br> + * + * Note: This means a player object is actually a join between Room and + * Client. + */ + public final class Player { + + /** + * The room to which this player belongs. + */ + private Room room; + + /** + * The room buffers the last draw message ID that was received from + * this player. + */ + private long lastReceivedMessageId = 0; + + private final Client client; + + /** + * Buffered DrawMessages that will be sent by a Timer. + */ + private final List<DrawMessage> bufferedDrawMessages = + new ArrayList<>(); + + private List<DrawMessage> getBufferedDrawMessages() { + return bufferedDrawMessages; + } + + private Player(Room room, Client client) { + this.room = room; + this.client = client; + } + + public Room getRoom() { + return room; + } + + public Client getClient() { + return client; + } + + /** + * Removes this player from its room, e.g. when + * the client disconnects. + */ + public void removeFromRoom() { + if (room != null) { + room.internalRemovePlayer(this); + room = null; + } + } + + + private long getLastReceivedMessageId() { + return lastReceivedMessageId; + } + private void setLastReceivedMessageId(long value) { + lastReceivedMessageId = value; + } + + + /** + * Handles the given DrawMessage by drawing it onto this Room's + * image and by broadcasting it to the connected players. + * + * @param msg The draw message received + * @param msgId The ID for the draw message received + */ + public void handleDrawMessage(DrawMessage msg, long msgId) { + room.internalHandleDrawMessage(this, msg, msgId); + } + + + /** + * Sends the given room message. + * @param type + * @param content + */ + private void sendRoomMessage(MessageType type, String content) { + Objects.requireNonNull(content); + Objects.requireNonNull(type); + + String completeMsg = String.valueOf(type.flag) + content; + + client.sendMessage(new StringWebsocketMessage(completeMsg)); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..7f60736faa3395557b729a7bfc69e16a35470ea9 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..d42539372f4cb33143ee9f3a796623cba4fc2331 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/AbstractWebsocketMessage.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard.wsmessages; + +/** + * Abstract base class for Websocket Messages (binary or string) + * that can be buffered. + */ +public abstract class AbstractWebsocketMessage { + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..20d4194f5b3ef9fb3d775d06f582a7359c9c966a Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..b16e1aede6de633ed48ebedc3c84d732465f4ffa --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/BinaryWebsocketMessage.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard.wsmessages; + +import java.nio.ByteBuffer; + +/** + * Represents a binary websocket message. + */ +public final class BinaryWebsocketMessage extends AbstractWebsocketMessage { + private final ByteBuffer bytes; + + public BinaryWebsocketMessage(ByteBuffer bytes) { + this.bytes = bytes; + } + + public ByteBuffer getBytes() { + return bytes; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..ba6beb3cc503e7fa5528af43b0a6cbd216b2fc2c Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..44f48adb748dd51253a3cb73cf461dc5778c0213 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/CloseWebsocketMessage.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard.wsmessages; + +/** + * Represents a "close" message that closes the session. + */ +public class CloseWebsocketMessage extends AbstractWebsocketMessage { + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class new file mode 100644 index 0000000000000000000000000000000000000000..6a7133d0d401454558c86b379139abc5e3bdfe1a Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..49be36935b20eae995149fe27b95d849cf82aefc --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/drawboard/wsmessages/StringWebsocketMessage.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.drawboard.wsmessages; + +/** + * Represents a string websocket message. + * + */ +public final class StringWebsocketMessage extends AbstractWebsocketMessage { + private final String string; + + public StringWebsocketMessage(String string) { + this.string = string; + } + + public String getString() { + return string; + } + +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..8b8d7d04aa19fdf02f215986129264733c29058f Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..34f0de2c1b410226ca40574fd9ce1eb145a937e1 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAnnotation.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.echo; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import javax.websocket.OnMessage; +import javax.websocket.PongMessage; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** + * The three annotated echo endpoints can be used to test with Autobahn and + * the following command "wstest -m fuzzingclient -s servers.json". See the + * Autobahn documentation for setup and general information. + */ +@ServerEndpoint("/websocket/echoAnnotation") +public class EchoAnnotation { + + @OnMessage + public void echoTextMessage(Session session, String msg, boolean last) { + try { + if (session.isOpen()) { + session.getBasicRemote().sendText(msg, last); + } + } catch (IOException e) { + try { + session.close(); + } catch (IOException e1) { + // Ignore + } + } + } + + @OnMessage + public void echoBinaryMessage(Session session, ByteBuffer bb, + boolean last) { + try { + if (session.isOpen()) { + session.getBasicRemote().sendBinary(bb, last); + } + } catch (IOException e) { + try { + session.close(); + } catch (IOException e1) { + // Ignore + } + } + } + + /** + * Process a received pong. This is a NO-OP. + * + * @param pm Ignored. + */ + @OnMessage + public void echoPongMessage(PongMessage pm) { + // NO-OP + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class new file mode 100644 index 0000000000000000000000000000000000000000..57bd5e2b3e7463ea63bc3dc44e899d0ca05b3580 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class new file mode 100644 index 0000000000000000000000000000000000000000..a131f264c6f50d91be99308306185818c7d303e5 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation$CompletedFuture.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..51273b869d1e3aa99c93cfe915719d5f1ffde666 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..39df783b721e0bc23aa70f9fdf8e8aa6951ddd99 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoAsyncAnnotation.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.echo; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import javax.websocket.OnMessage; +import javax.websocket.PongMessage; +import javax.websocket.Session; + +/** + * The three annotated echo endpoints can be used to test with Autobahn and + * the following command "wstest -m fuzzingclient -s servers.json". See the + * Autobahn documentation for setup and general information. + * + * Note: This one is disabled by default since it allocates memory, and needs + * to be enabled back. + */ +//@javax.websocket.server.ServerEndpoint("/websocket/echoAsyncAnnotation") +public class EchoAsyncAnnotation { + + private static final Future<Void> COMPLETED = new CompletedFuture(); + + Future<Void> f = COMPLETED; + StringBuilder sb = null; + ByteArrayOutputStream bytes = null; + + @OnMessage + public void echoTextMessage(Session session, String msg, boolean last) { + if (sb == null) { + sb = new StringBuilder(); + } + sb.append(msg); + if (last) { + // Before we send the next message, have to wait for the previous + // message to complete + try { + f.get(); + } catch (InterruptedException | ExecutionException e) { + // Let the container deal with it + throw new RuntimeException(e); + } + f = session.getAsyncRemote().sendText(sb.toString()); + sb = null; + } + } + + @OnMessage + public void echoBinaryMessage(byte[] msg, Session session, boolean last) + throws IOException { + if (bytes == null) { + bytes = new ByteArrayOutputStream(); + } + bytes.write(msg); + if (last) { + // Before we send the next message, have to wait for the previous + // message to complete + try { + f.get(); + } catch (InterruptedException | ExecutionException e) { + // Let the container deal with it + throw new RuntimeException(e); + } + f = session.getAsyncRemote().sendBinary(ByteBuffer.wrap(bytes.toByteArray())); + bytes = null; + } + } + + /** + * Process a received pong. This is a NO-OP. + * + * @param pm Ignored. + */ + @OnMessage + public void echoPongMessage(PongMessage pm) { + // NO-OP + } + + private static class CompletedFuture implements Future<Void> { + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return true; + } + + @Override + public Void get() throws InterruptedException, ExecutionException { + return null; + } + + @Override + public Void get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, + TimeoutException { + return null; + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d4a6809cbd6a06830fa8bd1b73b4e3d45b9a1163 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class new file mode 100644 index 0000000000000000000000000000000000000000..c5944a0a01d45fa04e56477b3f3708bd994be525 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerBinary.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class new file mode 100644 index 0000000000000000000000000000000000000000..d73bb55b181c3b8ccfa7c5a80006f1b04f10a7cc Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint$EchoMessageHandlerText.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class new file mode 100644 index 0000000000000000000000000000000000000000..1d76b20b9982b8ef3bdb39aefa47d92b8f2add02 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java new file mode 100644 index 0000000000000000000000000000000000000000..362023829825b06df934ae0afa0b95101eced649 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoEndpoint.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.echo; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.RemoteEndpoint; +import javax.websocket.Session; + +public class EchoEndpoint extends Endpoint { + + @Override + public void onOpen(Session session, EndpointConfig endpointConfig) { + RemoteEndpoint.Basic remoteEndpointBasic = session.getBasicRemote(); + session.addMessageHandler(new EchoMessageHandlerText(remoteEndpointBasic)); + session.addMessageHandler(new EchoMessageHandlerBinary(remoteEndpointBasic)); + } + + private static class EchoMessageHandlerText + implements MessageHandler.Partial<String> { + + private final RemoteEndpoint.Basic remoteEndpointBasic; + + private EchoMessageHandlerText(RemoteEndpoint.Basic remoteEndpointBasic) { + this.remoteEndpointBasic = remoteEndpointBasic; + } + + @Override + public void onMessage(String message, boolean last) { + try { + if (remoteEndpointBasic != null) { + remoteEndpointBasic.sendText(message, last); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + private static class EchoMessageHandlerBinary + implements MessageHandler.Partial<ByteBuffer> { + + private final RemoteEndpoint.Basic remoteEndpointBasic; + + private EchoMessageHandlerBinary(RemoteEndpoint.Basic remoteEndpointBasic) { + this.remoteEndpointBasic = remoteEndpointBasic; + } + + @Override + public void onMessage(ByteBuffer message, boolean last) { + try { + if (remoteEndpointBasic != null) { + remoteEndpointBasic.sendBinary(message, last); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..be1221d59bdb53cd09f2ce9cc9f8782f1356c500 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..7aef82110cf8bc5b698c02ecd8cc36755e420fa4 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/EchoStreamAnnotation.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.echo; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; + +import javax.websocket.OnMessage; +import javax.websocket.PongMessage; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** + * The three annotated echo endpoints can be used to test with Autobahn and + * the following command "wstest -m fuzzingclient -s servers.json". See the + * Autobahn documentation for setup and general information. + */ +@ServerEndpoint("/websocket/echoStreamAnnotation") +public class EchoStreamAnnotation { + + Writer writer; + OutputStream stream; + + @OnMessage + public void echoTextMessage(Session session, String msg, boolean last) + throws IOException { + if (writer == null) { + writer = session.getBasicRemote().getSendWriter(); + } + writer.write(msg); + if (last) { + writer.close(); + writer = null; + } + } + + @OnMessage + public void echoBinaryMessage(byte[] msg, Session session, boolean last) + throws IOException { + if (stream == null) { + stream = session.getBasicRemote().getSendStream(); + } + stream.write(msg); + stream.flush(); + if (last) { + stream.close(); + stream = null; + } + } + + /** + * Process a received pong. This is a NO-OP. + * + * @param pm Ignored. + */ + @OnMessage + public void echoPongMessage(PongMessage pm) { + // NO-OP + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json new file mode 100644 index 0000000000000000000000000000000000000000..c816a7d9e82b059221664164f5f39cafb6d9e57b --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/echo/servers.json @@ -0,0 +1,20 @@ +{ + "options": {"failByDrop": false}, + "outdir": "./reports/servers", + + "servers": [ + {"agent": "Basic", + "url": "ws://localhost:8080/examples/websocket/echoAnnotation", + "options": {"version": 18}}, + {"agent": "Stream", + "url": "ws://localhost:8080/examples/websocket/echoStreamAnnotation", + "options": {"version": 18}}, + {"agent": "Async", + "url": "ws://localhost:8080/examples/websocket/echoAsyncAnnotation", + "options": {"version": 18}} + ], + + "cases": ["*"], + "exclude-cases": [], + "exclude-agent-cases": {} +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class new file mode 100644 index 0000000000000000000000000000000000000000..b975929d6e68ea51be8b822b30ba0a960ce14c10 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java new file mode 100644 index 0000000000000000000000000000000000000000..4440c9ded517728e3d332883fb4d450bdcfe5892 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Direction.java @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.snake; + +public enum Direction { + NONE, NORTH, SOUTH, EAST, WEST +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f8b7ab96a7fbe4f54679cb96915436dc11459088 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class new file mode 100644 index 0000000000000000000000000000000000000000..c135f0b83a7cf87903a208252fdd4ce12d843922 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java new file mode 100644 index 0000000000000000000000000000000000000000..acbfeb779ea2df8b070d14ee6a388bd51b5a4cf9 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Location.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.snake; + +public class Location { + + public int x; + public int y; + + public Location(int x, int y) { + this.x = x; + this.y = y; + } + + public Location getAdjacentLocation(Direction direction) { + switch (direction) { + case NORTH: + return new Location(x, y - SnakeAnnotation.GRID_SIZE); + case SOUTH: + return new Location(x, y + SnakeAnnotation.GRID_SIZE); + case EAST: + return new Location(x + SnakeAnnotation.GRID_SIZE, y); + case WEST: + return new Location(x - SnakeAnnotation.GRID_SIZE, y); + case NONE: + // fall through + default: + return this; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Location location = (Location) o; + + if (x != location.x) return false; + if (y != location.y) return false; + + return true; + } + + @Override + public int hashCode() { + int result = x; + result = 31 * result + y; + return result; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class new file mode 100644 index 0000000000000000000000000000000000000000..867c80a92bfd0d16aa6b52b68e474bf7441ec2f3 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java new file mode 100644 index 0000000000000000000000000000000000000000..7a112220c57d573b59c9654bd0f1819d7b52a055 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java @@ -0,0 +1,150 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.snake; + +import java.io.IOException; +import java.util.ArrayDeque; +import java.util.Collection; +import java.util.Deque; + +import javax.websocket.CloseReason; +import javax.websocket.CloseReason.CloseCodes; +import javax.websocket.Session; + +public class Snake { + + private static final int DEFAULT_LENGTH = 5; + + private final int id; + private final Session session; + + private Direction direction; + private int length = DEFAULT_LENGTH; + private Location head; + private final Deque<Location> tail = new ArrayDeque<>(); + private final String hexColor; + + public Snake(int id, Session session) { + this.id = id; + this.session = session; + this.hexColor = SnakeAnnotation.getRandomHexColor(); + resetState(); + } + + private void resetState() { + this.direction = Direction.NONE; + this.head = SnakeAnnotation.getRandomLocation(); + this.tail.clear(); + this.length = DEFAULT_LENGTH; + } + + private synchronized void kill() { + resetState(); + sendMessage("{\"type\": \"dead\"}"); + } + + private synchronized void reward() { + length++; + sendMessage("{\"type\": \"kill\"}"); + } + + + protected void sendMessage(String msg) { + try { + session.getBasicRemote().sendText(msg); + } catch (IOException ioe) { + CloseReason cr = + new CloseReason(CloseCodes.CLOSED_ABNORMALLY, ioe.getMessage()); + try { + session.close(cr); + } catch (IOException ioe2) { + // Ignore + } + } + } + + public synchronized void update(Collection<Snake> snakes) { + Location nextLocation = head.getAdjacentLocation(direction); + if (nextLocation.x >= SnakeAnnotation.PLAYFIELD_WIDTH) { + nextLocation.x = 0; + } + if (nextLocation.y >= SnakeAnnotation.PLAYFIELD_HEIGHT) { + nextLocation.y = 0; + } + if (nextLocation.x < 0) { + nextLocation.x = SnakeAnnotation.PLAYFIELD_WIDTH; + } + if (nextLocation.y < 0) { + nextLocation.y = SnakeAnnotation.PLAYFIELD_HEIGHT; + } + if (direction != Direction.NONE) { + tail.addFirst(head); + if (tail.size() > length) { + tail.removeLast(); + } + head = nextLocation; + } + + handleCollisions(snakes); + } + + private void handleCollisions(Collection<Snake> snakes) { + for (Snake snake : snakes) { + boolean headCollision = id != snake.id && snake.getHead().equals(head); + boolean tailCollision = snake.getTail().contains(head); + if (headCollision || tailCollision) { + kill(); + if (id != snake.id) { + snake.reward(); + } + } + } + } + + public synchronized Location getHead() { + return head; + } + + public synchronized Collection<Location> getTail() { + return tail; + } + + public synchronized void setDirection(Direction direction) { + this.direction = direction; + } + + public synchronized String getLocationsJson() { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("{\"x\": %d, \"y\": %d}", + Integer.valueOf(head.x), Integer.valueOf(head.y))); + for (Location location : tail) { + sb.append(','); + sb.append(String.format("{\"x\": %d, \"y\": %d}", + Integer.valueOf(location.x), Integer.valueOf(location.y))); + } + return String.format("{\"id\":%d,\"body\":[%s]}", + Integer.valueOf(id), sb.toString()); + } + + public int getId() { + return id; + } + + public String getHexColor() { + return hexColor; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class new file mode 100644 index 0000000000000000000000000000000000000000..b88877fd52f79f4d28dccacc9c9d100a6aca4954 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java new file mode 100644 index 0000000000000000000000000000000000000000..c030dbcabe04ef0c92b14809fede9db1bc2b927c --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.snake; + +import java.awt.Color; +import java.io.EOFException; +import java.util.Iterator; +import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +@ServerEndpoint(value = "/websocket/snake") +public class SnakeAnnotation { + + public static final int PLAYFIELD_WIDTH = 640; + public static final int PLAYFIELD_HEIGHT = 480; + public static final int GRID_SIZE = 10; + + private static final AtomicInteger snakeIds = new AtomicInteger(0); + private static final Random random = new Random(); + + + private final int id; + private Snake snake; + + public static String getRandomHexColor() { + float hue = random.nextFloat(); + // sat between 0.1 and 0.3 + float saturation = (random.nextInt(2000) + 1000) / 10000f; + float luminance = 0.9f; + Color color = Color.getHSBColor(hue, saturation, luminance); + return '#' + Integer.toHexString( + (color.getRGB() & 0xffffff) | 0x1000000).substring(1); + } + + + public static Location getRandomLocation() { + int x = roundByGridSize(random.nextInt(PLAYFIELD_WIDTH)); + int y = roundByGridSize(random.nextInt(PLAYFIELD_HEIGHT)); + return new Location(x, y); + } + + + private static int roundByGridSize(int value) { + value = value + (GRID_SIZE / 2); + value = value / GRID_SIZE; + value = value * GRID_SIZE; + return value; + } + + public SnakeAnnotation() { + this.id = snakeIds.getAndIncrement(); + } + + + @OnOpen + public void onOpen(Session session) { + this.snake = new Snake(id, session); + SnakeTimer.addSnake(snake); + StringBuilder sb = new StringBuilder(); + for (Iterator<Snake> iterator = SnakeTimer.getSnakes().iterator(); + iterator.hasNext();) { + Snake snake = iterator.next(); + sb.append(String.format("{\"id\": %d, \"color\": \"%s\"}", + Integer.valueOf(snake.getId()), snake.getHexColor())); + if (iterator.hasNext()) { + sb.append(','); + } + } + SnakeTimer.broadcast(String.format("{\"type\": \"join\",\"data\":[%s]}", + sb.toString())); + } + + + @OnMessage + public void onTextMessage(String message) { + if ("west".equals(message)) { + snake.setDirection(Direction.WEST); + } else if ("north".equals(message)) { + snake.setDirection(Direction.NORTH); + } else if ("east".equals(message)) { + snake.setDirection(Direction.EAST); + } else if ("south".equals(message)) { + snake.setDirection(Direction.SOUTH); + } + } + + + @OnClose + public void onClose() { + SnakeTimer.removeSnake(snake); + SnakeTimer.broadcast(String.format("{\"type\": \"leave\", \"id\": %d}", + Integer.valueOf(id))); + } + + + @OnError + public void onError(Throwable t) throws Throwable { + // Most likely cause is a user closing their browser. Check to see if + // the root cause is EOF and if it is ignore it. + // Protect against infinite loops. + int count = 0; + Throwable root = t; + while (root.getCause() != null && count < 20) { + root = root.getCause(); + count ++; + } + if (root instanceof EOFException) { + // Assume this is triggered by the user closing their browser and + // ignore it. + } else { + throw t; + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0b50b8334c139ca1da2cea4c0304dd9365e76832 Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer$1.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class new file mode 100644 index 0000000000000000000000000000000000000000..d8e22d7135afeee545d73a76e4e228f280145c8b Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.class differ diff --git a/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java new file mode 100644 index 0000000000000000000000000000000000000000..011541399e1962e485dee873a5f3d60af017ba29 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package websocket.snake; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; + +/** + * Sets up the timer for the multi-player snake game WebSocket example. + */ +public class SnakeTimer { + + private static final Log log = + LogFactory.getLog(SnakeTimer.class); + + private static Timer gameTimer = null; + + private static final long TICK_DELAY = 100; + + private static final ConcurrentHashMap<Integer, Snake> snakes = + new ConcurrentHashMap<>(); + + protected static synchronized void addSnake(Snake snake) { + if (snakes.size() == 0) { + startTimer(); + } + snakes.put(Integer.valueOf(snake.getId()), snake); + } + + + protected static Collection<Snake> getSnakes() { + return Collections.unmodifiableCollection(snakes.values()); + } + + + protected static synchronized void removeSnake(Snake snake) { + snakes.remove(Integer.valueOf(snake.getId())); + if (snakes.size() == 0) { + stopTimer(); + } + } + + + protected static void tick() { + StringBuilder sb = new StringBuilder(); + for (Iterator<Snake> iterator = SnakeTimer.getSnakes().iterator(); + iterator.hasNext();) { + Snake snake = iterator.next(); + snake.update(SnakeTimer.getSnakes()); + sb.append(snake.getLocationsJson()); + if (iterator.hasNext()) { + sb.append(','); + } + } + broadcast(String.format("{\"type\": \"update\", \"data\" : [%s]}", + sb.toString())); + } + + protected static void broadcast(String message) { + for (Snake snake : SnakeTimer.getSnakes()) { + try { + snake.sendMessage(message); + } catch (IllegalStateException ise) { + // An ISE can occur if an attempt is made to write to a + // WebSocket connection after it has been closed. The + // alternative to catching this exception is to synchronise + // the writes to the clients along with the addSnake() and + // removeSnake() methods that are already synchronised. + } + } + } + + + public static void startTimer() { + gameTimer = new Timer(SnakeTimer.class.getSimpleName() + " Timer"); + gameTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + try { + tick(); + } catch (RuntimeException e) { + log.error("Caught to prevent timer from shutting down", e); + } + } + }, TICK_DELAY, TICK_DELAY); + } + + + public static void stopTimer() { + if (gameTimer != null) { + gameTimer.cancel(); + } + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java b/src/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java new file mode 100644 index 0000000000000000000000000000000000000000..c745815601441b27a7626a1b3b039f6d0f8058a8 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/jsp/applet/Clock2.java @@ -0,0 +1,230 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.applet.Applet; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Time! + * + * @author Rachel Gollub + */ + +public class Clock2 extends Applet implements Runnable { + private static final long serialVersionUID = 1L; + Thread timer; // The thread that displays clock + int lastxs, lastys, lastxm, + lastym, lastxh, lastyh; // Dimensions used to draw hands + SimpleDateFormat formatter; // Formats the date displayed + String lastdate; // String to hold date displayed + Font clockFaceFont; // Font for number display on clock + Date currentDate; // Used to get date to display + Color handColor; // Color of main hands and dial + Color numberColor; // Color of second hand and numbers + + @Override + public void init() { + lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0; + formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault()); + currentDate = new Date(); + lastdate = formatter.format(currentDate); + clockFaceFont = new Font("Serif", Font.PLAIN, 14); + handColor = Color.blue; + numberColor = Color.darkGray; + + try { + setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16))); + } catch (Exception e) { + // Ignore + } + try { + handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16)); + } catch (Exception e) { + // Ignore + } + try { + numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16)); + } catch (Exception e) { + // Ignore + } + resize(300,300); // Set clock window size + } + + // Plotpoints allows calculation to only cover 45 degrees of the circle, + // and then mirror + public void plotpoints(int x0, int y0, int x, int y, Graphics g) { + g.drawLine(x0+x,y0+y,x0+x,y0+y); + g.drawLine(x0+y,y0+x,x0+y,y0+x); + g.drawLine(x0+y,y0-x,x0+y,y0-x); + g.drawLine(x0+x,y0-y,x0+x,y0-y); + g.drawLine(x0-x,y0-y,x0-x,y0-y); + g.drawLine(x0-y,y0-x,x0-y,y0-x); + g.drawLine(x0-y,y0+x,x0-y,y0+x); + g.drawLine(x0-x,y0+y,x0-x,y0+y); + } + + // Circle is just Bresenham's algorithm for a scan converted circle + public void circle(int x0, int y0, int r, Graphics g) { + int x,y; + float d; + x=0; + y=r; + d=5/4-r; + plotpoints(x0,y0,x,y,g); + + while (y>x){ + if (d<0) { + d=d+2*x+3; + x++; + } + else { + d=d+2*(x-y)+5; + x++; + y--; + } + plotpoints(x0,y0,x,y,g); + } + } + + // Paint is the main part of the program + @Override + public void paint(Graphics g) { + int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter; + String today; + + currentDate = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault()); + try { + s = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + s = 0; + } + formatter.applyPattern("m"); + try { + m = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + m = 10; + } + formatter.applyPattern("h"); + try { + h = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + h = 10; + } + formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy"); + today = formatter.format(currentDate); + xcenter=80; + ycenter=55; + + // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00) + // x = r(cos a) + xcenter, y = r(sin a) + ycenter + + xs = (int)(Math.cos(s * Math.PI/30 - Math.PI/2) * 45 + xcenter); + ys = (int)(Math.sin(s * Math.PI/30 - Math.PI/2) * 45 + ycenter); + xm = (int)(Math.cos(m * Math.PI/30 - Math.PI/2) * 40 + xcenter); + ym = (int)(Math.sin(m * Math.PI/30 - Math.PI/2) * 40 + ycenter); + xh = (int)(Math.cos((h*30 + m/2) * Math.PI/180 - Math.PI/2) * 30 + xcenter); + yh = (int)(Math.sin((h*30 + m/2) * Math.PI/180 - Math.PI/2) * 30 + ycenter); + + // Draw the circle and numbers + + g.setFont(clockFaceFont); + g.setColor(handColor); + circle(xcenter,ycenter,50,g); + g.setColor(numberColor); + g.drawString("9",xcenter-45,ycenter+3); + g.drawString("3",xcenter+40,ycenter+3); + g.drawString("12",xcenter-5,ycenter-37); + g.drawString("6",xcenter-3,ycenter+45); + + // Erase if necessary, and redraw + + g.setColor(getBackground()); + if (xs != lastxs || ys != lastys) { + g.drawLine(xcenter, ycenter, lastxs, lastys); + g.drawString(lastdate, 5, 125); + } + if (xm != lastxm || ym != lastym) { + g.drawLine(xcenter, ycenter-1, lastxm, lastym); + g.drawLine(xcenter-1, ycenter, lastxm, lastym); } + if (xh != lastxh || yh != lastyh) { + g.drawLine(xcenter, ycenter-1, lastxh, lastyh); + g.drawLine(xcenter-1, ycenter, lastxh, lastyh); } + g.setColor(numberColor); + g.drawString("", 5, 125); + g.drawString(today, 5, 125); + g.drawLine(xcenter, ycenter, xs, ys); + g.setColor(handColor); + g.drawLine(xcenter, ycenter-1, xm, ym); + g.drawLine(xcenter-1, ycenter, xm, ym); + g.drawLine(xcenter, ycenter-1, xh, yh); + g.drawLine(xcenter-1, ycenter, xh, yh); + lastxs=xs; lastys=ys; + lastxm=xm; lastym=ym; + lastxh=xh; lastyh=yh; + lastdate = today; + currentDate=null; + } + + @Override + public void start() { + timer = new Thread(this); + timer.start(); + } + + @Override + public void stop() { + timer = null; + } + + @Override + public void run() { + Thread me = Thread.currentThread(); + while (timer == me) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + repaint(); + } + } + + @Override + public void update(Graphics g) { + paint(g); + } + + @Override + public String getAppletInfo() { + return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock."; + } + + @Override + public String[][] getParameterInfo() { + String[][] info = { + {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."}, + {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."}, + {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."} + }; + return info; + } +} diff --git a/src/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld b/src/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld new file mode 100644 index 0000000000000000000000000000000000000000..8f082d310350eeca5bd9b5f824a4947622a4f6c1 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/jsp/debug-taglib.tld @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE taglib + PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" + "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> + +<!-- a tag library descriptor --> + +<taglib> + <tlib-version>1.0</tlib-version> + <jsp-version>1.2</jsp-version> + <short-name>debug</short-name> + <uri>http://tomcat.apache.org/debug-taglib</uri> + <description> + This tag library defines no tags. Instead, its purpose is encapsulated + in the TagLibraryValidator implementation that simply outputs the XML + version of a JSP page to standard output, whenever this tag library is + referenced in a "taglib" directive in a JSP page. + </description> + <validator> + <validator-class>validators.DebugValidator</validator-class> + </validator> + + <!-- This is a dummy tag solely to satisfy DTD requirements --> + <tag> + <name>log</name> + <tag-class>examples.LogTag</tag-class> + <body-content>TAGDEPENDENT</body-content> + <description> + Perform a server side action; Log the message. + </description> + <attribute> + <name>toBrowser</name> + <required>false</required> + </attribute> + </tag> + + +</taglib> diff --git a/src/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld b/src/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld new file mode 100644 index 0000000000000000000000000000000000000000..442868ef939235f1c8e60865322d32e649a47d33 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/jsp/example-taglib.tld @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE taglib + PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" + "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> + +<taglib> + + <tlib-version>1.0</tlib-version> + <jsp-version>1.2</jsp-version> + <short-name>simple</short-name> + <uri>http://tomcat.apache.org/example-taglib</uri> + <description> + A simple tab library for the examples + </description> + + <tag> + <name>ShowSource</name> + <tag-class>examples.ShowSource</tag-class> + <description> Display JSP sources </description> + <attribute> + <name>jspFile</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + + <!-- A simple Tag --> + <!-- foo tag --> + <tag> + <name>foo</name> + <tag-class>examples.FooTag</tag-class> + <tei-class>examples.FooTagExtraInfo</tei-class> + <body-content>JSP</body-content> + <description> + Perform a server side action; uses 3 mandatory attributes + </description> + + <attribute> + <name>att1</name> + <required>true</required> + </attribute> + <attribute> + <name>att2</name> + <required>true</required> + </attribute> + <attribute> + <name>att3</name> + <required>true</required> + </attribute> + </tag> + + <!-- Another simple tag --> + <!-- log tag --> + <tag> + <name>log</name> + <tag-class>examples.LogTag</tag-class> + <body-content>TAGDEPENDENT</body-content> + <description> + Perform a server side action; Log the message. + </description> + <attribute> + <name>toBrowser</name> + <required>false</required> + </attribute> + </tag> + + <!-- Another simple Tag --> + <!-- values tag --> + <tag> + <name>values</name> + <tag-class>examples.ValuesTag</tag-class> + <body-content>empty</body-content> + <description> + Accept and return values of different types. This tag is used + to illustrate type coercions. + </description> + <attribute> + <name>object</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>java.lang.Object</type> + </attribute> + <attribute> + <name>string</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>java.lang.String</type> + </attribute> + <attribute> + <name>long</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>long</type> + </attribute> + <attribute> + <name>double</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <type>double</type> + </attribute> + </tag> +</taglib> diff --git a/src/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld b/src/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld new file mode 100644 index 0000000000000000000000000000000000000000..73173bdafd292911c4334ff505eb7f2c811fe56d --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<taglib xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" + version="2.0"> + <description>A tag library exercising SimpleTag handlers.</description> + <tlib-version>1.0</tlib-version> + <short-name>SimpleTagLibrary</short-name> + <uri>http://tomcat.apache.org/jsp2-example-taglib</uri> + <tag> + <description>Outputs Hello, World</description> + <name>helloWorld</name> + <tag-class>jsp2.examples.simpletag.HelloWorldSimpleTag</tag-class> + <body-content>empty</body-content> + </tag> + <tag> + <description>Repeats the body of the tag 'num' times</description> + <name>repeat</name> + <tag-class>jsp2.examples.simpletag.RepeatSimpleTag</tag-class> + <body-content>scriptless</body-content> + <variable> + <description>Current invocation count (1 to num)</description> + <name-given>count</name-given> + </variable> + <attribute> + <name>num</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + <tag> + <description>Populates the page context with a BookBean</description> + <name>findBook</name> + <tag-class>jsp2.examples.simpletag.FindBookSimpleTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>var</name> + <required>true</required> + <rtexprvalue>true</rtexprvalue> + </attribute> + </tag> + <tag> + <description> + Takes 3 fragments and invokes them in a random order + </description> + <name>shuffle</name> + <tag-class>jsp2.examples.simpletag.ShuffleSimpleTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>fragment1</name> + <required>true</required> + <fragment>true</fragment> + </attribute> + <attribute> + <name>fragment2</name> + <required>true</required> + <fragment>true</fragment> + </attribute> + <attribute> + <name>fragment3</name> + <required>true</required> + <fragment>true</fragment> + </attribute> + </tag> + <tag> + <description>Outputs a colored tile</description> + <name>tile</name> + <tag-class>jsp2.examples.simpletag.TileSimpleTag</tag-class> + <body-content>empty</body-content> + <attribute> + <name>color</name> + <required>true</required> + </attribute> + <attribute> + <name>label</name> + <required>true</required> + </attribute> + </tag> + <tag> + <description> + Tag that echoes all its attributes and body content + </description> + <name>echoAttributes</name> + <tag-class>jsp2.examples.simpletag.EchoAttributesTag</tag-class> + <body-content>empty</body-content> + <dynamic-attributes>true</dynamic-attributes> + </tag> + <function> + <description>Reverses the characters in the given String</description> + <name>reverse</name> + <function-class>jsp2.examples.el.Functions</function-class> + <function-signature>java.lang.String reverse( java.lang.String )</function-signature> + </function> + <function> + <description>Counts the number of vowels (a,e,i,o,u) in the given String</description> + <name>countVowels</name> + <function-class>jsp2.examples.el.Functions</function-class> + <function-signature>java.lang.String numVowels( java.lang.String )</function-signature> + </function> + <function> + <description>Converts the string to all caps</description> + <name>caps</name> + <function-class>jsp2.examples.el.Functions</function-class> + <function-signature>java.lang.String caps( java.lang.String )</function-signature> + </function> +</taglib> + diff --git a/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar b/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..9176777787e57984e2a6451fe52f80147bb1830e Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-impl-1.2.5.jar differ diff --git a/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar b/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..d54786732bcb5c48f907f5ce1436502aeb48ddef Binary files /dev/null and b/src/tomcat/webapps/examples/WEB-INF/lib/taglibs-standard-spec-1.2.5.jar differ diff --git a/src/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag b/src/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag new file mode 100644 index 0000000000000000000000000000000000000000..41e8c353db7040ad5124f7613a1f0e64a2cd95f8 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/tags/displayProducts.tag @@ -0,0 +1,55 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ attribute name="normalPrice" fragment="true" %> +<%@ attribute name="onSale" fragment="true" %> +<%@ variable name-given="name" %> +<%@ variable name-given="price" %> +<%@ variable name-given="origPrice" %> +<%@ variable name-given="salePrice" %> + +<table border="1"> + <tr> + <td> + <c:set var="name" value="Hand-held Color PDA"/> + <c:set var="price" value="$298.86"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="4-Pack 150 Watt Light Bulbs"/> + <c:set var="origPrice" value="$2.98"/> + <c:set var="salePrice" value="$2.32"/> + <jsp:invoke fragment="onSale"/> + </td> + <td> + <c:set var="name" value="Digital Cellular Phone"/> + <c:set var="price" value="$68.74"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="Baby Grand Piano"/> + <c:set var="price" value="$10,800.00"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="Luxury Car w/ Leather Seats"/> + <c:set var="origPrice" value="$23,980.00"/> + <c:set var="salePrice" value="$21,070.00"/> + <jsp:invoke fragment="onSale"/> + </td> + </tr> +</table> diff --git a/src/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag b/src/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag new file mode 100644 index 0000000000000000000000000000000000000000..192bf53cc466c1df947aae17efc304e535c26c39 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/tags/helloWorld.tag @@ -0,0 +1,17 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +Hello, world! diff --git a/src/tomcat/webapps/examples/WEB-INF/tags/panel.tag b/src/tomcat/webapps/examples/WEB-INF/tags/panel.tag new file mode 100644 index 0000000000000000000000000000000000000000..f4f30d0244e425dad93f90cf240c4e979d2f65e4 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/tags/panel.tag @@ -0,0 +1,29 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<%@ attribute name="color" %> +<%@ attribute name="bgcolor" %> +<%@ attribute name="title" %> +<table border="1" bgcolor="${color}"> + <tr> + <td><b>${title}</b></td> + </tr> + <tr> + <td bgcolor="${bgcolor}"> + <jsp:doBody/> + </td> + </tr> +</table> diff --git a/src/tomcat/webapps/examples/WEB-INF/web.xml b/src/tomcat/webapps/examples/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..4fb4d16ac95b3929ceb5418e14c1f4ee48f69cf1 --- /dev/null +++ b/src/tomcat/webapps/examples/WEB-INF/web.xml @@ -0,0 +1,399 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" + metadata-complete="true"> + + <description> + Servlet and JSP Examples. + </description> + <display-name>Servlet and JSP Examples</display-name> + + <request-character-encoding>UTF-8</request-character-encoding> + + <!-- Define example filters --> + <filter> + <filter-name>Timing Filter</filter-name> + <filter-class>filters.ExampleFilter</filter-class> + <init-param> + <param-name>attribute</param-name> + <param-value>filters.ExampleFilter</param-value> + </init-param> + </filter> + + <filter> + <filter-name>Request Dumper Filter</filter-name> + <filter-class>org.apache.catalina.filters.RequestDumperFilter</filter-class> + </filter> + + <filter> + <filter-name>Compression Filter</filter-name> + <filter-class>compressionFilters.CompressionFilter</filter-class> + <init-param> + <param-name>compressionThreshold</param-name> + <param-value>128</param-value> + </init-param> + <init-param> + <param-name>compressionBuffer</param-name> + <param-value>8192</param-value> + </init-param> + <init-param> + <param-name>compressionMimeTypes</param-name> + <param-value>text/html,text/plain,text/xml</param-value> + </init-param> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + </filter> + + <!-- Define filter mappings for the timing filters --> + <!-- + <filter-mapping> + <filter-name>Timing Filter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + --> + +<!-- + <filter-mapping> + <filter-name>Compression Filter</filter-name> + <url-pattern>/CompressionTest</url-pattern> + </filter-mapping> +--> + +<!-- + <filter-mapping> + <filter-name>Request Dumper Filter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> +--> + + <!-- Define example application events listeners --> + <listener> + <listener-class>listeners.ContextListener</listener-class> + </listener> + <listener> + <listener-class>listeners.SessionListener</listener-class> + </listener> + + <!-- Define listeners required by examples --> + <listener> + <listener-class>async.AsyncStockContextListener</listener-class> + </listener> + + <!-- Define servlets that are included in the example application --> + + <servlet> + <servlet-name>ServletToJsp</servlet-name> + <servlet-class>ServletToJsp</servlet-class> + </servlet> + <servlet> + <servlet-name>CompressionFilterTestServlet</servlet-name> + <servlet-class>compressionFilters.CompressionFilterTestServlet</servlet-class> + </servlet> + <servlet> + <servlet-name>HelloWorldExample</servlet-name> + <servlet-class>HelloWorldExample</servlet-class> + </servlet> + <servlet> + <servlet-name>RequestInfoExample</servlet-name> + <servlet-class>RequestInfoExample</servlet-class> + </servlet> + <servlet> + <servlet-name>RequestHeaderExample</servlet-name> + <servlet-class>RequestHeaderExample</servlet-class> + </servlet> + <servlet> + <servlet-name>RequestParamExample</servlet-name> + <servlet-class>RequestParamExample</servlet-class> + </servlet> + <servlet> + <servlet-name>CookieExample</servlet-name> + <servlet-class>CookieExample</servlet-class> + </servlet> + <servlet> + <servlet-name>SessionExample</servlet-name> + <servlet-class>SessionExample</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>CompressionFilterTestServlet</servlet-name> + <url-pattern>/CompressionTest</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>HelloWorldExample</servlet-name> + <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>RequestInfoExample</servlet-name> + <url-pattern>/servlets/servlet/RequestInfoExample/*</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>RequestHeaderExample</servlet-name> + <url-pattern>/servlets/servlet/RequestHeaderExample</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>RequestParamExample</servlet-name> + <url-pattern>/servlets/servlet/RequestParamExample</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>CookieExample</servlet-name> + <url-pattern>/servlets/servlet/CookieExample</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>SessionExample</servlet-name> + <url-pattern>/servlets/servlet/SessionExample</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>ServletToJsp</servlet-name> + <url-pattern>/servletToJsp</url-pattern> + </servlet-mapping> + + <jsp-config> + <taglib> + <taglib-uri> + http://tomcat.apache.org/debug-taglib + </taglib-uri> + <taglib-location> + /WEB-INF/jsp/debug-taglib.tld + </taglib-location> + </taglib> + + <taglib> + <taglib-uri> + http://tomcat.apache.org/example-taglib + </taglib-uri> + <taglib-location> + /WEB-INF/jsp/example-taglib.tld + </taglib-location> + </taglib> + + <taglib> + <taglib-uri> + http://tomcat.apache.org/jsp2-example-taglib + </taglib-uri> + <taglib-location> + /WEB-INF/jsp2/jsp2-example-taglib.tld + </taglib-location> + </taglib> + + <jsp-property-group> + <description> + Special property group for JSP Configuration JSP example. + </description> + <display-name>JSPConfiguration</display-name> + <url-pattern>/jsp/jsp2/misc/config.jsp</url-pattern> + <el-ignored>true</el-ignored> + <page-encoding>ISO-8859-1</page-encoding> + <scripting-invalid>true</scripting-invalid> + <include-prelude>/jsp/jsp2/misc/prelude.jspf</include-prelude> + <include-coda>/jsp/jsp2/misc/coda.jspf</include-coda> + </jsp-property-group> + </jsp-config> + + <security-constraint> + <display-name>Example Security Constraint - part 1</display-name> + <web-resource-collection> + <web-resource-name>Protected Area - Allow methods</web-resource-name> + <!-- Define the context-relative URL(s) to be protected --> + <url-pattern>/jsp/security/protected/*</url-pattern> + <!-- If you list http methods, only those methods are protected so --> + <!-- the constraint below ensures all other methods are denied --> + <http-method>DELETE</http-method> + <http-method>GET</http-method> + <http-method>POST</http-method> + <http-method>PUT</http-method> + </web-resource-collection> + <auth-constraint> + <!-- Anyone with one of the listed roles may access this area --> + <role-name>tomcat</role-name> + <role-name>role1</role-name> + </auth-constraint> + </security-constraint> + <security-constraint> + <display-name>Example Security Constraint - part 2</display-name> + <web-resource-collection> + <web-resource-name>Protected Area - Deny methods</web-resource-name> + <!-- Define the context-relative URL(s) to be protected --> + <url-pattern>/jsp/security/protected/*</url-pattern> + <http-method-omission>DELETE</http-method-omission> + <http-method-omission>GET</http-method-omission> + <http-method-omission>POST</http-method-omission> + <http-method-omission>PUT</http-method-omission> + </web-resource-collection> + <!-- An empty auth constraint denies access --> + <auth-constraint /> + </security-constraint> + + <!-- Default login configuration uses form-based authentication --> + <login-config> + <auth-method>FORM</auth-method> + <realm-name>Example Form-Based Authentication Area</realm-name> + <form-login-config> + <form-login-page>/jsp/security/protected/login.jsp</form-login-page> + <form-error-page>/jsp/security/protected/error.jsp</form-error-page> + </form-login-config> + </login-config> + + <!-- Security roles referenced by this web application --> + <security-role> + <role-name>role1</role-name> + </security-role> + <security-role> + <role-name>tomcat</role-name> + </security-role> + + <!-- Environment entry examples --> + <!--env-entry> + <env-entry-description> + The maximum number of tax exemptions allowed to be set. + </env-entry-description> + <env-entry-name>maxExemptions</env-entry-name> + <env-entry-type>java.lang.Integer</env-entry-type> + <env-entry-value>15</env-entry-value> + </env-entry--> + <env-entry> + <env-entry-name>minExemptions</env-entry-name> + <env-entry-type>java.lang.Integer</env-entry-type> + <env-entry-value>1</env-entry-value> + </env-entry> + <env-entry> + <env-entry-name>foo/name1</env-entry-name> + <env-entry-type>java.lang.String</env-entry-type> + <env-entry-value>value1</env-entry-value> + </env-entry> + <env-entry> + <env-entry-name>foo/bar/name2</env-entry-name> + <env-entry-type>java.lang.Boolean</env-entry-type> + <env-entry-value>true</env-entry-value> + </env-entry> + <env-entry> + <env-entry-name>name3</env-entry-name> + <env-entry-type>java.lang.Integer</env-entry-type> + <env-entry-value>1</env-entry-value> + </env-entry> + <env-entry> + <env-entry-name>foo/name4</env-entry-name> + <env-entry-type>java.lang.Integer</env-entry-type> + <env-entry-value>10</env-entry-value> + </env-entry> + + <!-- Async examples --> + <servlet> + <servlet-name>async0</servlet-name> + <servlet-class>async.Async0</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>async0</servlet-name> + <url-pattern>/async/async0</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>async1</servlet-name> + <servlet-class>async.Async1</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>async1</servlet-name> + <url-pattern>/async/async1</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>async2</servlet-name> + <servlet-class>async.Async2</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>async2</servlet-name> + <url-pattern>/async/async2</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>async3</servlet-name> + <servlet-class>async.Async3</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>async3</servlet-name> + <url-pattern>/async/async3</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>stock</servlet-name> + <servlet-class>async.AsyncStockServlet</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>stock</servlet-name> + <url-pattern>/async/stockticker</url-pattern> + </servlet-mapping> + + <!-- Non-blocking IO examples --> + <servlet> + <servlet-name>bytecounter</servlet-name> + <servlet-class>nonblocking.ByteCounter</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>bytecounter</servlet-name> + <url-pattern>/servlets/nonblocking/bytecounter</url-pattern> + </servlet-mapping> + <servlet> + <servlet-name>numberwriter</servlet-name> + <servlet-class>nonblocking.NumberWriter</servlet-class> + <async-supported>true</async-supported> + </servlet> + <servlet-mapping> + <servlet-name>numberwriter</servlet-name> + <url-pattern>/servlets/nonblocking/numberwriter</url-pattern> + </servlet-mapping> + + <!-- Server Push examples --> + <servlet> + <servlet-name>simpleimagepush</servlet-name> + <servlet-class>http2.SimpleImagePush</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>simpleimagepush</servlet-name> + <url-pattern>/servlets/serverpush/simpleimage</url-pattern> + </servlet-mapping> + + <!-- Trailer examples --> + <servlet> + <servlet-name>responsetrailer</servlet-name> + <servlet-class>trailers.ResponseTrailers</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>responsetrailer</servlet-name> + <url-pattern>/servlets/trailers/response</url-pattern> + </servlet-mapping> + + <welcome-file-list> + <welcome-file>index.html</welcome-file> + <welcome-file>index.xhtml</welcome-file> + <welcome-file>index.htm</welcome-file> + <welcome-file>index.jsp</welcome-file> + </welcome-file-list> + + <!-- Websocket examples --> + <listener> + <listener-class>websocket.drawboard.DrawboardContextListener</listener-class> + </listener> + +</web-app> diff --git a/src/tomcat/webapps/examples/index.html b/src/tomcat/webapps/examples/index.html new file mode 100644 index 0000000000000000000000000000000000000000..0799e10f7227885c731264ffe11c9bcafee11901 --- /dev/null +++ b/src/tomcat/webapps/examples/index.html @@ -0,0 +1,30 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE HTML><html lang="en"><head> +<meta charset="UTF-8"> +<title>Apache Tomcat Examples</title> +</head> +<body> +<p> +<h3>Apache Tomcat Examples</H3> +<p></p> +<ul> +<li><a href="servlets">Servlets examples</a></li> +<li><a href="jsp">JSP Examples</a></li> +<li><a href="websocket/index.xhtml">WebSocket Examples</a></li> +</ul> +</body></html> diff --git a/src/tomcat/webapps/examples/jsp/async/async1.jsp b/src/tomcat/webapps/examples/jsp/async/async1.jsp new file mode 100644 index 0000000000000000000000000000000000000000..af88869eaca2839ee55f644a87aab3e4cf856e28 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/async1.jsp @@ -0,0 +1,28 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%> +Output from async1.jsp +Type is <%=request.getDispatcherType()%> +<% + System.out.println("Inside Async 1"); + if (request.isAsyncStarted()) { + request.getAsyncContext().complete(); + } + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); +%> +Completed async request at <%=sdf.format(date)%> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/async/async1.jsp.html b/src/tomcat/webapps/examples/jsp/async/async1.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..2244765eb11302def78d84b25b580e9061874ef6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/async1.jsp.html @@ -0,0 +1,29 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%> +Output from async1.jsp +Type is <%=request.getDispatcherType()%> +<% + System.out.println("Inside Async 1"); + if (request.isAsyncStarted()) { + request.getAsyncContext().complete(); + } + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); +%> +Completed async request at <%=sdf.format(date)%> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/async/async3.jsp b/src/tomcat/webapps/examples/jsp/async/async3.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9d24e60194e246f537fed0dea425e35e97ba632a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/async3.jsp @@ -0,0 +1,25 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%> +Output from async3.jsp +Type is <%=request.getDispatcherType()%> +<% + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); +%> + +Completed async 3 request at <%=sdf.format(date)%> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/async/async3.jsp.html b/src/tomcat/webapps/examples/jsp/async/async3.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..6deced8523f2a2bdf2575ba10525533e90348c27 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/async3.jsp.html @@ -0,0 +1,26 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" import="java.util.Date,java.text.SimpleDateFormat"%> +Output from async3.jsp +Type is <%=request.getDispatcherType()%> +<% + Date date = new Date(System.currentTimeMillis()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); +%> + +Completed async 3 request at <%=sdf.format(date)%> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/async/index.jsp b/src/tomcat/webapps/examples/jsp/async/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..be2d713639153d9146ca268bdd4bebc604973b6b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/index.jsp @@ -0,0 +1,69 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false"%> + +<pre> +Use cases: + +1. Simple dispatch + - servlet does startAsync() + - background thread calls ctx.dispatch() + <a href="<%=response.encodeURL("/examples/async/async0")%>"> Async 0 </a> + +2. Simple dispatch + - servlet does startAsync() + - background thread calls dispatch(/path/to/jsp) + <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a> + +3. Simple dispatch + - servlet does startAsync() + - background thread calls writes and calls complete() + <a href="<%=response.encodeURL("/examples/async/async2")%>"> Async 2 </a> + +4. Simple dispatch + - servlet does a startAsync() + - servlet calls dispatch(/path/to/jsp) + - servlet calls complete() + <a href="<%=response.encodeURL("/examples/async/async3")%>"> Async 3 </a> + +3. Timeout s1 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - returns - waits for timeout to happen should return error page + +4. Timeout s2 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - servlet does a addAsyncListener + - returns - waits for timeout to happen and listener invoked + +5. Dispatch to asyncSupported=false servlet + - servlet1 does a startAsync() + - servlet1 dispatches to dispatch(/servlet2) + - the container calls complete() after servlet2 is complete + - TODO + +6. Chained dispatch + - servlet1 does a startAsync + - servlet1 does a dispatch to servlet2 (asyncsupported=true) + - servlet2 does a dispatch to servlet3 (asyncsupported=true) + - servlet3 does a dispatch to servlet4 (asyncsupported=false) + + +7. Stock ticker + <a href="<%=response.encodeURL("/examples/async/stockticker")%>"> StockTicker </a> +</pre> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/async/index.jsp.html b/src/tomcat/webapps/examples/jsp/async/index.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..778b6434faedb339f99b2f2e3230bf5bd8bb5222 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/async/index.jsp.html @@ -0,0 +1,70 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false"%> + +<pre> +Use cases: + +1. Simple dispatch + - servlet does startAsync() + - background thread calls ctx.dispatch() + <a href="<%=response.encodeURL("/examples/async/async0")%>"> Async 0 </a> + +2. Simple dispatch + - servlet does startAsync() + - background thread calls dispatch(/path/to/jsp) + <a href="<%=response.encodeURL("/examples/async/async1")%>"> Async 1 </a> + +3. Simple dispatch + - servlet does startAsync() + - background thread calls writes and calls complete() + <a href="<%=response.encodeURL("/examples/async/async2")%>"> Async 2 </a> + +4. Simple dispatch + - servlet does a startAsync() + - servlet calls dispatch(/path/to/jsp) + - servlet calls complete() + <a href="<%=response.encodeURL("/examples/async/async3")%>"> Async 3 </a> + +3. Timeout s1 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - returns - waits for timeout to happen should return error page + +4. Timeout s2 + - servlet does a startAsync() + - servlet does a setAsyncTimeout + - servlet does a addAsyncListener + - returns - waits for timeout to happen and listener invoked + +5. Dispatch to asyncSupported=false servlet + - servlet1 does a startAsync() + - servlet1 dispatches to dispatch(/servlet2) + - the container calls complete() after servlet2 is complete + - TODO + +6. Chained dispatch + - servlet1 does a startAsync + - servlet1 does a dispatch to servlet2 (asyncsupported=true) + - servlet2 does a dispatch to servlet3 (asyncsupported=true) + - servlet3 does a dispatch to servlet4 (asyncsupported=false) + + +7. Stock ticker + <a href="<%=response.encodeURL("/examples/async/stockticker")%>"> StockTicker </a> +</pre> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/Entries.java.html b/src/tomcat/webapps/examples/jsp/cal/Entries.java.html new file mode 100644 index 0000000000000000000000000000000000000000..03f9a0c16dc0f8bc940a2283f34cadf58ca18e38 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/Entries.java.html @@ -0,0 +1,61 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cal; + +import java.util.Hashtable; + +import javax.servlet.http.HttpServletRequest; + +public class Entries { + + private final Hashtable<String, Entry> entries; + private static final String[] time = { "8am", "9am", "10am", "11am", + "12pm", "1pm", "2pm", "3pm", "4pm", "5pm", "6pm", "7pm", "8pm" }; + public static final int rows = 12; + + public Entries() { + entries = new Hashtable<>(rows); + for (int i = 0; i < rows; i++) { + entries.put(time[i], new Entry(time[i])); + } + } + + public int getRows() { + return rows; + } + + public Entry getEntry(int index) { + return this.entries.get(time[index]); + } + + public int getIndex(String tm) { + for (int i = 0; i < rows; i++) + if (tm.equals(time[i])) + return i; + return -1; + } + + public void processRequest(HttpServletRequest request, String tm) { + int index = getIndex(tm); + if (index >= 0) { + String descr = request.getParameter("description"); + entries.get(time[index]).setDescription(descr); + } + } + +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/Entry.java.html b/src/tomcat/webapps/examples/jsp/cal/Entry.java.html new file mode 100644 index 0000000000000000000000000000000000000000..7183a0ac26a5ca868126805a26f1c45ea1cf39a8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/Entry.java.html @@ -0,0 +1,54 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cal; + +public class Entry { + + final String hour; + String description; + + public Entry(String hour) { + this.hour = hour; + this.description = ""; + + } + + public String getHour() { + return this.hour; + } + + public String getColor() { + if (description.equals("")) { + return "lightblue"; + } + return "red"; + } + + public String getDescription() { + if (description.equals("")) { + return "None"; + } + return this.description; + } + + public void setDescription(String descr) { + description = descr; + } + +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html b/src/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html new file mode 100644 index 0000000000000000000000000000000000000000..118996ee4f9278c2b89c84918728d5f0eefcfda0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/JspCalendar.java.html @@ -0,0 +1,152 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package cal; + +import java.util.Calendar; +import java.util.Date; + +public class JspCalendar { + final Calendar calendar; + + public JspCalendar() { + calendar = Calendar.getInstance(); + Date trialTime = new Date(); + calendar.setTime(trialTime); + } + + + public int getYear() { + return calendar.get(Calendar.YEAR); + } + + public String getMonth() { + int m = getMonthInt(); + String[] months = new String [] { "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" }; + if (m > 12) + return "Unknown to Man"; + + return months[m - 1]; + + } + + public String getDay() { + int x = getDayOfWeek(); + String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + + if (x > 7) + return "Unknown to Man"; + + return days[x - 1]; + + } + + public int getMonthInt() { + return 1 + calendar.get(Calendar.MONTH); + } + + public String getDate() { + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + } + + public String getCurrentDate() { + Date dt = new Date (); + calendar.setTime (dt); + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + + } + + public String getNextDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() + 1); + return getDate (); + } + + public String getPrevDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() - 1); + return getDate (); + } + + public String getTime() { + return getHour() + ":" + getMinute() + ":" + getSecond(); + } + + public int getDayOfMonth() { + return calendar.get(Calendar.DAY_OF_MONTH); + } + + public int getDayOfYear() { + return calendar.get(Calendar.DAY_OF_YEAR); + } + + public int getWeekOfYear() { + return calendar.get(Calendar.WEEK_OF_YEAR); + } + + public int getWeekOfMonth() { + return calendar.get(Calendar.WEEK_OF_MONTH); + } + + public int getDayOfWeek() { + return calendar.get(Calendar.DAY_OF_WEEK); + } + + public int getHour() { + return calendar.get(Calendar.HOUR_OF_DAY); + } + + public int getMinute() { + return calendar.get(Calendar.MINUTE); + } + + + public int getSecond() { + return calendar.get(Calendar.SECOND); + } + + + public int getEra() { + return calendar.get(Calendar.ERA); + } + + public String getUSTimeZone() { + String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific", + "Mountain", "Central", "Eastern"}; + + return zones[10 + getZoneOffset()]; + } + + public int getZoneOffset() { + return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000); + } + + + public int getDSTOffset() { + return calendar.get(Calendar.DST_OFFSET)/(60*60*1000); + } + + + public int getAMPM() { + return calendar.get(Calendar.AM_PM); + } +} + + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/TableBean.java.html b/src/tomcat/webapps/examples/jsp/cal/TableBean.java.html new file mode 100644 index 0000000000000000000000000000000000000000..00a8a04a184e4a4f6d85ec316ce0ec455a1ca19f --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/TableBean.java.html @@ -0,0 +1,102 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cal; + +import java.util.Hashtable; + +import javax.servlet.http.HttpServletRequest; + +public class TableBean { + + final Hashtable<String, Entries> table; + final JspCalendar JspCal; + Entries entries; + String date; + String name = null; + String email = null; + boolean processError = false; + + public TableBean() { + this.table = new Hashtable<>(10); + this.JspCal = new JspCalendar(); + this.date = JspCal.getCurrentDate(); + } + + public void setName(String nm) { + this.name = nm; + } + + public String getName() { + return this.name; + } + + public void setEmail(String mail) { + this.email = mail; + } + + public String getEmail() { + return this.email; + } + + public String getDate() { + return this.date; + } + + public Entries getEntries() { + return this.entries; + } + + public void processRequest(HttpServletRequest request) { + + // Get the name and e-mail. + this.processError = false; + if (name == null || name.equals("")) + setName(request.getParameter("name")); + if (email == null || email.equals("")) + setEmail(request.getParameter("email")); + if (name == null || email == null || name.equals("") + || email.equals("")) { + this.processError = true; + return; + } + + // Get the date. + String dateR = request.getParameter("date"); + if (dateR == null) + date = JspCal.getCurrentDate(); + else if (dateR.equalsIgnoreCase("next")) + date = JspCal.getNextDate(); + else if (dateR.equalsIgnoreCase("prev")) + date = JspCal.getPrevDate(); + + entries = table.get(date); + if (entries == null) { + entries = new Entries(); + table.put(date, entries); + } + + // If time is provided add the event. + String time = request.getParameter("time"); + if (time != null) + entries.processRequest(request, time); + } + + public boolean getProcessError() { + return this.processError; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/cal1.jsp b/src/tomcat/webapps/examples/jsp/cal/cal1.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e6b8a49d0c9eb169f8a46735f87d7680b6da9140 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/cal1.jsp @@ -0,0 +1,94 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<HTML> +<HEAD><TITLE> + Calendar: A JSP APPLICATION +</TITLE></HEAD> + + +<BODY BGCOLOR="white"> + +<%@ page language="java" import="cal.*" %> +<jsp:useBean id="table" scope="session" class="cal.TableBean" /> + +<% + table.processRequest(request); + if (table.getProcessError() == false) { +%> + +<!-- html table goes here --> +<CENTER> +<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15> +<TR> +<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=prev> prev </A> +<TD ALIGN=CENTER> Calendar:<%= table.getDate() %></TD> +<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=next> next </A> +</TR> +</TABLE> + +<!-- the main table --> +<TABLE WIDTH=60% BGCOLOR=lightblue BORDER=1 CELLPADDING=10> +<TR> +<TH> Time </TH> +<TH> Appointment </TH> +</TR> +<FORM METHOD=POST ACTION=cal1.jsp> +<% + for(int i=0; i<table.getEntries().getRows(); i++) { + cal.Entry entr = table.getEntries().getEntry(i); +%> + <TR> + <TD> + <A HREF=cal2.jsp?time=<%= entr.getHour() %>> + <%= entr.getHour() %> </A> + </TD> + <TD BGCOLOR=<%= entr.getColor() %>> + <% out.print(util.HTMLFilter.filter(entr.getDescription())); %> + </TD> + </TR> +<% + } +%> +</FORM> +</TABLE> +<BR> + +<!-- footer --> +<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15> +<TR> +<TD ALIGN=CENTER> <% out.print(util.HTMLFilter.filter(table.getName())); %> : + <% out.print(util.HTMLFilter.filter(table.getEmail())); %> </TD> +</TR> +</TABLE> +</CENTER> + +<% + } else { +%> +<font size=5> + You must enter your name and email address correctly. +</font> +<% + } +%> + + +</BODY> +</HTML> + + diff --git a/src/tomcat/webapps/examples/jsp/cal/cal1.jsp.html b/src/tomcat/webapps/examples/jsp/cal/cal1.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..7daddf010de3652aca82e2e7888ae5dcd17283b3 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/cal1.jsp.html @@ -0,0 +1,95 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<HTML> +<HEAD><TITLE> + Calendar: A JSP APPLICATION +</TITLE></HEAD> + + +<BODY BGCOLOR="white"> + +<%@ page language="java" import="cal.*" %> +<jsp:useBean id="table" scope="session" class="cal.TableBean" /> + +<% + table.processRequest(request); + if (table.getProcessError() == false) { +%> + +<!-- html table goes here --> +<CENTER> +<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15> +<TR> +<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=prev> prev </A> +<TD ALIGN=CENTER> Calendar:<%= table.getDate() %></TD> +<TD ALIGN=CENTER> <A HREF=cal1.jsp?date=next> next </A> +</TR> +</TABLE> + +<!-- the main table --> +<TABLE WIDTH=60% BGCOLOR=lightblue BORDER=1 CELLPADDING=10> +<TR> +<TH> Time </TH> +<TH> Appointment </TH> +</TR> +<FORM METHOD=POST ACTION=cal1.jsp> +<% + for(int i=0; i<table.getEntries().getRows(); i++) { + cal.Entry entr = table.getEntries().getEntry(i); +%> + <TR> + <TD> + <A HREF=cal2.jsp?time=<%= entr.getHour() %>> + <%= entr.getHour() %> </A> + </TD> + <TD BGCOLOR=<%= entr.getColor() %>> + <% out.print(util.HTMLFilter.filter(entr.getDescription())); %> + </TD> + </TR> +<% + } +%> +</FORM> +</TABLE> +<BR> + +<!-- footer --> +<TABLE WIDTH=60% BGCOLOR=yellow CELLPADDING=15> +<TR> +<TD ALIGN=CENTER> <% out.print(util.HTMLFilter.filter(table.getName())); %> : + <% out.print(util.HTMLFilter.filter(table.getEmail())); %> </TD> +</TR> +</TABLE> +</CENTER> + +<% + } else { +%> +<font size=5> + You must enter your name and email address correctly. +</font> +<% + } +%> + + +</BODY> +</HTML> + + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/cal2.jsp b/src/tomcat/webapps/examples/jsp/cal/cal2.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e7e14d8e0468825cc23b95a8c332c8990acfd873 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/cal2.jsp @@ -0,0 +1,45 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<HTML> +<HEAD><TITLE> + Calendar: A JSP APPLICATION +</TITLE></HEAD> + + +<BODY BGCOLOR="white"> +<jsp:useBean id="table" scope="session" class="cal.TableBean" /> + +<% + String time = request.getParameter ("time"); +%> + +<FONT SIZE=5> Please add the following event: +<BR> <h3> Date <%= table.getDate() %> +<BR> Time <%= util.HTMLFilter.filter(time) %> </h3> +</FONT> +<FORM METHOD=POST ACTION=cal1.jsp> +<BR> +<BR> <INPUT NAME="date" TYPE=HIDDEN VALUE="current"> +<BR> <INPUT NAME="time" TYPE=HIDDEN VALUE="<%= util.HTMLFilter.filter(time) %>"> +<BR> <h2> Description of the event <INPUT NAME="description" TYPE=TEXT SIZE=20> </h2> +<BR> <INPUT TYPE=SUBMIT VALUE="submit"> +</FORM> + +</BODY> +</HTML> + diff --git a/src/tomcat/webapps/examples/jsp/cal/cal2.jsp.html b/src/tomcat/webapps/examples/jsp/cal/cal2.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..2cc191bc35ba4f09dcbfa770e25cc50bd8191a8f --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/cal2.jsp.html @@ -0,0 +1,46 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<HTML> +<HEAD><TITLE> + Calendar: A JSP APPLICATION +</TITLE></HEAD> + + +<BODY BGCOLOR="white"> +<jsp:useBean id="table" scope="session" class="cal.TableBean" /> + +<% + String time = request.getParameter ("time"); +%> + +<FONT SIZE=5> Please add the following event: +<BR> <h3> Date <%= table.getDate() %> +<BR> Time <%= util.HTMLFilter.filter(time) %> </h3> +</FONT> +<FORM METHOD=POST ACTION=cal1.jsp> +<BR> +<BR> <INPUT NAME="date" TYPE=HIDDEN VALUE="current"> +<BR> <INPUT NAME="time" TYPE=HIDDEN VALUE="<%= util.HTMLFilter.filter(time) %>"> +<BR> <h2> Description of the event <INPUT NAME="description" TYPE=TEXT SIZE=20> </h2> +<BR> <INPUT TYPE=SUBMIT VALUE="submit"> +</FORM> + +</BODY> +</HTML> + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/cal/calendar.html b/src/tomcat/webapps/examples/jsp/cal/calendar.html new file mode 100644 index 0000000000000000000000000000000000000000..a0a3ea1841341fbd612d633dc5bed3f0171b1c36 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/calendar.html @@ -0,0 +1,43 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="login.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h2> Source Code for Calendar Example. <br> +<h3><a href="cal1.jsp.html">cal1.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="cal2.jsp.html">cal2.jsp<font color="#0000FF"></a> + </font> </h3> + +<br> +<h2> Beans. +<h3><a href="TableBean.java.html">TableBean<font color="#0000FF"></a> + </font> </h3> +<h3><a href="Entries.java.html">Entries<font color="#0000FF"></a> + </font> </h3> +<h3><a href="Entry.java.html">Entry<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/cal/login.html b/src/tomcat/webapps/examples/jsp/cal/login.html new file mode 100644 index 0000000000000000000000000000000000000000..2c4aa55e0f7c4db170cf4586cc107a523cdc2942 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/cal/login.html @@ -0,0 +1,47 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> + <title> Login page for the calendar. </title> +</head> + +<body bgcolor="white"> +<center> + + <font size=7 color="red"> Please Enter the following information: </font> + +<br> + <form method=GET action=cal1.jsp> + + <font size=5> Name <input type=text name="name" size=20> + </font> + <br> + <font size=5> Email <input type=text name="email" size=20> + </font> + <br> + <input type=submit name=action value="Submit"> + + </form> +<hr> +<font size=3 color="red"> Note: This application does not implement the complete +functionality of a typical calendar application. It demonstrates a way JSP can +be used with html tables and forms.</font> + +</center> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/checkbox/CheckTest.html b/src/tomcat/webapps/examples/jsp/checkbox/CheckTest.html new file mode 100644 index 0000000000000000000000000000000000000000..284d9ec3bce21f36e67d6eb2691c73eb22aa55e6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/checkbox/CheckTest.html @@ -0,0 +1,56 @@ +<HTML> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<HEAD> +<title> +checkbox.CheckTest Bean Properties +</title> +<BODY BGCOLOR="white"> +<H2> +checkbox.CheckTest Bean Properties +</H2> +<HR> +<DL> +<DT>public class <B>CheckTest</B><DT>extends Object</DL> + +<P> +<HR> + +<P> + +<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0"> +<TR BGCOLOR="#EEEEFF"> +<TD COLSPAN=3><FONT SIZE="+2"> +<B>Properties Summary</B></FONT></TD> +</TR> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +String +</FONT></TD> +<TD><B>CheckTest:fruit</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Multi +</FONT></TD> +</TABLE> +<HR> +</BODY> +</HTML> diff --git a/src/tomcat/webapps/examples/jsp/checkbox/check.html b/src/tomcat/webapps/examples/jsp/checkbox/check.html new file mode 100644 index 0000000000000000000000000000000000000000..b6d6b3bc1b3c09d8db7c8474c24861eb6fdd8cf7 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/checkbox/check.html @@ -0,0 +1,38 @@ +<HTML> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<BODY bgcolor="white"> + + +<FORM TYPE=POST ACTION=checkresult.jsp> +<BR> +<font size=5 color="red"> +Check all Favorite fruits: <br> + +<input TYPE=checkbox name=fruit VALUE=apples> Apples <BR> +<input TYPE=checkbox name=fruit VALUE=grapes> Grapes <BR> +<input TYPE=checkbox name=fruit VALUE=oranges> Oranges <BR> +<input TYPE=checkbox name=fruit VALUE=melons> Melons <BR> + + +<br> <INPUT TYPE=submit name=submit Value="Submit"> + +</font> +</FORM> +</BODY> +</HTML> diff --git a/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp b/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp new file mode 100644 index 0000000000000000000000000000000000000000..a8400e9944032f870559a81ae01f9c05262b4269 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp @@ -0,0 +1,63 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> +<font size=5 color="red"> +<%! String[] fruits; %> +<jsp:useBean id="foo" scope="page" class="checkbox.CheckTest" /> + +<jsp:setProperty name="foo" property="fruit" param="fruit" /> +<hr> +The checked fruits (got using request) are: <br> +<% + fruits = request.getParameterValues("fruit"); +%> +<ul> +<% + if (fruits != null) { + for (int i = 0; i < fruits.length; i++) { +%> +<li> +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +</ul> +<br> +<hr> + +The checked fruits (got using beans) are <br> + +<% + fruits = foo.getFruit(); +%> +<ul> +<% + if (!fruits[0].equals("1")) { + for (int i = 0; i < fruits.length; i++) { +%> +<li> +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +</ul> +</font> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html b/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..4dd0d9ba0e9b4b372823b7e4f8b4fa5fd2ce11aa --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/checkbox/checkresult.jsp.html @@ -0,0 +1,64 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> +<font size=5 color="red"> +<%! String[] fruits; %> +<jsp:useBean id="foo" scope="page" class="checkbox.CheckTest" /> + +<jsp:setProperty name="foo" property="fruit" param="fruit" /> +<hr> +The checked fruits (got using request) are: <br> +<% + fruits = request.getParameterValues("fruit"); +%> +<ul> +<% + if (fruits != null) { + for (int i = 0; i < fruits.length; i++) { +%> +<li> +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +</ul> +<br> +<hr> + +The checked fruits (got using beans) are <br> + +<% + fruits = foo.getFruit(); +%> +<ul> +<% + if (!fruits[0].equals("1")) { + for (int i = 0; i < fruits.length; i++) { +%> +<li> +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +</ul> +</font> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/checkbox/cresult.html b/src/tomcat/webapps/examples/jsp/checkbox/cresult.html new file mode 100644 index 0000000000000000000000000000000000000000..b6a28d6645fcbaedc7666e9e88d068fbd1fdaa09 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/checkbox/cresult.html @@ -0,0 +1,34 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="check.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="checkresult.jsp.html">Source Code for Checkbox Example<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="CheckTest.html">Property Sheet for CheckTest +<font color="#0000FF"></a> </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/colors/ColorGameBean.html b/src/tomcat/webapps/examples/jsp/colors/ColorGameBean.html new file mode 100644 index 0000000000000000000000000000000000000000..172bc6646b2664e88fdce6c17607d4acede0a6ca --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/colors/ColorGameBean.html @@ -0,0 +1,116 @@ +<HTML> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<HEAD> +<title> +colors.ColorGameBean Bean Properties +</title> +<BODY BGCOLOR="white"> +<H2> +colors.ColorGameBean Bean Properties +</H2> +<HR> +<DL> +<DT>public class <B>ColorGameBean</B><DT>extends Object</DL> + +<P> +<HR> + +<P> + +<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0"> +<TR BGCOLOR="#EEEEFF"> +<TD COLSPAN=3><FONT SIZE="+2"> +<B>Properties Summary</B></FONT></TD> +</TR> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +String +</FONT></TD> +<TD><B>ColorGameBean:color2</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +String +</FONT></TD> +<TD><B>ColorGameBean:color1</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +int +</FONT></TD> +<TD><B>ColorGameBean:attempts</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +boolean +</FONT></TD> +<TD><B>ColorGameBean:hint</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +boolean +</FONT></TD> +<TD><B>ColorGameBean:success</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +boolean +</FONT></TD> +<TD><B>ColorGameBean:hintTaken</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Single +</FONT></TD> +</TABLE> +<HR> +</BODY> +</HTML> diff --git a/src/tomcat/webapps/examples/jsp/colors/clr.html b/src/tomcat/webapps/examples/jsp/colors/clr.html new file mode 100644 index 0000000000000000000000000000000000000000..e411f597d22d86c6d9919ab19ebddef30da7cbee --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/colors/clr.html @@ -0,0 +1,34 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="colors.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="colrs.jsp.html">Source Code for Color Example<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="ColorGameBean.html">Property Sheet for ColorGameBean +<font color="#0000FF"></a> </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/colors/colors.html b/src/tomcat/webapps/examples/jsp/colors/colors.html new file mode 100644 index 0000000000000000000000000000000000000000..900651e2c6db1a40892cad4562404b37f60167c1 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/colors/colors.html @@ -0,0 +1,47 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<body bgcolor= white> +<font size=6 color=red> + +<hr> +This web page is an example using JSP and BEANs. +<p> +Guess my favorite two colors + +<p> If you fail to guess both of them - you get yellow on red. + +<p> If you guess one of them right, either your foreground or + your background will change to the color that was guessed right. + +<p> Guess them both right and your browser foreground/background + will change to my two favorite colors to display this page. + +<hr> +<form method=GET action=colrs.jsp> +Color #1: <input type=text name= color1 size=16> +<br> +Color #2: <input type=text name= color2 size=16> +<p> +<input type=submit name=action value="Submit"> +<input type=submit name=action value="Hint"> +</form> + +</font> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/colors/colrs.jsp b/src/tomcat/webapps/examples/jsp/colors/colrs.jsp new file mode 100644 index 0000000000000000000000000000000000000000..ec3af887c4fd3f744c6c99f48caf250621855b5d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/colors/colrs.jsp @@ -0,0 +1,70 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<jsp:useBean id="cb" scope="session" class="colors.ColorGameBean" /> +<jsp:setProperty name="cb" property="*" /> + +<% + cb.processRequest(); +%> + +<body bgcolor=<%= cb.getColor1() %>> +<font size=6 color=<%= cb.getColor2() %>> +<p> + +<% if (cb.getHint()==true) { %> + + <p> Hint #1: Vampires prey at night! + <p> <p> Hint #2: Nancy without the n. + +<% } %> + +<% if (cb.getSuccess()==true) { %> + + <p> CONGRATULATIONS!! + <% if (cb.getHintTaken()==true) { %> + + <p> ( although I know you cheated and peeked into the hints) + + <% } %> + +<% } %> + +<p> Total attempts so far: <%= cb.getAttempts() %> +<p> + +<p> + +<form method=POST action=colrs.jsp> + +Color #1: <input type=text name= color1 size=16> + +<br> + +Color #2: <input type=text name= color2 size=16> + +<p> + +<input type=submit name=action value="Submit"> +<input type=submit name=action value="Hint"> + +</form> + +</font> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/colors/colrs.jsp.html b/src/tomcat/webapps/examples/jsp/colors/colrs.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..7ef38aecfd57850129d9e469d2943ab001e0424b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/colors/colrs.jsp.html @@ -0,0 +1,71 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<jsp:useBean id="cb" scope="session" class="colors.ColorGameBean" /> +<jsp:setProperty name="cb" property="*" /> + +<% + cb.processRequest(); +%> + +<body bgcolor=<%= cb.getColor1() %>> +<font size=6 color=<%= cb.getColor2() %>> +<p> + +<% if (cb.getHint()==true) { %> + + <p> Hint #1: Vampires prey at night! + <p> <p> Hint #2: Nancy without the n. + +<% } %> + +<% if (cb.getSuccess()==true) { %> + + <p> CONGRATULATIONS!! + <% if (cb.getHintTaken()==true) { %> + + <p> ( although I know you cheated and peeked into the hints) + + <% } %> + +<% } %> + +<p> Total attempts so far: <%= cb.getAttempts() %> +<p> + +<p> + +<form method=POST action=colrs.jsp> + +Color #1: <input type=text name= color1 size=16> + +<br> + +Color #2: <input type=text name= color2 size=16> + +<p> + +<input type=submit name=action value="Submit"> +<input type=submit name=action value="Hint"> + +</form> + +</font> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/dates/date.html b/src/tomcat/webapps/examples/jsp/dates/date.html new file mode 100644 index 0000000000000000000000000000000000000000..683ab4d2a06a2f57a0b7e04d5b664bda562e4116 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/dates/date.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="date.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="date.jsp.html">Source Code for Date Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/dates/date.jsp b/src/tomcat/webapps/examples/jsp/dates/date.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d6c6b8664ce35671e5e9ad0867b5a0b2e34b065f --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/dates/date.jsp @@ -0,0 +1,41 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<%@ page session="false"%> + +<body bgcolor="white"> +<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" /> + +<font size=4> +<ul> +<li> Day of month: is <jsp:getProperty name="clock" property="dayOfMonth"/> +<li> Year: is <jsp:getProperty name="clock" property="year"/> +<li> Month: is <jsp:getProperty name="clock" property="month"/> +<li> Time: is <jsp:getProperty name="clock" property="time"/> +<li> Date: is <jsp:getProperty name="clock" property="date"/> +<li> Day: is <jsp:getProperty name="clock" property="day"/> +<li> Day Of Year: is <jsp:getProperty name="clock" property="dayOfYear"/> +<li> Week Of Year: is <jsp:getProperty name="clock" property="weekOfYear"/> +<li> era: is <jsp:getProperty name="clock" property="era"/> +<li> DST Offset: is <jsp:getProperty name="clock" property="DSTOffset"/> +<li> Zone Offset: is <jsp:getProperty name="clock" property="zoneOffset"/> +</ul> +</font> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/dates/date.jsp.html b/src/tomcat/webapps/examples/jsp/dates/date.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..3f2abfc4c7596d8d5484e43b22127420473896af --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/dates/date.jsp.html @@ -0,0 +1,42 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<%@ page session="false"%> + +<body bgcolor="white"> +<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" /> + +<font size=4> +<ul> +<li> Day of month: is <jsp:getProperty name="clock" property="dayOfMonth"/> +<li> Year: is <jsp:getProperty name="clock" property="year"/> +<li> Month: is <jsp:getProperty name="clock" property="month"/> +<li> Time: is <jsp:getProperty name="clock" property="time"/> +<li> Date: is <jsp:getProperty name="clock" property="date"/> +<li> Day: is <jsp:getProperty name="clock" property="day"/> +<li> Day Of Year: is <jsp:getProperty name="clock" property="dayOfYear"/> +<li> Week Of Year: is <jsp:getProperty name="clock" property="weekOfYear"/> +<li> era: is <jsp:getProperty name="clock" property="era"/> +<li> DST Offset: is <jsp:getProperty name="clock" property="DSTOffset"/> +<li> Zone Offset: is <jsp:getProperty name="clock" property="zoneOffset"/> +</ul> +</font> + +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/error/er.html b/src/tomcat/webapps/examples/jsp/error/er.html new file mode 100644 index 0000000000000000000000000000000000000000..af78159dda604e48e62fc803f324ca8b787fd7d9 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/er.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="error.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="err.jsp.html">Source Code for Error Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/error/err.jsp b/src/tomcat/webapps/examples/jsp/error/err.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d188456b30403024e670b3e125d4446afdfda22e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/err.jsp @@ -0,0 +1,44 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="lightblue"> + + <%@ page errorPage="errorpge.jsp" %> + <jsp:useBean id="foo" scope="request" class="error.Smart" /> + <% + String name = null; + + if (request.getParameter("name") == null) { + %> + <%@ include file="error.html" %> + <% + } else { + foo.setName(request.getParameter("name")); + if (foo.getName().equalsIgnoreCase("integra")) + name = "acura"; + if (name.equalsIgnoreCase("acura")) { + %> + + <H1> Yes!!! <a href="http://www.acura.com">Acura</a> is my favorite car. + + <% + } + } + %> +</body> +</html> + diff --git a/src/tomcat/webapps/examples/jsp/error/err.jsp.html b/src/tomcat/webapps/examples/jsp/error/err.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..3d607a5c90131afc389176e59a0071aab68fdf5c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/err.jsp.html @@ -0,0 +1,45 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="lightblue"> + + <%@ page errorPage="errorpge.jsp" %> + <jsp:useBean id="foo" scope="request" class="error.Smart" /> + <% + String name = null; + + if (request.getParameter("name") == null) { + %> + <%@ include file="error.html" %> + <% + } else { + foo.setName(request.getParameter("name")); + if (foo.getName().equalsIgnoreCase("integra")) + name = "acura"; + if (name.equalsIgnoreCase("acura")) { + %> + + <H1> Yes!!! <a href="http://www.acura.com">Acura</a> is my favorite car. + + <% + } + } + %> +</body> +</html> + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/error/error.html b/src/tomcat/webapps/examples/jsp/error/error.html new file mode 100644 index 0000000000000000000000000000000000000000..b1b029c90a8ac8fdeb4d4353a02012b052f727ae --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/error.html @@ -0,0 +1,37 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<body bgcolor="white"> + +<h1> This example uses <b>errorpage</b> directive </h1> +<br> +<h3> Select my favourite car.</h3> +<form method=get action=err.jsp> +<!-- <br> Make a guess: --> +<SELECT NAME="name" SIZE=5> +<OPTION VALUE="integra"> Acura Integra <BR> +<OPTION VALUE="bmw328i"> BMW 328I <BR> +<OPTION VALUE="z3"> BMW Z3 <BR> +<OPTION VALUE="infiniti"> InfinitiQ3 <BR> +<OPTION VALUE="audi"> Audi A8 <BR> +</SELECT> +<br> <INPUT TYPE=submit name=submit Value="Submit"> +</form> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/error/errorpge.jsp b/src/tomcat/webapps/examples/jsp/error/errorpge.jsp new file mode 100644 index 0000000000000000000000000000000000000000..5c6eb0a38718b7eb4e2b359fbc0e19d4f1cb069a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/errorpge.jsp @@ -0,0 +1,25 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="red"> + + <%@ page isErrorPage="true" %> + <h1> The exception <%= exception.getMessage() %> tells me you + made a wrong choice. +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/error/errorpge.jsp.html b/src/tomcat/webapps/examples/jsp/error/errorpge.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..3d690dc96df6098eeebfd05878d0f736822fee59 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/error/errorpge.jsp.html @@ -0,0 +1,26 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="red"> + + <%@ page isErrorPage="true" %> + <h1> The exception <%= exception.getMessage() %> tells me you + made a wrong choice. +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/forward/forward.jsp b/src/tomcat/webapps/examples/jsp/forward/forward.jsp new file mode 100644 index 0000000000000000000000000000000000000000..092d9b4c73a29de06f023d5c66fff343862494cd --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/forward.jsp @@ -0,0 +1,33 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<% + double freeMem = Runtime.getRuntime().freeMemory(); + double totlMem = Runtime.getRuntime().totalMemory(); + double percent = freeMem/totlMem; + if (percent < 0.5) { +%> + +<jsp:forward page="one.jsp"/> + +<% } else { %> + +<jsp:forward page="two.html"/> + +<% } %> + +</html> diff --git a/src/tomcat/webapps/examples/jsp/forward/forward.jsp.html b/src/tomcat/webapps/examples/jsp/forward/forward.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..32f8bf72903c9a6657eeda670da4d93f5d03bbdc --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/forward.jsp.html @@ -0,0 +1,34 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<% + double freeMem = Runtime.getRuntime().freeMemory(); + double totlMem = Runtime.getRuntime().totalMemory(); + double percent = freeMem/totlMem; + if (percent < 0.5) { +%> + +<jsp:forward page="one.jsp"/> + +<% } else { %> + +<jsp:forward page="two.html"/> + +<% } %> + +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/forward/fwd.html b/src/tomcat/webapps/examples/jsp/forward/fwd.html new file mode 100644 index 0000000000000000000000000000000000000000..b3b0219fc903c6fc9423b5c32bc89b38cdf92b26 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/fwd.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="forward.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="forward.jsp.html">Source Code for Forward Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/forward/one.jsp b/src/tomcat/webapps/examples/jsp/forward/one.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c7f0004aa6f9164429ee276cbaf7892705a59777 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/one.jsp @@ -0,0 +1,23 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="white"> +<font color="red"> + +VM Memory usage < 50%. +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/forward/one.jsp.html b/src/tomcat/webapps/examples/jsp/forward/one.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..af185012c332fdfa180b218ddfa3db08eea22b4a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/one.jsp.html @@ -0,0 +1,24 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="white"> +<font color="red"> + +VM Memory usage &lt; 50%. +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/forward/two.html b/src/tomcat/webapps/examples/jsp/forward/two.html new file mode 100644 index 0000000000000000000000000000000000000000..24f4c08f041e57b6b94fff0603edb7e32b0c3581 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/forward/two.html @@ -0,0 +1,23 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<body bgcolor="white"> +<font color="red"> + +VM Memory usage > 50%. +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/images/code.gif b/src/tomcat/webapps/examples/jsp/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..93af2cd130aa61cb2f235cdd6f0e75ab444819ef Binary files /dev/null and b/src/tomcat/webapps/examples/jsp/images/code.gif differ diff --git a/src/tomcat/webapps/examples/jsp/images/execute.gif b/src/tomcat/webapps/examples/jsp/images/execute.gif new file mode 100644 index 0000000000000000000000000000000000000000..f64d70fd233d6fb3fcbdeedc02061871984f8fb5 Binary files /dev/null and b/src/tomcat/webapps/examples/jsp/images/execute.gif differ diff --git a/src/tomcat/webapps/examples/jsp/images/return.gif b/src/tomcat/webapps/examples/jsp/images/return.gif new file mode 100644 index 0000000000000000000000000000000000000000..af4f68f4a3a13e0ef1dc0045b04c2c93354cdf40 Binary files /dev/null and b/src/tomcat/webapps/examples/jsp/images/return.gif differ diff --git a/src/tomcat/webapps/examples/jsp/include/foo.html b/src/tomcat/webapps/examples/jsp/include/foo.html new file mode 100644 index 0000000000000000000000000000000000000000..168c8c852f19cb367ec37e05a41c34dfee6ae293 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/foo.html @@ -0,0 +1,17 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +To get the current time in ms diff --git a/src/tomcat/webapps/examples/jsp/include/foo.jsp b/src/tomcat/webapps/examples/jsp/include/foo.jsp new file mode 100644 index 0000000000000000000000000000000000000000..bb476c78e9341fa292c27b00157d93ae6a1092b0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/foo.jsp @@ -0,0 +1,17 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--%><%= System.currentTimeMillis() %> diff --git a/src/tomcat/webapps/examples/jsp/include/foo.jsp.html b/src/tomcat/webapps/examples/jsp/include/foo.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..2a1ac7b04ba8b20b7f9b6f345244b959572db9cb --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/foo.jsp.html @@ -0,0 +1,18 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--%><%= System.currentTimeMillis() %> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/include/inc.html b/src/tomcat/webapps/examples/jsp/include/inc.html new file mode 100644 index 0000000000000000000000000000000000000000..fedaed0918e41fecca0b2b69823cf31bf7d8bcbe --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/inc.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="include.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="include.jsp.html">Source Code for Include Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/include/include.jsp b/src/tomcat/webapps/examples/jsp/include/include.jsp new file mode 100644 index 0000000000000000000000000000000000000000..62a8c2247177c00b63c9beadee74d39db38fadbb --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/include.jsp @@ -0,0 +1,30 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="white"> + +<font color="red"> + +<%@ page buffer="5kb" autoFlush="false" %> + +<p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %> + +<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/> +:-) + +</html> diff --git a/src/tomcat/webapps/examples/jsp/include/include.jsp.html b/src/tomcat/webapps/examples/jsp/include/include.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..4f529c16d8f0bb4cca3cb20e6b39c6505891d677 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/include/include.jsp.html @@ -0,0 +1,31 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + +<body bgcolor="white"> + +<font color="red"> + +<%@ page buffer="5kb" autoFlush="false" %> + +<p>In place evaluation of another JSP which gives you the current time: <%@ include file="foo.jsp" %> + +<p> <jsp:include page="foo.html" flush="true"/> by including the output of another JSP: <jsp:include page="foo.jsp" flush="true"/> +:-) + +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/index.html b/src/tomcat/webapps/examples/jsp/index.html new file mode 100644 index 0000000000000000000000000000000000000000..27d53a197e13cc5264f4f4c2b76350578c6ff406 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/index.html @@ -0,0 +1,369 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html><html lang="en"> +<head> + <meta charset="UTF-8"/> + <meta name="Author" content="Anil K. Vijendran" /> + <title>JSP Examples</title> + <style type="text/css"> + img { border: 0; } + th { text-align: left; } + tr { vertical-align: top; } + </style> +</head> +<body> +<h1>JSP +Samples</h1> +<p>This is a collection of samples demonstrating the usage of different +parts of the Java Server Pages (JSP) specification. Both JSP 2.0 and +JSP 1.2 examples are presented below. +<p>These examples will only work when these pages are being served by a +servlet engine; of course, we recommend +<a href="http://tomcat.apache.org/">Tomcat</a>. +They will not work if you are viewing these pages via a +"file://..." URL. +<p>To navigate your way through the examples, the following icons will +help:</p> +<ul style="list-style-type: none; padding-left: 0;"> +<li><img src="images/execute.gif" alt=""> Execute the example</li> +<li><img src="images/code.gif" alt=""> Look at the source code for the example</li> +<li><img src="images/return.gif" alt=""> Return to this screen</li> +</ul> + +<p>Tip: For session scoped beans to work, the cookies must be enabled. +This can be done using browser options.</p> +<h2>JSP 2.0 Examples</h2> + +<table style="width: 85%;"> +<tr> +<th colspan="3">Expression Language</th> +</tr> + +<tr> +<td>Basic Arithmetic</td> +<td style="width: 30%;"><a href="jsp2/el/basic-arithmetic.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/basic-arithmetic.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/el/basic-arithmetic.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/basic-arithmetic.html">Source</a></td> +</tr> + +<tr> +<td>Basic Comparisons</td> +<td style="width: 30%;"><a href="jsp2/el/basic-comparisons.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/basic-comparisons.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/el/basic-comparisons.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/basic-comparisons.html">Source</a></td> +</tr> + +<tr> +<td>Implicit Objects</td> +<td style="width: 30%;"><a href="jsp2/el/implicit-objects.jsp?foo=bar"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/implicit-objects.jsp?foo=bar">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/el/implicit-objects.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/implicit-objects.html">Source</a></td> +</tr> +<tr> + +<td>Functions</td> +<td style="width: 30%;"><a href="jsp2/el/functions.jsp?foo=JSP+2.0"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/functions.jsp?foo=JSP+2.0">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/el/functions.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/functions.html">Source</a></td> +</tr> + +<tr> +<td>Composite Expressions</td> +<td style="width: 30%;"><a href="jsp2/el/composite.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/el/composite.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/el/composite.html"><img src="images/code.gif" alt=""></a><a href="jsp2/el/composite.html">Source</a></td> +</tr> + + +<tr> +<th colspan="3"><br />SimpleTag Handlers and JSP Fragments</th> +</tr> + +<tr> +<td>Hello World Tag</td> +<td style="width: 30%;"><a href="jsp2/simpletag/hello.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/hello.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/simpletag/hello.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/hello.html">Source</a></td> +</tr> + +<tr> +<td>Repeat Tag</td> +<td style="width: 30%;"><a href="jsp2/simpletag/repeat.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/repeat.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/simpletag/repeat.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/repeat.html">Source</a></td> +</tr> + +<tr> +<td>Book Example</td> +<td style="width: 30%;"><a href="jsp2/simpletag/book.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/simpletag/book.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/simpletag/book.html"><img src="images/code.gif" alt=""></a><a href="jsp2/simpletag/book.html">Source</a></td> +</tr> + +<tr> +<th colspan="3"><br />Tag Files</th> +</tr> + +<tr> +<td>Hello World Tag File</td> +<td style="width: 30%;"><a href="jsp2/tagfiles/hello.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/hello.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/tagfiles/hello.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/hello.html">Source</a></td> +</tr> + +<tr> +<td>Panel Tag File</td> +<td style="width: 30%;"><a href="jsp2/tagfiles/panel.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/panel.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/tagfiles/panel.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/panel.html">Source</a></td> +</tr> + +<tr> +<td>Display Products Example</td> +<td style="width: 30%;"><a href="jsp2/tagfiles/products.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/tagfiles/products.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/tagfiles/products.html"><img src="images/code.gif" alt=""></a><a href="jsp2/tagfiles/products.html">Source</a></td> +</tr> + +<tr> +<th colspan="3"><br />New JSP XML Syntax (.jspx)</th> +</tr> + +<tr> +<td>XHTML Basic Example</td> +<td style="width: 30%;"><a href="jsp2/jspx/basic.jspx"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspx/basic.jspx">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/jspx/basic.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspx/basic.html">Source</a></td> +</tr> + +<tr> +<td>SVG (Scalable Vector Graphics)</td> +<td style="width: 30%;"><a href="jsp2/jspx/svgexample.html"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspx/svgexample.html">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/jspx/textRotate.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspx/textRotate.html">Source</a></td> +</tr> + +<tr> +<th colspan="3"><br />Other JSP 2.0 Features</th> +</tr> + +<tr> +<td><jsp:attribute> and <jsp:body></td> +<td style="width: 30%;"><a href="jsp2/jspattribute/jspattribute.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspattribute/jspattribute.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/jspattribute/jspattribute.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspattribute/jspattribute.html">Source</a></td> +</tr> + +<tr> +<td>Shuffle Example</td> +<td style="width: 30%;"><a href="jsp2/jspattribute/shuffle.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/jspattribute/shuffle.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/jspattribute/shuffle.html"><img src="images/code.gif" alt=""></a><a href="jsp2/jspattribute/shuffle.html">Source</a></td> +</tr> + +<tr> +<td>Attributes With Dynamic Names</td> +<td style="width: 30%;"><a href="jsp2/misc/dynamicattrs.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/misc/dynamicattrs.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/misc/dynamicattrs.html"><img src="images/code.gif" alt=""></a><a href="jsp2/misc/dynamicattrs.html">Source</a></td> +</tr> + +<tr> +<td>JSP Configuration</td> +<td style="width: 30%;"><a href="jsp2/misc/config.jsp"><img src="images/execute.gif" alt=""></a><a href="jsp2/misc/config.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsp2/misc/config.html"><img src="images/code.gif" alt=""></a><a href="jsp2/misc/config.html">Source</a></td> +</tr> + +</table> + +<h2>JSP 1.2 Examples</h2> +<table style="width: 85%;"> +<tr> +<td>Numberguess</td> + +<td style="width: 30%;"><a href="num/numguess.jsp"><img src="images/execute.gif" alt=""></a><a href="num/numguess.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="num/numguess.html"><img src="images/code.gif" alt=""></a><a href="num/numguess.html">Source</a></td> +</tr> + +<tr> +<td>Date</td> + +<td style="width: 30%;"><a href="dates/date.jsp"><img src="images/execute.gif" alt=""></a><a href="dates/date.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="dates/date.html"><img src="images/code.gif" alt=""></a><a href="dates/date.html">Source</a></td> +</tr> + +<tr> +<td>Snoop</td> + +<td style="width: 30%;"><a href="snp/snoop.jsp"><img src="images/execute.gif" alt=""></a><a href="snp/snoop.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="snp/snoop.html"><img src="images/code.gif" alt=""></a><a href="snp/snoop.html">Source</a></td> +</tr> + +<tr> +<td>ErrorPage</td> + +<td style="width: 30%;"><a href="error/error.html"><img src="images/execute.gif" alt=""></a><a href="error/error.html">Execute</a></td> + +<td style="width: 30%;"><a href="error/er.html"><img src="images/code.gif" alt=""></a><a href="error/er.html">Source</a></td> +</tr> + +<tr> +<td>Carts</td> + +<td style="width: 30%;"><a href="sessions/carts.html"><img src="images/execute.gif" alt=""></a><a href="sessions/carts.html">Execute</a></td> + +<td style="width: 30%;"><a href="sessions/crt.html"><img src="images/code.gif" alt=""></a><a href="sessions/crt.html">Source</a></td> +</tr> + +<tr> +<td>Checkbox</td> + +<td style="width: 30%;"><a href="checkbox/check.html"><img src="images/execute.gif" alt=""></a><a href="checkbox/check.html">Execute</a></td> + +<td style="width: 30%;"><a href="checkbox/cresult.html"><img src="images/code.gif" alt=""></a><a href="checkbox/cresult.html">Source</a></td> +</tr> + +<tr> +<td>Color</td> + +<td style="width: 30%;"><a href="colors/colors.html"><img src="images/execute.gif" alt=""></a><a href="colors/colors.html">Execute</a></td> + +<td style="width: 30%;"><a href="colors/clr.html"><img src="images/code.gif" alt=""></a><a href="colors/clr.html">Source</a></td> +</tr> + +<tr> +<td>Calendar</td> + +<td style="width: 30%;"><a href="cal/login.html"><img src="images/execute.gif" alt=""></a><a href="cal/login.html">Execute</a></td> + +<td style="width: 30%;"><a href="cal/calendar.html"><img src="images/code.gif" alt=""></a><a href="cal/calendar.html">Source</a></td> +</tr> + +<tr> +<td>Include</td> + +<td style="width: 30%;"><a href="include/include.jsp"><img src="images/execute.gif" alt=""></a><a href="include/include.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="include/inc.html"><img src="images/code.gif" alt=""></a><a href="include/inc.html">Source</a></td> +</tr> + +<tr> +<td>Forward</td> + +<td style="width: 30%;"><a href="forward/forward.jsp"><img src="images/execute.gif" alt=""></a><a href="forward/forward.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="forward/fwd.html"><img src="images/code.gif" alt=""></a><a href="forward/fwd.html">Source</a></td> +</tr> + +<tr> +<td>Plugin</td> + +<td style="width: 30%;"><a href="plugin/plugin.jsp"><img src="images/execute.gif" alt=""></a><a href="plugin/plugin.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="plugin/plugin.html"><img src="images/code.gif" alt=""></a><a href="plugin/plugin.html">Source</a></td> +</tr> + +<tr> +<td>JSP-Servlet-JSP</td> + +<td style="width: 30%;"><a href="jsptoserv/jsptoservlet.jsp"><img src="images/execute.gif" alt=""></a><a href="jsptoserv/jsptoservlet.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="jsptoserv/jts.html"><img src="images/code.gif" alt=""></a><a href="jsptoserv/jts.html">Source</a></td> +</tr> + +<tr> +<td>Custom tag example</td> + +<td style="width: 30%;"><a href="simpletag/foo.jsp"><img src="images/execute.gif" alt=""></a><a href="simpletag/foo.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="simpletag/foo.html"><img src="images/code.gif" alt=""></a><a href="simpletag/foo.html">Source</a></td> +</tr> + +<tr> +<td>XML syntax example</td> +<td style="width: 30%;"><a href="xml/xml.jsp"><img src="images/execute.gif" alt=""></a><a href="xml/xml.jsp">Execute</a></td> + +<td style="width: 30%;"><a href="xml/xml.html"><img src="images/code.gif" alt=""></a><a href="xml/xml.html">Source</a></td> +</tr> + +</table> + +<h2>Tag Plugins</h2> +<table style="width: 85%;"> + +<tr> + <td>If</td> + <td style="width: 30%;"> + <a href="tagplugin/if.jsp"><img src="images/execute.gif" alt=""></a> + <a href="tagplugin/if.jsp">Execute</a> + </td> + <td style="width: 30%;"> + <a href="tagplugin/if.html"><img src="images/code.gif" alt=""></a> + <a href="tagplugin/if.html">Source</a> + </td> +</tr> + +<tr> + <td>ForEach</td> + <td style="width: 30%;"> + <a href="tagplugin/foreach.jsp"><img src="images/execute.gif" alt=""></a> + <a href="tagplugin/foreach.jsp">Execute</a> + </td> + <td style="width: 30%;"> + <a href="tagplugin/foreach.html"><img src="images/code.gif" alt=""></a> + <a href="tagplugin/foreach.html">Source</a> + </td> +</tr> + +<tr> + <td>Choose</td> + <td style="width: 30%;"> + <a href="tagplugin/choose.jsp"><img src="images/execute.gif" alt=""></a> + <a href="tagplugin/choose.jsp">Execute</a> + </td> + <td style="width: 30%;"> + <a href="tagplugin/choose.html"><img src="images/code.gif" alt=""></a> + <a href="tagplugin/choose.html">Source</a> + </td> +</tr> + +</table> + +<h2>Other Examples</h2> +<table style="width: 85%;"> + +<tr> + <td>FORM Authentication</td> + <td style="width: 30%;"> + <a href="security/protected/index.jsp"><img src="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td colspan="3">Example that demonstrates protecting a resource and + using Form-Based authentication. To access the page the user must + have role of either "tomcat" or "role1". By default no user + is configured to have these roles.</td> +</tr> + +</table> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html b/src/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html new file mode 100644 index 0000000000000000000000000000000000000000..aa84cccc46dd097cad8b43b9f1e8e1b2398e847c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/Functions.java.html @@ -0,0 +1,46 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package jsp2.examples.el; + +import java.util.Locale; + +/** + * Defines the functions for the jsp2 example tag library. + * + * <p>Each function is defined as a static method.</p> + */ +public class Functions { + public static String reverse( String text ) { + return new StringBuilder( text ).reverse().toString(); + } + + public static int numVowels( String text ) { + String vowels = "aeiouAEIOU"; + int result = 0; + for( int i = 0; i < text.length(); i++ ) { + if( vowels.indexOf( text.charAt( i ) ) != -1 ) { + result++; + } + } + return result; + } + + public static String caps( String text ) { + return text.toUpperCase(Locale.ENGLISH); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html b/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html new file mode 100644 index 0000000000000000000000000000000000000000..3744236491f837aaaa856d7282ce51257cb0b02d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesBean.java.html @@ -0,0 +1,53 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +/** + * Accept and display a value. + */ +public class ValuesBean { + private String string; + private double doubleValue; + private long longValue; + + public String getStringValue() { + return this.string; + } + + public void setStringValue(String string) { + this.string = string; + } + + public double getDoubleValue() { + return doubleValue; + } + + public void setDoubleValue(double doubleValue) { + this.doubleValue = doubleValue; + } + + public long getLongValue() { + return longValue; + } + + public void setLongValue(long longValue) { + this.longValue = longValue; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..490d2123be7995778694fab07fe51352fb114ad4 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/ValuesTag.java.html @@ -0,0 +1,80 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package examples; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspTagException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +/** + * Accept and display a value. + */ +public class ValuesTag extends TagSupport { + + private static final long serialVersionUID = 1L; + + // Using "-1" as the default value, + // in the assumption that it won't be used as the value. + // Cannot use null here, because null is an important case + // that should be present in the tests. + private Object objectValue = "-1"; + private String stringValue = "-1"; + private long longValue = -1; + private double doubleValue = -1; + + public void setObject(Object objectValue) { + this.objectValue = objectValue; + } + + public void setString(String stringValue) { + this.stringValue = stringValue; + } + + public void setLong(long longValue) { + this.longValue = longValue; + } + + public void setDouble(double doubleValue) { + this.doubleValue = doubleValue; + } + + @Override + public int doEndTag() throws JspException { + JspWriter out = pageContext.getOut(); + + try { + if (!"-1".equals(objectValue)) { + out.print(objectValue); + } else if (!"-1".equals(stringValue)) { + out.print(stringValue); + } else if (longValue != -1) { + out.print(longValue); + } else if (doubleValue != -1) { + out.print(doubleValue); + } else { + out.print("-1"); + } + } catch (IOException ex) { + throw new JspTagException("IOException: " + ex.toString(), ex); + } + return super.doEndTag(); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html new file mode 100644 index 0000000000000000000000000000000000000000..8a2f0a61dbb02b070dd63d7a3df501cd980f2432 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="basic-arithmetic.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="basic-arithmetic.jsp.html">Source Code for Basic Arithmetic Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp new file mode 100644 index 0000000000000000000000000000000000000000..757e809f15a3d0a8d030f94632ae221474560e7d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp @@ -0,0 +1,88 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>JSP 2.0 Expression Language - Basic Arithmetic</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Basic Arithmetic</h1> + <hr> + This example illustrates basic Expression Language arithmetic. + Addition (+), subtraction (-), multiplication (*), division (/ or div), + and modulus (% or mod) are all supported. Error conditions, like + division by zero, are handled gracefully. + <br> + <blockquote> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${1}</td> + <td>${1}</td> + </tr> + <tr> + <td>\${1 + 2}</td> + <td>${1 + 2}</td> + </tr> + <tr> + <td>\${1.2 + 2.3}</td> + <td>${1.2 + 2.3}</td> + </tr> + <tr> + <td>\${1.2E4 + 1.4}</td> + <td>${1.2E4 + 1.4}</td> + </tr> + <tr> + <td>\${-4 - 2}</td> + <td>${-4 - 2}</td> + </tr> + <tr> + <td>\${21 * 2}</td> + <td>${21 * 2}</td> + </tr> + <tr> + <td>\${3/4}</td> + <td>${3/4}</td> + </tr> + <tr> + <td>\${3 div 4}</td> + <td>${3 div 4}</td> + </tr> + <tr> + <td>\${3/0}</td> + <td>${3/0}</td> + </tr> + <tr> + <td>\${10%4}</td> + <td>${10%4}</td> + </tr> + <tr> + <td>\${10 mod 4}</td> + <td>${10 mod 4}</td> + </tr> + <tr> + <td>\${(1==2) ? 3 : 4}</td> + <td>${(1==2) ? 3 : 4}</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..b8e1a69635856731752a70dde2f4570dd9c00a9c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp.html @@ -0,0 +1,89 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>JSP 2.0 Expression Language - Basic Arithmetic</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Basic Arithmetic</h1> + <hr> + This example illustrates basic Expression Language arithmetic. + Addition (+), subtraction (-), multiplication (*), division (/ or div), + and modulus (% or mod) are all supported. Error conditions, like + division by zero, are handled gracefully. + <br> + <blockquote> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${1}</td> + <td>${1}</td> + </tr> + <tr> + <td>\${1 + 2}</td> + <td>${1 + 2}</td> + </tr> + <tr> + <td>\${1.2 + 2.3}</td> + <td>${1.2 + 2.3}</td> + </tr> + <tr> + <td>\${1.2E4 + 1.4}</td> + <td>${1.2E4 + 1.4}</td> + </tr> + <tr> + <td>\${-4 - 2}</td> + <td>${-4 - 2}</td> + </tr> + <tr> + <td>\${21 * 2}</td> + <td>${21 * 2}</td> + </tr> + <tr> + <td>\${3/4}</td> + <td>${3/4}</td> + </tr> + <tr> + <td>\${3 div 4}</td> + <td>${3 div 4}</td> + </tr> + <tr> + <td>\${3/0}</td> + <td>${3/0}</td> + </tr> + <tr> + <td>\${10%4}</td> + <td>${10%4}</td> + </tr> + <tr> + <td>\${10 mod 4}</td> + <td>${10 mod 4}</td> + </tr> + <tr> + <td>\${(1==2) ? 3 : 4}</td> + <td>${(1==2) ? 3 : 4}</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html new file mode 100644 index 0000000000000000000000000000000000000000..60fb40a3bbf90ab293d065a36ebe01dec9a34849 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="basic-comparisons.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="basic-comparisons.jsp.html">Source Code for Basic Comparisons Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d72f7245f8cd2fe21be00024f78d6fe5deed5ca0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp @@ -0,0 +1,116 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>JSP 2.0 Expression Language - Basic Comparisons</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Basic Comparisons</h1> + <hr> + This example illustrates basic Expression Language comparisons. + The following comparison operators are supported: + <ul> + <li>Less-than (< or lt)</li> + <li>Greater-than (> or gt)</li> + <li>Less-than-or-equal (<= or le)</li> + <li>Greater-than-or-equal (>= or ge)</li> + <li>Equal (== or eq)</li> + <li>Not Equal (!= or ne)</li> + </ul> + <blockquote> + <u><b>Numeric</b></u> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${1 < 2}</td> + <td>${1 < 2}</td> + </tr> + <tr> + <td>\${1 lt 2}</td> + <td>${1 lt 2}</td> + </tr> + <tr> + <td>\${1 > (4/2)}</td> + <td>${1 > (4/2)}</td> + </tr> + <tr> + <td>\${1 gt (4/2)}</td> + <td>${1 gt (4/2)}</td> + </tr> + <tr> + <td>\${4.0 >= 3}</td> + <td>${4.0 >= 3}</td> + </tr> + <tr> + <td>\${4.0 ge 3}</td> + <td>${4.0 ge 3}</td> + </tr> + <tr> + <td>\${4 <= 3}</td> + <td>${4 <= 3}</td> + </tr> + <tr> + <td>\${4 le 3}</td> + <td>${4 le 3}</td> + </tr> + <tr> + <td>\${100.0 == 100}</td> + <td>${100.0 == 100}</td> + </tr> + <tr> + <td>\${100.0 eq 100}</td> + <td>${100.0 eq 100}</td> + </tr> + <tr> + <td>\${(10*10) != 100}</td> + <td>${(10*10) != 100}</td> + </tr> + <tr> + <td>\${(10*10) ne 100}</td> + <td>${(10*10) ne 100}</td> + </tr> + </table> + </code> + <br> + <u><b>Alphabetic</b></u> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${'a' < 'b'}</td> + <td>${'a' < 'b'}</td> + </tr> + <tr> + <td>\${'hip' > 'hit'}</td> + <td>${'hip' > 'hit'}</td> + </tr> + <tr> + <td>\${'4' > 3}</td> + <td>${'4' > 3}</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..d20471e2070488597d0bf7c7d10e0e21c06a144e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp.html @@ -0,0 +1,117 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>JSP 2.0 Expression Language - Basic Comparisons</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Basic Comparisons</h1> + <hr> + This example illustrates basic Expression Language comparisons. + The following comparison operators are supported: + <ul> + <li>Less-than (&lt; or lt)</li> + <li>Greater-than (&gt; or gt)</li> + <li>Less-than-or-equal (&lt;= or le)</li> + <li>Greater-than-or-equal (&gt;= or ge)</li> + <li>Equal (== or eq)</li> + <li>Not Equal (!= or ne)</li> + </ul> + <blockquote> + <u><b>Numeric</b></u> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${1 &lt; 2}</td> + <td>${1 < 2}</td> + </tr> + <tr> + <td>\${1 lt 2}</td> + <td>${1 lt 2}</td> + </tr> + <tr> + <td>\${1 &gt; (4/2)}</td> + <td>${1 > (4/2)}</td> + </tr> + <tr> + <td>\${1 gt (4/2)}</td> + <td>${1 gt (4/2)}</td> + </tr> + <tr> + <td>\${4.0 &gt;= 3}</td> + <td>${4.0 >= 3}</td> + </tr> + <tr> + <td>\${4.0 ge 3}</td> + <td>${4.0 ge 3}</td> + </tr> + <tr> + <td>\${4 &lt;= 3}</td> + <td>${4 <= 3}</td> + </tr> + <tr> + <td>\${4 le 3}</td> + <td>${4 le 3}</td> + </tr> + <tr> + <td>\${100.0 == 100}</td> + <td>${100.0 == 100}</td> + </tr> + <tr> + <td>\${100.0 eq 100}</td> + <td>${100.0 eq 100}</td> + </tr> + <tr> + <td>\${(10*10) != 100}</td> + <td>${(10*10) != 100}</td> + </tr> + <tr> + <td>\${(10*10) ne 100}</td> + <td>${(10*10) ne 100}</td> + </tr> + </table> + </code> + <br> + <u><b>Alphabetic</b></u> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${'a' &lt; 'b'}</td> + <td>${'a' < 'b'}</td> + </tr> + <tr> + <td>\${'hip' &gt; 'hit'}</td> + <td>${'hip' > 'hit'}</td> + </tr> + <tr> + <td>\${'4' &gt; 3}</td> + <td>${'4' > 3}</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/composite.html b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.html new file mode 100644 index 0000000000000000000000000000000000000000..5900008e2dacc5cb0e8ae5917e53432a906492b6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="composite.jsp"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="composite.jsp.html">Source Code for composite.jsp</a></h3> +<h3><a href="ValuesTag.java.html">Source Code for ValuesTag.java</a></h3> +<h3><a href="ValuesBean.java.html">Source Code for ValuesBean.java</a></h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp new file mode 100644 index 0000000000000000000000000000000000000000..ae671d48a78e1fde9e5b7dc584ab007d3b85553c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp @@ -0,0 +1,110 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/example-taglib" %> + +<html> + <head> + <title>JSP 2.0 Expression Language - Composite Expressions</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Composite Expressions</h1> + <hr> + This example illustrates EL composite expressions. Composite expressions + are formed by grouping together multiple EL expressions. Each of them is + evaluated from left to right, coerced to String, all those strings are + concatenated, and the result is coerced to the expected type. + + <jsp:useBean id="values" class="jsp2.examples.ValuesBean" /> + + <blockquote> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Type</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${'hello'} wo\${'rld'}</td> + <td>String</td> + <td><jsp:setProperty name="values" property="stringValue" value="${'hello'} wo${'rld'}"/>${values.stringValue}</td> + </tr> + <tr> + <td>\${'hello'} wo\${'rld'}</td> + <td>String</td> + <td><my:values string="${'hello'} wo${'rld'}"/></td> + </tr> + <tr> + <td>\${1+2}.\${220}</td> + <td>Double</td> + <td><jsp:setProperty name="values" property="doubleValue" value="${1+2}.${220}"/>${values.doubleValue}</td> + </tr> + <tr> + <td>\${1+2}.\${220}</td> + <td>Double</td> + <td><my:values double="${1+2}.${220}"/></td> + </tr> + <tr> + <td>000\${1}\${7}</td> + <td>Long</td> + <td><jsp:setProperty name="values" property="longValue" value="000${1}${7}"/>${values.longValue}</td> + </tr> + <tr> + <td>000\${1}\${7}</td> + <td>Long</td> + <td><my:values long="000${1}${7}"/></td> + </tr> + <!-- + Undefined values are to be coerced to String, to be "", + https://bz.apache.org/bugzilla/show_bug.cgi?id=47413 + --> + <tr> + <td>\${undefinedFoo}hello world\${undefinedBar}</td> + <td>String</td> + <td><jsp:setProperty name="values" property="stringValue" value="${undefinedFoo}hello world${undefinedBar}"/>${values.stringValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}hello world\${undefinedBar}</td> + <td>String</td> + <td><my:values string="${undefinedFoo}hello world${undefinedBar}"/></td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Double</td> + <td><jsp:setProperty name="values" property="doubleValue" value="${undefinedFoo}${undefinedBar}"/>${values.doubleValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Double</td> + <td><my:values double="${undefinedFoo}${undefinedBar}"/></td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Long</td> + <td><jsp:setProperty name="values" property="longValue" value="${undefinedFoo}${undefinedBar}"/>${values.longValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Long</td> + <td><my:values long="${undefinedFoo}${undefinedBar}"/></td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> + diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..375555f8e6fdf9c32b9748b75ef3f8c9a20331db --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/composite.jsp.html @@ -0,0 +1,111 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/example-taglib" %> + +<html> + <head> + <title>JSP 2.0 Expression Language - Composite Expressions</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Composite Expressions</h1> + <hr> + This example illustrates EL composite expressions. Composite expressions + are formed by grouping together multiple EL expressions. Each of them is + evaluated from left to right, coerced to String, all those strings are + concatenated, and the result is coerced to the expected type. + + <jsp:useBean id="values" class="jsp2.examples.ValuesBean" /> + + <blockquote> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Type</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${'hello'} wo\${'rld'}</td> + <td>String</td> + <td><jsp:setProperty name="values" property="stringValue" value="${'hello'} wo${'rld'}"/>${values.stringValue}</td> + </tr> + <tr> + <td>\${'hello'} wo\${'rld'}</td> + <td>String</td> + <td><my:values string="${'hello'} wo${'rld'}"/></td> + </tr> + <tr> + <td>\${1+2}.\${220}</td> + <td>Double</td> + <td><jsp:setProperty name="values" property="doubleValue" value="${1+2}.${220}"/>${values.doubleValue}</td> + </tr> + <tr> + <td>\${1+2}.\${220}</td> + <td>Double</td> + <td><my:values double="${1+2}.${220}"/></td> + </tr> + <tr> + <td>000\${1}\${7}</td> + <td>Long</td> + <td><jsp:setProperty name="values" property="longValue" value="000${1}${7}"/>${values.longValue}</td> + </tr> + <tr> + <td>000\${1}\${7}</td> + <td>Long</td> + <td><my:values long="000${1}${7}"/></td> + </tr> + <!-- + Undefined values are to be coerced to String, to be "", + https://bz.apache.org/bugzilla/show_bug.cgi?id=47413 + --> + <tr> + <td>\${undefinedFoo}hello world\${undefinedBar}</td> + <td>String</td> + <td><jsp:setProperty name="values" property="stringValue" value="${undefinedFoo}hello world${undefinedBar}"/>${values.stringValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}hello world\${undefinedBar}</td> + <td>String</td> + <td><my:values string="${undefinedFoo}hello world${undefinedBar}"/></td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Double</td> + <td><jsp:setProperty name="values" property="doubleValue" value="${undefinedFoo}${undefinedBar}"/>${values.doubleValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Double</td> + <td><my:values double="${undefinedFoo}${undefinedBar}"/></td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Long</td> + <td><jsp:setProperty name="values" property="longValue" value="${undefinedFoo}${undefinedBar}"/>${values.longValue}</td> + </tr> + <tr> + <td>\${undefinedFoo}\${undefinedBar}</td> + <td>Long</td> + <td><my:values long="${undefinedFoo}${undefinedBar}"/></td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/functions.html b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.html new file mode 100644 index 0000000000000000000000000000000000000000..726dda3661cccb3d543c67598742c5b4ee667c72 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.html @@ -0,0 +1,32 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="functions.jsp?foo=JSP+2.0"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="functions.jsp.html">Source Code for functions.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="Functions.java.html">Source Code for Functions.java<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp new file mode 100644 index 0000000000000000000000000000000000000000..12b3fa97d7c5c6256fd42e25a799864a7e3fa6dc --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp @@ -0,0 +1,67 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Expression Language - Functions</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Functions</h1> + <hr> + An upgrade from the JSTL expression language, the JSP 2.0 EL also + allows for simple function invocation. Functions are defined + by tag libraries and are implemented by a Java programmer as + static methods. + + <blockquote> + <u><b>Change Parameter</b></u> + <form action="functions.jsp" method="GET"> + foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}"> + <input type="submit"> + </form> + <br> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${param["foo"]}</td> + <td>${fn:escapeXml(param["foo"])} </td> + </tr> + <tr> + <td>\${my:reverse(param["foo"])}</td> + <td>${my:reverse(fn:escapeXml(param["foo"]))} </td> + </tr> + <tr> + <td>\${my:reverse(my:reverse(param["foo"]))}</td> + <td>${my:reverse(my:reverse(fn:escapeXml(param["foo"])))} </td> + </tr> + <tr> + <td>\${my:countVowels(param["foo"])}</td> + <td>${my:countVowels(fn:escapeXml(param["foo"]))} </td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> + diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..1a3cdb4043c44a172967ea4b454cefb0cd217398 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/functions.jsp.html @@ -0,0 +1,68 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Expression Language - Functions</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Functions</h1> + <hr> + An upgrade from the JSTL expression language, the JSP 2.0 EL also + allows for simple function invocation. Functions are defined + by tag libraries and are implemented by a Java programmer as + static methods. + + <blockquote> + <u><b>Change Parameter</b></u> + <form action="functions.jsp" method="GET"> + foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}"> + <input type="submit"> + </form> + <br> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${param["foo"]}</td> + <td>${fn:escapeXml(param["foo"])}&nbsp;</td> + </tr> + <tr> + <td>\${my:reverse(param["foo"])}</td> + <td>${my:reverse(fn:escapeXml(param["foo"]))}&nbsp;</td> + </tr> + <tr> + <td>\${my:reverse(my:reverse(param["foo"]))}</td> + <td>${my:reverse(my:reverse(fn:escapeXml(param["foo"])))}&nbsp;</td> + </tr> + <tr> + <td>\${my:countVowels(param["foo"])}</td> + <td>${my:countVowels(fn:escapeXml(param["foo"]))}&nbsp;</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html new file mode 100644 index 0000000000000000000000000000000000000000..15268db59abc8a756e678c50d68368a71137d128 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="implicit-objects.jsp?foo=bar"><img src="../../images/execute.gif" align="right" border="0"></a><a href="../../index.html"> +<img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="implicit-objects.jsp.html">Source Code for Implicit Objects Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp new file mode 100644 index 0000000000000000000000000000000000000000..b5577142189aec9be3b8d09ce9a4372a3dcc0210 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp @@ -0,0 +1,90 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<html> + <head> + <title>JSP 2.0 Expression Language - Implicit Objects</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Implicit Objects</h1> + <hr> + This example illustrates some of the implicit objects available + in the Expression Language. The following implicit objects are + available (not all illustrated here): + <ul> + <li>pageContext - the PageContext object</li> + <li>pageScope - a Map that maps page-scoped attribute names to + their values</li> + <li>requestScope - a Map that maps request-scoped attribute names + to their values</li> + <li>sessionScope - a Map that maps session-scoped attribute names + to their values</li> + <li>applicationScope - a Map that maps application-scoped attribute + names to their values</li> + <li>param - a Map that maps parameter names to a single String + parameter value</li> + <li>paramValues - a Map that maps parameter names to a String[] of + all values for that parameter</li> + <li>header - a Map that maps header names to a single String + header value</li> + <li>headerValues - a Map that maps header names to a String[] of + all values for that header</li> + <li>initParam - a Map that maps context initialization parameter + names to their String parameter value</li> + <li>cookie - a Map that maps cookie names to a single Cookie object.</li> + </ul> + + <blockquote> + <u><b>Change Parameter</b></u> + <form action="implicit-objects.jsp" method="GET"> + foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}"> + <input type="submit"> + </form> + <br> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${param.foo}</td> + <td>${fn:escapeXml(param["foo"])} </td> + </tr> + <tr> + <td>\${param["foo"]}</td> + <td>${fn:escapeXml(param["foo"])} </td> + </tr> + <tr> + <td>\${header["host"]}</td> + <td>${fn:escapeXml(header["host"])} </td> + </tr> + <tr> + <td>\${header["accept"]}</td> + <td>${fn:escapeXml(header["accept"])} </td> + </tr> + <tr> + <td>\${header["user-agent"]}</td> + <td>${fn:escapeXml(header["user-agent"])} </td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..db967e7a91e32752152b38d0dadbe783eb7fe736 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/el/implicit-objects.jsp.html @@ -0,0 +1,91 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page contentType="text/html; charset=UTF-8" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + +<html> + <head> + <title>JSP 2.0 Expression Language - Implicit Objects</title> + </head> + <body> + <h1>JSP 2.0 Expression Language - Implicit Objects</h1> + <hr> + This example illustrates some of the implicit objects available + in the Expression Language. The following implicit objects are + available (not all illustrated here): + <ul> + <li>pageContext - the PageContext object</li> + <li>pageScope - a Map that maps page-scoped attribute names to + their values</li> + <li>requestScope - a Map that maps request-scoped attribute names + to their values</li> + <li>sessionScope - a Map that maps session-scoped attribute names + to their values</li> + <li>applicationScope - a Map that maps application-scoped attribute + names to their values</li> + <li>param - a Map that maps parameter names to a single String + parameter value</li> + <li>paramValues - a Map that maps parameter names to a String[] of + all values for that parameter</li> + <li>header - a Map that maps header names to a single String + header value</li> + <li>headerValues - a Map that maps header names to a String[] of + all values for that header</li> + <li>initParam - a Map that maps context initialization parameter + names to their String parameter value</li> + <li>cookie - a Map that maps cookie names to a single Cookie object.</li> + </ul> + + <blockquote> + <u><b>Change Parameter</b></u> + <form action="implicit-objects.jsp" method="GET"> + foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}"> + <input type="submit"> + </form> + <br> + <code> + <table border="1"> + <thead> + <td><b>EL Expression</b></td> + <td><b>Result</b></td> + </thead> + <tr> + <td>\${param.foo}</td> + <td>${fn:escapeXml(param["foo"])}&nbsp;</td> + </tr> + <tr> + <td>\${param["foo"]}</td> + <td>${fn:escapeXml(param["foo"])}&nbsp;</td> + </tr> + <tr> + <td>\${header["host"]}</td> + <td>${fn:escapeXml(header["host"])}&nbsp;</td> + </tr> + <tr> + <td>\${header["accept"]}</td> + <td>${fn:escapeXml(header["accept"])}&nbsp;</td> + </tr> + <tr> + <td>\${header["user-agent"]}</td> + <td>${fn:escapeXml(header["user-agent"])}&nbsp;</td> + </tr> + </table> + </code> + </blockquote> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html new file mode 100644 index 0000000000000000000000000000000000000000..a5ddf411b8060f6b495e120efdb6f8a2a33f5000 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/FooBean.java.html @@ -0,0 +1,37 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class FooBean { + private String bar; + + public FooBean() { + bar = "Initial value"; + } + + public String getBar() { + return this.bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..8c0bd4dc49c18e67a7a750bd46312cb633d3ca72 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/HelloWorldSimpleTag.java.html @@ -0,0 +1,35 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that prints "Hello, world!" + */ +public class HelloWorldSimpleTag extends SimpleTagSupport { + @Override + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( "Hello, world!" ); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..8d360841325be70cb735a4ba8b36319d401c0a68 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/ShuffleSimpleTag.java.html @@ -0,0 +1,88 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; +import java.util.Random; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.JspFragment; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that accepts takes three attributes of type + * JspFragment and invokes then in a random order. + */ +public class ShuffleSimpleTag extends SimpleTagSupport { + // No need for this to use SecureRandom + private static final Random random = new Random(); + + private JspFragment fragment1; + private JspFragment fragment2; + private JspFragment fragment3; + + @Override + public void doTag() throws JspException, IOException { + switch(random.nextInt(6)) { + case 0: + fragment1.invoke( null ); + fragment2.invoke( null ); + fragment3.invoke( null ); + break; + case 1: + fragment1.invoke( null ); + fragment3.invoke( null ); + fragment2.invoke( null ); + break; + case 2: + fragment2.invoke( null ); + fragment1.invoke( null ); + fragment3.invoke( null ); + break; + case 3: + fragment2.invoke( null ); + fragment3.invoke( null ); + fragment1.invoke( null ); + break; + case 4: + fragment3.invoke( null ); + fragment1.invoke( null ); + fragment2.invoke( null ); + break; + case 5: + fragment3.invoke( null ); + fragment2.invoke( null ); + fragment1.invoke( null ); + break; + } + } + + public void setFragment1( JspFragment fragment1 ) { + this.fragment1 = fragment1; + } + + public void setFragment2( JspFragment fragment2 ) { + this.fragment2 = fragment2; + } + + public void setFragment3( JspFragment fragment3 ) { + this.fragment3 = fragment3; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..75d6daf8d4a3bf0360eb024a042f1eab3c2230a9 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/TileSimpleTag.java.html @@ -0,0 +1,49 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * Displays a tile as a single cell in a table. + */ +public class TileSimpleTag extends SimpleTagSupport { + private String color; + private String label; + + @Override + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( + "<td width=\"32\" height=\"32\" bgcolor=\"" + this.color + + "\"><font color=\"#ffffff\"><center>" + this.label + + "</center></font></td>" ); + } + + public void setColor( String color ) { + this.color = color; + } + + public void setLabel( String label ) { + this.label = label; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html new file mode 100644 index 0000000000000000000000000000000000000000..df1b6e68c6dd88c1e9e883a46abd9c5227059a06 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html @@ -0,0 +1,37 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="jspattribute.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="jspattribute.jsp.html">Source Code for jspattribute.jsp<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="HelloWorldSimpleTag.java.html">Source Code for HelloWorldSimpleTag.java<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="FooBean.java.html">Source Code for FooBean.java<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp new file mode 100644 index 0000000000000000000000000000000000000000..8050b3420b028404499211be42d88dc637fea819 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp @@ -0,0 +1,46 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Examples - jsp:attribute and jsp:body</title> + </head> + <body> + <h1>JSP 2.0 Examples - jsp:attribute and jsp:body</h1> + <hr> + <p>The new <jsp:attribute> and <jsp:body> + standard actions can be used to specify the value of any standard + action or custom action attribute.</p> + <p>This example uses the <jsp:attribute> + standard action to use the output of a custom action invocation + (one that simply outputs "Hello, World!") to set the value of a + bean property. This would normally require an intermediary + step, such as using JSTL's <c:set> action.</p> + <br> + <jsp:useBean id="foo" class="jsp2.examples.FooBean"> + Bean created! Setting foo.bar...<br> + <jsp:setProperty name="foo" property="bar"> + <jsp:attribute name="value"> + <my:helloWorld/> + </jsp:attribute> + </jsp:setProperty> + </jsp:useBean> + <br> + Result: ${foo.bar} + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..959699792169d7e4f758fad04d3dbc4879b0afa8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp.html @@ -0,0 +1,47 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Examples - jsp:attribute and jsp:body</title> + </head> + <body> + <h1>JSP 2.0 Examples - jsp:attribute and jsp:body</h1> + <hr> + <p>The new &lt;jsp:attribute&gt; and &lt;jsp:body&gt; + standard actions can be used to specify the value of any standard + action or custom action attribute.</p> + <p>This example uses the &lt;jsp:attribute&gt; + standard action to use the output of a custom action invocation + (one that simply outputs "Hello, World!") to set the value of a + bean property. This would normally require an intermediary + step, such as using JSTL's &lt;c:set&gt; action.</p> + <br> + <jsp:useBean id="foo" class="jsp2.examples.FooBean"> + Bean created! Setting foo.bar...<br> + <jsp:setProperty name="foo" property="bar"> + <jsp:attribute name="value"> + <my:helloWorld/> + </jsp:attribute> + </jsp:setProperty> + </jsp:useBean> + <br> + Result: ${foo.bar} + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html new file mode 100644 index 0000000000000000000000000000000000000000..5711860afe55facdaddfaab9e212855cbb5f48b6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.html @@ -0,0 +1,37 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="shuffle.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="shuffle.jsp.html">Source Code for shuffle.jsp<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="ShuffleSimpleTag.java.html">Source Code for ShuffleSimpleTag.java<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="TileSimpleTag.java.html">Source Code for TileSimpleTag.java<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp new file mode 100644 index 0000000000000000000000000000000000000000..737ff657aff04f5cf13c3692d5051a22d6ed0060 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp @@ -0,0 +1,90 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Examples - Shuffle Example</title> + </head> + <body> + <h1>JSP 2.0 Examples - Shuffle Example</h1> + <hr> + <p>Try reloading the page a few times. Both the rows and the columns + are shuffled and appear different each time.</p> + <p>Here's how the code works. The SimpleTag handler called + <my:shuffle> accepts three attributes. Each attribute is a + JSP Fragment, meaning it is a fragment of JSP code that can be + dynamically executed by the shuffle tag handler on demand. The + shuffle tag handler executes the three fragments in a random order. + To shuffle both the rows and the columns, the shuffle tag is used + with itself as a parameter.</p> + <hr> + <blockquote> + <font color="#ffffff"> + <table> + <my:shuffle> + <jsp:attribute name="fragment1"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="A"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="B"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="C"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="1"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="2"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="3"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="!"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="@"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="#"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + </my:shuffle> + </table> + </font> + </blockquote> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..dcb137d22625d69503633357217fa776fe4fae9d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp.html @@ -0,0 +1,91 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + +<html> + <head> + <title>JSP 2.0 Examples - Shuffle Example</title> + </head> + <body> + <h1>JSP 2.0 Examples - Shuffle Example</h1> + <hr> + <p>Try reloading the page a few times. Both the rows and the columns + are shuffled and appear different each time.</p> + <p>Here's how the code works. The SimpleTag handler called + &lt;my:shuffle&gt; accepts three attributes. Each attribute is a + JSP Fragment, meaning it is a fragment of JSP code that can be + dynamically executed by the shuffle tag handler on demand. The + shuffle tag handler executes the three fragments in a random order. + To shuffle both the rows and the columns, the shuffle tag is used + with itself as a parameter.</p> + <hr> + <blockquote> + <font color="#ffffff"> + <table> + <my:shuffle> + <jsp:attribute name="fragment1"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="A"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="B"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="C"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="1"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="2"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="3"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <tr> + <my:shuffle> + <jsp:attribute name="fragment1"> + <my:tile color="#ff0000" label="!"/> + </jsp:attribute> + <jsp:attribute name="fragment2"> + <my:tile color="#00ff00" label="@"/> + </jsp:attribute> + <jsp:attribute name="fragment3"> + <my:tile color="#0000ff" label="#"/> + </jsp:attribute> + </my:shuffle> + </tr> + </jsp:attribute> + </my:shuffle> + </table> + </font> + </blockquote> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html new file mode 100644 index 0000000000000000000000000000000000000000..f9df6a4a2015cb5eede40fe3e6ddae9d78a683be --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html lang="en"> +<head> +<meta charset="UTF-8"> +<title>View Source Code</title> +</head> + +<body> +<p><a href="basic.jspx"><img src="../../images/execute.gif" alt="Execute" style="border: 0;"></a><a +href="../../index.html"><img src="../../images/return.gif" alt="Return" style="border: 0;"></a></p> + +<h3><a href="basic.jspx.html">Source Code for XHTML Basic Example</a></h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx new file mode 100644 index 0000000000000000000000000000000000000000..fc1e45f923b48fce4ec05c0030877d800d1d24f0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns:jsp="http://java.sun.com/JSP/Page" + xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" + xmlns="http://www.w3.org/1999/xhtml"> + <jsp:output doctype-root-element="html" + doctype-public="-//W3C//DTD XHTML Basic 1.0//EN" + doctype-system="http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"/> + <jsp:directive.page contentType="application/xhtml+xml" /> + <head> + <title>JSPX - XHTML Basic Example</title> + </head> + <body> + <h1>JSPX - XHTML Basic Example</h1> + This example illustrates how to use JSPX to produce an XHTML basic + document suitable for use with mobile phones, televisions, + PDAs, vending machines, pagers, car navigation systems, + mobile game machines, digital book readers, smart watches, etc. + <p/> + JSPX lets you create dynamic documents in a pure XML syntax compatible + with existing XML tools. The XML syntax in JSP 1.2 was awkward and + required &lt;jsp:root&gt; to be the root element of the document. + This is no longer the case in JSP 2.0. + <p/> + This particular example uses + namespace declarations to make the output of this page a valid XHTML + document. + <p/> + Just to prove this is live, here's some dynamic content: + <jsp:useBean id="now" class="java.util.Date" /> + <fmt:formatDate value="${now}" pattern="MMMM d, yyyy, H:mm:ss"/> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html new file mode 100644 index 0000000000000000000000000000000000000000..6b38336ba3c485251916c20cc813898132922543 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/basic.jspx.html @@ -0,0 +1,49 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns:jsp="http://java.sun.com/JSP/Page" + xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" + xmlns="http://www.w3.org/1999/xhtml"> + <jsp:output doctype-root-element="html" + doctype-public="-//W3C//DTD XHTML Basic 1.0//EN" + doctype-system="http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd"/> + <jsp:directive.page contentType="application/xhtml+xml" /> + <head> + <title>JSPX - XHTML Basic Example</title> + </head> + <body> + <h1>JSPX - XHTML Basic Example</h1> + This example illustrates how to use JSPX to produce an XHTML basic + document suitable for use with mobile phones, televisions, + PDAs, vending machines, pagers, car navigation systems, + mobile game machines, digital book readers, smart watches, etc. + <p/> + JSPX lets you create dynamic documents in a pure XML syntax compatible + with existing XML tools. The XML syntax in JSP 1.2 was awkward and + required &amp;lt;jsp:root&amp;gt; to be the root element of the document. + This is no longer the case in JSP 2.0. + <p/> + This particular example uses + namespace declarations to make the output of this page a valid XHTML + document. + <p/> + Just to prove this is live, here's some dynamic content: + <jsp:useBean id="now" class="java.util.Date" /> + <fmt:formatDate value="${now}" pattern="MMMM d, yyyy, H:mm:ss"/> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html b/src/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html new file mode 100644 index 0000000000000000000000000000000000000000..f7d591a58370bc4a2002132444db94373c8e6ef1 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/svgexample.html @@ -0,0 +1,46 @@ +<!DOCTYPE html><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> + <head> + <meta charset="UTF-8"> + <title>JSP 2.0 SVG Example</title> + </head> + <body> + <h1>JSP 2.0 SVG Example</h1> + This example uses JSP 2.0's new, simplified JSPX syntax to render a + Scalable Vector Graphics (SVG) document. When you view the source, + notice the lack of a <jsp:root> element! The text to be rendered + can be modified by changing the value of the name parameter. + <p> + SVG has many potential uses, such as searchable images, or images + customized with the name of your site's visitor (e.g. a "Susan's Store" + tab image). JSPX is a natural fit for generating dynamic XML content + such as SVG. + <p> + To execute this example you will need a browser with basic SVG support. Any + remotely recent browser should have this. + <ol> + <li>Use this URL: + <a href="textRotate.jspx?name=JSPX">textRotate.jspx?name=JSPX</a></li> + <li>Customize by changing the name=JSPX parameter</li> + </ol> + <p style="margin-top: 2em;"> + The following is a screenshot of the resulting image, for those using a + browser without SVG support:<br> + <img src="textRotate.jpg" alt="[Screenshot image]" style="border: 1px solid #000;"> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html new file mode 100644 index 0000000000000000000000000000000000000000..5b3befe2e048a379085e2f381a3a23b35a7ab2ea --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html lang="en"> +<head> +<meta charset="UTF-8"> +<title>View Source Code</title> +</head> + +<body> +<p><a href="textRotate.jspx"><img src="../../images/execute.gif" alt="Execute" style="border: 0;"></a> <a +href="../../index.html"><img src="../../images/return.gif" alt="Return" style="border: 0;"></a></p> + +<h3><a href="textRotate.jspx.html">Source Code for SVG (Scalable Vector Graphics) +Example</a></h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e987367bc83c25aedf1c7afd76f34de4a229f82 Binary files /dev/null and b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jpg differ diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx new file mode 100644 index 0000000000000000000000000000000000000000..c543887e6688f863e1382a588d8aa996ed1cef16 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- + - This example is based off the textRotate.svg example that comes + - with Apache Batik. The original example was written by Bill Haneman. + - This version by Mark Roth. + --> +<svg xmlns="http://www.w3.org/2000/svg" + width="450" height="500" viewBox="0 0 450 500" + xmlns:c="http://java.sun.com/jsp/jstl/core" + xmlns:fn="http://java.sun.com/jsp/jstl/functions" + xmlns:jsp="http://java.sun.com/JSP/Page"> + <jsp:directive.page contentType="image/svg+xml" /> + <title>JSP 2.0 JSPX</title> + <!-- select name parameter, or default to JSPX --> + <c:set var="name" value='${empty fn:escapeXml(param["name"]) ? "JSPX" : fn:escapeXml(param["name"])}'/> + <g id="testContent"> + <text class="title" x="50%" y="10%" font-size="15" text-anchor="middle" > + JSP 2.0 XML Syntax (.jspx) Demo</text> + <text class="title" x="50%" y="15%" font-size="15" text-anchor="middle" > + Try changing the name parameter!</text> + <g opacity="1.0" transform="translate(225, 250)" id="rotatedText"> + <c:forEach var="i" begin="1" end="24"> + <jsp:text> + <![CDATA[<g opacity="0.95" transform="scale(1.05) rotate(15)">]]> + </jsp:text> + <text x="0" y="0" transform="scale(1.6, 1.6)" fill="DarkSlateBlue" + text-anchor="middle" font-size="40" font-family="Serif" + id="words">${name}</text> + </c:forEach> + <c:forEach var="i" begin="1" end="24"> + <jsp:text><![CDATA[</g>]]></jsp:text> + </c:forEach> + <text style="font-size:75;font-family:Serif;fill:white" + text-anchor="middle">${name}</text> + </g> + </g> +</svg> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html new file mode 100644 index 0000000000000000000000000000000000000000..0e6c8208f7189c088af0325e5e8bf527b72ee9a9 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/jspx/textRotate.jspx.html @@ -0,0 +1,54 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- + - This example is based off the textRotate.svg example that comes + - with Apache Batik. The original example was written by Bill Haneman. + - This version by Mark Roth. + --> +<svg xmlns="http://www.w3.org/2000/svg" + width="450" height="500" viewBox="0 0 450 500" + xmlns:c="http://java.sun.com/jsp/jstl/core" + xmlns:fn="http://java.sun.com/jsp/jstl/functions" + xmlns:jsp="http://java.sun.com/JSP/Page"> + <jsp:directive.page contentType="image/svg+xml" /> + <title>JSP 2.0 JSPX</title> + <!-- select name parameter, or default to JSPX --> + <c:set var="name" value='${empty fn:escapeXml(param["name"]) ? "JSPX" : fn:escapeXml(param["name"])}'/> + <g id="testContent"> + <text class="title" x="50%" y="10%" font-size="15" text-anchor="middle" > + JSP 2.0 XML Syntax (.jspx) Demo</text> + <text class="title" x="50%" y="15%" font-size="15" text-anchor="middle" > + Try changing the name parameter!</text> + <g opacity="1.0" transform="translate(225, 250)" id="rotatedText"> + <c:forEach var="i" begin="1" end="24"> + <jsp:text> + <![CDATA[<g opacity="0.95" transform="scale(1.05) rotate(15)">]]> + </jsp:text> + <text x="0" y="0" transform="scale(1.6, 1.6)" fill="DarkSlateBlue" + text-anchor="middle" font-size="40" font-family="Serif" + id="words">${name}</text> + </c:forEach> + <c:forEach var="i" begin="1" end="24"> + <jsp:text><![CDATA[</g>]]></jsp:text> + </c:forEach> + <text style="font-size:75;font-family:Serif;fill:white" + text-anchor="middle">${name}</text> + </g> + </g> +</svg> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..cab826dc686bb77d274caf1292f49f3433e818ee --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/EchoAttributesTag.java.html @@ -0,0 +1,59 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.DynamicAttributes; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that echoes all its attributes + */ +public class EchoAttributesTag + extends SimpleTagSupport + implements DynamicAttributes +{ + private final List<String> keys = new ArrayList<>(); + private final List<Object> values = new ArrayList<>(); + + @Override + public void doTag() throws JspException, IOException { + JspWriter out = getJspContext().getOut(); + for( int i = 0; i < keys.size(); i++ ) { + String key = keys.get( i ); + Object value = values.get( i ); + out.println( "<li>" + key + " = " + value + "</li>" ); + } + } + + @Override + public void setDynamicAttribute( String uri, String localName, + Object value ) + throws JspException + { + keys.add( localName ); + values.add( value ); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf b/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf new file mode 100644 index 0000000000000000000000000000000000000000..d767de506b8de5aa838bbeb9727c936acc66abd6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<hr> +<center> +This banner included with <include-coda> +</center> +<hr> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html new file mode 100644 index 0000000000000000000000000000000000000000..3a82576c0e6371c1b64f74ab03e21e7d31c0acb4 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/coda.jspf.html @@ -0,0 +1,22 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<hr> +<center> +This banner included with &lt;include-coda&gt; +</center> +<hr> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/config.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.html new file mode 100644 index 0000000000000000000000000000000000000000..707d68faf1c71fe57b54d858438da3a2d8531bef --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.html @@ -0,0 +1,35 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="config.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="config.jsp.html">Source Code for config.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="prelude.jspf.html">Source Code for prelude.jspf<font color="#0000FF"></a> + </font> </h3> +<h3><a href="coda.jspf.html">Source Code for coda.jspf<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp new file mode 100644 index 0000000000000000000000000000000000000000..0372889615a9f3fe0ca93918d1df16b6c2cab8a2 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp @@ -0,0 +1,32 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + <h1>JSP 2.0 Examples - JSP Configuration</h1> + <hr> + <p>Using a <jsp-property-group> element in the web.xml + deployment descriptor, this JSP page has been configured in the + following ways:</p> + <ul> + <li>Uses <include-prelude> to include the top banner.</li> + <li>Uses <include-coda> to include the bottom banner.</li> + <li>Uses <scripting-invalid> true to disable + <% scripting %> elements</li> + <li>Uses <el-ignored> true to disable ${EL} elements</li> + <li>Uses <page-encoding> ISO-8859-1 to set the page encoding (though this is the default anyway)</li> + </ul> + There are various other configuration options that can be used. + diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..6ce33ff5e32b0869758daed41b97501d0457b87e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/config.jsp.html @@ -0,0 +1,33 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> + <h1>JSP 2.0 Examples - JSP Configuration</h1> + <hr> + <p>Using a &lt;jsp-property-group&gt; element in the web.xml + deployment descriptor, this JSP page has been configured in the + following ways:</p> + <ul> + <li>Uses &lt;include-prelude&gt; to include the top banner.</li> + <li>Uses &lt;include-coda&gt; to include the bottom banner.</li> + <li>Uses &lt;scripting-invalid&gt; true to disable + &lt;% scripting %&gt; elements</li> + <li>Uses &lt;el-ignored&gt; true to disable ${EL} elements</li> + <li>Uses &lt;page-encoding&gt; ISO-8859-1 to set the page encoding (though this is the default anyway)</li> + </ul> + There are various other configuration options that can be used. + +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html new file mode 100644 index 0000000000000000000000000000000000000000..4fa1bf14e6f834a350d07253b6f7d74f01238fe8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="dynamicattrs.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="dynamicattrs.jsp.html">Source Code for dynamicattrs.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="EchoAttributesTag.java.html">Source Code for EchoAttributesTag.java<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp new file mode 100644 index 0000000000000000000000000000000000000000..251c49dbc8e89c6e4b1d45957b3ddbeda1cedb78 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp @@ -0,0 +1,44 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> +<html> + <head> + <title>JSP 2.0 Examples - Dynamic Attributes</title> + </head> + <body> + <h1>JSP 2.0 Examples - Dynamic Attributes</h1> + <hr> + <p>This JSP page invokes a custom tag that accepts a dynamic set + of attributes. The tag echoes the name and value of all attributes + passed to it.</p> + <hr> + <h2>Invocation 1 (six attributes)</h2> + <ul> + <my:echoAttributes x="1" y="2" z="3" r="red" g="green" b="blue"/> + </ul> + <h2>Invocation 2 (zero attributes)</h2> + <ul> + <my:echoAttributes/> + </ul> + <h2>Invocation 3 (three attributes)</h2> + <ul> + <my:echoAttributes dogName="Scruffy" + catName="Fluffy" + blowfishName="Puffy"/> + </ul> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..8f5ee18e7c30e018f1373175c0c9c683a403699f --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp.html @@ -0,0 +1,45 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="http://tomcat.apache.org/jsp2-example-taglib"%> +<html> + <head> + <title>JSP 2.0 Examples - Dynamic Attributes</title> + </head> + <body> + <h1>JSP 2.0 Examples - Dynamic Attributes</h1> + <hr> + <p>This JSP page invokes a custom tag that accepts a dynamic set + of attributes. The tag echoes the name and value of all attributes + passed to it.</p> + <hr> + <h2>Invocation 1 (six attributes)</h2> + <ul> + <my:echoAttributes x="1" y="2" z="3" r="red" g="green" b="blue"/> + </ul> + <h2>Invocation 2 (zero attributes)</h2> + <ul> + <my:echoAttributes/> + </ul> + <h2>Invocation 3 (three attributes)</h2> + <ul> + <my:echoAttributes dogName="Scruffy" + catName="Fluffy" + blowfishName="Puffy"/> + </ul> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf b/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf new file mode 100644 index 0000000000000000000000000000000000000000..05f7c845a1084ee0c9eeb98fad625509bdf87477 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<hr> +<center> +This banner included with <include-prelude> +</center> +<hr> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html b/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html new file mode 100644 index 0000000000000000000000000000000000000000..8b2bcd056eb3338a80d1549bebc6c1900fd0254e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/misc/prelude.jspf.html @@ -0,0 +1,22 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<hr> +<center> +This banner included with &lt;include-prelude&gt; +</center> +<hr> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html new file mode 100644 index 0000000000000000000000000000000000000000..5c99dad403f3655d956e59452ba87462aa5f1adf --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/BookBean.java.html @@ -0,0 +1,45 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class BookBean { + private final String title; + private final String author; + private final String isbn; + + public BookBean( String title, String author, String isbn ) { + this.title = title; + this.author = author; + this.isbn = isbn; + } + + public String getTitle() { + return this.title; + } + + public String getAuthor() { + return this.author; + } + + public String getIsbn() { + return this.isbn; + } + +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..4deafca9fd79dbff589b71ee95a69cd1262a10d2 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/FindBookSimpleTag.java.html @@ -0,0 +1,47 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +import jsp2.examples.BookBean; + +/** + * SimpleTag handler that pretends to search for a book, and stores + * the result in a scoped variable. + */ +public class FindBookSimpleTag extends SimpleTagSupport { + private String var; + + private static final String BOOK_TITLE = "The Lord of the Rings"; + private static final String BOOK_AUTHOR = "J. R. R. Tolkein"; + private static final String BOOK_ISBN = "0618002251"; + + @Override + public void doTag() throws JspException { + BookBean book = new BookBean( BOOK_TITLE, BOOK_AUTHOR, BOOK_ISBN ); + getJspContext().setAttribute( this.var, book ); + } + + public void setVar( String var ) { + this.var = var; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html new file mode 100644 index 0000000000000000000000000000000000000000..aa84cccc46dd097cad8b43b9f1e8e1b2398e847c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/Functions.java.html @@ -0,0 +1,46 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package jsp2.examples.el; + +import java.util.Locale; + +/** + * Defines the functions for the jsp2 example tag library. + * + * <p>Each function is defined as a static method.</p> + */ +public class Functions { + public static String reverse( String text ) { + return new StringBuilder( text ).reverse().toString(); + } + + public static int numVowels( String text ) { + String vowels = "aeiouAEIOU"; + int result = 0; + for( int i = 0; i < text.length(); i++ ) { + if( vowels.indexOf( text.charAt( i ) ) != -1 ) { + result++; + } + } + return result; + } + + public static String caps( String text ) { + return text.toUpperCase(Locale.ENGLISH); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..8c0bd4dc49c18e67a7a750bd46312cb633d3ca72 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/HelloWorldSimpleTag.java.html @@ -0,0 +1,35 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that prints "Hello, world!" + */ +public class HelloWorldSimpleTag extends SimpleTagSupport { + @Override + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( "Hello, world!" ); + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html new file mode 100644 index 0000000000000000000000000000000000000000..12913fcdae1d4d38aac6d976b7b47e4cbf5bef27 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/RepeatSimpleTag.java.html @@ -0,0 +1,45 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import java.io.IOException; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * SimpleTag handler that accepts a num attribute and + * invokes its body 'num' times. + */ +public class RepeatSimpleTag extends SimpleTagSupport { + private int num; + + @Override + public void doTag() throws JspException, IOException { + for (int i=0; i<num; i++) { + getJspContext().setAttribute("count", String.valueOf( i + 1 ) ); + getJspBody().invoke(null); + } + } + + public void setNum(int num) { + this.num = num; + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html new file mode 100644 index 0000000000000000000000000000000000000000..2841acf17f8b06afaaa12b1848eb99b71f34b5c8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.html @@ -0,0 +1,37 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="book.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="book.jsp.html">Source Code for the Book Example JSP<font color="#0000FF"></a> + </font> </h3> +<h3><a href="FindBookSimpleTag.java.html">Source Code for the FindBook SimpleTag Handler<font color="#0000FF"></a> + </font> </h3> +<h3><a href="BookBean.java.html">Source Code for BookBean<font color="#0000FF"></a> + </font> </h3> +<h3><a href="Functions.java.html">Source Code for the EL Functions<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp new file mode 100644 index 0000000000000000000000000000000000000000..ba07cfb64ace92524a587ea9336320e3f1c3b0d0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp @@ -0,0 +1,55 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Book SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Book SimpleTag Handler</h1> + <hr> + <p>Illustrates a semi-realistic use of SimpleTag and the Expression + Language. First, a <my:findBook> tag is invoked to populate + the page context with a BookBean. Then, the books fields are printed + in all caps.</p> + <br> + <b><u>Result:</u></b><br> + <my:findBook var="book"/> + <table border="1"> + <thead> + <td><b>Field</b></td> + <td><b>Value</b></td> + <td><b>Capitalized</b></td> + </thead> + <tr> + <td>Title</td> + <td>${book.title}</td> + <td>${my:caps(book.title)}</td> + </tr> + <tr> + <td>Author</td> + <td>${book.author}</td> + <td>${my:caps(book.author)}</td> + </tr> + <tr> + <td>ISBN</td> + <td>${book.isbn}</td> + <td>${my:caps(book.isbn)}</td> + </tr> + </table> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..51c27a0bd3c357fc3a7fb91549058c58f47bebf0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/book.jsp.html @@ -0,0 +1,56 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Book SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Book SimpleTag Handler</h1> + <hr> + <p>Illustrates a semi-realistic use of SimpleTag and the Expression + Language. First, a &lt;my:findBook&gt; tag is invoked to populate + the page context with a BookBean. Then, the books fields are printed + in all caps.</p> + <br> + <b><u>Result:</u></b><br> + <my:findBook var="book"/> + <table border="1"> + <thead> + <td><b>Field</b></td> + <td><b>Value</b></td> + <td><b>Capitalized</b></td> + </thead> + <tr> + <td>Title</td> + <td>${book.title}</td> + <td>${my:caps(book.title)}</td> + </tr> + <tr> + <td>Author</td> + <td>${book.author}</td> + <td>${my:caps(book.author)}</td> + </tr> + <tr> + <td>ISBN</td> + <td>${book.isbn}</td> + <td>${my:caps(book.isbn)}</td> + </tr> + </table> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html new file mode 100644 index 0000000000000000000000000000000000000000..20cadf877c32f2466e53a31fd9d839db7c99d37f --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="hello.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="hello.jsp.html">Source Code for the Hello World Tag Example JSP<font color="#0000FF"></a> + </font> </h3> +<h3><a href="HelloWorldSimpleTag.java.html">Source Code for the Hello World SimpleTag Handler<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d9f22a281a431ee4e00ec4f8fbf0c2cad03aa234 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp @@ -0,0 +1,31 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1> + <hr> + <p>This tag handler simply echos "Hello, World!" It's an example of + a very basic SimpleTag handler with no body.</p> + <br> + <b><u>Result:</u></b> + <mytag:helloWorld/> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..76f39739560d521670628c991a7e7b2445be562d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/hello.jsp.html @@ -0,0 +1,32 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Hello World SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Hello World SimpleTag Handler</h1> + <hr> + <p>This tag handler simply echos "Hello, World!" It's an example of + a very basic SimpleTag handler with no body.</p> + <br> + <b><u>Result:</u></b> + <mytag:helloWorld/> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html new file mode 100644 index 0000000000000000000000000000000000000000..a56bfcd2e70013cbca35d9b4413fc8033c7160a7 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="repeat.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="repeat.jsp.html">Source Code for the Repeat Tag Example JSP<font color="#0000FF"></a> + </font> </h3> +<h3><a href="RepeatSimpleTag.java.html">Source Code for the Repeat SimpleTag Handler<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp new file mode 100644 index 0000000000000000000000000000000000000000..b12d0a91d75c51d98a7f04b4d85adb49e628d079 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp @@ -0,0 +1,39 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Repeat SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Repeat SimpleTag Handler</h1> + <hr> + <p>This tag handler accepts a "num" parameter and repeats the body of the + tag "num" times. It's a simple example, but the implementation of + such a tag in JSP 2.0 is substantially simpler than the equivalent + JSP 1.2-style classic tag handler.</p> + <p>The body of the tag is encapsulated in a "JSP Fragment" and passed + to the tag handler, which then executes it five times, inside a + for loop. The tag handler passes in the current invocation in a + scoped variable called count, which can be accessed using the EL.</p> + <br> + <b><u>Result:</u></b><br> + <mytag:repeat num="5"> + Invocation ${count} of 5<br> + </mytag:repeat> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..bd40cab6af4fc043de4105c6e30ee9fb45b2ce98 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/simpletag/repeat.jsp.html @@ -0,0 +1,40 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> +<html> + <head> + <title>JSP 2.0 Examples - Repeat SimpleTag Handler</title> + </head> + <body> + <h1>JSP 2.0 Examples - Repeat SimpleTag Handler</h1> + <hr> + <p>This tag handler accepts a "num" parameter and repeats the body of the + tag "num" times. It's a simple example, but the implementation of + such a tag in JSP 2.0 is substantially simpler than the equivalent + JSP 1.2-style classic tag handler.</p> + <p>The body of the tag is encapsulated in a "JSP Fragment" and passed + to the tag handler, which then executes it five times, inside a + for loop. The tag handler passes in the current invocation in a + scoped variable called count, which can be accessed using the EL.</p> + <br> + <b><u>Result:</u></b><br> + <mytag:repeat num="5"> + Invocation ${count} of 5<br> + </mytag:repeat> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html new file mode 100644 index 0000000000000000000000000000000000000000..dd488f22ca62f1986516bb604ad727e7d99dd6d4 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/displayProducts.tag.html @@ -0,0 +1,56 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ attribute name="normalPrice" fragment="true" %> +<%@ attribute name="onSale" fragment="true" %> +<%@ variable name-given="name" %> +<%@ variable name-given="price" %> +<%@ variable name-given="origPrice" %> +<%@ variable name-given="salePrice" %> + +<table border="1"> + <tr> + <td> + <c:set var="name" value="Hand-held Color PDA"/> + <c:set var="price" value="$298.86"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="4-Pack 150 Watt Light Bulbs"/> + <c:set var="origPrice" value="$2.98"/> + <c:set var="salePrice" value="$2.32"/> + <jsp:invoke fragment="onSale"/> + </td> + <td> + <c:set var="name" value="Digital Cellular Phone"/> + <c:set var="price" value="$68.74"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="Baby Grand Piano"/> + <c:set var="price" value="$10,800.00"/> + <jsp:invoke fragment="normalPrice"/> + </td> + <td> + <c:set var="name" value="Luxury Car w/ Leather Seats"/> + <c:set var="origPrice" value="$23,980.00"/> + <c:set var="salePrice" value="$21,070.00"/> + <jsp:invoke fragment="onSale"/> + </td> + </tr> +</table> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html new file mode 100644 index 0000000000000000000000000000000000000000..f29a37969b2e4368b1e536d543447a56792f22d4 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="hello.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="hello.jsp.html">Source Code for hello.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="helloWorld.tag.html">Source Code for helloWorld.tag<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9b260f5f2d1bb9e78cb4e9c9e537ac8a66736de8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp @@ -0,0 +1,35 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Hello World Using a Tag File</title> + </head> + <body> + <h1>JSP 2.0 Examples - Hello World Using a Tag File</h1> + <hr> + <p>This JSP page invokes a custom tag that simply echos "Hello, World!" + The custom tag is generated from a tag file in the /WEB-INF/tags + directory.</p> + <p>Notice that we did not need to write a TLD for this tag. We just + created /WEB-INF/tags/helloWorld.tag, imported it using the taglib + directive, and used it!</p> + <br> + <b><u>Result:</u></b> + <tags:helloWorld/> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..b431f30245ead6ddd153df3a2e7cdad68b80e355 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/hello.jsp.html @@ -0,0 +1,36 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Hello World Using a Tag File</title> + </head> + <body> + <h1>JSP 2.0 Examples - Hello World Using a Tag File</h1> + <hr> + <p>This JSP page invokes a custom tag that simply echos "Hello, World!" + The custom tag is generated from a tag file in the /WEB-INF/tags + directory.</p> + <p>Notice that we did not need to write a TLD for this tag. We just + created /WEB-INF/tags/helloWorld.tag, imported it using the taglib + directive, and used it!</p> + <br> + <b><u>Result:</u></b> + <tags:helloWorld/> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html new file mode 100644 index 0000000000000000000000000000000000000000..f29726f43fcd7a40a87fc4d168308c92dfec9fd8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/helloWorld.tag.html @@ -0,0 +1,18 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +Hello, world! +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html new file mode 100644 index 0000000000000000000000000000000000000000..1f03b9cab7b29b8faef3aed2cafc1476cc82cb8a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="panel.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="panel.jsp.html">Source Code for panel.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="panel.tag.html">Source Code for panel.tag<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d96387789ce1b38ab8397dd628761a2f46b2ceeb --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp @@ -0,0 +1,58 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Panels using Tag Files</title> + </head> + <body> + <h1>JSP 2.0 Examples - Panels using Tag Files</h1> + <hr> + <p>This JSP page invokes a custom tag that draws a + panel around the contents of the tag body. Normally, such a tag + implementation would require a Java class with many println() statements, + outputting HTML. Instead, we can use a .tag file as a template, + and we don't need to write a single line of Java or even a TLD!</p> + <hr> + <table border="0"> + <tr valign="top"> + <td> + <tags:panel color="#ff8080" bgcolor="#ffc0c0" title="Panel 1"> + First panel.<br/> + </tags:panel> + </td> + <td> + <tags:panel color="#80ff80" bgcolor="#c0ffc0" title="Panel 2"> + Second panel.<br/> + Second panel.<br/> + Second panel.<br/> + Second panel.<br/> + </tags:panel> + </td> + <td> + <tags:panel color="#8080ff" bgcolor="#c0c0ff" title="Panel 3"> + Third panel.<br/> + <tags:panel color="#ff80ff" bgcolor="#ffc0ff" title="Inner"> + A panel in a panel. + </tags:panel> + Third panel.<br/> + </tags:panel> + </td> + </tr> + </table> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..584393de2c99d26e0fc10676ff9f6354d350521d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.jsp.html @@ -0,0 +1,59 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Panels using Tag Files</title> + </head> + <body> + <h1>JSP 2.0 Examples - Panels using Tag Files</h1> + <hr> + <p>This JSP page invokes a custom tag that draws a + panel around the contents of the tag body. Normally, such a tag + implementation would require a Java class with many println() statements, + outputting HTML. Instead, we can use a .tag file as a template, + and we don't need to write a single line of Java or even a TLD!</p> + <hr> + <table border="0"> + <tr valign="top"> + <td> + <tags:panel color="#ff8080" bgcolor="#ffc0c0" title="Panel 1"> + First panel.<br/> + </tags:panel> + </td> + <td> + <tags:panel color="#80ff80" bgcolor="#c0ffc0" title="Panel 2"> + Second panel.<br/> + Second panel.<br/> + Second panel.<br/> + Second panel.<br/> + </tags:panel> + </td> + <td> + <tags:panel color="#8080ff" bgcolor="#c0c0ff" title="Panel 3"> + Third panel.<br/> + <tags:panel color="#ff80ff" bgcolor="#ffc0ff" title="Inner"> + A panel in a panel. + </tags:panel> + Third panel.<br/> + </tags:panel> + </td> + </tr> + </table> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html new file mode 100644 index 0000000000000000000000000000000000000000..aec91c306f06e10f89a2eafee0e6bdaa1606d2aa --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/panel.tag.html @@ -0,0 +1,30 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<%@ attribute name="color" %> +<%@ attribute name="bgcolor" %> +<%@ attribute name="title" %> +<table border="1" bgcolor="${color}"> + <tr> + <td><b>${title}</b></td> + </tr> + <tr> + <td bgcolor="${bgcolor}"> + <jsp:doBody/> + </td> + </tr> +</table> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html new file mode 100644 index 0000000000000000000000000000000000000000..72ae49ff2c63139391393119047cfacd2a0b4934 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.html @@ -0,0 +1,33 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>View Source Code</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="products.jsp"><img src="../../images/execute.gif" align="right" border="0"></a> +<a href="../../index.html"><img src="../../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="products.jsp.html">Source Code for products.jsp<font color="#0000FF"></a> + </font> </h3> +<h3><a href="displayProducts.tag.html">Source Code for displayProducts.tag<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp new file mode 100644 index 0000000000000000000000000000000000000000..7f32ffb4d6b53c40edfd81f1e7ce485e5afba755 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp @@ -0,0 +1,54 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Display Products Tag File</title> + </head> + <body> + <h1>JSP 2.0 Examples - Display Products Tag File</h1> + <hr> + <p>This JSP page invokes a tag file that displays a listing of + products. The custom tag accepts two fragments that enable + customization of appearance. One for when the product is on sale + and one for normal price.</p> + <p>The tag is invoked twice, using different styles</p> + <hr> + <h2>Products</h2> + <tags:displayProducts> + <jsp:attribute name="normalPrice"> + Item: ${name}<br/> + Price: ${price} + </jsp:attribute> + <jsp:attribute name="onSale"> + Item: ${name}<br/> + <font color="red"><strike>Was: ${origPrice}</strike></font><br/> + <b>Now: ${salePrice}</b> + </jsp:attribute> + </tags:displayProducts> + <hr> + <h2>Products (Same tag, alternate style)</h2> + <tags:displayProducts> + <jsp:attribute name="normalPrice"> + <b>${name}</b> @ ${price} ea. + </jsp:attribute> + <jsp:attribute name="onSale"> + <b>${name}</b> @ ${salePrice} ea. (was: ${origPrice}) + </jsp:attribute> + </tags:displayProducts> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..6d6fc10389d954111c43ca7783198b2edac1cd5c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsp2/tagfiles/products.jsp.html @@ -0,0 +1,55 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> +<html> + <head> + <title>JSP 2.0 Examples - Display Products Tag File</title> + </head> + <body> + <h1>JSP 2.0 Examples - Display Products Tag File</h1> + <hr> + <p>This JSP page invokes a tag file that displays a listing of + products. The custom tag accepts two fragments that enable + customization of appearance. One for when the product is on sale + and one for normal price.</p> + <p>The tag is invoked twice, using different styles</p> + <hr> + <h2>Products</h2> + <tags:displayProducts> + <jsp:attribute name="normalPrice"> + Item: ${name}<br/> + Price: ${price} + </jsp:attribute> + <jsp:attribute name="onSale"> + Item: ${name}<br/> + <font color="red"><strike>Was: ${origPrice}</strike></font><br/> + <b>Now: ${salePrice}</b> + </jsp:attribute> + </tags:displayProducts> + <hr> + <h2>Products (Same tag, alternate style)</h2> + <tags:displayProducts> + <jsp:attribute name="normalPrice"> + <b>${name}</b> @ ${price} ea. + </jsp:attribute> + <jsp:attribute name="onSale"> + <b>${name}</b> @ ${salePrice} ea. (was: ${origPrice}) + </jsp:attribute> + </tags:displayProducts> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html b/src/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html new file mode 100644 index 0000000000000000000000000000000000000000..0a3803705e880323c791ae3b806988c0cf4b7bc0 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/ServletToJsp.java.html @@ -0,0 +1,40 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre>/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ServletToJsp extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + public void doGet (HttpServletRequest request, + HttpServletResponse response) { + + try { + // Set the attribute and Forward to hello.jsp + request.setAttribute ("servletName", "servletToJsp"); + getServletConfig().getServletContext().getRequestDispatcher( + "/jsp/jsptoserv/hello.jsp").forward(request, response); + } catch (Exception ex) { + ex.printStackTrace (); + } + } +} +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp b/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp new file mode 100644 index 0000000000000000000000000000000000000000..8b2a43f555eef356cefeda6074fd810077aa0197 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp @@ -0,0 +1,26 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> + +<h1> +I have been invoked by +<% out.print (request.getAttribute("servletName").toString()); %> +Servlet. +</h1> + +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html b/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..6ed71761689ffdbff96bb3b6d3e8d8f509fb07fa --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/hello.jsp.html @@ -0,0 +1,27 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> + +<h1> +I have been invoked by +<% out.print (request.getAttribute("servletName").toString()); %> +Servlet. +</h1> + +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp b/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp new file mode 100644 index 0000000000000000000000000000000000000000..db68a6ff07b33c57e7a7ae67325d06dfcbb4f393 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp @@ -0,0 +1,23 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> + +<!-- Forward to a servlet --> +<jsp:forward page="/servletToJsp" /> + +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html b/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..a5dc22cca5217808b55342b1208dc2fe28c3b0f8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp.html @@ -0,0 +1,24 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> + +<!-- Forward to a servlet --> +<jsp:forward page="/servletToJsp" /> + +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/jsptoserv/jts.html b/src/tomcat/webapps/examples/jsp/jsptoserv/jts.html new file mode 100644 index 0000000000000000000000000000000000000000..a4e16794a3af66037a69bbfce717d7efec891800 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/jsptoserv/jts.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<meta charset="UTF-8" /> +<title>Untitled Document</title> +<style type="text/css"> +img { border: 0; } +</style> +</head> + +<body> +<p><a href="jsptoservlet.jsp"><img src="../images/execute.gif" alt=""> Execute</a><br /> +<a href="../index.html"><img src="../images/return.gif" alt=""> Return</a></p> + +<p style="font-size: 1.4em;"><a href="jsptoservlet.jsp.html">Source Code for JSP calling servlet</a></p> + +<p style="font-size: 1.4em;"><a href="ServletToJsp.java.html">Source Code for Servlet calling JSP</a></p> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/num/numguess.html b/src/tomcat/webapps/examples/jsp/num/numguess.html new file mode 100644 index 0000000000000000000000000000000000000000..1c5a4844aa17f4019c1e12d4e427bbe51c54626c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/num/numguess.html @@ -0,0 +1,34 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Number Guess Game + Written by Jason Hunter, CTO, K&A Software + http://www.servlets.com +--> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="numguess.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="numguess.jsp.html">Source Code for Numguess Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/num/numguess.jsp b/src/tomcat/webapps/examples/jsp/num/numguess.jsp new file mode 100644 index 0000000000000000000000000000000000000000..d9c61b912db5e251c9c467bb065b9dc6612e830c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/num/numguess.jsp @@ -0,0 +1,69 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Number Guess Game + Written by Jason Hunter, CTO, K&A Software + http://www.servlets.com +--%> + +<%@ page import = "num.NumberGuessBean" %> + +<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/> +<jsp:setProperty name="numguess" property="*"/> + +<html> +<head><title>Number Guess</title></head> +<body bgcolor="white"> +<font size=4> + +<% if (numguess.getSuccess()) { %> + + Congratulations! You got it. + And after just <%= numguess.getNumGuesses() %> tries.<p> + + <% numguess.reset(); %> + + Care to <a href="numguess.jsp">try again</a>? + +<% } else if (numguess.getNumGuesses() == 0) { %> + + Welcome to the Number Guess game.<p> + + I'm thinking of a number between 1 and 100.<p> + + <form method=get> + What's your guess? <input type=text name=guess> + <input type=submit value="Submit"> + </form> + +<% } else { %> + + Good guess, but nope. Try <b><%= numguess.getHint() %></b>. + + You have made <%= numguess.getNumGuesses() %> guesses.<p> + + I'm thinking of a number between 1 and 100.<p> + + <form method=get> + What's your guess? <input type=text name=guess> + <input type=submit value="Submit"> + </form> + +<% } %> + +</font> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/num/numguess.jsp.html b/src/tomcat/webapps/examples/jsp/num/numguess.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..e7640419ae74ab90aab4d4ccff996265f8772f5e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/num/numguess.jsp.html @@ -0,0 +1,70 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Number Guess Game + Written by Jason Hunter, CTO, K&A Software + http://www.servlets.com +--%> + +<%@ page import = "num.NumberGuessBean" %> + +<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/> +<jsp:setProperty name="numguess" property="*"/> + +<html> +<head><title>Number Guess</title></head> +<body bgcolor="white"> +<font size=4> + +<% if (numguess.getSuccess()) { %> + + Congratulations! You got it. + And after just <%= numguess.getNumGuesses() %> tries.<p> + + <% numguess.reset(); %> + + Care to <a href="numguess.jsp">try again</a>? + +<% } else if (numguess.getNumGuesses() == 0) { %> + + Welcome to the Number Guess game.<p> + + I'm thinking of a number between 1 and 100.<p> + + <form method=get> + What's your guess? <input type=text name=guess> + <input type=submit value="Submit"> + </form> + +<% } else { %> + + Good guess, but nope. Try <b><%= numguess.getHint() %></b>. + + You have made <%= numguess.getNumGuesses() %> guesses.<p> + + I'm thinking of a number between 1 and 100.<p> + + <form method=get> + What's your guess? <input type=text name=guess> + <input type=submit value="Submit"> + </form> + +<% } %> + +</font> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class b/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class new file mode 100644 index 0000000000000000000000000000000000000000..888b2059bd16e817f4165069d4a5007bd5599ddc Binary files /dev/null and b/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.class differ diff --git a/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java b/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java new file mode 100644 index 0000000000000000000000000000000000000000..4ea737a735275e5efb94519ed09477ea7c87987a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/plugin/applet/Clock2.java @@ -0,0 +1,230 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.applet.Applet; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Time! + * + * @author Rachel Gollub + */ + +public class Clock2 extends Applet implements Runnable { + private static final long serialVersionUID = 1L; + Thread timer; // The thread that displays clock + int lastxs, lastys, lastxm, + lastym, lastxh, lastyh; // Dimensions used to draw hands + SimpleDateFormat formatter; // Formats the date displayed + String lastdate; // String to hold date displayed + Font clockFaceFont; // Font for number display on clock + Date currentDate; // Used to get date to display + Color handColor; // Color of main hands and dial + Color numberColor; // Color of second hand and numbers + + @Override + public void init() { + lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0; + formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault()); + currentDate = new Date(); + lastdate = formatter.format(currentDate); + clockFaceFont = new Font("Serif", Font.PLAIN, 14); + handColor = Color.blue; + numberColor = Color.darkGray; + + try { + setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16))); + } catch (Exception e) { + // Ignored + } + try { + handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16)); + } catch (Exception e) { + // Ignored + } + try { + numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16)); + } catch (Exception e) { + // Ignored + } + resize(300,300); // Set clock window size + } + + // Plotpoints allows calculation to only cover 45 degrees of the circle, + // and then mirror + public void plotpoints(int x0, int y0, int x, int y, Graphics g) { + g.drawLine(x0+x,y0+y,x0+x,y0+y); + g.drawLine(x0+y,y0+x,x0+y,y0+x); + g.drawLine(x0+y,y0-x,x0+y,y0-x); + g.drawLine(x0+x,y0-y,x0+x,y0-y); + g.drawLine(x0-x,y0-y,x0-x,y0-y); + g.drawLine(x0-y,y0-x,x0-y,y0-x); + g.drawLine(x0-y,y0+x,x0-y,y0+x); + g.drawLine(x0-x,y0+y,x0-x,y0+y); + } + + // Circle is just Bresenham's algorithm for a scan converted circle + public void circle(int x0, int y0, int r, Graphics g) { + int x,y; + float d; + x=0; + y=r; + d=5/4-r; + plotpoints(x0,y0,x,y,g); + + while (y>x){ + if (d<0) { + d=d+2*x+3; + x++; + } + else { + d=d+2*(x-y)+5; + x++; + y--; + } + plotpoints(x0,y0,x,y,g); + } + } + + // Paint is the main part of the program + @Override + public void paint(Graphics g) { + int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter; + String today; + + currentDate = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault()); + try { + s = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + s = 0; + } + formatter.applyPattern("m"); + try { + m = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + m = 10; + } + formatter.applyPattern("h"); + try { + h = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + h = 10; + } + formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy"); + today = formatter.format(currentDate); + xcenter=80; + ycenter=55; + + // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00) + // x = r(cos a) + xcenter, y = r(sin a) + ycenter + + xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter); + ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter); + xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter); + ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter); + xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter); + yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter); + + // Draw the circle and numbers + + g.setFont(clockFaceFont); + g.setColor(handColor); + circle(xcenter,ycenter,50,g); + g.setColor(numberColor); + g.drawString("9",xcenter-45,ycenter+3); + g.drawString("3",xcenter+40,ycenter+3); + g.drawString("12",xcenter-5,ycenter-37); + g.drawString("6",xcenter-3,ycenter+45); + + // Erase if necessary, and redraw + + g.setColor(getBackground()); + if (xs != lastxs || ys != lastys) { + g.drawLine(xcenter, ycenter, lastxs, lastys); + g.drawString(lastdate, 5, 125); + } + if (xm != lastxm || ym != lastym) { + g.drawLine(xcenter, ycenter-1, lastxm, lastym); + g.drawLine(xcenter-1, ycenter, lastxm, lastym); } + if (xh != lastxh || yh != lastyh) { + g.drawLine(xcenter, ycenter-1, lastxh, lastyh); + g.drawLine(xcenter-1, ycenter, lastxh, lastyh); } + g.setColor(numberColor); + g.drawString("", 5, 125); + g.drawString(today, 5, 125); + g.drawLine(xcenter, ycenter, xs, ys); + g.setColor(handColor); + g.drawLine(xcenter, ycenter-1, xm, ym); + g.drawLine(xcenter-1, ycenter, xm, ym); + g.drawLine(xcenter, ycenter-1, xh, yh); + g.drawLine(xcenter-1, ycenter, xh, yh); + lastxs=xs; lastys=ys; + lastxm=xm; lastym=ym; + lastxh=xh; lastyh=yh; + lastdate = today; + currentDate=null; + } + + @Override + public void start() { + timer = new Thread(this); + timer.start(); + } + + @Override + public void stop() { + timer = null; + } + + @Override + public void run() { + Thread me = Thread.currentThread(); + while (timer == me) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + repaint(); + } + } + + @Override + public void update(Graphics g) { + paint(g); + } + + @Override + public String getAppletInfo() { + return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock."; + } + + @Override + public String[][] getParameterInfo() { + String[][] info = { + {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."}, + {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."}, + {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."} + }; + return info; + } +} diff --git a/src/tomcat/webapps/examples/jsp/plugin/plugin.html b/src/tomcat/webapps/examples/jsp/plugin/plugin.html new file mode 100644 index 0000000000000000000000000000000000000000..27bc51b131ff9de2f0503557803b7c5488af1f7b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/plugin/plugin.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="plugin.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="plugin.jsp.html">Source Code for Plugin Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp b/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp new file mode 100644 index 0000000000000000000000000000000000000000..a07dda3af5815125dfd50303a838fe015dec310b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp @@ -0,0 +1,34 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<title> Plugin example </title> +<body bgcolor="white"> +<h3> Current time is : </h3> +<jsp:plugin type="applet" code="Clock2.class" codebase="applet" jreversion="1.2" width="160" height="150" > + <jsp:fallback> + Plugin tag OBJECT or EMBED not supported by browser. + </jsp:fallback> +</jsp:plugin> +<p> +<h4> +<font color=red> +The above applet is loaded using the Java Plugin from a jsp page using the +plugin tag. +</font> +</h4> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html b/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..710bda762841580b802b8cc55d84bf444d4f25fa --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/plugin/plugin.jsp.html @@ -0,0 +1,35 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<title> Plugin example </title> +<body bgcolor="white"> +<h3> Current time is : </h3> +<jsp:plugin type="applet" code="Clock2.class" codebase="applet" jreversion="1.2" width="160" height="150" > + <jsp:fallback> + Plugin tag OBJECT or EMBED not supported by browser. + </jsp:fallback> +</jsp:plugin> +<p> +<h4> +<font color=red> +The above applet is loaded using the Java Plugin from a jsp page using the +plugin tag. +</font> +</h4> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/security/protected/error.jsp b/src/tomcat/webapps/examples/jsp/security/protected/error.jsp new file mode 100644 index 0000000000000000000000000000000000000000..3ef57434161a94bc32eb8408308832b85adcf787 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/error.jsp @@ -0,0 +1,25 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<head> +<title>Error Page For Examples</title> +</head> +<body bgcolor="white"> +Invalid username and/or password, please try +<a href='<%= response.encodeURL("index.jsp") %>'>again</a>. +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/security/protected/error.jsp.html b/src/tomcat/webapps/examples/jsp/security/protected/error.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..50ec895acf1fb73aef22b0a01c317b08ea0e9f6a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/error.jsp.html @@ -0,0 +1,26 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<head> +<title>Error Page For Examples</title> +</head> +<body bgcolor="white"> +Invalid username and/or password, please try +<a href='<%= response.encodeURL("index.jsp") %>'>again</a>. +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/security/protected/index.jsp b/src/tomcat/webapps/examples/jsp/security/protected/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..eacf27acbc33a46d538609817fe1ca941e51e873 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/index.jsp @@ -0,0 +1,82 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<% + if (request.getParameter("logoff") != null) { + session.invalidate(); + response.sendRedirect("index.jsp"); + return; + } +%> +<html> +<head> +<title>Protected Page for Examples</title> +</head> +<body bgcolor="white"> + +You are logged in as remote user +<b><%= util.HTMLFilter.filter(request.getRemoteUser()) %></b> +in session <b><%= session.getId() %></b><br><br> + +<% + if (request.getUserPrincipal() != null) { +%> + Your user principal name is + <b><%= util.HTMLFilter.filter(request.getUserPrincipal().getName()) %></b> + <br><br> +<% + } else { +%> + No user principal could be identified.<br><br> +<% + } +%> + +<% + String role = request.getParameter("role"); + if (role == null) + role = ""; + if (role.length() > 0) { + if (request.isUserInRole(role)) { +%> + You have been granted role + <b><%= util.HTMLFilter.filter(role) %></b><br><br> +<% + } else { +%> + You have <i>not</i> been granted role + <b><%= util.HTMLFilter.filter(role) %></b><br><br> +<% + } + } +%> + +To check whether your user name has been granted a particular role, +enter it here: +<form method="GET" action='<%= response.encodeURL("index.jsp") %>'> +<input type="text" name="role" value="<%= util.HTMLFilter.filter(role) %>"> +<input type="submit" > +</form> +<br><br> + +If you have configured this application for form-based authentication, you can +log off by clicking +<a href='<%= response.encodeURL("index.jsp?logoff=true") %>'>here</a>. +This should cause you to be returned to the login page after the redirect +that is performed. + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/security/protected/index.jsp.html b/src/tomcat/webapps/examples/jsp/security/protected/index.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..cadf810cf888cb4b0b38eb06b0455dfca89a1a44 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/index.jsp.html @@ -0,0 +1,83 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<% + if (request.getParameter("logoff") != null) { + session.invalidate(); + response.sendRedirect("index.jsp"); + return; + } +%> +<html> +<head> +<title>Protected Page for Examples</title> +</head> +<body bgcolor="white"> + +You are logged in as remote user +<b><%= util.HTMLFilter.filter(request.getRemoteUser()) %></b> +in session <b><%= session.getId() %></b><br><br> + +<% + if (request.getUserPrincipal() != null) { +%> + Your user principal name is + <b><%= util.HTMLFilter.filter(request.getUserPrincipal().getName()) %></b> + <br><br> +<% + } else { +%> + No user principal could be identified.<br><br> +<% + } +%> + +<% + String role = request.getParameter("role"); + if (role == null) + role = ""; + if (role.length() > 0) { + if (request.isUserInRole(role)) { +%> + You have been granted role + <b><%= util.HTMLFilter.filter(role) %></b><br><br> +<% + } else { +%> + You have <i>not</i> been granted role + <b><%= util.HTMLFilter.filter(role) %></b><br><br> +<% + } + } +%> + +To check whether your user name has been granted a particular role, +enter it here: +<form method="GET" action='<%= response.encodeURL("index.jsp") %>'> +<input type="text" name="role" value="<%= util.HTMLFilter.filter(role) %>"> +<input type="submit" > +</form> +<br><br> + +If you have configured this application for form-based authentication, you can +log off by clicking +<a href='<%= response.encodeURL("index.jsp?logoff=true") %>'>here</a>. +This should cause you to be returned to the login page after the redirect +that is performed. + +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/security/protected/login.jsp b/src/tomcat/webapps/examples/jsp/security/protected/login.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e11a898c7dbfa8ca8ce4551a786fccf3ec08374c --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/login.jsp @@ -0,0 +1,38 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<head> +<title>Login Page for Examples</title> +<body bgcolor="white"> +<form method="POST" action='<%= response.encodeURL("j_security_check") %>' > + <table border="0" cellspacing="5"> + <tr> + <th align="right">Username:</th> + <td align="left"><input type="text" name="j_username"></td> + </tr> + <tr> + <th align="right">Password:</th> + <td align="left"><input type="password" name="j_password"></td> + </tr> + <tr> + <td align="right"><input type="submit" value="Log In"></td> + <td align="left"><input type="reset"></td> + </tr> + </table> +</form> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/security/protected/login.jsp.html b/src/tomcat/webapps/examples/jsp/security/protected/login.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..5726e3207fb217202658a8eb2efa5aa2df431217 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/security/protected/login.jsp.html @@ -0,0 +1,39 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<head> +<title>Login Page for Examples</title> +<body bgcolor="white"> +<form method="POST" action='<%= response.encodeURL("j_security_check") %>' > + <table border="0" cellspacing="5"> + <tr> + <th align="right">Username:</th> + <td align="left"><input type="text" name="j_username"></td> + </tr> + <tr> + <th align="right">Password:</th> + <td align="left"><input type="password" name="j_password"></td> + </tr> + <tr> + <td align="right"><input type="submit" value="Log In"></td> + <td align="left"><input type="reset"></td> + </tr> + </table> +</form> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/sessions/DummyCart.html b/src/tomcat/webapps/examples/jsp/sessions/DummyCart.html new file mode 100644 index 0000000000000000000000000000000000000000..d953fa9209762862c415d10d53337384ec0bb61b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/sessions/DummyCart.html @@ -0,0 +1,56 @@ +<HTML> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<HEAD> +<title> +sessions.DummyCart Bean Properties +</title> +<BODY BGCOLOR="white"> +<H2> +sessions.DummyCart Bean Properties +</H2> +<HR> +<DL> +<DT>public class <B>DummyCart</B><DT>extends Object</DL> + +<P> +<HR> + +<P> + +<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0"> +<TR BGCOLOR="#EEEEFF"> +<TD COLSPAN=3><FONT SIZE="+2"> +<B>Properties Summary</B></FONT></TD> +</TR> +<TR BGCOLOR="white"> +<td align="right" valign="top" width="1%"> +<FONT SIZE="-1"> +String +</FONT></TD> +<TD><B>DummyCart:items</B> +<BR> + </TD> +<td width="1%"> +<FONT SIZE="-1"> +Multi +</FONT></TD> +</TABLE> +<HR> +</BODY> +</HTML> diff --git a/src/tomcat/webapps/examples/jsp/sessions/carts.html b/src/tomcat/webapps/examples/jsp/sessions/carts.html new file mode 100644 index 0000000000000000000000000000000000000000..834ee0a594fd5b2c623a8adc0c5e3af304772a52 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/sessions/carts.html @@ -0,0 +1,53 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> + <title>carts</title> +</head> + + <body bgcolor="white"> +<font size = 5 color="#CC0000"> + +<form type=POST action=carts.jsp> +<BR> +Please enter item to add or remove: +<br> +Add Item: + +<SELECT NAME="item"> +<OPTION>Beavis & Butt-head Video collection +<OPTION>X-files movie +<OPTION>Twin peaks tapes +<OPTION>NIN CD +<OPTION>JSP Book +<OPTION>Concert tickets +<OPTION>Love life +<OPTION>Switch blade +<OPTION>Rex, Rugs & Rock n' Roll +</SELECT> + + +<br> <br> +<INPUT TYPE=submit name="submit" value="add"> +<INPUT TYPE=submit name="submit" value="remove"> + +</form> + +</FONT> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/sessions/carts.jsp b/src/tomcat/webapps/examples/jsp/sessions/carts.jsp new file mode 100644 index 0000000000000000000000000000000000000000..6fba47d9fb50d61e20371136c7aefa8ad350e5af --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/sessions/carts.jsp @@ -0,0 +1,43 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<jsp:useBean id="cart" scope="session" class="sessions.DummyCart" /> + +<jsp:setProperty name="cart" property="*" /> +<% + cart.processRequest(); +%> + + +<FONT size = 5 COLOR="#CC0000"> +<br> You have the following items in your cart: +<ol> +<% + String[] items = cart.getItems(); + for (int i=0; i<items.length; i++) { +%> +<li> <% out.print(util.HTMLFilter.filter(items[i])); %> +<% + } +%> +</ol> + +</FONT> + +<hr> +<%@ include file ="carts.html" %> +</html> diff --git a/src/tomcat/webapps/examples/jsp/sessions/carts.jsp.html b/src/tomcat/webapps/examples/jsp/sessions/carts.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..cb2325ffa4b90dbddb7738e4a7cf65cd24e713e6 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/sessions/carts.jsp.html @@ -0,0 +1,44 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<jsp:useBean id="cart" scope="session" class="sessions.DummyCart" /> + +<jsp:setProperty name="cart" property="*" /> +<% + cart.processRequest(); +%> + + +<FONT size = 5 COLOR="#CC0000"> +<br> You have the following items in your cart: +<ol> +<% + String[] items = cart.getItems(); + for (int i=0; i<items.length; i++) { +%> +<li> <% out.print(util.HTMLFilter.filter(items[i])); %> +<% + } +%> +</ol> + +</FONT> + +<hr> +<%@ include file ="carts.html" %> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/sessions/crt.html b/src/tomcat/webapps/examples/jsp/sessions/crt.html new file mode 100644 index 0000000000000000000000000000000000000000..11e6edafe0e9167a5f573763a888736cedb8310e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/sessions/crt.html @@ -0,0 +1,34 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="carts.html"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="carts.jsp.html">Source Code for Cart Example<font color="#0000FF"></a> + </font> </h3> + +<h3><a href="DummyCart.html">Property Sheet for DummyCart +<font color="#0000FF"></a> </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/simpletag/foo.html b/src/tomcat/webapps/examples/jsp/simpletag/foo.html new file mode 100644 index 0000000000000000000000000000000000000000..e20f840b7b9786e64c52c8fcfa33be70b1fd0a4b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/simpletag/foo.html @@ -0,0 +1,30 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="foo.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="foo.jsp.html">Source Code for the Simple Tag Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp b/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2489146033af4be8d36a1c46f032a10da35783a2 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp @@ -0,0 +1,38 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body> +<%@ taglib uri="http://tomcat.apache.org/example-taglib" prefix="eg"%> + +Radio stations that rock: + +<ul> +<eg:foo att1="98.5" att2="92.3" att3="107.7"> +<li><%= member %></li> +</eg:foo> +</ul> + +<eg:log> +Did you see me on the stderr window? +</eg:log> + +<eg:log toBrowser="true"> +Did you see me on the browser window as well? +</eg:log> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html b/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..02693c89c20f3486fac8ec552954c4d6541f013b --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/simpletag/foo.jsp.html @@ -0,0 +1,39 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body> +<%@ taglib uri="http://tomcat.apache.org/example-taglib" prefix="eg"%> + +Radio stations that rock: + +<ul> +<eg:foo att1="98.5" att2="92.3" att3="107.7"> +<li><%= member %></li> +</eg:foo> +</ul> + +<eg:log> +Did you see me on the stderr window? +</eg:log> + +<eg:log toBrowser="true"> +Did you see me on the browser window as well? +</eg:log> + +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/snp/snoop.html b/src/tomcat/webapps/examples/jsp/snp/snoop.html new file mode 100644 index 0000000000000000000000000000000000000000..e48355b4351d6064ce9e4d882653d8d299c197eb --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/snp/snoop.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="snoop.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="snoop.jsp.html">Source Code for Request Parameters Example<font color="#0000FF"> + </font></a></h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/snp/snoop.jsp b/src/tomcat/webapps/examples/jsp/snp/snoop.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9bb57a85f119ef20a77109f739470f9ccb5764ea --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/snp/snoop.jsp @@ -0,0 +1,56 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> +<h1> Request Information </h1> +<font size="4"> +JSP Request Method: <%= util.HTMLFilter.filter(request.getMethod()) %> +<br> +Request URI: <%= util.HTMLFilter.filter(request.getRequestURI()) %> +<br> +Request Protocol: <%= util.HTMLFilter.filter(request.getProtocol()) %> +<br> +Servlet path: <%= util.HTMLFilter.filter(request.getServletPath()) %> +<br> +Path info: <%= util.HTMLFilter.filter(request.getPathInfo()) %> +<br> +Query string: <%= util.HTMLFilter.filter(request.getQueryString()) %> +<br> +Content length: <%= request.getContentLength() %> +<br> +Content type: <%= util.HTMLFilter.filter(request.getContentType()) %> +<br> +Server name: <%= util.HTMLFilter.filter(request.getServerName()) %> +<br> +Server port: <%= request.getServerPort() %> +<br> +Remote user: <%= util.HTMLFilter.filter(request.getRemoteUser()) %> +<br> +Remote address: <%= util.HTMLFilter.filter(request.getRemoteAddr()) %> +<br> +Remote host: <%= util.HTMLFilter.filter(request.getRemoteHost()) %> +<br> +Authorization scheme: <%= util.HTMLFilter.filter(request.getAuthType()) %> +<br> +Locale: <%= request.getLocale() %> +<hr> +The browser you are using is +<%= util.HTMLFilter.filter(request.getHeader("User-Agent")) %> +<hr> +</font> +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/snp/snoop.jsp.html b/src/tomcat/webapps/examples/jsp/snp/snoop.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..00bf89b4954634dbc302e45634e872e21f035bdf --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/snp/snoop.jsp.html @@ -0,0 +1,57 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> +<body bgcolor="white"> +<h1> Request Information </h1> +<font size="4"> +JSP Request Method: <%= util.HTMLFilter.filter(request.getMethod()) %> +<br> +Request URI: <%= util.HTMLFilter.filter(request.getRequestURI()) %> +<br> +Request Protocol: <%= util.HTMLFilter.filter(request.getProtocol()) %> +<br> +Servlet path: <%= util.HTMLFilter.filter(request.getServletPath()) %> +<br> +Path info: <%= util.HTMLFilter.filter(request.getPathInfo()) %> +<br> +Query string: <%= util.HTMLFilter.filter(request.getQueryString()) %> +<br> +Content length: <%= request.getContentLength() %> +<br> +Content type: <%= util.HTMLFilter.filter(request.getContentType()) %> +<br> +Server name: <%= util.HTMLFilter.filter(request.getServerName()) %> +<br> +Server port: <%= request.getServerPort() %> +<br> +Remote user: <%= util.HTMLFilter.filter(request.getRemoteUser()) %> +<br> +Remote address: <%= util.HTMLFilter.filter(request.getRemoteAddr()) %> +<br> +Remote host: <%= util.HTMLFilter.filter(request.getRemoteHost()) %> +<br> +Authorization scheme: <%= util.HTMLFilter.filter(request.getAuthType()) %> +<br> +Locale: <%= request.getLocale() %> +<hr> +The browser you are using is +<%= util.HTMLFilter.filter(request.getHeader("User-Agent")) %> +<hr> +</font> +</body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/source.jsp b/src/tomcat/webapps/examples/jsp/source.jsp new file mode 100644 index 0000000000000000000000000000000000000000..fb75b588eb196f06c8e13c05d544ebf8dd71db55 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/source.jsp @@ -0,0 +1,20 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib uri="http://tomcat.apache.org/example-taglib" + prefix="eg" %> + +<eg:ShowSource jspFile="<%= util.HTMLFilter.filter(request.getQueryString()) %>"/> diff --git a/src/tomcat/webapps/examples/jsp/source.jsp.html b/src/tomcat/webapps/examples/jsp/source.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..66d5a2024f01c9cf501af16762cd3d63d3cf772e --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/source.jsp.html @@ -0,0 +1,21 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ taglib uri="http://tomcat.apache.org/example-taglib" + prefix="eg" %> + +<eg:ShowSource jspFile="<%= util.HTMLFilter.filter(request.getQueryString()) %>"/> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/choose.html b/src/tomcat/webapps/examples/jsp/tagplugin/choose.html new file mode 100644 index 0000000000000000000000000000000000000000..afe90b2f42ef319e870f2c2600e3eed1a90a714d --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/choose.html @@ -0,0 +1,36 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>View Source Code</title> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"> + <a href="choose.jsp"> + <img src="../images/execute.gif" align="right" border="0"></a> + <a href="../index.html"> + <img src="../images/return.gif" width="24" height="24" align="right" border="0"> + </a></font> +</p> + +<h3> + <a href="choose.jsp.html">Source Code for choose.jsp<font color="#0000FF"/></a> +</h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp b/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp new file mode 100644 index 0000000000000000000000000000000000000000..745e5f538d6cdb8b368f0a26cd297c239be78872 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp @@ -0,0 +1,54 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Examples - choose</title> + </head> + <body> + <h1>Tag Plugin Examples - <c:choose></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + <c:forEach var="index" begin="0" end="4"> + # ${index}: + <c:choose> + <c:when test="${index == 1}"> + One!<br/> + </c:when> + <c:when test="${index == 4}"> + Four!<br/> + </c:when> + <c:when test="${index == 3}"> + Three!<br/> + </c:when> + <c:otherwise> + Huh?<br/> + </c:otherwise> + </c:choose> + </c:forEach> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html b/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..3f3b7e43d4f2425b0afcefbef1f51247fcdd4c05 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/choose.jsp.html @@ -0,0 +1,55 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Examples - choose</title> + </head> + <body> + <h1>Tag Plugin Examples - &lt;c:choose></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + <c:forEach var="index" begin="0" end="4"> + # ${index}: + <c:choose> + <c:when test="${index == 1}"> + One!<br/> + </c:when> + <c:when test="${index == 4}"> + Four!<br/> + </c:when> + <c:when test="${index == 3}"> + Three!<br/> + </c:when> + <c:otherwise> + Huh?<br/> + </c:otherwise> + </c:choose> + </c:forEach> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/foreach.html b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.html new file mode 100644 index 0000000000000000000000000000000000000000..3d2e6082daa0a152f7985994728066b67c3a2a76 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.html @@ -0,0 +1,36 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>View Source Code</title> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"> + <a href="foreach.jsp"> + <img src="../images/execute.gif" align="right" border="0"></a> + <a href="../index.html"> + <img src="../images/return.gif" width="24" height="24" align="right" border="0"> + </a></font> +</p> + +<h3> + <a href="foreach.jsp.html">Source Code for foreach.jsp<font color="#0000FF"/></a> +</h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp new file mode 100644 index 0000000000000000000000000000000000000000..81621cc665e11f97a5a729cbde077b7e35f6d2e3 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp @@ -0,0 +1,54 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Plugin Examples: forEach</title> + </head> + <body> + <h1>Tag Plugin Examples - <c:forEach></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + <%@ page import="java.util.Vector" %> + + <h3>Iterating over a range</h3> + <c:forEach var="item" begin="1" end="10"> + ${item} + </c:forEach> + + <% Vector v = new Vector(); + v.add("One"); v.add("Two"); v.add("Three"); v.add("Four"); + + pageContext.setAttribute("vector", v); + %> + + <h3>Iterating over a Vector</h3> + + <c:forEach items="${vector}" var="item" > + ${item} + </c:forEach> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..de4eca916e3e7379ded8a4a28f5cef60a2374225 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/foreach.jsp.html @@ -0,0 +1,55 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Plugin Examples: forEach</title> + </head> + <body> + <h1>Tag Plugin Examples - &lt;c:forEach></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + <%@ page import="java.util.Vector" %> + + <h3>Iterating over a range</h3> + <c:forEach var="item" begin="1" end="10"> + ${item} + </c:forEach> + + <% Vector v = new Vector(); + v.add("One"); v.add("Two"); v.add("Three"); v.add("Four"); + + pageContext.setAttribute("vector", v); + %> + + <h3>Iterating over a Vector</h3> + + <c:forEach items="${vector}" var="item" > + ${item} + </c:forEach> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/howto.html b/src/tomcat/webapps/examples/jsp/tagplugin/howto.html new file mode 100644 index 0000000000000000000000000000000000000000..5f1d2234ab8e37f444f0bd04cd237e1da87a2c99 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/howto.html @@ -0,0 +1,45 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> + <head> + <title>Tag Plugin Implementation</title> + </head> + <body> + <h2>How to write tag plugins</h2> + <p> + To write a plugin, you'll need to download the source for Tomcat. + There are two steps: + <ol> + <li> + Implement the plugin class.<p/> + This class, which implements + <tt>org.apache.jasper.compiler.tagplugin.TagPlugin</tt> + instructs Jasper what Java codes to generate in place of the tag + handler calls. + See Javadoc for <tt>org.apache.jasper.compiler.tagplugin.TagPlugin</tt> + for details. + </li> + + <li> + Create the plugin descriptor file <tt> WEB-INF/tagPlugins.xml</tt><p/> + This file + specifies the plugin classes and their corresponding tag handler + classes. + </li> + </ol> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/if.html b/src/tomcat/webapps/examples/jsp/tagplugin/if.html new file mode 100644 index 0000000000000000000000000000000000000000..b04ac592b9bc8b0a5acb8fdef1785514df053ab8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/if.html @@ -0,0 +1,36 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>View Source Code</title> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"> + <a href="if.jsp"> + <img src="../images/execute.gif" align="right" border="0"></a> + <a href="../index.html"> + <img src="../images/return.gif" width="24" height="24" align="right" border="0"> + </a></font> +</p> + +<h3> + <a href="if.jsp.html">Source Code for if.jsp<font color="#0000FF"/></a> +</h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp b/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp new file mode 100644 index 0000000000000000000000000000000000000000..af627bf360340ed32f2ae861d0b437c81cff7366 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp @@ -0,0 +1,47 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Plugin Examples: if</title> + </head> + <body> + <h1>Tag Plugin Examples - <c:if></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + <h3>Set the test result to a variable</h3> + <c:if test="${1==1}" var="theTruth" scope="page"/> + The result of testing for (1==1) is: ${theTruth} + + <h3>Conditionally execute the body</h3> + <c:if test="${2>0}"> + <p>It's true that (2>0)! Working.</p> + </c:if> + <c:if test="${0>2}"> + <p>It's not true that (0>2)! Failed.</p> + </c:if> + </body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html b/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..ee126c3eb398adf26f2feb5444a60f6bcad53e78 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/if.jsp.html @@ -0,0 +1,48 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<html> + <head> + <title>Tag Plugin Examples: if</title> + </head> + <body> + <h1>Tag Plugin Examples - &lt;c:if></h1> + + <hr/> + <br/> + <a href="notes.html">Plugin Introductory Notes</a> + <br/> + <a href="howto.html">Brief Instructions for Writing Plugins</a> + <br/> <br/> + <hr/> + + <br/> + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + <h3>Set the test result to a variable</h3> + <c:if test="${1==1}" var="theTruth" scope="page"/> + The result of testing for (1==1) is: ${theTruth} + + <h3>Conditionally execute the body</h3> + <c:if test="${2>0}"> + <p>It's true that (2>0)! Working.</p> + </c:if> + <c:if test="${0>2}"> + <p>It's not true that (0>2)! Failed.</p> + </c:if> + </body> +</html> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/jsp/tagplugin/notes.html b/src/tomcat/webapps/examples/jsp/tagplugin/notes.html new file mode 100644 index 0000000000000000000000000000000000000000..cd326fc2df9befece4d9c46d7cb447f4067bf922 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/tagplugin/notes.html @@ -0,0 +1,41 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> + <head> + <title>Tag Plugin Introduction</title> + </head> + <body> + <h2>Tag Plugins: Introductory Notes</h2> + <p> + Tomcat provides a framework for implementing tag plugins. The + plugins instruct Jasper, at translation time, to replace tag handler + calls with Java scriptlets. + The framework allows tag library authors to implement plugins for + their tags. + </p> + <p> + Tomcat is released with plugins for several JSTL tags. Note + that these plugins work with JSTL 1.1 as well as JSTL 1.0, though + the examples uses JSTL 1.1 and JSP 2.0. + These plugins are not complete (for instance, some item types are not + handled in <c:if>). + They do serve as examples to show plugins in action (just + examine the generated Java files), and how they can be implemented. + </p> + </body> +</html> + diff --git a/src/tomcat/webapps/examples/jsp/xml/xml.html b/src/tomcat/webapps/examples/jsp/xml/xml.html new file mode 100644 index 0000000000000000000000000000000000000000..00121424e98be10f00ae9ba8b6188057238607b8 --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/xml/xml.html @@ -0,0 +1,31 @@ +<html> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="xml.jsp"><img src="../images/execute.gif" align="right" border="0"></a><a href="../index.html"><img src="../images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> + +<h3><a href="xml.jsp.html">Source Code for XML syntax Example<font color="#0000FF"></a> + </font> </h3> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/jsp/xml/xml.jsp b/src/tomcat/webapps/examples/jsp/xml/xml.jsp new file mode 100644 index 0000000000000000000000000000000000000000..840b21f3248ba3f7fe51a538b31e06cc0f07bcda --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/xml/xml.jsp @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" + version="1.2"> +<jsp:directive.page contentType="text/html"/> +<jsp:directive.page import="java.util.Date, java.util.Locale"/> +<jsp:directive.page import="java.text.*"/> + +<jsp:declaration> + String getDateTimeStr(Locale l) { + DateFormat df = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l); + return df.format(new Date()); + } +</jsp:declaration> + +<html> +<head> + <title>Example JSP in XML format</title> +</head> + +<body> +This is the output of a simple JSP using XML format. +<br /> + +<div>Use a jsp:scriptlet to loop from 1 to 10: </div> +<jsp:scriptlet> +// Note we need to declare CDATA because we don't escape the less than symbol +<![CDATA[ + for (int i = 1; i<=10; i++) { + out.println(i); + if (i < 10) { + out.println(", "); + } + } +]]> +</jsp:scriptlet> + +<!-- Because I omit br's end tag, declare it as CDATA --> +<![CDATA[ + <br><br> +]]> + +<div align="left"> + Use a jsp:expression to write the date and time in the browser's locale: + <jsp:expression>getDateTimeStr(request.getLocale())</jsp:expression> +</div> + + +<jsp:text> + <p>This sentence is enclosed in a jsp:text element.</p> +</jsp:text> + +</body> +</html> +</jsp:root> diff --git a/src/tomcat/webapps/examples/jsp/xml/xml.jsp.html b/src/tomcat/webapps/examples/jsp/xml/xml.jsp.html new file mode 100644 index 0000000000000000000000000000000000000000..b146a971021cdfb260f54d43dbe6cca8d9b1de1a --- /dev/null +++ b/src/tomcat/webapps/examples/jsp/xml/xml.jsp.html @@ -0,0 +1,71 @@ +<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Source Code</title></head><body><pre><?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" + version="1.2"> +<jsp:directive.page contentType="text/html"/> +<jsp:directive.page import="java.util.Date, java.util.Locale"/> +<jsp:directive.page import="java.text.*"/> + +<jsp:declaration> + String getDateTimeStr(Locale l) { + DateFormat df = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l); + return df.format(new Date()); + } +</jsp:declaration> + +<html> +<head> + <title>Example JSP in XML format</title> +</head> + +<body> +This is the output of a simple JSP using XML format. +<br /> + +<div>Use a jsp:scriptlet to loop from 1 to 10: </div> +<jsp:scriptlet> +// Note we need to declare CDATA because we don't escape the less than symbol +<![CDATA[ + for (int i = 1; i<=10; i++) { + out.println(i); + if (i < 10) { + out.println(", "); + } + } +]]> +</jsp:scriptlet> + +<!-- Because I omit br's end tag, declare it as CDATA --> +<![CDATA[ + <br><br> +]]> + +<div align="left"> + Use a jsp:expression to write the date and time in the browser's locale: + <jsp:expression>getDateTimeStr(request.getLocale())</jsp:expression> +</div> + + +<jsp:text> + &lt;p&gt;This sentence is enclosed in a jsp:text element.&lt;/p&gt; +</jsp:text> + +</body> +</html> +</jsp:root> +</pre></body></html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/servlets/cookies.html b/src/tomcat/webapps/examples/servlets/cookies.html new file mode 100644 index 0000000000000000000000000000000000000000..bacee44dbac72ad64e689eb26081a1f8946b86cf --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/cookies.html @@ -0,0 +1,61 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/CookieExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for Cookie Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> CookieExample <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + + <font color="#CC0000">// print out cookies</font> + + Cookie[] cookies = request.getCookies(); + for (int i = 0; i < cookies.length; i++) { + Cookie c = cookies[i]; + String name = c.getName(); + String value = c.getValue(); + out.println(name + "<font color="#009900"> = </font>" + value); + } + + <font color="#CC0000">// set a cookie</font> + + String name = request.getParameter("<font color="#009900">cookieName</font>"); + if (name != null && name.length() > 0) { + String value = request.getParameter("<font color="#009900">cookieValue</font>"); + Cookie c = new Cookie(name, value); + response.addCookie(c); + } + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/helloworld.html b/src/tomcat/webapps/examples/servlets/helloworld.html new file mode 100644 index 0000000000000000000000000000000000000000..c2234467b9f1796363b639b72cbe28664754523a --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/helloworld.html @@ -0,0 +1,50 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/HelloWorldExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for HelloWorld Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> HelloWorld <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + out.println("<font color="#009900"><html></font>"); + out.println("<font color="#009900"><head></font>"); + out.println("<font color="#009900"><title>Hello World!</title></font>"); + out.println("<font color="#009900"></head></font>"); + out.println("<font color="#009900"><body></font>"); + out.println("<font color="#009900"><h1>Hello World!</h1></font>"); + out.println("<font color="#009900"></body></font>"); + out.println("<font color="#009900"></html></font>"); + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/images/code.gif b/src/tomcat/webapps/examples/servlets/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..93af2cd130aa61cb2f235cdd6f0e75ab444819ef Binary files /dev/null and b/src/tomcat/webapps/examples/servlets/images/code.gif differ diff --git a/src/tomcat/webapps/examples/servlets/images/execute.gif b/src/tomcat/webapps/examples/servlets/images/execute.gif new file mode 100644 index 0000000000000000000000000000000000000000..f64d70fd233d6fb3fcbdeedc02061871984f8fb5 Binary files /dev/null and b/src/tomcat/webapps/examples/servlets/images/execute.gif differ diff --git a/src/tomcat/webapps/examples/servlets/images/return.gif b/src/tomcat/webapps/examples/servlets/images/return.gif new file mode 100644 index 0000000000000000000000000000000000000000..af4f68f4a3a13e0ef1dc0045b04c2c93354cdf40 Binary files /dev/null and b/src/tomcat/webapps/examples/servlets/images/return.gif differ diff --git a/src/tomcat/webapps/examples/servlets/index.html b/src/tomcat/webapps/examples/servlets/index.html new file mode 100644 index 0000000000000000000000000000000000000000..d07a277e9c85bf62d01fde644c04ce24bafab224 --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/index.html @@ -0,0 +1,193 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!DOCTYPE html><html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="Author" content="Anil K. Vijendran" /> + <title>Servlet Examples</title> + <style type="text/css"> + img { border: 0; } + th { text-align: left; } + tr { vertical-align: top; } + </style> +</head> +<body> +<h1>Servlet +Examples with Code</h1> +<p>This is a collection of examples which demonstrate some of the more +frequently used parts of the Servlet API. Familiarity with the Java(tm) +Programming Language is assumed. +<p>These examples will only work when viewed via an http URL. They will +not work if you are viewing these pages via a "file://..." URL. Please +refer to the <i>README</i> file provide with this Tomcat release regarding +how to configure and start the provided web server. +<p>Wherever you see a form, enter some data and see how the servlet reacts. +When playing with the Cookie and Session Examples, jump back to the Headers +Example to see exactly what your browser is sending the server. +<p>To navigate your way through the examples, the following icons will +help:</p> +<ul style="list-style-type: none; padding-left: 0;"> +<li><img src="images/execute.gif" alt=""> Execute the example</li> +<li><img src="images/code.gif" alt=""> Look at the source code for the example</li> +<li><img src="images/return.gif" alt=""> Return to this screen</li> +</ul> + +<p>Tip: To see the cookie interactions with your browser, try turning on +the "notify when setting a cookie" option in your browser preferences. +This will let you see when a session is created and give some feedback +when looking at the cookie demo.</p> +<table style="width: 85%;" > +<tr> +<td>Hello World</td> + +<td style="width: 30%;"><a href="servlet/HelloWorldExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/HelloWorldExample">Execute</a></td> + +<td style="width: 30%;"><a href="helloworld.html"><img SRC="images/code.gif" alt=""></a><a href="helloworld.html">Source</a></td> +</tr> + +<tr> +<td>Request Info</td> + +<td style="width: 30%;"><a href="servlet/RequestInfoExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestInfoExample">Execute</a></td> + +<td style="width: 30%;"><a href="reqinfo.html"><img SRC="images/code.gif" alt=""></a><a href="reqinfo.html">Source</a></td> +</tr> + +<tr> +<td>Request Headers</td> + +<td style="width: 30%;"><a href="servlet/RequestHeaderExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestHeaderExample">Execute</a></td> + +<td style="width: 30%;"><a href="reqheaders.html"><img SRC="images/code.gif" alt=""></a><a href="reqheaders.html">Source</a></td> +</tr> + +<tr> +<td>Request Parameters</td> + +<td style="width: 30%;"><a href="servlet/RequestParamExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/RequestParamExample">Execute</a></td> + +<td style="width: 30%;"><a href="reqparams.html"><img SRC="images/code.gif" alt=""></a><a href="reqparams.html">Source</a></td> +</tr> + +<tr> +<td>Cookies</td> + +<td style="width: 30%;"><a href="servlet/CookieExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/CookieExample">Execute</a></td> + +<td style="width: 30%;"><a href="cookies.html"><img SRC="images/code.gif" alt=""></a><a href="cookies.html">Source</a></td> +</tr> + +<tr> +<td>Sessions</td> + +<td style="width: 30%;"><a href="servlet/SessionExample"><img SRC="images/execute.gif" alt=""></a><a href="servlet/SessionExample">Execute</a></td> + +<td style="width: 30%;"><a href="sessions.html"><img SRC="images/code.gif" alt=""></a><a href="sessions.html">Source</a></td> +</tr> +</table> + +<p>Note: The source code for these examples does not contain all of the +source code that is actually in the example, only the important sections +of code. Code not important to understand the example has been removed +for clarity.</p> + +<h2>Other Examples</h2> +<table style="width: 85%;" > + +<tr> + <th colspan="3">Servlet 3.0 Asynchronous processing examples:</th> +</tr> +<tr> + <td>async0</td> + <td style="width: 30%;"> + <a href="../async/async0"><img SRC="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td>async1</td> + <td style="width: 30%;"> + <a href="../async/async1"><img SRC="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td>async2</td> + <td style="width: 30%;"> + <a href="../async/async2"><img SRC="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td>async3</td> + <td style="width: 30%;"> + <a href="../async/async3"><img SRC="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td>stockticker</td> + <td style="width: 30%;"> + <a href="../async/stockticker"><img SRC="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> + +<tr> + <th colspan="3">Servlet 3.1 Non-blocking IO examples</th> +</tr> +<tr> + <td>Byte counter</td> + <td style="width: 30%;"> + <a href="nonblocking/bytecounter.html"><img src="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> +<tr> + <td>Number Writer</td> + <td style="width: 30%;"> + <a href="nonblocking/numberwriter"><img src="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> + +<tr> + <th colspan="3">Servlet 4.0 Server Push examples</th> +</tr> +<tr> + <td>Simple image push</td> + <td style="width: 30%;"> + <a href="serverpush/simpleimage"><img src="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> + +<tr> + <th colspan="3">Servlet 4.0 Trailer Field examples</th> +</tr> +<tr> + <td>Response trailer fields</td> + <td style="width: 30%;"> + <a href="trailers/response"><img src="images/execute.gif" alt=""> Execute</a> + </td> + <td style="width: 30%;"></td> +</tr> + +</table> + +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html b/src/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html new file mode 100644 index 0000000000000000000000000000000000000000..55d31a21380e172f4a930206b82933fb95891514 --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/nonblocking/bytecounter.html @@ -0,0 +1,32 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> + <head> + <title>Servlet 3.1 non-blocking IO examples: Byte counter</title> + </head> + <body> + <h1>Byte counter</h1> + <p>Select a file and/or enter some data using the form below and then submit + it. The server will read the request body using non-blocking IO and then + respond with the total length of the request body in bytes.</p> + <form method="POST" enctype="multipart/form-data" action="bytecounter" > + <p><textarea name="data" rows="5" cols="60" ></textarea></p> + <p><input name="source" type="file" /></p> + <p><input type="submit" value="Submit" /></p> + </form> + </body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/servlets/reqheaders.html b/src/tomcat/webapps/examples/servlets/reqheaders.html new file mode 100644 index 0000000000000000000000000000000000000000..adda30cefa9460195d7e567c4cdfe0fc0e13fb9c --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/reqheaders.html @@ -0,0 +1,49 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/RequestHeaderExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for RequestHeader Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> java.util.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> RequestHeaderExample <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + Enumeration e = request.getHeaderNames(); + while (e.hasMoreElements()) { + String name = (String)e.nextElement(); + String value = request.getHeader(name); + out.println(name + "<font color="#009900"> = </font>" + value); + } + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/reqinfo.html b/src/tomcat/webapps/examples/servlets/reqinfo.html new file mode 100644 index 0000000000000000000000000000000000000000..daf239c181ef4d1fa7091f963536284148efea85 --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/reqinfo.html @@ -0,0 +1,68 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/RequestInfoExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for Request Info Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> RequestInfo <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + out.println("<font color="#009900"><html></font>"); + out.println("<font color="#009900"><body></font>"); + out.println("<font color="#009900"><head></font>"); + out.println("<font color="#009900"><title>Request Information Example</title></font>"); + out.println("<font color="#009900"></head></font>"); + out.println("<font color="#009900"><body></font>"); + out.println("<font color="#009900"><h3>Request Information Example</h3></font>"); + out.println("<font color="#009900">Method: </font>" + request.getMethod()); + out.println("<font color="#009900">Request URI: </font>" + request.getRequestURI()); + out.println("<font color="#009900">Protocol: </font>" + request.getProtocol()); + out.println("<font color="#009900">PathInfo: </font>" + request.getPathInfo()); + out.println("<font color="#009900">Remote Address: </font>" + request.getRemoteAddr()); + out.println("<font color="#009900"></body></font>"); + out.println("<font color="#009900"></html></font>"); + } + +<font color="#FF0000"> /** + * We are going to perform the same operations for POST requests + * as for GET methods, so this method just sends the request to + * the doGet method. + */</font> + + <font color="#0000FF">public void</font> doPost(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + doGet(request, response); + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/reqparams.html b/src/tomcat/webapps/examples/servlets/reqparams.html new file mode 100644 index 0000000000000000000000000000000000000000..7128e39e4da7d0b1b3d03e4d8f79200fff3a9a3c --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/reqparams.html @@ -0,0 +1,78 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/RequestParamExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for Request Parameter Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> java.util.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> RequestParamExample <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + out.println("<font color="#009900"><html></font>"); + out.println("<font color="#009900"><head></font>"); + out.println("<font color="#009900"><title>Request Parameters Example</title></font>"); + out.println("<font color="#009900"></head></font>"); + out.println("<font color="#009900"><body></font>"); + out.println("<font color="#009900"><h3>Request Parameters Example</h3></font>"); + out.println("<font color="#009900">Parameters in this request:<br></font>"); + if (firstName != null || lastName != null) { + out.println("<font color="#009900">First Name:</font>"); + out.println("<font color="#009900"> = </font>" + HTMLFilter.filter(firstName) + "<font color="#009900"><br></font>"); + out.println("<font color="#009900">Last Name:</font>"); + out.println("<font color="#009900"> = </font>" + HTMLFilter.filter(lastName)); + } else { + out.println("<font color="#009900">No Parameters, Please enter some</font>"); + } + out.println("<font color="#009900"><P></font>"); + out.print("<font color="#009900"><form action=\"</font>"); + out.print("<font color="#009900">RequestParamExample\" </font>"); + out.println("<font color="#009900">method=POST></font>"); + out.println("<font color="#009900">First Name:</font>"); + out.println("<font color="#009900"><input type=text size=20 name=firstname></font>"); + out.println("<font color="#009900"><br></font>"); + out.println("<font color="#009900">Last Name:</font>"); + out.println("<font color="#009900"><input type=text size=20 name=lastname></font>"); + out.println("<font color="#009900"><br></font>"); + out.println("<font color="#009900"><input type=submit></font>"); + out.println("<font color="#009900"></form></font>"); + out.println("<font color="#009900"></body></font>"); + out.println("<font color="#009900"></html></font>"); + } + + <font color="#0000FF">public void</font> doPost(HttpServletRequest request, HttpServletResponse res) + <font color="#0000FF">throws</font> IOException, ServletException + { + doGet(request, response); + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/servlets/sessions.html b/src/tomcat/webapps/examples/servlets/sessions.html new file mode 100644 index 0000000000000000000000000000000000000000..99816c22e6e44654c1495c5d76a3ea88560e2f5c --- /dev/null +++ b/src/tomcat/webapps/examples/servlets/sessions.html @@ -0,0 +1,70 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +</head> + +<body bgcolor="#FFFFFF"> +<p><font color="#0000FF"><a href="servlet/SessionExample"><img src="images/execute.gif" align="right" border="0"></a><a href="index.html"><img src="images/return.gif" width="24" height="24" align="right" border="0"></a></font></p> +<h3>Source Code for Session Example<font color="#0000FF"><br> + </font> </h3> +<font color="#0000FF"></font> +<pre><font color="#0000FF">import</font> java.io.*; +<font color="#0000FF">import</font> java.util.*; +<font color="#0000FF">import</font> javax.servlet.*; +<font color="#0000FF">import</font> javax.servlet.http.*; + +<font color="#0000FF">public class</font> SessionExample <font color="#0000FF">extends</font> HttpServlet { + + <font color="#0000FF">public void</font> doGet(HttpServletRequest request, HttpServletResponse response) + <font color="#0000FF">throws</font> IOException, ServletException + { + response.setContentType("<font color="#009900">text/html</font>"); + PrintWriter out = response.getWriter(); + + HttpSession session = request.getSession(true); + + <font color="#CC0000">// print session info</font> + + Date created = new Date(session.getCreationTime()); + Date accessed = new Date(session.getLastAccessedTime()); + out.println("<font color="#009900">ID </font>" + session.getId()); + out.println("<font color="#009900">Created: </font>" + created); + out.println("<font color="#009900">Last Accessed: </font>" + accessed); + + <font color="#CC0000">// set session info if needed</font> + + String dataName = request.getParameter("<font color="#009900">dataName</font>"); + if (dataName != null && dataName.length() > 0) { + String dataValue = request.getParameter("<font color="#009900">dataValue</font>"); + session.setAttribute(dataName, dataValue); + } + + // print session contents + + Enumeration e = session.getAttributeNames(); + while (e.hasMoreElements()) { + String name = (String)e.nextElement(); + String value = session.getAttribute(name).toString(); + out.println(name + " <font color="#009900">= </font>" + value); + } + } +}</pre> +</body> +</html> diff --git a/src/tomcat/webapps/examples/websocket/chat.xhtml b/src/tomcat/webapps/examples/websocket/chat.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..fca748ca98c4c60d8cdbb8f9fbf2d20e91f030ff --- /dev/null +++ b/src/tomcat/webapps/examples/websocket/chat.xhtml @@ -0,0 +1,136 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <title>Apache Tomcat WebSocket Examples: Chat</title> + <style type="text/css"><![CDATA[ + input#chat { + width: 410px + } + + #console-container { + width: 400px; + } + + #console { + border: 1px solid #CCCCCC; + border-right-color: #999999; + border-bottom-color: #999999; + height: 170px; + overflow-y: scroll; + padding: 5px; + width: 100%; + } + + #console p { + padding: 0; + margin: 0; + } + ]]></style> + <script type="application/javascript"><![CDATA[ + "use strict"; + + var Chat = {}; + + Chat.socket = null; + + Chat.connect = (function(host) { + if ('WebSocket' in window) { + Chat.socket = new WebSocket(host); + } else if ('MozWebSocket' in window) { + Chat.socket = new MozWebSocket(host); + } else { + Console.log('Error: WebSocket is not supported by this browser.'); + return; + } + + Chat.socket.onopen = function () { + Console.log('Info: WebSocket connection opened.'); + document.getElementById('chat').onkeydown = function(event) { + if (event.keyCode == 13) { + Chat.sendMessage(); + } + }; + }; + + Chat.socket.onclose = function () { + document.getElementById('chat').onkeydown = null; + Console.log('Info: WebSocket closed.'); + }; + + Chat.socket.onmessage = function (message) { + Console.log(message.data); + }; + }); + + Chat.initialize = function() { + if (window.location.protocol == 'http:') { + Chat.connect('ws://' + window.location.host + '/examples/websocket/chat'); + } else { + Chat.connect('wss://' + window.location.host + '/examples/websocket/chat'); + } + }; + + Chat.sendMessage = (function() { + var message = document.getElementById('chat').value; + if (message != '') { + Chat.socket.send(message); + document.getElementById('chat').value = ''; + } + }); + + var Console = {}; + + Console.log = (function(message) { + var console = document.getElementById('console'); + var p = document.createElement('p'); + p.style.wordWrap = 'break-word'; + p.innerHTML = message; + console.appendChild(p); + while (console.childNodes.length > 25) { + console.removeChild(console.firstChild); + } + console.scrollTop = console.scrollHeight; + }); + + Chat.initialize(); + + + document.addEventListener("DOMContentLoaded", function() { + // Remove elements with "noscript" class - <noscript> is not allowed in XHTML + var noscripts = document.getElementsByClassName("noscript"); + for (var i = 0; i < noscripts.length; i++) { + noscripts[i].parentNode.removeChild(noscripts[i]); + } + }, false); + + ]]></script> +</head> +<body> +<div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable + Javascript and reload this page!</h2></div> +<div> + <p> + <input type="text" placeholder="type and press enter to chat" id="chat" /> + </p> + <div id="console-container"> + <div id="console"/> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/websocket/drawboard.xhtml b/src/tomcat/webapps/examples/websocket/drawboard.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..ff63366484cf386e9cc4d024b56e85685d9af936 --- /dev/null +++ b/src/tomcat/webapps/examples/websocket/drawboard.xhtml @@ -0,0 +1,899 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <title>Apache Tomcat WebSocket Examples: Drawboard</title> + <style type="text/css"><![CDATA[ + + body { + font-family: Arial, sans-serif; + font-size: 11pt; + background-color: #eeeeea; + padding: 10px; + } + + #console-container { + float: left; + background-color: #fff; + width: 250px; + } + + #console { + font-size: 10pt; + height: 600px; + overflow-y: scroll; + padding-left: 5px; + padding-right: 5px; + } + + #console p { + padding: 0; + margin: 0; + } + + #drawContainer { + float: left; + display: none; + margin-right: 25px; + } + + #drawContainer canvas { + display: block; + -ms-touch-action: none; + touch-action: none; /* Disable touch behaviors, like pan and zoom */ + cursor: crosshair; + } + + #labelContainer { + margin-bottom: 15px; + } + + #drawContainer, #console-container { + box-shadow: 0px 0px 8px 3px #bbb; + border: 1px solid #CCCCCC; + } + + ]]></style> + <script type="application/javascript"><![CDATA[ + "use strict"; + + (function() { + + document.addEventListener("DOMContentLoaded", function() { + // Remove elements with "noscript" class - <noscript> is not + // allowed in XHTML + var noscripts = document.getElementsByClassName("noscript"); + for (var i = 0; i < noscripts.length; i++) { + noscripts[i].parentNode.removeChild(noscripts[i]); + } + + // Add script for expand content. + var expandElements = document.getElementsByClassName("expand"); + for (var ixx = 0; ixx < expandElements.length; ixx++) { + (function(el) { + var expandContent = document.getElementById(el.getAttribute("data-content-id")); + expandContent.style.display = "none"; + var arrow = document.createTextNode("â—¢ "); + var arrowSpan = document.createElement("span"); + arrowSpan.appendChild(arrow); + + var link = document.createElement("a"); + link.setAttribute("href", "#!"); + while (el.firstChild != null) { + link.appendChild(el.removeChild(el.firstChild)); + } + el.appendChild(arrowSpan); + el.appendChild(link); + + var textSpan = document.createElement("span"); + textSpan.setAttribute("style", "font-weight: normal;"); + textSpan.appendChild(document.createTextNode(" (click to expand)")); + el.appendChild(textSpan); + + + var visible = true; + + var switchExpand = function() { + visible = !visible; + expandContent.style.display = visible ? "block" : "none"; + arrowSpan.style.color = visible ? "#000" : "#888"; + return false; + }; + + link.onclick = switchExpand; + switchExpand(); + + })(expandElements[ixx]); + } + + + var Console = {}; + + Console.log = (function() { + var consoleContainer = + document.getElementById("console-container"); + var console = document.createElement("div"); + console.setAttribute("id", "console"); + consoleContainer.appendChild(console); + + return function(message) { + var p = document.createElement('p'); + p.style.wordWrap = "break-word"; + p.appendChild(document.createTextNode(message)); + console.appendChild(p); + while (console.childNodes.length > 25) { + console.removeChild(console.firstChild); + } + console.scrollTop = console.scrollHeight; + } + })(); + + + function Room(drawContainer) { + + /* A pausable event forwarder that can be used to pause and + * resume handling of events (e.g. when we need to wait + * for a Image's load event before we can process further + * WebSocket messages). + * The object's callFunction(func) should be called from an + * event handler and give the function to handle the event as + * argument. + * Call pauseProcessing() to suspend event forwarding and + * resumeProcessing() to resume it. + */ + function PausableEventForwarder() { + + var pauseProcessing = false; + // Queue for buffering functions to be called. + var functionQueue = []; + + this.callFunction = function(func) { + // If message processing is paused, we push it + // into the queue - otherwise we process it directly. + if (pauseProcessing) { + functionQueue.push(func); + } else { + func(); + } + }; + + this.pauseProcessing = function() { + pauseProcessing = true; + }; + + this.resumeProcessing = function() { + pauseProcessing = false; + + // Process all queued functions until some handler calls + // pauseProcessing() again. + while (functionQueue.length > 0 && !pauseProcessing) { + var func = functionQueue.pop(); + func(); + } + }; + } + + // The WebSocket object. + var socket; + // ID of the timer which sends ping messages. + var pingTimerId; + + var isStarted = false; + var playerCount = 0; + + // An array of PathIdContainer objects that the server + // did not yet handle. + // They are ordered by id (ascending). + var pathsNotHandled = []; + + var nextMsgId = 1; + + var canvasDisplay = document.createElement("canvas"); + var canvasBackground = document.createElement("canvas"); + var canvasServerImage = document.createElement("canvas"); + var canvasArray = [canvasDisplay, canvasBackground, + canvasServerImage]; + canvasDisplay.addEventListener("mousedown", function(e) { + // Prevent default mouse event to prevent browsers from marking text + // (and Chrome from displaying the "text" cursor). + e.preventDefault(); + }, false); + + var labelPlayerCount = document.createTextNode("0"); + var optionContainer = document.createElement("div"); + + + var canvasDisplayCtx = canvasDisplay.getContext("2d"); + var canvasBackgroundCtx = canvasBackground.getContext("2d"); + var canvasServerImageCtx = canvasServerImage.getContext("2d"); + var canvasMouseMoveHandler; + var canvasMouseDownHandler; + + var isActive = false; + var mouseInWindow = false; + var mouseDown = false; + var currentMouseX = 0, currentMouseY = 0; + var currentPreviewPath = null; + + var availableColors = []; + var currentColorIndex; + var colorContainers; + var previewTransparency = 0.65; + + var availableThicknesses = [2, 3, 6, 10, 16, 28, 50]; + var currentThicknessIndex; + var thicknessContainers; + + var availableDrawTypes = [ + { name: "Brush", id: 1, continuous: true }, + { name: "Line", id: 2, continuous: false }, + { name: "Rectangle", id: 3, continuous: false }, + { name: "Ellipse", id: 4, continuous: false } + ]; + var currentDrawTypeIndex; + var drawTypeContainers; + + + var labelContainer = document.getElementById("labelContainer"); + var placeholder = document.createElement("div"); + placeholder.appendChild(document.createTextNode("Loading... ")); + var progressElem = document.createElement("progress"); + placeholder.appendChild(progressElem); + + labelContainer.appendChild(placeholder); + + function rgb(color) { + return "rgba(" + color[0] + "," + color[1] + "," + + color[2] + "," + color[3] + ")"; + } + + function PathIdContainer(path, id) { + this.path = path; + this.id = id; + } + + function Path(type, color, thickness, x1, y1, x2, y2) { + this.type = type; + this.color = color; + this.thickness = thickness; + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + + function ellipse(ctx, x, y, w, h) { + /* Drawing a ellipse cannot be done directly in a + * CanvasRenderingContext2D - we need to use drawArc() + * in conjunction with scaling the context so that we + * get the needed proportion. + */ + ctx.save(); + + // Translate and scale the context so that we can draw + // an arc at (0, 0) with a radius of 1. + ctx.translate(x + w / 2, y + h / 2); + ctx.scale(w / 2, h / 2); + + ctx.beginPath(); + ctx.arc(0, 0, 1, 0, Math.PI * 2, false); + + ctx.restore(); + } + + this.draw = function(ctx) { + ctx.beginPath(); + ctx.lineCap = "round"; + ctx.lineWidth = thickness; + var style = rgb(color); + ctx.strokeStyle = style; + + if (x1 == x2 && y1 == y2) { + // Always draw as arc to meet the behavior + // in Java2D. + ctx.fillStyle = style; + ctx.arc(x1, y1, thickness / 2.0, 0, + Math.PI * 2.0, false); + ctx.fill(); + } else { + if (type == 1 || type == 2) { + // Draw a line. + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } else if (type == 3) { + // Draw a rectangle. + if (x1 == x2 || y1 == y2) { + // Draw as line + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } else { + ctx.strokeRect(x1, y1, x2 - x1, y2 - y1); + } + } else if (type == 4) { + // Draw a ellipse. + ellipse(ctx, x1, y1, x2 - x1, y2 - y1); + ctx.closePath(); + ctx.stroke(); + } + } + }; + } + + + function connect() { + var host = (window.location.protocol == "https:" + ? "wss://" : "ws://") + window.location.host + + "/examples/websocket/drawboard"; + socket = new WebSocket(host); + + /* Use a pausable event forwarder. + * This is needed when we load an Image object with data + * from a previous message, because we must wait until the + * Image's load event it raised before we can use it (and + * in the meantime the socket.message event could be + * raised). + * Therefore we need this pausable event handler to handle + * e.g. socket.onmessage and socket.onclose. + */ + var eventForwarder = new PausableEventForwarder(); + + socket.onopen = function () { + // Socket has opened. Now wait for the server to + // send us the initial packet. + Console.log("WebSocket connection opened."); + + // Set up a timer for pong messages. + pingTimerId = window.setInterval(function() { + socket.send("0"); + }, 30000); + }; + + socket.onclose = function () { + eventForwarder.callFunction(function() { + Console.log("WebSocket connection closed."); + disableControls(); + + // Disable pong timer. + window.clearInterval(pingTimerId); + }); + }; + + // Handles an incoming Websocket message. + var handleOnMessage = function(message) { + + // Split joined message and process them + // individually. + var messages = message.data.split(";"); + for (var msgArrIdx = 0; msgArrIdx < messages.length; + msgArrIdx++) { + var msg = messages[msgArrIdx]; + var type = msg.substring(0, 1); + + if (type == "0") { + // Error message. + var error = msg.substring(1); + // Log it to the console and show an alert. + Console.log("Error: " + error); + alert(error); + + } else { + if (!isStarted) { + if (type == "2") { + // Initial message. It contains the + // number of players. + // After this message we will receive + // a binary message containing the current + // room image as PNG. + playerCount = parseInt(msg.substring(1)); + + refreshPlayerCount(); + + // The next message will be a binary + // message containing the room images + // as PNG. Therefore we temporarily swap + // the message handler. + var originalHandler = handleOnMessage; + handleOnMessage = function(message) { + // First, we restore the original handler. + handleOnMessage = originalHandler; + + // Read the image. + var blob = message.data; + // Create new blob with correct MIME type. + blob = new Blob([blob], {type : "image/png"}); + + var url = URL.createObjectURL(blob); + + var img = new Image(); + + // We must wait until the onload event is + // raised until we can draw the image onto + // the canvas. + // Therefore we need to pause the event + // forwarder until the image is loaded. + eventForwarder.pauseProcessing(); + + img.onload = function() { + + // Release the object URL. + URL.revokeObjectURL(url); + + // Set the canvases to the correct size. + for (var i = 0; i < canvasArray.length; i++) { + canvasArray[i].width = img.width; + canvasArray[i].height = img.height; + } + + // Now draw the image on the last canvas. + canvasServerImageCtx.clearRect(0, 0, + canvasServerImage.width, + canvasServerImage.height); + canvasServerImageCtx.drawImage(img, 0, 0); + + // Draw it on the background canvas. + canvasBackgroundCtx.drawImage(canvasServerImage, + 0, 0); + + isStarted = true; + startControls(); + + // Refresh the display canvas. + refreshDisplayCanvas(); + + + // Finally, resume the event forwarder. + eventForwarder.resumeProcessing(); + }; + + img.src = url; + }; + } + } else { + if (type == "3") { + // The number of players in this room changed. + var playerAdded = msg.substring(1) == "+"; + playerCount += playerAdded ? 1 : -1; + refreshPlayerCount(); + + Console.log("Player " + (playerAdded + ? "joined." : "left.")); + + } else if (type == "1") { + // We received a new DrawMessage. + var maxLastHandledId = -1; + var drawMessages = msg.substring(1).split("|"); + for (var i = 0; i < drawMessages.length; i++) { + var elements = drawMessages[i].split(","); + var lastHandledId = parseInt(elements[0]); + maxLastHandledId = Math.max(maxLastHandledId, + lastHandledId); + + var path = new Path( + parseInt(elements[1]), + [parseInt(elements[2]), + parseInt(elements[3]), + parseInt(elements[4]), + parseInt(elements[5]) / 255.0], + parseFloat(elements[6]), + parseFloat(elements[7]), + parseFloat(elements[8]), + parseFloat(elements[9]), + parseFloat(elements[10])); + + // Draw the path onto the last canvas. + path.draw(canvasServerImageCtx); + } + + // Draw the last canvas onto the background one. + canvasBackgroundCtx.drawImage(canvasServerImage, + 0, 0); + + // Now go through the pathsNotHandled array and + // remove the paths that were already handled by + // the server. + while (pathsNotHandled.length > 0 + && pathsNotHandled[0].id <= maxLastHandledId) + pathsNotHandled.shift(); + + // Now me must draw the remaining paths onto + // the background canvas. + for (var i = 0; i < pathsNotHandled.length; i++) { + pathsNotHandled[i].path.draw(canvasBackgroundCtx); + } + + refreshDisplayCanvas(); + } + } + } + } + }; + + socket.onmessage = function(message) { + eventForwarder.callFunction(function() { + handleOnMessage(message); + }); + }; + + } + + + function refreshPlayerCount() { + labelPlayerCount.nodeValue = String(playerCount); + } + + function refreshDisplayCanvas() { + if (!isActive) { // Don't draw a curser when not active. + return; + } + + canvasDisplayCtx.drawImage(canvasBackground, 0, 0); + if (currentPreviewPath != null) { + // Draw the preview path. + currentPreviewPath.draw(canvasDisplayCtx); + + } else if (mouseInWindow && !mouseDown) { + canvasDisplayCtx.beginPath(); + var color = availableColors[currentColorIndex].slice(0); + color[3] = previewTransparency; + canvasDisplayCtx.fillStyle = rgb(color); + + canvasDisplayCtx.arc(currentMouseX, currentMouseY, + availableThicknesses[currentThicknessIndex] / 2, + 0, Math.PI * 2.0, true); + canvasDisplayCtx.fill(); + } + + } + + function startControls() { + isActive = true; + + labelContainer.removeChild(placeholder); + placeholder = undefined; + + labelContainer.appendChild( + document.createTextNode("Number of Players: ")); + labelContainer.appendChild(labelPlayerCount); + + + drawContainer.style.display = "block"; + drawContainer.appendChild(canvasDisplay); + + drawContainer.appendChild(optionContainer); + + canvasMouseDownHandler = function(e) { + if (e.button == 0) { + currentMouseX = e.pageX - canvasDisplay.offsetLeft; + currentMouseY = e.pageY - canvasDisplay.offsetTop; + + mouseDown = true; + canvasMouseMoveHandler(e); + + } else if (mouseDown) { + // Cancel drawing. + mouseDown = false; + currentPreviewPath = null; + + currentMouseX = e.pageX - canvasDisplay.offsetLeft; + currentMouseY = e.pageY - canvasDisplay.offsetTop; + + refreshDisplayCanvas(); + } + }; + canvasDisplay.addEventListener("mousedown", canvasMouseDownHandler, false); + + canvasMouseMoveHandler = function(e) { + var mouseX = e.pageX - canvasDisplay.offsetLeft; + var mouseY = e.pageY - canvasDisplay.offsetTop; + + if (mouseDown) { + var drawType = availableDrawTypes[currentDrawTypeIndex]; + + if (drawType.continuous) { + + var path = new Path(drawType.id, + availableColors[currentColorIndex], + availableThicknesses[currentThicknessIndex], + currentMouseX, currentMouseY, mouseX, + mouseY); + // Draw it on the background canvas. + path.draw(canvasBackgroundCtx); + + // Send it to the sever. + pushPath(path); + + // Refresh old coordinates + currentMouseX = mouseX; + currentMouseY = mouseY; + + } else { + // Create a new preview path. + var color = availableColors[currentColorIndex].slice(0); + color[3] = previewTransparency; + currentPreviewPath = new Path(drawType.id, + color, + availableThicknesses[currentThicknessIndex], + currentMouseX, currentMouseY, mouseX, + mouseY, false); + } + + refreshDisplayCanvas(); + } else { + currentMouseX = mouseX; + currentMouseY = mouseY; + + if (mouseInWindow) { + refreshDisplayCanvas(); + } + } + + }; + document.addEventListener("mousemove", canvasMouseMoveHandler, false); + + document.addEventListener("mouseup", function(e) { + if (e.button == 0) { + if (mouseDown) { + mouseDown = false; + currentPreviewPath = null; + + var mouseX = e.pageX - canvasDisplay.offsetLeft; + var mouseY = e.pageY - canvasDisplay.offsetTop; + var drawType = availableDrawTypes[currentDrawTypeIndex]; + + // If we are drawing a continuous path and the previous mouse coordinates are the same as + // the new ones, there is no need to construct a new draw message as we don't need to + // "terminate" a path as every path element contains both the start and the end point. + if (!(drawType.continuous && mouseX == currentMouseX && mouseY == currentMouseY)) { + var path = new Path(drawType.id, availableColors[currentColorIndex], + availableThicknesses[currentThicknessIndex], + currentMouseX, currentMouseY, mouseX, + mouseY); + // Draw it on the background canvas. + path.draw(canvasBackgroundCtx); + + // Send it to the sever. + pushPath(path); + + // Refresh old coordinates + currentMouseX = mouseX; + currentMouseY = mouseY; + } + + refreshDisplayCanvas(); + } + } + }, false); + + canvasDisplay.addEventListener("mouseout", function(e) { + mouseInWindow = false; + refreshDisplayCanvas(); + }, false); + + canvasDisplay.addEventListener("mousemove", function(e) { + if (!mouseInWindow) { + mouseInWindow = true; + refreshDisplayCanvas(); + } + }, false); + + + // Create color and thickness controls. + var colorContainersBox = document.createElement("div"); + colorContainersBox.setAttribute("style", + "margin: 4px; border: 1px solid #bbb; border-radius: 3px;"); + optionContainer.appendChild(colorContainersBox); + + colorContainers = new Array(3 * 3 * 3); + for (var i = 0; i < colorContainers.length; i++) { + var colorContainer = colorContainers[i] = + document.createElement("div"); + var color = availableColors[i] = + [ + Math.floor((i % 3) * 255 / 2), + Math.floor((Math.floor(i / 3) % 3) * 255 / 2), + Math.floor((Math.floor(i / (3 * 3)) % 3) * 255 / 2), + 1.0 + ]; + colorContainer.setAttribute("style", + "margin: 3px; width: 18px; height: 18px; " + + "float: left; background-color: " + rgb(color)); + colorContainer.style.border = '2px solid #000'; + colorContainer.addEventListener("mousedown", (function(ix) { + return function() { + setColor(ix); + }; + })(i), false); + + colorContainersBox.appendChild(colorContainer); + } + + var divClearLeft = document.createElement("div"); + divClearLeft.setAttribute("style", "clear: left;"); + colorContainersBox.appendChild(divClearLeft); + + + var drawTypeContainersBox = document.createElement("div"); + drawTypeContainersBox.setAttribute("style", + "float: right; margin-right: 3px; margin-top: 1px;"); + optionContainer.appendChild(drawTypeContainersBox); + + drawTypeContainers = new Array(availableDrawTypes.length); + for (var i = 0; i < drawTypeContainers.length; i++) { + var drawTypeContainer = drawTypeContainers[i] = + document.createElement("div"); + drawTypeContainer.setAttribute("style", + "text-align: center; margin: 3px; padding: 0 3px;" + + "height: 18px; float: left;"); + drawTypeContainer.style.border = "2px solid #000"; + drawTypeContainer.appendChild(document.createTextNode( + String(availableDrawTypes[i].name))); + drawTypeContainer.addEventListener("mousedown", (function(ix) { + return function() { + setDrawType(ix); + }; + })(i), false); + + drawTypeContainersBox.appendChild(drawTypeContainer); + } + + + var thicknessContainersBox = document.createElement("div"); + thicknessContainersBox.setAttribute("style", + "margin: 3px; border: 1px solid #bbb; border-radius: 3px;"); + optionContainer.appendChild(thicknessContainersBox); + + thicknessContainers = new Array(availableThicknesses.length); + for (var i = 0; i < thicknessContainers.length; i++) { + var thicknessContainer = thicknessContainers[i] = + document.createElement("div"); + thicknessContainer.setAttribute("style", + "text-align: center; margin: 3px; width: 18px; " + + "height: 18px; float: left;"); + thicknessContainer.style.border = "2px solid #000"; + thicknessContainer.appendChild(document.createTextNode( + String(availableThicknesses[i]))); + thicknessContainer.addEventListener("mousedown", (function(ix) { + return function() { + setThickness(ix); + }; + })(i), false); + + thicknessContainersBox.appendChild(thicknessContainer); + } + + + divClearLeft = document.createElement("div"); + divClearLeft.setAttribute("style", "clear: left;"); + thicknessContainersBox.appendChild(divClearLeft); + + + setColor(0); + setThickness(0); + setDrawType(0); + + } + + function disableControls() { + document.removeEventListener("mousedown", canvasMouseDownHandler); + document.removeEventListener("mousemove", canvasMouseMoveHandler); + mouseInWindow = false; + refreshDisplayCanvas(); + + isActive = false; + } + + function pushPath(path) { + + // Push it into the pathsNotHandled array. + var container = new PathIdContainer(path, nextMsgId++); + pathsNotHandled.push(container); + + // Send the path to the server. + var message = container.id + "|" + path.type + "," + + path.color[0] + "," + path.color[1] + "," + + path.color[2] + "," + + Math.round(path.color[3] * 255.0) + "," + + path.thickness + "," + path.x1 + "," + + path.y1 + "," + path.x2 + "," + path.y2; + + socket.send("1" + message); + } + + function setThickness(thicknessIndex) { + if (typeof currentThicknessIndex !== "undefined") + thicknessContainers[currentThicknessIndex] + .style.borderColor = "#000"; + currentThicknessIndex = thicknessIndex; + thicknessContainers[currentThicknessIndex] + .style.borderColor = "#d08"; + } + + function setColor(colorIndex) { + if (typeof currentColorIndex !== "undefined") + colorContainers[currentColorIndex] + .style.borderColor = "#000"; + currentColorIndex = colorIndex; + colorContainers[currentColorIndex] + .style.borderColor = "#d08"; + } + + function setDrawType(drawTypeIndex) { + if (typeof currentDrawTypeIndex !== "undefined") + drawTypeContainers[currentDrawTypeIndex] + .style.borderColor = "#000"; + currentDrawTypeIndex = drawTypeIndex; + drawTypeContainers[currentDrawTypeIndex] + .style.borderColor = "#d08"; + } + + + connect(); + + } + + + // Initialize the room + var room = new Room(document.getElementById("drawContainer")); + + + }, false); + + })(); + ]]></script> +</head> +<body> + <div class="noscript"><div style="color: #ff0000; font-size: 16pt;">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable + Javascript and reload this page!</div></div> + <div id="labelContainer"/> + <div id="drawContainer"/> + <div id="console-container"/> + <div style="clear: left;"/> + + <h1 class="expand" data-content-id="expandContent" style="font-size: 1.3em;" + >About Drawboard WebSocket Example</h1> + <div id="expandContent"> + <p> + This drawboard is a page where you can draw with your mouse or touch input + (using different colors) and everybody else which has the page open will + <em>immediately</em> see what you are drawing.<br/> + If someone opens the page later, they will get the current room image (so they + can see what was already drawn by other people). + </p> + <p> + It uses asynchronous sending of messages so that it doesn't need separate threads + for each client to send messages.<br/> + Each "Room" (where the drawing happens) uses a ReentrantLock to synchronize access + (currently, only a single Room is implemented). + </p> + <p> + When you open the page, first you will receive a binary websocket message containing + the current room image as PNG image. After that, you will receive string messages + that contain the drawing actions (line from x1,y1 to x2,y2).<br/> + <small>Note that it currently only uses simple string messages instead of JSON because + I did not want to introduce a dependency on a JSON lib.</small> + </p> + <p> + It uses synchronization mechanisms to ensure that the final image will look the same + for every user, regardless of what their network latency/speed is – e.g. if two user + draw at the same time on the same place, the server will decide which line was the + first one, and that will be reflected on every client. + </p> + </div> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/websocket/echo.xhtml b/src/tomcat/webapps/examples/websocket/echo.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..89347bbd2169ba34461df35ee93aa5474b99755d --- /dev/null +++ b/src/tomcat/webapps/examples/websocket/echo.xhtml @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <title>Apache Tomcat WebSocket Examples: Echo</title> + <style type="text/css"><![CDATA[ + #connect-container { + float: left; + width: 400px + } + + #connect-container div { + padding: 5px; + } + + #console-container { + float: left; + margin-left: 15px; + width: 400px; + } + + #console { + border: 1px solid #CCCCCC; + border-right-color: #999999; + border-bottom-color: #999999; + height: 170px; + overflow-y: scroll; + padding: 5px; + width: 100%; + } + + #console p { + padding: 0; + margin: 0; + } + ]]></style> + <script type="application/javascript"><![CDATA[ + "use strict"; + + var ws = null; + + function setConnected(connected) { + document.getElementById('connect').disabled = connected; + document.getElementById('disconnect').disabled = !connected; + document.getElementById('echo').disabled = !connected; + } + + function connect() { + var target = document.getElementById('target').value; + if (target == '') { + alert('Please select server side connection implementation.'); + return; + } + if ('WebSocket' in window) { + ws = new WebSocket(target); + } else if ('MozWebSocket' in window) { + ws = new MozWebSocket(target); + } else { + alert('WebSocket is not supported by this browser.'); + return; + } + ws.onopen = function () { + setConnected(true); + log('Info: WebSocket connection opened.'); + }; + ws.onmessage = function (event) { + log('Received: ' + event.data); + }; + ws.onclose = function (event) { + setConnected(false); + log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason)); + }; + } + + function disconnect() { + if (ws != null) { + ws.close(); + ws = null; + } + setConnected(false); + } + + function echo() { + if (ws != null) { + var message = document.getElementById('message').value; + log('Sent: ' + message); + ws.send(message); + } else { + alert('WebSocket connection not established, please connect.'); + } + } + + function updateTarget(target) { + if (window.location.protocol == 'http:') { + document.getElementById('target').value = 'ws://' + window.location.host + target; + } else { + document.getElementById('target').value = 'wss://' + window.location.host + target; + } + } + + function log(message) { + var console = document.getElementById('console'); + var p = document.createElement('p'); + p.style.wordWrap = 'break-word'; + p.appendChild(document.createTextNode(message)); + console.appendChild(p); + while (console.childNodes.length > 25) { + console.removeChild(console.firstChild); + } + console.scrollTop = console.scrollHeight; + } + + + document.addEventListener("DOMContentLoaded", function() { + // Remove elements with "noscript" class - <noscript> is not allowed in XHTML + var noscripts = document.getElementsByClassName("noscript"); + for (var i = 0; i < noscripts.length; i++) { + noscripts[i].parentNode.removeChild(noscripts[i]); + } + }, false); + ]]></script> +</head> +<body> +<div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable + Javascript and reload this page!</h2></div> +<div> + <div id="connect-container"> + <div> + <span>Connect to service implemented using:</span> + <br/> + <!-- echo example using new programmatic API on the server side --> + <input id="radio1" type="radio" name="group1" value="/examples/websocket/echoProgrammatic" + onclick="updateTarget(this.value);"/> <label for="radio1">programmatic API</label> + <br/> + <!-- echo example using new annotation API on the server side --> + <input id="radio2" type="radio" name="group1" value="/examples/websocket/echoAnnotation" + onclick="updateTarget(this.value);"/> <label for="radio2">annotation API (basic)</label> + <br/> + <!-- echo example using new annotation API on the server side --> + <input id="radio3" type="radio" name="group1" value="/examples/websocket/echoStreamAnnotation" + onclick="updateTarget(this.value);"/> <label for="radio3">annotation API (stream)</label> + <br/> + <!-- echo example using new annotation API on the server side --> + <!-- Disabled by default --> + <!-- + <input id="radio4" type="radio" name="group1" value="/examples/websocket/echoAsyncAnnotation" + onclick="updateTarget(this.value);"/> <label for="radio4">annotation API (async)</label> + --> + </div> + <div> + <input id="target" type="text" size="40" style="width: 350px"/> + </div> + <div> + <button id="connect" onclick="connect();">Connect</button> + <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button> + </div> + <div> + <textarea id="message" style="width: 350px">Here is a message!</textarea> + </div> + <div> + <button id="echo" onclick="echo();" disabled="disabled">Echo message</button> + </div> + </div> + <div id="console-container"> + <div id="console"/> + </div> +</div> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/websocket/index.xhtml b/src/tomcat/webapps/examples/websocket/index.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..97ee9451b6ca525961d8c71170fd776c16b08265 --- /dev/null +++ b/src/tomcat/webapps/examples/websocket/index.xhtml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <title>Apache Tomcat WebSocket Examples</title> +</head> +<body> +<h1>Apache Tomcat WebSocket Examples</h1> +<ul> + <li><a href="echo.xhtml">Echo example</a></li> + <li><a href="chat.xhtml">Chat example</a></li> + <li><a href="snake.xhtml">Multiplayer snake example</a></li> + <li><a href="drawboard.xhtml">Multiplayer drawboard example</a></li> + +</ul> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/examples/websocket/snake.xhtml b/src/tomcat/webapps/examples/websocket/snake.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..b71077c63a46771def4b35763d749b121f3cbf8c --- /dev/null +++ b/src/tomcat/webapps/examples/websocket/snake.xhtml @@ -0,0 +1,266 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <title>Apache Tomcat WebSocket Examples: Multiplayer Snake</title> + <style type="text/css"><![CDATA[ + #playground { + width: 640px; + height: 480px; + background-color: #000; + } + + #console-container { + float: left; + margin-left: 15px; + width: 300px; + } + + #console { + border: 1px solid #CCCCCC; + border-right-color: #999999; + border-bottom-color: #999999; + height: 480px; + overflow-y: scroll; + padding-left: 5px; + padding-right: 5px; + width: 100%; + } + + #console p { + padding: 0; + margin: 0; + } + ]]></style> +</head> +<body> + <div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable + Javascript and reload this page!</h2></div> + <div style="float: left"> + <canvas id="playground" width="640" height="480"/> + </div> + <div id="console-container"> + <div id="console"/> + </div> + <script type="application/javascript"><![CDATA[ + "use strict"; + + var Game = {}; + + Game.fps = 30; + Game.socket = null; + Game.nextFrame = null; + Game.interval = null; + Game.direction = 'none'; + Game.gridSize = 10; + + function Snake() { + this.snakeBody = []; + this.color = null; + } + + Snake.prototype.draw = function(context) { + for (var id in this.snakeBody) { + context.fillStyle = this.color; + context.fillRect(this.snakeBody[id].x, this.snakeBody[id].y, Game.gridSize, Game.gridSize); + } + }; + + Game.initialize = function() { + this.entities = []; + var canvas = document.getElementById('playground'); + if (!canvas.getContext) { + Console.log('Error: 2d canvas not supported by this browser.'); + return; + } + this.context = canvas.getContext('2d'); + window.addEventListener('keydown', function (e) { + var code = e.keyCode; + if (code > 36 && code < 41) { + switch (code) { + case 37: + if (Game.direction != 'east') Game.setDirection('west'); + break; + case 38: + if (Game.direction != 'south') Game.setDirection('north'); + break; + case 39: + if (Game.direction != 'west') Game.setDirection('east'); + break; + case 40: + if (Game.direction != 'north') Game.setDirection('south'); + break; + } + } + }, false); + if (window.location.protocol == 'http:') { + Game.connect('ws://' + window.location.host + '/examples/websocket/snake'); + } else { + Game.connect('wss://' + window.location.host + '/examples/websocket/snake'); + } + }; + + Game.setDirection = function(direction) { + Game.direction = direction; + Game.socket.send(direction); + Console.log('Sent: Direction ' + direction); + }; + + Game.startGameLoop = function() { + if (window.webkitRequestAnimationFrame) { + Game.nextFrame = function () { + webkitRequestAnimationFrame(Game.run); + }; + } else if (window.mozRequestAnimationFrame) { + Game.nextFrame = function () { + mozRequestAnimationFrame(Game.run); + }; + } else { + Game.interval = setInterval(Game.run, 1000 / Game.fps); + } + if (Game.nextFrame != null) { + Game.nextFrame(); + } + }; + + Game.stopGameLoop = function () { + Game.nextFrame = null; + if (Game.interval != null) { + clearInterval(Game.interval); + } + }; + + Game.draw = function() { + this.context.clearRect(0, 0, 640, 480); + for (var id in this.entities) { + this.entities[id].draw(this.context); + } + }; + + Game.addSnake = function(id, color) { + Game.entities[id] = new Snake(); + Game.entities[id].color = color; + }; + + Game.updateSnake = function(id, snakeBody) { + if (typeof Game.entities[id] != "undefined") { + Game.entities[id].snakeBody = snakeBody; + } + }; + + Game.removeSnake = function(id) { + Game.entities[id] = null; + // Force GC. + delete Game.entities[id]; + }; + + Game.run = (function() { + var skipTicks = 1000 / Game.fps, nextGameTick = (new Date).getTime(); + + return function() { + while ((new Date).getTime() > nextGameTick) { + nextGameTick += skipTicks; + } + Game.draw(); + if (Game.nextFrame != null) { + Game.nextFrame(); + } + }; + })(); + + Game.connect = (function(host) { + if ('WebSocket' in window) { + Game.socket = new WebSocket(host); + } else if ('MozWebSocket' in window) { + Game.socket = new MozWebSocket(host); + } else { + Console.log('Error: WebSocket is not supported by this browser.'); + return; + } + + Game.socket.onopen = function () { + // Socket open.. start the game loop. + Console.log('Info: WebSocket connection opened.'); + Console.log('Info: Press an arrow key to begin.'); + Game.startGameLoop(); + setInterval(function() { + // Prevent server read timeout. + Game.socket.send('ping'); + }, 5000); + }; + + Game.socket.onclose = function () { + Console.log('Info: WebSocket closed.'); + Game.stopGameLoop(); + }; + + Game.socket.onmessage = function (message) { + var packet = JSON.parse(message.data); + switch (packet.type) { + case 'update': + for (var i = 0; i < packet.data.length; i++) { + Game.updateSnake(packet.data[i].id, packet.data[i].body); + } + break; + case 'join': + for (var j = 0; j < packet.data.length; j++) { + Game.addSnake(packet.data[j].id, packet.data[j].color); + } + break; + case 'leave': + Game.removeSnake(packet.id); + break; + case 'dead': + Console.log('Info: Your snake is dead, bad luck!'); + Game.direction = 'none'; + break; + case 'kill': + Console.log('Info: Head shot!'); + break; + } + }; + }); + + var Console = {}; + + Console.log = (function(message) { + var console = document.getElementById('console'); + var p = document.createElement('p'); + p.style.wordWrap = 'break-word'; + p.innerHTML = message; + console.appendChild(p); + while (console.childNodes.length > 25) { + console.removeChild(console.firstChild); + } + console.scrollTop = console.scrollHeight; + }); + + Game.initialize(); + + + document.addEventListener("DOMContentLoaded", function() { + // Remove elements with "noscript" class - <noscript> is not allowed in XHTML + var noscripts = document.getElementsByClassName("noscript"); + for (var i = 0; i < noscripts.length; i++) { + noscripts[i].parentNode.removeChild(noscripts[i]); + } + }, false); + + ]]></script> +</body> +</html> \ No newline at end of file diff --git a/src/tomcat/webapps/host-manager/META-INF/context.xml b/src/tomcat/webapps/host-manager/META-INF/context.xml new file mode 100644 index 0000000000000000000000000000000000000000..8d1f61d6c09e44c623f137658f1a96aced7a3a83 --- /dev/null +++ b/src/tomcat/webapps/host-manager/META-INF/context.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<Context antiResourceLocking="false" privileged="true" > + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> + <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> +</Context> \ No newline at end of file diff --git a/src/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp b/src/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp new file mode 100644 index 0000000000000000000000000000000000000000..047766bbf96cc310bc076aa64cce79c1afe21f50 --- /dev/null +++ b/src/tomcat/webapps/host-manager/WEB-INF/jsp/401.jsp @@ -0,0 +1,71 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>401 Unauthorized</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>401 Unauthorized</h1> + <p> + You are not authorized to view this page. If you have not changed + any configuration files, please examine the file + <tt>conf/tomcat-users.xml</tt> in your installation. That + file must contain the credentials to let you use this webapp. + </p> + <p> + For example, to add the <tt>admin-gui</tt> role to a user named + <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the + config file listed above. + </p> +<pre> +<role rolename="admin-gui"/> +<user username="tomcat" password="s3cret" roles="admin-gui"/> +</pre> + <p> + Note that for Tomcat 7 onwards, the roles required to use the host manager + application were changed from the single <tt>admin</tt> role to the + following two roles. You will need to assign the role(s) required for + the functionality you wish to access. + </p> + <ul> + <li><tt>admin-gui</tt> - allows access to the HTML GUI</li> + <li><tt>admin-script</tt> - allows access to the text interface</li> + </ul> + <p> + The HTML interface is protected against CSRF but the text interface is not. + To maintain the CSRF protection: + </p> + <ul> + <li>Users with the <tt>admin-gui</tt> role should not be granted the + <tt>admin-script</tt> role.</li> + <li>If the text interface is accessed through a browser (e.g. for testing + since this interface is intended for tools not humans) then the browser + must be closed afterwards to terminate the session.</li> + </ul> + </body> + +</html> diff --git a/src/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp b/src/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp new file mode 100644 index 0000000000000000000000000000000000000000..74e1e2da931039ec7bf3a9a5d51163ff94dc5fa5 --- /dev/null +++ b/src/tomcat/webapps/host-manager/WEB-INF/jsp/403.jsp @@ -0,0 +1,90 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>403 Access Denied</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>403 Access Denied</h1> + <p> + You are not authorized to view this page. + </p> + <p> + By default the Host Manager is only accessible from a browser running on the + same machine as Tomcat. If you wish to modify this restriction, you'll need + to edit the Host Manager's <tt>context.xml</tt> file. + </p> + <p> + If you have already configured the Host Manager application to allow access + and you have used your browsers back button, used a saved book-mark or + similar then you may have triggered the cross-site request forgery (CSRF) + protection that has been enabled for the HTML interface of the Host Manager + application. You will need to reset this protection by returning to the + <a href="<%=request.getContextPath()%>/html">main Host Manager page</a>. + Once you return to this page, you will be able to continue using the Host + Manager application's HTML interface normally. If you continue to see this + access denied message, check that you have the necessary permissions to + access this application. + </p> + <p> If you have not changed + any configuration files, please examine the file + <tt>conf/tomcat-users.xml</tt> in your installation. That + file must contain the credentials to let you use this webapp. + </p> + <p> + For example, to add the <tt>admin-gui</tt> role to a user named + <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the + config file listed above. + </p> +<pre> +<role rolename="admin-gui"/> +<user username="tomcat" password="s3cret" roles="admin-gui"/> +</pre> + <p> + Note that for Tomcat 7 onwards, the roles required to use the host manager + application were changed from the single <tt>admin</tt> role to the + following two roles. You will need to assign the role(s) required for + the functionality you wish to access. + </p> + <ul> + <li><tt>admin-gui</tt> - allows access to the HTML GUI</li> + <li><tt>admin-script</tt> - allows access to the text interface</li> + </ul> + <p> + The HTML interface is protected against CSRF but the text interface is not. + To maintain the CSRF protection: + </p> + <ul> + <li>Users with the <tt>admin-gui</tt> role should not be granted the + <tt>admin-script</tt> role.</li> + <li>If the text interface is accessed through a browser (e.g. for testing + since this interface is intended for tools not humans) then the browser + must be closed afterwards to terminate the session.</li> + </ul> + </body> + +</html> diff --git a/src/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp b/src/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp new file mode 100644 index 0000000000000000000000000000000000000000..9816df590a25829b9d6e4ce583d7f15512fb6c60 --- /dev/null +++ b/src/tomcat/webapps/host-manager/WEB-INF/jsp/404.jsp @@ -0,0 +1,62 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page import="org.apache.catalina.util.RequestUtil" session="false" + trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>404 Not found</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>404 Not found</h1> + <p> + The page you tried to access + (<%=RequestUtil.filter((String) request.getAttribute( + "javax.servlet.error.request_uri"))%>) + does not exist. + </p> + <p> + The Host Manager application has been re-structured for Tomcat 7 onwards and + some URLs have changed. All URLs used to access the Manager application + should now start with one of the following options: + </p> + <ul> + <li><%=request.getContextPath()%>/html for the HTML GUI</li> + <li><%=request.getContextPath()%>/text for the text interface</li> + </ul> + <p> + Note that the URL for the text interface has changed from + "<%=request.getContextPath()%>" to + "<%=request.getContextPath()%>/text". + </p> + <p> + You probably need to adjust the URL you are using to access the Host Manager + application. However, there is always a chance you have found a bug in the + Host Manager application. If you are sure you have found a bug, and that the + bug has not already been reported, please report it to the Apache Tomcat + team. + </p> + </body> +</html> diff --git a/src/tomcat/webapps/host-manager/WEB-INF/web.xml b/src/tomcat/webapps/host-manager/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..e9faa2c4c3a640230f6e158b5e3fc6b48e83f729 --- /dev/null +++ b/src/tomcat/webapps/host-manager/WEB-INF/web.xml @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" + metadata-complete="true"> + + <display-name>Tomcat Host Manager Application</display-name> + <description> + A scriptable host management web application for the Tomcat Web Server; + Manager lets you view, create and remove virtual hosts. + </description> + + <request-character-encoding>UTF-8</request-character-encoding> + + <servlet> + <servlet-name>HostManager</servlet-name> + <servlet-class>org.apache.catalina.manager.host.HostManagerServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>2</param-value> + </init-param> + </servlet> + <servlet> + <servlet-name>HTMLHostManager</servlet-name> + <servlet-class>org.apache.catalina.manager.host.HTMLHostManagerServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>2</param-value> + </init-param> + </servlet> + + <filter> + <filter-name>CSRF</filter-name> + <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class> + <init-param> + <param-name>entryPoints</param-name> + <param-value>/html,/html/,/html/list,/index.jsp</param-value> + </init-param> + </filter> + + <filter-mapping> + <filter-name>CSRF</filter-name> + <servlet-name>HTMLHostManager</servlet-name> + </filter-mapping> + + <!-- Define the Manager Servlet Mapping --> + <servlet-mapping> + <servlet-name>HostManager</servlet-name> + <url-pattern>/text/*</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>HTMLHostManager</servlet-name> + <url-pattern>/html/*</url-pattern> + </servlet-mapping> + + <!-- Define a Security Constraint on this Application --> + <security-constraint> + <web-resource-collection> + <web-resource-name>HostManager commands</web-resource-name> + <url-pattern>/text/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <!-- NOTE: This role is not present in the default users file --> + <role-name>admin-script</role-name> + </auth-constraint> + </security-constraint> + <security-constraint> + <web-resource-collection> + <web-resource-name>HTMLHostManager commands</web-resource-name> + <url-pattern>/html/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <!-- NOTE: This role is not present in the default users file --> + <role-name>admin-gui</role-name> + </auth-constraint> + </security-constraint> + + <!-- Define the Login Configuration for this Application --> + <login-config> + <auth-method>BASIC</auth-method> + <realm-name>Tomcat Host Manager Application</realm-name> + </login-config> + + <!-- Security roles referenced by this web application --> + <security-role> + <description> + The role that is required to log in to the Host Manager Application HTML + interface + </description> + <role-name>admin-gui</role-name> + </security-role> + <security-role> + <description> + The role that is required to log in to the Host Manager Application text + interface + </description> + <role-name>admin-script</role-name> + </security-role> + + <error-page> + <error-code>401</error-code> + <location>/WEB-INF/jsp/401.jsp</location> + </error-page> + <error-page> + <error-code>403</error-code> + <location>/WEB-INF/jsp/403.jsp</location> + </error-page> + <error-page> + <error-code>404</error-code> + <location>/WEB-INF/jsp/404.jsp</location> + </error-page> + +</web-app> diff --git a/src/tomcat/webapps/host-manager/images/asf-logo.svg b/src/tomcat/webapps/host-manager/images/asf-logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..e24cbe52975eaea5ed9ede394d40862db1a05b34 --- /dev/null +++ b/src/tomcat/webapps/host-manager/images/asf-logo.svg @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve"> +<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1 + c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1 + C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5 + c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6 + c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3 + h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12 + c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/> +<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/> +<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/> +<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/> +<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970 + l-205.1,493.2h404.7L2032.6,970z"/> +<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1 + H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/> +<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970 + l-205.1,493.2h404.7L3708.6,970z"/> +<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177 + c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1 + c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/> +<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/> +<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/> +<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4 + c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6 + c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6 + c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6 + c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9 + c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2 + c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1 + c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/> +<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/> +<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/> +<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/> +<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7 + l57.1-182.7h25l-70.6,210.6H2871.8z"/> +<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6 + l-46.9,106.8h94.4L3144.5,2086.6z"/> +<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5 + c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6 + c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56 + C3466.2,2180.2,3481,2176,3491.3,2167.6z"/> +<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/> +<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/> +<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/> +<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6 + v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124 + h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/> +<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/> +<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6 + c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z + M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42 + c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/> +<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6 + l-46.9,106.8h94.4L5725.8,2086.6z"/> +<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/> +<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/> +<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/> +<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#F69923"/> + <stop offset="0.3123" style="stop-color:#F79A23"/> + <stop offset="0.8383" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2 + c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7 + c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/> +<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1 + C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/> +<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/> +<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3 + c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6 + c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9 + c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3 + c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2 + c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4 + C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/> +<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/> +<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8 + c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1 + c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7 + c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5 + c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3 + l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2 + c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6 + c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2 + c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5 + C374.4,1966.3,371.7,1973.6,369,1981z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2 + c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51 + c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4 + c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5 + c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3 + L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1 + c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9 + c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6 + c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9 + c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8 + c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8 + c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7 + c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5 + c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2 + c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4 + c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1 + c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2 + c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8 + c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0 + c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2 + c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6 + c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9 + c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5 + c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/> +<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7 + L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +</svg> diff --git a/src/tomcat/webapps/host-manager/images/tomcat.gif b/src/tomcat/webapps/host-manager/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aa6f863e43e3924a35854c556a9c1b6d125cba Binary files /dev/null and b/src/tomcat/webapps/host-manager/images/tomcat.gif differ diff --git a/src/tomcat/webapps/host-manager/index.jsp b/src/tomcat/webapps/host-manager/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2806b76e8e00d033a5e7aa1f30338e9608041899 --- /dev/null +++ b/src/tomcat/webapps/host-manager/index.jsp @@ -0,0 +1,18 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<% response.sendRedirect(request.getContextPath() + "/html"); %> \ No newline at end of file diff --git a/src/tomcat/webapps/host-manager/manager.xml b/src/tomcat/webapps/host-manager/manager.xml new file mode 100644 index 0000000000000000000000000000000000000000..2510acbc20481fa3d7498ea9e4a0a7c591edcab7 --- /dev/null +++ b/src/tomcat/webapps/host-manager/manager.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- + + Context configuration file for the Tomcat Manager Web App + +--> +<Context docBase="${catalina.home}/webapps/manager" + privileged="true" antiResourceLocking="false" > + +</Context> diff --git a/src/tomcat/webapps/manager/META-INF/context.xml b/src/tomcat/webapps/manager/META-INF/context.xml new file mode 100644 index 0000000000000000000000000000000000000000..021774508876428603f2819e507908685c01bec0 --- /dev/null +++ b/src/tomcat/webapps/manager/META-INF/context.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<Context antiResourceLocking="false" privileged="true" > + <Valve className="org.apache.catalina.valves.RemoteAddrValve" + allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> + <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> +</Context> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/401.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/401.jsp new file mode 100644 index 0000000000000000000000000000000000000000..fcd0280a02d7838d04541a8bde3c7574e5164129 --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/401.jsp @@ -0,0 +1,80 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>401 Unauthorized</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>401 Unauthorized</h1> + <p> + You are not authorized to view this page. If you have not changed + any configuration files, please examine the file + <tt>conf/tomcat-users.xml</tt> in your installation. That + file must contain the credentials to let you use this webapp. + </p> + <p> + For example, to add the <tt>manager-gui</tt> role to a user named + <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the + config file listed above. + </p> +<pre> +<role rolename="manager-gui"/> +<user username="tomcat" password="s3cret" roles="manager-gui"/> +</pre> + <p> + Note that for Tomcat 7 onwards, the roles required to use the manager + application were changed from the single <tt>manager</tt> role to the + following four roles. You will need to assign the role(s) required for + the functionality you wish to access. + </p> + <ul> + <li><tt>manager-gui</tt> - allows access to the HTML GUI and the status + pages</li> + <li><tt>manager-script</tt> - allows access to the text interface and the + status pages</li> + <li><tt>manager-jmx</tt> - allows access to the JMX proxy and the status + pages</li> + <li><tt>manager-status</tt> - allows access to the status pages only</li> + </ul> + <p> + The HTML interface is protected against CSRF but the text and JMX interfaces + are not. To maintain the CSRF protection: + </p> + <ul> + <li>Users with the <tt>manager-gui</tt> role should not be granted either + the <tt>manager-script</tt> or <tt>manager-jmx</tt> roles.</li> + <li>If the text or jmx interfaces are accessed through a browser (e.g. for + testing since these interfaces are intended for tools not humans) then + the browser must be closed afterwards to terminate the session.</li> + </ul> + <p> + For more information - please see the + <a href="/docs/manager-howto.html">Manager App HOW-TO</a>. + </p> + </body> + +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/403.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/403.jsp new file mode 100644 index 0000000000000000000000000000000000000000..78184c71ef70eccb428714a048e5eee46dd4532e --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/403.jsp @@ -0,0 +1,100 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>403 Access Denied</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>403 Access Denied</h1> + <p> + You are not authorized to view this page. + </p> + <p> + By default the Manager is only accessible from a browser running on the + same machine as Tomcat. If you wish to modify this restriction, you'll need + to edit the Manager's <tt>context.xml</tt> file. + </p> + <p> + If you have already configured the Manager application to allow access and + you have used your browsers back button, used a saved book-mark or similar + then you may have triggered the cross-site request forgery (CSRF) protection + that has been enabled for the HTML interface of the Manager application. You + will need to reset this protection by returning to the + <a href="<%=request.getContextPath()%>/html">main Manager page</a>. Once you + return to this page, you will be able to continue using the Manager + application's HTML interface normally. If you continue to see this access + denied message, check that you have the necessary permissions to access this + application. + </p> + <p> + If you have not changed + any configuration files, please examine the file + <tt>conf/tomcat-users.xml</tt> in your installation. That + file must contain the credentials to let you use this webapp. + </p> + <p> + For example, to add the <tt>manager-gui</tt> role to a user named + <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the + config file listed above. + </p> +<pre> +<role rolename="manager-gui"/> +<user username="tomcat" password="s3cret" roles="manager-gui"/> +</pre> + <p> + Note that for Tomcat 7 onwards, the roles required to use the manager + application were changed from the single <tt>manager</tt> role to the + following four roles. You will need to assign the role(s) required for + the functionality you wish to access. + </p> + <ul> + <li><tt>manager-gui</tt> - allows access to the HTML GUI and the status + pages</li> + <li><tt>manager-script</tt> - allows access to the text interface and the + status pages</li> + <li><tt>manager-jmx</tt> - allows access to the JMX proxy and the status + pages</li> + <li><tt>manager-status</tt> - allows access to the status pages only</li> + </ul> + <p> + The HTML interface is protected against CSRF but the text and JMX interfaces + are not. To maintain the CSRF protection: + </p> + <ul> + <li>Users with the <tt>manager-gui</tt> role should not be granted either + the <tt>manager-script</tt> or <tt>manager-jmx</tt> roles.</li> + <li>If the text or jmx interfaces are accessed through a browser (e.g. for + testing since these interfaces are intended for tools not humans) then + the browser must be closed afterwards to terminate the session.</li> + </ul> + <p> + For more information - please see the + <a href="/docs/manager-howto.html">Manager App HOW-TO</a>. + </p> + </body> + +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/404.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/404.jsp new file mode 100644 index 0000000000000000000000000000000000000000..111a80083652fbd8e9c4a4a6129345f99e47257e --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/404.jsp @@ -0,0 +1,63 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page import="org.apache.tomcat.util.security.Escape" session="false" + trimDirectiveWhitespaces="true" %> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>404 Not found</title> + <style type="text/css"> + <!-- + BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;} + H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} + PRE, TT {border: 1px dotted #525D76} + A {color : black;}A.name {color : black;} + --> + </style> + </head> + <body> + <h1>404 Not found</h1> + <p> + The page you tried to access + (<%=Escape.htmlElementContent((String) request.getAttribute( + "javax.servlet.error.request_uri"))%>) + does not exist. + </p> + <p> + The Manager application has been re-structured for Tomcat 7 onwards and some + of URLs have changed. All URLs used to access the Manager application should + now start with one of the following options: + </p> + <ul> + <li><%=request.getContextPath()%>/html for the HTML GUI</li> + <li><%=request.getContextPath()%>/text for the text interface</li> + <li><%=request.getContextPath()%>/jmxproxy for the JMX proxy</li> + <li><%=request.getContextPath()%>/status for the status pages</li> + </ul> + <p> + Note that the URL for the text interface has changed from + "<%=request.getContextPath()%>" to + "<%=request.getContextPath()%>/text". + </p> + <p> + You probably need to adjust the URL you are using to access the Manager + application. However, there is always a chance you have found a bug in the + Manager application. If you are sure you have found a bug, and that the bug + has not already been reported, please report it to the Apache Tomcat team. + </p> + </body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp new file mode 100644 index 0000000000000000000000000000000000000000..77ddc2b4cbd58c4b556f7688b743c67e326f955d --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCerts.jsp @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" contentType="text/html; charset=ISO-8859-1" %> +<%@page import="java.util.Map" %> +<%@page import="java.util.Map.Entry" %> +<%@page import="java.util.List" %> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<% Map<String,List<String>> certList = (Map<String,List<String>>) request.getAttribute("certList"); +%> +<head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> + <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 --> + <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 --> + <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' --> + <meta http-equiv="content-language" content="en"/> + <meta name="copyright" content="copyright 2005-2018 the Apache Software Foundation"/> + <meta name="robots" content="noindex,nofollow,noarchive"/> + <title>Configured certificate chains per Connector</title> +</head> +<body> +<h1>Configured certificate chains per Connector</h1> + +<table border="1" cellpadding="2" cellspacing="2" width="100%"> + <thead> + <tr> + <th>Connector / TLS Virtual Host / Certificate type</th> + <th>Certificate chain</th> + </tr> + </thead> + <tbody> + <% + for (Map.Entry<String, List<String>> entry : certList.entrySet()) { + %> + <tr> + <td><%=entry.getKey()%></td> + <td> + <% + for (String cert : entry.getValue()) { + %> + <pre><%=cert%></pre> + <% + } + %> + </td> + </tr> + <% + } + %> + </tbody> +</table> + +<form method="get" action="<%=request.getContextPath()%>/html"> + <p style="text-align: center;"> + <input type="submit" value="Return to main page" /> + </p> +</form> + +<%--div style="display: none;"> +<p> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-html401" + alt="Valid HTML 4.01!" height="31" width="88"></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml10" + alt="Valid XHTML 1.0!" height="31" width="88" /></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml11" + alt="Valid XHTML 1.1!" height="31" width="88" /></a> +</p> +</div--%> + +</body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp new file mode 100644 index 0000000000000000000000000000000000000000..e82a3dd1ceab0f6bc09e6b241d997a56e9b49dd1 --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorCiphers.jsp @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" contentType="text/html; charset=ISO-8859-1" %> +<%@page import="java.util.Map" %> +<%@page import="java.util.Map.Entry" %> +<%@page import="java.util.List" %> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<% Map<String,List<String>> cipherList = (Map<String,List<String>>) request.getAttribute("cipherList"); +%> +<head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> + <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 --> + <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 --> + <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' --> + <meta http-equiv="content-language" content="en"/> + <meta name="copyright" content="copyright 2005-2018 the Apache Software Foundation"/> + <meta name="robots" content="noindex,nofollow,noarchive"/> + <title>Configured ciphers per Connector</title> +</head> +<body> +<h1>Configured ciphers per Connector</h1> + +<table border="1" cellpadding="2" cellspacing="2" width="100%"> + <thead> + <tr> + <th>Connector / TLS Virtual Host</th> + <th>Enabled Ciphers</th> + </tr> + </thead> + <tbody> + <% + for (Map.Entry<String, List<String>> entry : cipherList.entrySet()) { + %> + <tr> + <td><%=entry.getKey()%></td> + <td> + <% + for (String cipher : entry.getValue()) { + %> + <p><%=cipher%></p> + <% + } + %> + </td> + </tr> + <% + } + %> + </tbody> +</table> + +<form method="get" action="<%=request.getContextPath()%>/html"> + <p style="text-align: center;"> + <input type="submit" value="Return to main page" /> + </p> +</form> + +<%--div style="display: none;"> +<p> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-html401" + alt="Valid HTML 4.01!" height="31" width="88"></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml10" + alt="Valid XHTML 1.0!" height="31" width="88" /></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml11" + alt="Valid XHTML 1.1!" height="31" width="88" /></a> +</p> +</div--%> + +</body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp new file mode 100644 index 0000000000000000000000000000000000000000..7d1ed96f2fd5c508ef28ae88c6388993f0799947 --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/connectorTrustedCerts.jsp @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" contentType="text/html; charset=ISO-8859-1" %> +<%@page import="java.util.Map" %> +<%@page import="java.util.Map.Entry" %> +<%@page import="java.util.List" %> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<% Map<String,List<String>> trustedCertList = (Map<String,List<String>>) request.getAttribute("trustedCertList"); +%> +<head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> + <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 --> + <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 --> + <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' --> + <meta http-equiv="content-language" content="en"/> + <meta name="copyright" content="copyright 2005-2018 the Apache Software Foundation"/> + <meta name="robots" content="noindex,nofollow,noarchive"/> + <title>Trusted certificates per Connector</title> +</head> +<body> +<h1>Trusted certificates per Connector</h1> + +<table border="1" cellpadding="2" cellspacing="2" width="100%"> + <thead> + <tr> + <th>Connector / TLS Virtual Host</th> + <th>Trusted Certificates</th> + </tr> + </thead> + <tbody> + <% + for (Map.Entry<String, List<String>> entry : trustedCertList.entrySet()) { + %> + <tr> + <td><%=entry.getKey()%></td> + <td> + <% + for (String cert : entry.getValue()) { + %> + <pre><%=cert%></pre> + <% + } + %> + </td> + </tr> + <% + } + %> + </tbody> +</table> + +<form method="get" action="<%=request.getContextPath()%>/html"> + <p style="text-align: center;"> + <input type="submit" value="Return to main page" /> + </p> +</form> + +<%--div style="display: none;"> +<p> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-html401" + alt="Valid HTML 4.01!" height="31" width="88"></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml10" + alt="Valid XHTML 1.0!" height="31" width="88" /></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml11" + alt="Valid XHTML 1.1!" height="31" width="88" /></a> +</p> +</div--%> + +</body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp new file mode 100644 index 0000000000000000000000000000000000000000..58d1f902b0006a84f630564631fdf86034a8d99c --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/sessionDetail.jsp @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="UTF-8"?> +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" contentType="text/html; charset=ISO-8859-1" %> +<%@page import="java.util.Enumeration" %> +<%@page import="javax.servlet.http.HttpSession" %> +<%@page import="org.apache.catalina.Session" %> +<%@page import="org.apache.catalina.manager.JspHelper" %> +<%@page import="org.apache.catalina.util.ContextName" %> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<%--!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"--%> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<% String path = (String) request.getAttribute("path"); + String version = (String) request.getAttribute("version"); + ContextName cn = new ContextName(path, version); + Session currentSession = (Session)request.getAttribute("currentSession"); + String currentSessionId = null; + HttpSession currentHttpSession = null; + if (currentSession != null) { + currentHttpSession = currentSession.getSession(); + currentSessionId = JspHelper.escapeXml(currentSession.getId()); + } else { + currentSessionId = "Session invalidated"; + } + String submitUrl = JspHelper.escapeXml(response.encodeURL( + ((HttpServletRequest) pageContext.getRequest()).getRequestURI() + + "?path=" + path + "&version=" + version)); +%> +<head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> + <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 --> + <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 --> + <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' --> + <meta http-equiv="content-language" content="en"/> + <meta name="author" content="Cedrik LIME"/> + <meta name="copyright" content="copyright 2005-2018 the Apache Software Foundation"/> + <meta name="robots" content="noindex,nofollow,noarchive"/> + <title>Sessions Administration: details for <%= currentSessionId %></title> +</head> +<body> +<% if (currentHttpSession == null) { %> + <h1><%=currentSessionId%></h1> +<% } else { %> + <h1>Details for Session <%= currentSessionId %></h1> + + <table style="text-align: left;" border="0"> + <tr> + <th>Session Id</th> + <td><%= currentSessionId %></td> + </tr> + <tr> + <th>Guessed Locale</th> + <td><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td> + </tr> + <tr> + <th>Guessed User</th> + <td><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td> + </tr> + <tr> + <th>Creation Time</th> + <td><%= JspHelper.getDisplayCreationTimeForSession(currentSession) %></td> + </tr> + <tr> + <th>Last Accessed Time</th> + <td><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td> + </tr> + <tr> + <th>Session Max Inactive Interval</th> + <td><%= JspHelper.secondsToTimeString(currentSession.getMaxInactiveInterval()) %></td> + </tr> + <tr> + <th>Used Time</th> + <td><%= JspHelper.getDisplayUsedTimeForSession(currentSession) %></td> + </tr> + <tr> + <th>Inactive Time</th> + <td><%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %></td> + </tr> + <tr> + <th>TTL</th> + <td><%= JspHelper.getDisplayTTLForSession(currentSession) %></td> + </tr> + </table> + + <form method="post" action="<%= submitUrl %>"> + <div> + <input type="hidden" name="sessionId" value="<%= currentSessionId %>" /> + <input type="hidden" name="action" value="sessionDetail" /> + <% + if ("Primary".equals(request.getParameter("sessionType"))) { + %> + <input type="hidden" name="sessionType" value="Primary" /> + <% + } + %> <input type="submit" value="Refresh" /> + </div> + </form> + + <div class="error"><%= JspHelper.escapeXml(request.getAttribute("error")) %></div> + <div class="message"><%= JspHelper.escapeXml(request.getAttribute("message")) %></div> + + <table style="text-align: left;" border="1" cellpadding="2" cellspacing="2"> + <% int nAttributes = 0; + Enumeration attributeNamesEnumeration = currentHttpSession.getAttributeNames(); + while (attributeNamesEnumeration.hasMoreElements()) { + attributeNamesEnumeration.nextElement(); + ++nAttributes; + } + %> + <caption style="font-variant: small-caps;"><%= JspHelper.formatNumber(nAttributes) %> attributes</caption> + <thead> + <tr> + <th>Remove Attribute</th> + <th>Attribute name</th> + <th>Attribute value</th> + </tr> + </thead> + <%--tfoot> + <tr> + <td colspan="3" style="text-align: center;"> + TODO: set Max Inactive Interval on sessions + </td> + </tr> + </tfoot--%> + <tbody> + <% attributeNamesEnumeration = currentHttpSession.getAttributeNames(); + while (attributeNamesEnumeration.hasMoreElements()) { + String attributeName = (String) attributeNamesEnumeration.nextElement(); + %> + <tr> + <td align="center"> + <form method="post" action="<%= submitUrl %>"> + <div> + <input type="hidden" name="action" value="removeSessionAttribute" /> + <input type="hidden" name="sessionId" value="<%= currentSessionId %>" /> + <input type="hidden" name="attributeName" value="<%= JspHelper.escapeXml(attributeName) %>" /> + <% + if ("Primary".equals(request.getParameter("sessionType"))) { + %> + <input type="submit" value="Remove" /> + <input type="hidden" name="sessionType" value="Primary" /> + <% + } else { + out.print("Primary sessions only"); + } + %> + </div> + </form> + </td> + <td><%= JspHelper.escapeXml(attributeName) %></td> + <td><% Object attributeValue = currentHttpSession.getAttribute(attributeName); %><span title="<%= attributeValue == null ? "" : attributeValue.getClass().toString() %>"><%= JspHelper.escapeXml(attributeValue) %></span></td> + </tr> + <% } // end while %> + </tbody> + </table> +<% } // endif%> + +<form method="post" action="<%=submitUrl%>"> + <p style="text-align: center;"> + <input type="submit" value="Return to session list" /> + </p> +</form> + +<%--div style="display: none;"> +<p> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-html401" + alt="Valid HTML 4.01!" height="31" width="88"></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml10" + alt="Valid XHTML 1.0!" height="31" width="88" /></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml11" + alt="Valid XHTML 1.1!" height="31" width="88" /></a> +</p> +</div--%> + +</body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp b/src/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2c760aa16dbaf815775ead90e6bf5f53fa345fb2 --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/jsp/sessionsList.jsp @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="UTF-8"?> +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@page session="false" contentType="text/html; charset=ISO-8859-1" %> +<%@page import="java.util.Collection" %> +<%@page import="org.apache.catalina.manager.JspHelper" %> +<%@page import="org.apache.catalina.Session" %> +<%@page import="org.apache.catalina.ha.session.DeltaSession" %> +<%@page import="org.apache.catalina.util.ContextName" %> +<!DOCTYPE html + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<%@page import="org.apache.catalina.manager.DummyProxySession"%><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<% String path = (String) request.getAttribute("path"); + String version = (String) request.getAttribute("version"); + ContextName cn = new ContextName(path, version); + String submitUrl = JspHelper.escapeXml(response.encodeURL( + ((HttpServletRequest) pageContext.getRequest()).getRequestURI() + + "?path=" + path + "&version=" + version)); + Collection<Session> activeSessions = (Collection<Session>) request.getAttribute("activeSessions"); +%> +<head> + <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> + <meta http-equiv="pragma" content="no-cache"/><!-- HTTP 1.0 --> + <meta http-equiv="cache-control" content="no-cache,must-revalidate"/><!-- HTTP 1.1 --> + <meta http-equiv="expires" content="0"/><!-- 0 is an invalid value and should be treated as 'now' --> + <meta http-equiv="content-language" content="en"/> + <meta name="author" content="Cedrik LIME"/> + <meta name="copyright" content="copyright 2005-2018 the Apache Software Foundation"/> + <meta name="robots" content="noindex,nofollow,noarchive"/> + <title>Sessions Administration for <%= JspHelper.escapeXml(cn.getDisplayName()) %></title> +</head> +<body> +<h1>Sessions Administration for <%= JspHelper.escapeXml(cn.getDisplayName()) %></h1> + +<p>Tips:</p> +<ul> + <li>Click on a column to sort.</li> + <li>To view a session details and/or remove a session attributes, click on its id.</li> +</ul> + +<div class="error"><%= JspHelper.escapeXml(request.getAttribute("error")) %></div> +<div class="message"><%= JspHelper.escapeXml(request.getAttribute("message")) %></div> + +<form action="<%= submitUrl %>" method="post" id="sessionsForm"> + <fieldset><legend>Active HttpSessions informations</legend> + <input type="hidden" name="action" id="sessionsFormAction" value="injectSessions"/> + <input type="hidden" name="sort" id="sessionsFormSort" value="<%= JspHelper.escapeXml(request.getAttribute("sort")) %>"/> + <% String order = (String) request.getAttribute("order"); + if (order == null || "".equals(order)) { + order = "ASC"; + } + %> + <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= JspHelper.escapeXml(order) %>"/> + <input type="submit" name="refresh" id="refreshButton" value="Refresh Sessions list" onclick="document.getElementById('sessionsFormAction').value='refreshSessions'; return true;"/> + <%= JspHelper.formatNumber(activeSessions.size()) %> active Sessions<br/> + <table border="1" cellpadding="2" cellspacing="2" width="100%"> + <thead> + <tr> + <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Session Id</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Type</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='locale'; document.getElementById('refreshButton').click(); return true;">Guessed Locale</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='user'; document.getElementById('refreshButton').click(); return true;">Guessed User name</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='CreationTime'; document.getElementById('refreshButton').click(); return true;">Creation Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='LastAccessedTime'; document.getElementById('refreshButton').click(); return true;">Last Accessed Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='UsedTime'; document.getElementById('refreshButton').click(); return true;">Used Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='InactiveTime'; document.getElementById('refreshButton').click(); return true;">Inactive Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='TTL'; document.getElementById('refreshButton').click(); return true;"><span title="Time To Live">TTL</span></a></th> + </tr> + </thead> + <% if (activeSessions.size() > 10) { %> + <tfoot><%-- <tfoot> is the same as <thead> --%> + <tr> + <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Session Id</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='id'; document.getElementById('refreshButton').click(); return true;">Type</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='locale'; document.getElementById('refreshButton').click(); return true;">Guessed Locale</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='user'; document.getElementById('refreshButton').click(); return true;">Guessed User name</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='CreationTime'; document.getElementById('refreshButton').click(); return true;">Creation Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='LastAccessedTime'; document.getElementById('refreshButton').click(); return true;">Last Accessed Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='UsedTime'; document.getElementById('refreshButton').click(); return true;">Used Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='InactiveTime'; document.getElementById('refreshButton').click(); return true;">Inactive Time</a></th> + <th><a onclick="document.getElementById('sessionsFormSort').value='TTL'; document.getElementById('refreshButton').click(); return true;"><span title="Time To Live">TTL</span></a></th> + </tr> + </tfoot> + <% } // end if %> + <tbody> +<% + for (Session currentSession : activeSessions) { + String currentSessionId = JspHelper.escapeXml(currentSession.getId()); + String type; + if (currentSession instanceof DeltaSession) { + if (((DeltaSession) currentSession).isPrimarySession()) { + type = "Primary"; + } else { + type = "Backup"; + } + } else if (currentSession instanceof DummyProxySession) { + type = "Proxy"; + } else { + type = "Primary"; + } +%> + <tr> + <td><input type="checkbox" name="sessionIds" value="<%= currentSessionId %>" /> + <% + if ("Proxy".equals(type)) { + out.print(currentSessionId); + } else { + %> + <a href="<%= submitUrl %>&action=sessionDetail&sessionId=<%= currentSessionId %>&sessionType=<%= type %>"><%= currentSessionId %></a> + <% + } + %> + </td> + <td style="text-align: center;"><%= type %></td> + <td style="text-align: center;"><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.getDisplayCreationTimeForSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.getDisplayUsedTimeForSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %></td> + <td style="text-align: center;"><%= JspHelper.getDisplayTTLForSession(currentSession) %></td> + </tr> +<% } // end while %> + </tbody> + </table> + <p style="text-align: center;"> + <input type="submit" name="invalidate" value="Invalidate selected Sessions" onclick="document.getElementById('sessionsFormAction').value='invalidateSessions'; return true;"/> + </p> + </fieldset> +</form> + +<form method="get" action="<%=request.getContextPath()%>/html"> + <p style="text-align: center;"> + <input type="submit" value="Return to main page" /> + </p> +</form> + +<%--div style="display: none;"> +<p> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-html401" + alt="Valid HTML 4.01!" height="31" width="88"></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml10" + alt="Valid XHTML 1.0!" height="31" width="88" /></a> + <a href="http://validator.w3.org/check?uri=referer"><img + src="http://www.w3.org/Icons/valid-xhtml11" + alt="Valid XHTML 1.1!" height="31" width="88" /></a> +</p> +</div--%> + +</body> +</html> diff --git a/src/tomcat/webapps/manager/WEB-INF/web.xml b/src/tomcat/webapps/manager/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..e73aae05f260197ead565ee2869f012f59d78f88 --- /dev/null +++ b/src/tomcat/webapps/manager/WEB-INF/web.xml @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee + http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0" + metadata-complete="true"> + + <display-name>Tomcat Manager Application</display-name> + <description> + A scriptable management web application for the Tomcat Web Server; + Manager lets you view, load/unload/etc particular web applications. + </description> + + <request-character-encoding>UTF-8</request-character-encoding> + + <servlet> + <servlet-name>Manager</servlet-name> + <servlet-class>org.apache.catalina.manager.ManagerServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>2</param-value> + </init-param> + </servlet> + <servlet> + <servlet-name>HTMLManager</servlet-name> + <servlet-class>org.apache.catalina.manager.HTMLManagerServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>2</param-value> + </init-param> + <!-- Uncomment this to show proxy sessions from the Backup manager or a + StoreManager in the sessions list for an application + <init-param> + <param-name>showProxySessions</param-name> + <param-value>true</param-value> + </init-param> + --> + <multipart-config> + <!-- 50MB max --> + <max-file-size>52428800</max-file-size> + <max-request-size>52428800</max-request-size> + <file-size-threshold>0</file-size-threshold> + </multipart-config> + </servlet> + <servlet> + <servlet-name>Status</servlet-name> + <servlet-class>org.apache.catalina.manager.StatusManagerServlet</servlet-class> + <init-param> + <param-name>debug</param-name> + <param-value>0</param-value> + </init-param> + </servlet> + + <servlet> + <servlet-name>JMXProxy</servlet-name> + <servlet-class>org.apache.catalina.manager.JMXProxyServlet</servlet-class> + </servlet> + + <!-- Define the Manager Servlet Mapping --> + <servlet-mapping> + <servlet-name>Manager</servlet-name> + <url-pattern>/text/*</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>Status</servlet-name> + <url-pattern>/status/*</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>JMXProxy</servlet-name> + <url-pattern>/jmxproxy/*</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>HTMLManager</servlet-name> + <url-pattern>/html/*</url-pattern> + </servlet-mapping> + + <filter> + <filter-name>CSRF</filter-name> + <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class> + <init-param> + <param-name>entryPoints</param-name> + <param-value>/html,/html/,/html/list,/index.jsp</param-value> + </init-param> + </filter> + + <filter-mapping> + <filter-name>CSRF</filter-name> + <servlet-name>HTMLManager</servlet-name> + </filter-mapping> + + <!-- Define a Security Constraint on this Application --> + <!-- NOTE: None of these roles are present in the default users file --> + <security-constraint> + <web-resource-collection> + <web-resource-name>HTML Manager interface (for humans)</web-resource-name> + <url-pattern>/html/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <role-name>manager-gui</role-name> + </auth-constraint> + </security-constraint> + <security-constraint> + <web-resource-collection> + <web-resource-name>Text Manager interface (for scripts)</web-resource-name> + <url-pattern>/text/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <role-name>manager-script</role-name> + </auth-constraint> + </security-constraint> + <security-constraint> + <web-resource-collection> + <web-resource-name>JMX Proxy interface</web-resource-name> + <url-pattern>/jmxproxy/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <role-name>manager-jmx</role-name> + </auth-constraint> + </security-constraint> + <security-constraint> + <web-resource-collection> + <web-resource-name>Status interface</web-resource-name> + <url-pattern>/status/*</url-pattern> + </web-resource-collection> + <auth-constraint> + <role-name>manager-gui</role-name> + <role-name>manager-script</role-name> + <role-name>manager-jmx</role-name> + <role-name>manager-status</role-name> + </auth-constraint> + </security-constraint> + + <!-- Define the Login Configuration for this Application --> + <login-config> + <auth-method>BASIC</auth-method> + <realm-name>Tomcat Manager Application</realm-name> + </login-config> + + <!-- Security roles referenced by this web application --> + <security-role> + <description> + The role that is required to access the HTML Manager pages + </description> + <role-name>manager-gui</role-name> + </security-role> + <security-role> + <description> + The role that is required to access the text Manager pages + </description> + <role-name>manager-script</role-name> + </security-role> + <security-role> + <description> + The role that is required to access the HTML JMX Proxy + </description> + <role-name>manager-jmx</role-name> + </security-role> + <security-role> + <description> + The role that is required to access to the Manager Status pages + </description> + <role-name>manager-status</role-name> + </security-role> + + <error-page> + <error-code>401</error-code> + <location>/WEB-INF/jsp/401.jsp</location> + </error-page> + <error-page> + <error-code>403</error-code> + <location>/WEB-INF/jsp/403.jsp</location> + </error-page> + <error-page> + <error-code>404</error-code> + <location>/WEB-INF/jsp/404.jsp</location> + </error-page> + +</web-app> diff --git a/src/tomcat/webapps/manager/images/asf-logo.svg b/src/tomcat/webapps/manager/images/asf-logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..e24cbe52975eaea5ed9ede394d40862db1a05b34 --- /dev/null +++ b/src/tomcat/webapps/manager/images/asf-logo.svg @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve"> +<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1 + c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1 + C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5 + c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6 + c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3 + h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12 + c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/> +<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/> +<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/> +<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/> +<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970 + l-205.1,493.2h404.7L2032.6,970z"/> +<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1 + H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/> +<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970 + l-205.1,493.2h404.7L3708.6,970z"/> +<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177 + c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1 + c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/> +<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/> +<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/> +<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4 + c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6 + c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6 + c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6 + c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9 + c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2 + c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1 + c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/> +<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/> +<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/> +<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/> +<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7 + l57.1-182.7h25l-70.6,210.6H2871.8z"/> +<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6 + l-46.9,106.8h94.4L3144.5,2086.6z"/> +<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5 + c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6 + c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56 + C3466.2,2180.2,3481,2176,3491.3,2167.6z"/> +<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/> +<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/> +<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/> +<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6 + v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124 + h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/> +<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/> +<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6 + c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z + M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42 + c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/> +<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6 + l-46.9,106.8h94.4L5725.8,2086.6z"/> +<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/> +<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/> +<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/> +<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#F69923"/> + <stop offset="0.3123" style="stop-color:#F79A23"/> + <stop offset="0.8383" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2 + c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7 + c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/> +<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1 + C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/> +<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/> +<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3 + c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6 + c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9 + c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3 + c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2 + c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4 + C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/> +<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/> +<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8 + c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1 + c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7 + c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5 + c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3 + l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2 + c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6 + c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2 + c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5 + C374.4,1966.3,371.7,1973.6,369,1981z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2 + c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51 + c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4 + c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5 + c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3 + L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1 + c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9 + c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6 + c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9 + c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8 + c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8 + c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7 + c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5 + c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2 + c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4 + c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1 + c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2 + c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8 + c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0 + c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2 + c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6 + c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9 + c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5 + c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/> +<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7 + L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +</svg> diff --git a/src/tomcat/webapps/manager/images/tomcat.gif b/src/tomcat/webapps/manager/images/tomcat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aa6f863e43e3924a35854c556a9c1b6d125cba Binary files /dev/null and b/src/tomcat/webapps/manager/images/tomcat.gif differ diff --git a/src/tomcat/webapps/manager/index.jsp b/src/tomcat/webapps/manager/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..2806b76e8e00d033a5e7aa1f30338e9608041899 --- /dev/null +++ b/src/tomcat/webapps/manager/index.jsp @@ -0,0 +1,18 @@ +<%-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--%> +<%@ page session="false" trimDirectiveWhitespaces="true" %> +<% response.sendRedirect(request.getContextPath() + "/html"); %> \ No newline at end of file diff --git a/src/tomcat/webapps/manager/status.xsd b/src/tomcat/webapps/manager/status.xsd new file mode 100644 index 0000000000000000000000000000000000000000..5af979d839bdc09f4ca12e46b4af65530a29de45 --- /dev/null +++ b/src/tomcat/webapps/manager/status.xsd @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> + <xs:element name="status"> + <xs:complexType> + <xs:sequence> + <xs:element name="jvm" type="jvm"/> + <xs:element name="connector" type="connector" minOccurs="1" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:complexType name="connector"> + <xs:sequence> + <xs:element name="threadInfo" type="threadInfo"/> + <xs:element name="requestInfo" type="requestInfo"/> + <xs:element name="workers" type="workers"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <xs:complexType name="jvm"> + <xs:sequence> + <xs:element name="memory" type="memory"/> + <xs:element name="memorypool" type="memorypool" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="memory"> + <xs:attribute name="free" type="xs:long" use="required"/> + <xs:attribute name="total" type="xs:long" use="required"/> + <xs:attribute name="max" type="xs:long" use="required"/> + </xs:complexType> + <xs:complexType name="memorypool"> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="type" type="xs:string" use="required"/> + <xs:attribute name="usageInit" type="xs:long" use="required"/> + <xs:attribute name="usageCommitted" type="xs:long" use="required"/> + <xs:attribute name="usageMax" type="xs:long" use="required"/> + <xs:attribute name="usageUsed" type="xs:long" use="required"/> + </xs:complexType> + <xs:complexType name="requestInfo"> + <xs:attribute name="maxTime" type="xs:long" use="required"/> + <xs:attribute name="processingTime" type="xs:int" use="required"/> + <xs:attribute name="requestCount" type="xs:long" use="required"/> + <xs:attribute name="errorCount" type="xs:long" use="required"/> + <xs:attribute name="bytesReceived" type="xs:long" use="required"/> + <xs:attribute name="bytesSent" type="xs:long" use="required"/> + </xs:complexType> + <xs:complexType name="threadInfo"> + <xs:attribute name="maxThreads" type="xs:int" use="required"/> + <xs:attribute name="currentThreadCount" type="xs:int" use="required"/> + <xs:attribute name="currentThreadsBusy" type="xs:int" use="required"/> + </xs:complexType> + <xs:complexType name="worker"> + <xs:attribute name="stage" type="xs:string" use="required"/> + <xs:attribute name="requestProcessingTime" type="xs:int" use="required"/> + <xs:attribute name="requestBytesSent" type="xs:long" use="required"/> + <xs:attribute name="requestBytesReceived" type="xs:long" use="required"/> + <xs:attribute name="remoteAddr" type="xs:string" use="required"/> + <xs:attribute name="virtualHost" type="xs:string" use="required"/> + <xs:attribute name="method" type="xs:string" use="required"/> + <xs:attribute name="currentUri" type="xs:string" use="required"/> + <xs:attribute name="currentQueryString" type="xs:string" use="required"/> + <xs:attribute name="protocol" type="xs:string" use="required"/> + </xs:complexType> + <xs:complexType name="workers"> + <xs:sequence> + <xs:element name="worker" type="worker" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> +</xs:schema> diff --git a/src/tomcat/webapps/manager/xform.xsl b/src/tomcat/webapps/manager/xform.xsl new file mode 100644 index 0000000000000000000000000000000000000000..06ced01694b1b0b61809a6d7ab30eee4b0366700 --- /dev/null +++ b/src/tomcat/webapps/manager/xform.xsl @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <!-- Output method --> + <xsl:output encoding="iso-8859-1" + indent="no"/> + + <xsl:template match="status"> + <html> + <head> + <TITLE>Tomcat Status</TITLE> + <STYLE type="text/css"> + body, table, tr, td, a, div, span { + vertical-align : top; + } + </STYLE> + </head> + <body> + <div style='font-size:20px;'>Tomcat Status</div> + + <xsl:apply-templates select="jvm"/> + <xsl:apply-templates select="connector"/> + </body> + </html> + </xsl:template> + + <xsl:template match="jvm"> + <xsl:apply-templates select="memory"/> + <b>Memory Pools</b><br /> + <xsl:apply-templates select="memorypool"/> + <hr /> + </xsl:template> + + <xsl:template match="memory"> + <table><tr> + <td><b>JVM:</b></td> + <td><b>free:</b> <xsl:value-of select="@free"/></td> + <td><b>total:</b> <xsl:value-of select="@total"/></td> + <td><b>max:</b> <xsl:value-of select="@max"/></td> + </tr> + </table><hr /> + </xsl:template> + + <xsl:template match="memorypool"> + <table><tr> + <td><b>Name:</b> <xsl:value-of select="@name"/></td> + <td><b>Type:</b> <xsl:value-of select="@type"/></td> + <td><b>Initial:</b> <xsl:value-of select="@usageInit"/></td> + <td><b>Committed:</b> <xsl:value-of select="@usageCommitted"/></td> + <td><b>Maximum:</b> <xsl:value-of select="@usageMax"/></td> + <td><b>Used:</b> <xsl:value-of select="@usageUsed"/></td> + </tr> + </table> + </xsl:template> + + <xsl:template match="connector"> + <b>Connector -- </b> <xsl:value-of select="@name"/><br /> + + <xsl:apply-templates select="threadInfo"/> + <xsl:apply-templates select="requestInfo"/> + <xsl:apply-templates select="workers"/> + </xsl:template> + + <xsl:template match="threadInfo"> + <table><tr> + <td><b>threadInfo</b></td> + <td><b>maxThreads:</b> <xsl:value-of select="@maxThreads"/></td> + <td><b>currentThreadCount:</b> <xsl:value-of select="@currentThreadCount"/></td> + <td><b>currentThreadsBusy:</b> <xsl:value-of select="@currentThreadsBusy"/></td> + </tr> + </table><hr /> + </xsl:template> + + <xsl:template match="requestInfo"> + <table><tr> + <td><b>requestInfo </b></td> + <td><b>maxTime:</b> <xsl:value-of select="@maxTime"/></td> + <td><b>processingTime:</b> <xsl:value-of select="@processingTime"/></td> + <td><b>requestCount:</b> <xsl:value-of select="@requestCount"/></td> + <td><b>errorCount:</b> <xsl:value-of select="@errorCount"/></td> + <td><b>bytesReceived:</b> <xsl:value-of select="@bytesReceived"/></td> + <td><b>bytesSent:</b> <xsl:value-of select="@bytesSent"/></td> + </tr> + </table><hr /> + </xsl:template> + + <xsl:template match="workers"> + <table> + <tr><th>Stage</th><th>Time</th><th>B Sent</th><th>B Recv</th><th>Client</th><th>VHost</th><th>Request</th></tr> + <xsl:apply-templates select="worker"/> + + </table><hr /> + </xsl:template> + + <xsl:template match="worker"> + <tr> + <td><xsl:value-of select="@stage"/></td> + <td><xsl:value-of select="@requestProcessingTime"/></td> + <td><xsl:value-of select="@requestBytesSent"/></td> + <td><xsl:value-of select="@requestBytesReceived"/></td> + <td><xsl:value-of select="@remoteAddr"/></td> + <td><xsl:value-of select="@virtualHost"/></td> + <td><xsl:value-of select="@method"/> <xsl:value-of select="@currentUri"/>?<xsl:value-of select="@currentQueryString"/> <xsl:value-of select="@protocol"/></td> + </tr> + </xsl:template> + +</xsl:stylesheet> diff --git a/src/tomcat/windows-script.py b/src/tomcat/windows-script.py new file mode 100644 index 0000000000000000000000000000000000000000..3cfa0a9cab06219d72c0dfcfdc128b3f63203592 --- /dev/null +++ b/src/tomcat/windows-script.py @@ -0,0 +1,25 @@ +import subprocess + +pathToTomcat = "C:\\Users\\liang\\Documents\\Git\\Trawl\\tomcat" # REPLACE ME - CUSTOM + +pathToSrc = "\\webapps\\Trawl\\bin\\com\\example\\" +pathToFin = "\\webapps\\Trawl\\WEB-INF\\classes\\com\\example\\" +pathClasspath = pathToTomcat + "\\lib\\servlet-api.jar;" + pathToTomcat + "\\webapps\\Trawl\\bin" + +compileCMD1 = "javac -cp " + pathClasspath + " " + pathToTomcat + pathToSrc + "web\\Director.java" +compileCMD2 = "javac -cp " + pathClasspath + " " + pathToTomcat + pathToSrc + "model\\TrawlExpert.java" + +# print(compileCMD1) +# print(compileCMD2) + +copyCMD1 = "copy " + pathToTomcat + pathToSrc + "web\\Director.class" + " " + pathToTomcat + pathToFin + "web\\Director.class" +copyCMD2 = "copy " + pathToTomcat + pathToSrc + "model\\TrawlExpert.class" + " " + pathToTomcat + pathToFin + "model\\TrawlExpert.class" + +# print(copyCMD1) +# print(copyCMD2) + +# Command Processes +subprocess.call(compileCMD1, shell=True) +subprocess.call(compileCMD2, shell=True) +subprocess.call(copyCMD1, shell=True) +subprocess.call(copyCMD2, shell=True) \ No newline at end of file diff --git a/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.class b/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..c0a3e56ff226dd410460e7aef4a639b5f0734c79 Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java b/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..21fd28856e91315da464559a24ce0739d18f6a78 --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.java @@ -0,0 +1,437 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-12 20:39:19 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; + +public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html; charset=UTF-8"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, false, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\r\n"); + out.write("\r\n"); + +java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy"); +request.setAttribute("year", sdf.format(new java.util.Date())); +request.setAttribute("tomcatUrl", "http://tomcat.apache.org/"); +request.setAttribute("tomcatDocUrl", "/docs/"); +request.setAttribute("tomcatExamplesUrl", "/examples/"); + + out.write("\r\n"); + out.write("<!DOCTYPE html>\r\n"); + out.write("<html lang=\"en\">\r\n"); + out.write(" <head>\r\n"); + out.write(" <meta charset=\"UTF-8\" />\r\n"); + out.write(" <title>"); + out.print(request.getServletContext().getServerInfo() ); + out.write("</title>\r\n"); + out.write(" <link href=\"favicon.ico\" rel=\"icon\" type=\"image/x-icon\" />\r\n"); + out.write(" <link href=\"favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\r\n"); + out.write(" <link href=\"tomcat.css\" rel=\"stylesheet\" type=\"text/css\" />\r\n"); + out.write(" </head>\r\n"); + out.write("\r\n"); + out.write(" <body>\r\n"); + out.write(" <div id=\"wrapper\">\r\n"); + out.write(" <div id=\"navigation\" class=\"curved container\">\r\n"); + out.write(" <span id=\"nav-home\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("\">Home</a></span>\r\n"); + out.write(" <span id=\"nav-hosts\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("\">Documentation</a></span>\r\n"); + out.write(" <span id=\"nav-config\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("config/\">Configuration</a></span>\r\n"); + out.write(" <span id=\"nav-examples\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatExamplesUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("\">Examples</a></span>\r\n"); + out.write(" <span id=\"nav-wiki\"><a href=\"http://wiki.apache.org/tomcat/FrontPage\">Wiki</a></span>\r\n"); + out.write(" <span id=\"nav-lists\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html\">Mailing Lists</a></span>\r\n"); + out.write(" <span id=\"nav-help\"><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("findhelp.html\">Find Help</a></span>\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"asf-box\">\r\n"); + out.write(" <h1>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.servletContext.serverInfo}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</h1>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"upper\" class=\"curved container\">\r\n"); + out.write(" <div id=\"congrats\" class=\"curved container\">\r\n"); + out.write(" <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"notice\">\r\n"); + out.write(" <img src=\"tomcat.png\" alt=\"[tomcat logo]\" />\r\n"); + out.write(" <div id=\"tasks\">\r\n"); + out.write(" <h3>Recommended Reading:</h3>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("security-howto.html\">Security Considerations HOW-TO</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("manager-howto.html\">Manager Application HOW-TO</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("cluster-howto.html\">Clustering/Session Replication HOW-TO</a></h4>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"actions\">\r\n"); + out.write(" <div class=\"button\">\r\n"); + out.write(" <a class=\"container shadow\" href=\"/manager/status\"><span>Server Status</span></a>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"button\">\r\n"); + out.write(" <a class=\"container shadow\" href=\"/manager/html\"><span>Manager App</span></a>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"button\">\r\n"); + out.write(" <a class=\"container shadow\" href=\"/host-manager/html\"><span>Host Manager</span></a>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <!--\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" -->\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"middle\" class=\"curved container\">\r\n"); + out.write(" <h3>Developer Quick Start</h3>\r\n"); + out.write(" <div class=\"col25\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <p><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("setup.html\">Tomcat Setup</a></p>\r\n"); + out.write(" <p><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("appdev/\">First Web Application</a></p>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col25\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <p><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("realm-howto.html\">Realms & AAA</a></p>\r\n"); + out.write(" <p><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("jndi-datasource-examples-howto.html\">JDBC DataSources</a></p>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col25\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <p><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatExamplesUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("\">Examples</a></p>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col25\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <p><a href=\"http://wiki.apache.org/tomcat/Specifications\">Servlet Specifications</a></p>\r\n"); + out.write(" <p><a href=\"http://wiki.apache.org/tomcat/TomcatVersions\">Tomcat Versions</a></p>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"lower\">\r\n"); + out.write(" <div id=\"low-manage\" class=\"\">\r\n"); + out.write(" <div class=\"curved container\">\r\n"); + out.write(" <h3>Managing Tomcat</h3>\r\n"); + out.write(" <p>For security, access to the <a href=\"/manager/html\">manager webapp</a> is restricted.\r\n"); + out.write(" Users are defined in:</p>\r\n"); + out.write(" <pre>$CATALINA_HOME/conf/tomcat-users.xml</pre>\r\n"); + out.write(" <p>In Tomcat 9.0 access to the manager application is split between\r\n"); + out.write(" different users. <a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("manager-howto.html\">Read more...</a></p>\r\n"); + out.write(" <br />\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("RELEASE-NOTES.txt\">Release Notes</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("changelog.html\">Changelog</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("migration.html\">Migration Guide</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("security.html\">Security Notices</a></h4>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"low-docs\" class=\"\">\r\n"); + out.write(" <div class=\"curved container\">\r\n"); + out.write(" <h3>Documentation</h3>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("\">Tomcat 9.0 Documentation</a></h4>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("config/\">Tomcat 9.0 Configuration</a></h4>\r\n"); + out.write(" <h4><a href=\"http://wiki.apache.org/tomcat/FrontPage\">Tomcat Wiki</a></h4>\r\n"); + out.write(" <p>Find additional important configuration information in:</p>\r\n"); + out.write(" <pre>$CATALINA_HOME/RUNNING.txt</pre>\r\n"); + out.write(" <p>Developers may be interested in:</p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\"http://tomcat.apache.org/bugreport.html\">Tomcat 9.0 Bug Database</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("api/index.html\">Tomcat 9.0 JavaDocs</a></li>\r\n"); + out.write(" <li><a href=\"http://svn.apache.org/repos/asf/tomcat/tc9.0.x/\">Tomcat 9.0 SVN Repository</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"low-help\" class=\"\">\r\n"); + out.write(" <div class=\"curved container\">\r\n"); + out.write(" <h3>Getting Help</h3>\r\n"); + out.write(" <h4><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("faq/\">FAQ</a> and <a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html\">Mailing Lists</a></h4>\r\n"); + out.write(" <p>The following mailing lists are available:</p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li id=\"list-announce\"><strong><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html#tomcat-announce\">tomcat-announce</a><br />\r\n"); + out.write(" Important announcements, releases, security vulnerability notifications. (Low volume).</strong>\r\n"); + out.write(" </li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html#tomcat-users\">tomcat-users</a><br />\r\n"); + out.write(" User support and discussion\r\n"); + out.write(" </li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html#taglibs-user\">taglibs-user</a><br />\r\n"); + out.write(" User support and discussion for <a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("taglibs/\">Apache Taglibs</a>\r\n"); + out.write(" </li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html#tomcat-dev\">tomcat-dev</a><br />\r\n"); + out.write(" Development mailing list, including commit messages\r\n"); + out.write(" </li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" </div>\r\n"); + out.write(" <div id=\"footer\" class=\"curved container\">\r\n"); + out.write(" <div class=\"col20\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <h4>Other Downloads</h4>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("download-connectors.cgi\">Tomcat Connectors</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("download-native.cgi\">Tomcat Native</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("taglibs/\">Taglibs</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("deployer-howto.html\">Deployer</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col20\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <h4>Other Documentation</h4>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("connectors-doc/\">Tomcat Connectors</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("connectors-doc/\">mod_jk Documentation</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("native-doc/\">Tomcat Native</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatDocUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("deployer-howto.html\">Deployer</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col20\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <h4>Get Involved</h4>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("getinvolved.html\">Overview</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("svn.html\">SVN Repositories</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("lists.html\">Mailing Lists</a></li>\r\n"); + out.write(" <li><a href=\"http://wiki.apache.org/tomcat/FrontPage\">Wiki</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col20\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <h4>Miscellaneous</h4>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("contact.html\">Contact</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("legal.html\">Legal</a></li>\r\n"); + out.write(" <li><a href=\"http://www.apache.org/foundation/sponsorship.html\">Sponsorship</a></li>\r\n"); + out.write(" <li><a href=\"http://www.apache.org/foundation/thanks.html\">Thanks</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <div class=\"col20\">\r\n"); + out.write(" <div class=\"container\">\r\n"); + out.write(" <h4>Apache Software Foundation</h4>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("whoweare.html\">Who We Are</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("heritage.html\">Heritage</a></li>\r\n"); + out.write(" <li><a href=\"http://www.apache.org\">Apache Home</a></li>\r\n"); + out.write(" <li><a href=\""); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${tomcatUrl}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("resources.html\">Resources</a></li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </div>\r\n"); + out.write(" </div>\r\n"); + out.write(" <br class=\"separator\" />\r\n"); + out.write(" </div>\r\n"); + out.write(" <p class=\"copyright\">Copyright ©1999-"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${year}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write(" Apache Software Foundation. All Rights Reserved</p>\r\n"); + out.write(" </div>\r\n"); + out.write(" </body>\r\n"); + out.write("\r\n"); + out.write("</html>\r\n"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.class b/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..26d886e262ac417dc4078a27ce3a56e8b293d2a7 Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.java b/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..5726e8fab1c658ee79b32e9c2c710586d2549fcc --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/Trawl-Site/org/apache/jsp/result_jsp.java @@ -0,0 +1,152 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-12 20:54:09 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; +import java.util.*; + +public final class result_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("java.util"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + javax.servlet.http.HttpSession session = null; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, true, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + session = pageContext.getSession(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\r\n"); + out.write("<html>\r\n"); + out.write("<body>\r\n"); + out.write("<h1 align=\"center\">Beer Recommendations JSP</h1>\r\n"); + out.write("<p>\r\n"); + out.write("\r\n"); + + List styles = (List)request.getAttribute("styles"); + Iterator it = styles.iterator(); + while (it.hasNext()) { + out.print("<br>TRY: " + it.next()); + } + + out.write("\r\n"); + out.write("</body>\r\n"); + out.write("</html>"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.class b/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..858153e6610d5d5888307c6487e75ee7115c9659 Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.java b/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..da1966168ecab8c04c3c080771c67ade39182c21 --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/Trawl/org/apache/jsp/result_jsp.java @@ -0,0 +1,152 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-13 21:29:18 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; +import java.util.*; + +public final class result_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("java.util"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + javax.servlet.http.HttpSession session = null; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, true, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + session = pageContext.getSession(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\r\n"); + out.write("<html>\r\n"); + out.write("<body>\r\n"); + out.write("<h1 align=\"center\">Trawl Results</h1>\r\n"); + out.write("<p>\r\n"); + out.write("\r\n"); + + List styles = (List)request.getAttribute("styles"); + Iterator it = styles.iterator(); + while (it.hasNext()) { + out.print("<br>TRY: " + it.next()); + } + + out.write("\r\n"); + out.write("</body>\r\n"); + out.write("</html>"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.class b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..06241f9062f25cacae9b37384fbc95a406b1a1b2 Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.java b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..4dccab7e1f1757fbf6678a22f3cf6d039479e093 --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/dates/date_jsp.java @@ -0,0 +1,186 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-21 13:35:58 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp.jsp.dates; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; + +public final class date_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, false, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\r\n"); + out.write("<html>\r\n"); + out.write("\r\n"); + out.write("\r\n"); + out.write("\r\n"); + out.write("<body bgcolor=\"white\">\r\n"); + dates.JspCalendar clock = null; + clock = (dates.JspCalendar) _jspx_page_context.getAttribute("clock", javax.servlet.jsp.PageContext.PAGE_SCOPE); + if (clock == null){ + clock = new dates.JspCalendar(); + _jspx_page_context.setAttribute("clock", clock, javax.servlet.jsp.PageContext.PAGE_SCOPE); + } + out.write("\r\n"); + out.write("\r\n"); + out.write("<font size=4>\r\n"); + out.write("<ul>\r\n"); + out.write("<li> Day of month: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getDayOfMonth()))); + out.write("\r\n"); + out.write("<li> Year: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getYear()))); + out.write("\r\n"); + out.write("<li> Month: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getMonth()))); + out.write("\r\n"); + out.write("<li> Time: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getTime()))); + out.write("\r\n"); + out.write("<li> Date: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getDate()))); + out.write("\r\n"); + out.write("<li> Day: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getDay()))); + out.write("\r\n"); + out.write("<li> Day Of Year: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getDayOfYear()))); + out.write("\r\n"); + out.write("<li> Week Of Year: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getWeekOfYear()))); + out.write("\r\n"); + out.write("<li> era: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getEra()))); + out.write("\r\n"); + out.write("<li> DST Offset: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getDSTOffset()))); + out.write("\r\n"); + out.write("<li> Zone Offset: is "); + out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((dates.JspCalendar)_jspx_page_context.findAttribute("clock")).getZoneOffset()))); + out.write("\r\n"); + out.write("</ul>\r\n"); + out.write("</font>\r\n"); + out.write("\r\n"); + out.write("</body>\r\n"); + out.write("</html>\r\n"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.class b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..a668d586102ecedcbe0ea12460287df9fc14166e Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.java b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..ca04e49876cab3f1dbb248d36210593ef6a8bd04 --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/el/basic_002darithmetic_jsp.java @@ -0,0 +1,231 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-21 13:31:45 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp.jsp.jsp2.el; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; + +public final class basic_002darithmetic_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + javax.servlet.http.HttpSession session = null; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, true, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + session = pageContext.getSession(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("\r\n"); + out.write("<html>\r\n"); + out.write(" <head>\r\n"); + out.write(" <title>JSP 2.0 Expression Language - Basic Arithmetic</title>\r\n"); + out.write(" </head>\r\n"); + out.write(" <body>\r\n"); + out.write(" <h1>JSP 2.0 Expression Language - Basic Arithmetic</h1>\r\n"); + out.write(" <hr>\r\n"); + out.write(" This example illustrates basic Expression Language arithmetic.\r\n"); + out.write(" Addition (+), subtraction (-), multiplication (*), division (/ or div),\r\n"); + out.write(" and modulus (% or mod) are all supported. Error conditions, like\r\n"); + out.write(" division by zero, are handled gracefully.\r\n"); + out.write(" <br>\r\n"); + out.write(" <blockquote>\r\n"); + out.write(" <code>\r\n"); + out.write(" <table border=\"1\">\r\n"); + out.write(" <thead>\r\n"); + out.write(" <td><b>EL Expression</b></td>\r\n"); + out.write(" <td><b>Result</b></td>\r\n"); + out.write(" </thead>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${1}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${1}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${1 + 2}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${1 + 2}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${1.2 + 2.3}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${1.2 + 2.3}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${1.2E4 + 1.4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${1.2E4 + 1.4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${-4 - 2}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${-4 - 2}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${21 * 2}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${21 * 2}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${3/4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${3/4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${3 div 4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${3 div 4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${3/0}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${3/0}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${10%4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${10%4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${10 mod 4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${10 mod 4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" <tr>\r\n"); + out.write(" <td>${(1==2) ? 3 : 4}</td>\r\n"); + out.write(" <td>"); + out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${(1==2) ? 3 : 4}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null)); + out.write("</td>\r\n"); + out.write(" </tr>\r\n"); + out.write(" </table>\r\n"); + out.write(" </code>\r\n"); + out.write(" </blockquote>\r\n"); + out.write(" </body>\r\n"); + out.write("</html>\r\n"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class b/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..aae4ffe6735adde40d17c18a3703df742b97cd0e Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java b/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..659b3b4949b52dd340d72b34eed06fa49f6fcd8e --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/host-manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java @@ -0,0 +1,186 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-21 13:30:48 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp.WEB_002dINF.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; + +public final class _401_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, false, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n"); + out.write("<html>\r\n"); + out.write(" <head>\r\n"); + out.write(" <title>401 Unauthorized</title>\r\n"); + out.write(" <style type=\"text/css\">\r\n"); + out.write(" <!--\r\n"); + out.write(" BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}\r\n"); + out.write(" H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}\r\n"); + out.write(" PRE, TT {border: 1px dotted #525D76}\r\n"); + out.write(" A {color : black;}A.name {color : black;}\r\n"); + out.write(" -->\r\n"); + out.write(" </style>\r\n"); + out.write(" </head>\r\n"); + out.write(" <body>\r\n"); + out.write(" <h1>401 Unauthorized</h1>\r\n"); + out.write(" <p>\r\n"); + out.write(" You are not authorized to view this page. If you have not changed\r\n"); + out.write(" any configuration files, please examine the file\r\n"); + out.write(" <tt>conf/tomcat-users.xml</tt> in your installation. That\r\n"); + out.write(" file must contain the credentials to let you use this webapp.\r\n"); + out.write(" </p>\r\n"); + out.write(" <p>\r\n"); + out.write(" For example, to add the <tt>admin-gui</tt> role to a user named\r\n"); + out.write(" <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the\r\n"); + out.write(" config file listed above.\r\n"); + out.write(" </p>\r\n"); + out.write("<pre>\r\n"); + out.write("<role rolename=\"admin-gui\"/>\r\n"); + out.write("<user username=\"tomcat\" password=\"s3cret\" roles=\"admin-gui\"/>\r\n"); + out.write("</pre>\r\n"); + out.write(" <p>\r\n"); + out.write(" Note that for Tomcat 7 onwards, the roles required to use the host manager\r\n"); + out.write(" application were changed from the single <tt>admin</tt> role to the\r\n"); + out.write(" following two roles. You will need to assign the role(s) required for\r\n"); + out.write(" the functionality you wish to access.\r\n"); + out.write(" </p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><tt>admin-gui</tt> - allows access to the HTML GUI</li>\r\n"); + out.write(" <li><tt>admin-script</tt> - allows access to the text interface</li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" <p>\r\n"); + out.write(" The HTML interface is protected against CSRF but the text interface is not.\r\n"); + out.write(" To maintain the CSRF protection:\r\n"); + out.write(" </p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li>Users with the <tt>admin-gui</tt> role should not be granted the\r\n"); + out.write(" <tt>admin-script</tt> role.</li>\r\n"); + out.write(" <li>If the text interface is accessed through a browser (e.g. for testing\r\n"); + out.write(" since this interface is intended for tools not humans) then the browser\r\n"); + out.write(" must be closed afterwards to terminate the session.</li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" </body>\r\n"); + out.write("\r\n"); + out.write("</html>\r\n"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +} diff --git a/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class b/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class new file mode 100644 index 0000000000000000000000000000000000000000..b0925a11a3c85effa590d365366e672f60e58458 Binary files /dev/null and b/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.class differ diff --git a/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java b/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java new file mode 100644 index 0000000000000000000000000000000000000000..e1d2a08864702b0a8ccccb4bf391684320b40b7b --- /dev/null +++ b/src/tomcat/work/Catalina/localhost/manager/org/apache/jsp/WEB_002dINF/jsp/_401_jsp.java @@ -0,0 +1,195 @@ +/* + * Generated by the Jasper component of Apache Tomcat + * Version: Apache Tomcat/9.0.6 + * Generated at: 2018-03-12 20:42:32 UTC + * Note: The last modified time of this file was set to + * the last modified time of the source file after + * generation to assist with modification tracking. + */ +package org.apache.jsp.WEB_002dINF.jsp; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.servlet.jsp.*; + +public final class _401_jsp extends org.apache.jasper.runtime.HttpJspBase + implements org.apache.jasper.runtime.JspSourceDependent, + org.apache.jasper.runtime.JspSourceImports { + + private static final javax.servlet.jsp.JspFactory _jspxFactory = + javax.servlet.jsp.JspFactory.getDefaultFactory(); + + private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; + + private static final java.util.Set<java.lang.String> _jspx_imports_packages; + + private static final java.util.Set<java.lang.String> _jspx_imports_classes; + + static { + _jspx_imports_packages = new java.util.HashSet<>(); + _jspx_imports_packages.add("javax.servlet"); + _jspx_imports_packages.add("javax.servlet.http"); + _jspx_imports_packages.add("javax.servlet.jsp"); + _jspx_imports_classes = null; + } + + private volatile javax.el.ExpressionFactory _el_expressionfactory; + private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; + + public java.util.Map<java.lang.String,java.lang.Long> getDependants() { + return _jspx_dependants; + } + + public java.util.Set<java.lang.String> getPackageImports() { + return _jspx_imports_packages; + } + + public java.util.Set<java.lang.String> getClassImports() { + return _jspx_imports_classes; + } + + public javax.el.ExpressionFactory _jsp_getExpressionFactory() { + if (_el_expressionfactory == null) { + synchronized (this) { + if (_el_expressionfactory == null) { + _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); + } + } + } + return _el_expressionfactory; + } + + public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { + if (_jsp_instancemanager == null) { + synchronized (this) { + if (_jsp_instancemanager == null) { + _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); + } + } + } + return _jsp_instancemanager; + } + + public void _jspInit() { + } + + public void _jspDestroy() { + } + + public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) + throws java.io.IOException, javax.servlet.ServletException { + + if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { + final java.lang.String _jspx_method = request.getMethod(); + if ("OPTIONS".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + return; + } + if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { + response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); + response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS"); + return; + } + } + + final javax.servlet.jsp.PageContext pageContext; + final javax.servlet.ServletContext application; + final javax.servlet.ServletConfig config; + javax.servlet.jsp.JspWriter out = null; + final java.lang.Object page = this; + javax.servlet.jsp.JspWriter _jspx_out = null; + javax.servlet.jsp.PageContext _jspx_page_context = null; + + + try { + response.setContentType("text/html"); + pageContext = _jspxFactory.getPageContext(this, request, response, + null, false, 8192, true); + _jspx_page_context = pageContext; + application = pageContext.getServletContext(); + config = pageContext.getServletConfig(); + out = pageContext.getOut(); + _jspx_out = out; + + out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n"); + out.write("<html>\r\n"); + out.write(" <head>\r\n"); + out.write(" <title>401 Unauthorized</title>\r\n"); + out.write(" <style type=\"text/css\">\r\n"); + out.write(" <!--\r\n"); + out.write(" BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;font-size:12px;}\r\n"); + out.write(" H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}\r\n"); + out.write(" PRE, TT {border: 1px dotted #525D76}\r\n"); + out.write(" A {color : black;}A.name {color : black;}\r\n"); + out.write(" -->\r\n"); + out.write(" </style>\r\n"); + out.write(" </head>\r\n"); + out.write(" <body>\r\n"); + out.write(" <h1>401 Unauthorized</h1>\r\n"); + out.write(" <p>\r\n"); + out.write(" You are not authorized to view this page. If you have not changed\r\n"); + out.write(" any configuration files, please examine the file\r\n"); + out.write(" <tt>conf/tomcat-users.xml</tt> in your installation. That\r\n"); + out.write(" file must contain the credentials to let you use this webapp.\r\n"); + out.write(" </p>\r\n"); + out.write(" <p>\r\n"); + out.write(" For example, to add the <tt>manager-gui</tt> role to a user named\r\n"); + out.write(" <tt>tomcat</tt> with a password of <tt>s3cret</tt>, add the following to the\r\n"); + out.write(" config file listed above.\r\n"); + out.write(" </p>\r\n"); + out.write("<pre>\r\n"); + out.write("<role rolename=\"manager-gui\"/>\r\n"); + out.write("<user username=\"tomcat\" password=\"s3cret\" roles=\"manager-gui\"/>\r\n"); + out.write("</pre>\r\n"); + out.write(" <p>\r\n"); + out.write(" Note that for Tomcat 7 onwards, the roles required to use the manager\r\n"); + out.write(" application were changed from the single <tt>manager</tt> role to the\r\n"); + out.write(" following four roles. You will need to assign the role(s) required for\r\n"); + out.write(" the functionality you wish to access.\r\n"); + out.write(" </p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li><tt>manager-gui</tt> - allows access to the HTML GUI and the status\r\n"); + out.write(" pages</li>\r\n"); + out.write(" <li><tt>manager-script</tt> - allows access to the text interface and the\r\n"); + out.write(" status pages</li>\r\n"); + out.write(" <li><tt>manager-jmx</tt> - allows access to the JMX proxy and the status\r\n"); + out.write(" pages</li>\r\n"); + out.write(" <li><tt>manager-status</tt> - allows access to the status pages only</li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" <p>\r\n"); + out.write(" The HTML interface is protected against CSRF but the text and JMX interfaces\r\n"); + out.write(" are not. To maintain the CSRF protection:\r\n"); + out.write(" </p>\r\n"); + out.write(" <ul>\r\n"); + out.write(" <li>Users with the <tt>manager-gui</tt> role should not be granted either\r\n"); + out.write(" the <tt>manager-script</tt> or <tt>manager-jmx</tt> roles.</li>\r\n"); + out.write(" <li>If the text or jmx interfaces are accessed through a browser (e.g. for\r\n"); + out.write(" testing since these interfaces are intended for tools not humans) then\r\n"); + out.write(" the browser must be closed afterwards to terminate the session.</li>\r\n"); + out.write(" </ul>\r\n"); + out.write(" <p>\r\n"); + out.write(" For more information - please see the\r\n"); + out.write(" <a href=\"/docs/manager-howto.html\">Manager App HOW-TO</a>.\r\n"); + out.write(" </p>\r\n"); + out.write(" </body>\r\n"); + out.write("\r\n"); + out.write("</html>\r\n"); + } catch (java.lang.Throwable t) { + if (!(t instanceof javax.servlet.jsp.SkipPageException)){ + out = _jspx_out; + if (out != null && out.getBufferSize() != 0) + try { + if (response.isCommitted()) { + out.flush(); + } else { + out.clearBuffer(); + } + } catch (java.io.IOException e) {} + if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); + else throw new ServletException(t); + } + } finally { + _jspxFactory.releasePageContext(_jspx_page_context); + } + } +}