背景:
我的任务是通过start/stop/reload
JMX
部署在tomcat,jboss,weblogic或websphere中的应用程序。 (一个人可能知道所提到的Web应用程序服务器已经具有管理器页面来实现它,我们只想通过start/stop/reload
将所有这四个主要Web服务器管理员的JMX
功能集中到一个页面中。)
与tomcat有关的问题:
我有一个名为JMXWebExample1-0.1
的示例应用程序。我可以通过在提示的登录页面中输入tomcat/tomcat(username/password)
来访问管理器页面,然后单击应用程序名称旁边的停止按钮,即可看到以下链接。
http://localhost:8080/manager/html/stop;jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3?path=/JMXWebExample1-0.1&org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423
链接包含jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3
和CSRF token org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423
。
因此,当我调用http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1
时,它总是为我提供403状态代码(访问被拒绝)。 问题是我如何停止类似于tomcat管理器页面的应用程序JMXWebExample1-0.1
?
启动tomcat之前的一些步骤
在tomcat启动之前,我需要执行以下步骤:
1)通过添加%CATALINA_OPTS%,
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
2)tomcat-users.xml
:我进行了以下配置:
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
3)E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml
下的context.xml,我在下面的行中注释:
<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|\d+\.\d+\.\d+\.\d+" /> -->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
更新:
E:\apache-tomcat-9.0.12\conf\tomcat-users.xml
,登录时我使用tomcat
。
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="admin-script" />
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="admin-gui"/>
<role rolename="admin-jmx" />
<user username="tomcat" password="tomcat" roles="manager-gui,manager-jmx"/>
<user username="both" password="both" roles="tomcat,role1"/>
<user username="role1" password="role1" roles="role1"/>
<user username="all" password="all" roles="tomcat,role1,manager-script,manager-jmx" />
在E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml
中:
<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|\d+\.\d+\.\d+\.\d+" /> -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow=".*" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
调用命令:http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1
答案 0 :(得分:0)
首先,tomcat提供必须以不同方式访问的HTML
和JMX
接口。
您正在尝试使用html,因此您应该向
/ manager页面使用org.apache.catalina.filters.CSRF_NONCE
参数来防止CSRF。如果已删除,则会收到错误403和说明:
HTML界面受CSRF保护,但文本和JMX接口不受保护。要维持CSRF保护,请执行以下操作:
不应该授予具有manager-gui角色的用户
manager-script
或manager-jmx
角色。
因此,如果要停止应用程序,请发送带有有效CSRF令牌的POST请求。
通过JMX停止应用
首先,您禁用了-Dcom.sun.management.jmxremote.authenticate=false
的身份验证,您可能想要更改它。通过连接到jconsole
地址的远程应用程序,<ip address>:9000
可用于通过JMX控制tomcat。
然后,要停止使用Catalina -> WebModule
MBean的应用程序,您将看到一些可用的操作,找到stop()
并使用它:
最后,如the docs所示,我认为您应该更改验证模式或完全删除allow
属性。注释掉阀门可能会禁用该功能。
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow=".*"/>
另外,the role for JMX access是manager-jmx
。
请注意此处的安全性!