【问题标题】:Why is Ant returning a 403 on deploy?为什么 Ant 在部署时返回 403?
【发布时间】:2011-10-30 07:06:30
【问题描述】:

我正在尝试部署到 Tomcat 7 中的 war 文件。它给了我以下错误。

deploy:
   [echo] Deploying on Tomcat.

BUILD FAILED
   C:\Users\coder\workspace\projectName\build.xml:84: java.io.IOException: Server returned    
   HTTP response code: 403 for URL: http://localhost:8090/manager/deploy?path=%2FprojectName

这是我的构建文件

<project name="ProjectName" default="main"
                basedir=".">

                <!-- Tell ant to use my environment variables -->
                <property environment="env"/>

                <property file="./build.properties"/>
                <property name="username" value="someUsername"/>
                <property name="password" value="somePassword"/>

                <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>

                <property name="tomcat.home"
                value="${env.CATALINA_HOME}"/>
                <property name="hibernate.home"
                value="${env.CATALINA_HOME}"/>
                <property name="servlet.jar"
                value="${tomcat.home}/common/lib/servlet-api.jar"/>
                <property name="jsp.jar"
                value="${tomcat.home}/common/lib/jsp-api.jar"/>
                <property name="hibernate.jar" value="C:/hibernate-distribution-3.6.4.Final/hibernate3.jar"/>

                <property name="deploy.dir"
                value="${tomcat.home}/webapps"/>
                <property name="build.compiler" value="modern"/>
                <property name="build.dir" value="build" />
                <property name="src.dir" value="src"/>
                <property name="war.file" value="projectName"/>
                <property name="war.file.name" value="${war.file}.war"/>

                <path id="project.class.path">
                <fileset dir="./WEB-INF/lib/">
                <include name="**/*.jar"/>
                </fileset>
                <pathelement path="${src.dir}"/>
                <pathelement path="${servlet.jar}"/>
                <pathelement path="${jsp.jar}"/>
                <pathelement path="${hibernate.jar}"/>
                </path>

                <target name="clean">
                <delete dir="${build.dir}" includeEmptyDirs="true" />
                </target>

                <target name="prep">
                <mkdir dir="${build.dir}"/>
                </target>

                <target name="compile">
                <javac srcdir="${src.dir}"
                destdir="${build.dir}"
                debug="on"
                deprecation="on">
                <include name="**/*.java"/>
                <classpath refid="project.class.path"/>
                </javac>
                </target>

                <target name="cleanWebApp">
                <delete file="${deploy.dir}/${war.file.name}" />
                <delete dir="${deploy.dir}/${war.file}"
                includeEmptyDirs="true" />
                </target>

                <target name="war">
                <war warfile="${war.file.name}"
                webxml="./WEB-INF/web.xml">
                <fileset dir="./" includes="**/*.*" excludes="*.war,
                **/*.nbattrs, web.xml, **/WEB-INF/**/*.*,
                **/project-files/**/*.*"/>
                <webinf dir="./WEB-INF" includes="**/*"
                excludes="web.xml, **/*.jar, **/*.class"/>
                <lib dir="./WEB-INF/lib"/>
                <classes dir="${build.dir}"/>
                <classes dir="${src.dir}">
                <include name="**/*.properties"/>
                </classes>
                </war>
                </target>

                <target name="deploy">
                    <echo message="Deploying on Tomcat." />
                    <deploy url="http://localhost:8090/manager" username="someUsername"
                     password="somePassword" path="/projectName" war="./${war.file.name}" />
                </target>

                <target name="main" depends="clean, prep, cleanWebApp,
                compile, war, deploy"/>

                </project>

【问题讨论】:

  • 403是HTTP响应码,表示资源被禁止。在这种情况下,您的 Tomcat 管理器。检查您的用户名、密码、路径等。

标签: java tomcat ant tomcat7


【解决方案1】:

manager.username 和 manager.password 中提到的帐户必须是“manager-script”(如果不起作用,也可以是“admin-script”)的角色。

好像“manager”和“admin”角色改成了“manager-gui”、“admin-gui”、“manager-script”(用于文本连接)、“admin-script”(用于文本连接)在 Tomcat 7 中。

我从下面的错误页面中找到了 4 个与经理相关的角色:

403 访问被拒绝

您无权查看此页面。

如果您已将 Manager 应用程序配置为允许访问,并且您已使用浏览器的后退按钮、使用保存的书签或类似功能,则您可能触发了已启用的跨站点请求伪造 (CSRF) 保护用于 Manager 应用程序的 HTML 界面。您需要通过返回主管理器页面来重置此保护。返回此页面后,您将能够继续正常使用 Manager 应用程序的 HTML 界面。如果您继续看到此访问被拒绝消息,请检查您是否拥有访问此应用程序的必要权限。

如果您没有更改任何配置文件,请检查安装中的文件 conf/tomcat-users.xml。该文件必须包含允许您使用此 web 应用程序的凭据。

例如,要将 manager-gui 角色添加到名为 tomcat 且密码为 s3cret 的用户,请将以下内容添加到上面列出的配置文件中。

请注意,对于 Tomcat 7 及更高版本,使用管理器应用程序所需的角色已从单个管理器角色更改为以下四个角色。您需要分配您希望访问的功能所需的角色。

manager-gui - 允许访问 HTML GUI 和状态页面

manager-script - 允许访问文本界面和状态页面

manager-jmx - 允许访问 JMX 代理和状态页面

manager-status - 只允许访问状态页面

HTML 界面受到 CSRF 保护,但文本和 JMX 界面没有。维护 CSRF 保护:

不应授予具有 manager-gui 角色的用户 manager-script 或 manager-jmx 角色。 如果文本或 jmx 接口是通过浏览器访问的(例如,用于测试,因为这些接口是为工具而非人类设计的),那么之后必须关闭浏览器以终止会话。 有关更多信息 - 请参阅 Manager App HOW-TO。

【讨论】:

    【解决方案2】:

    您应该使用的基本 URL 应该是:http://localhost:8090/manager/text

    【讨论】:

    • 这应该是公认的答案。仅将 /text 添加到经理路径对我有用
    • 它也对我有用,我认为如果脚本是由 netbeans 生成的,那么你必须更改 ant-deploy.xml 中的 url
    【解决方案3】:

    您收到拒绝访问错误。

    这可能是因为您的用户名或密码不正确,或者您没有正确添加角色。

    这是来自 Tomcat 文档的简介 --

    Apache Tomcat 6.0 Realm Configuration HOW-TO 写道:如果你想使用 管理器应用程序,用于在一个应用程序中部署和取消部署应用程序 运行 Tomcat 安装,您必须将“经理”角色添加到 at 在您选择的 Realm 实现中至少有一个用户名。这是 因为管理器 Web 应用程序本身使用了安全约束 需要角色“经理”访问其中的任何请求 URI 应用。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      我在使用 Tomcat 6 时遇到了同样的问题,但上面的任何解决方案都对我没有帮助。 所以我通过在 tomcat-users 中为用户添加额外的角色('manager')来修复它。

      <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,manager"/>
      

      【讨论】:

        【解决方案5】:

        我最近遇到了这个错误,这些方法都没有帮助我。

        解决方案是显式将角色写入 tomcat-users.xml:

        <role rolename="manager-gui"/>
        <role rolename="manager-script"/>
        <role rolename="admin-gui"/>
        <role rolename="admin-script"/>
        <user name="admin" password="admin" roles="admin-gui,admin-script,manager-gui,manager-script"/>
        

        角色admin-guiadmin-script 不是运行脚本所必需的,我需要他们使用此用户在Web gui 中管理tomcat。

        【讨论】:

          猜你喜欢
          • 2015-08-22
          • 2019-11-17
          • 2016-05-06
          • 1970-01-01
          • 1970-01-01
          • 2021-03-31
          • 2017-05-15
          • 2019-11-21
          • 1970-01-01
          相关资源
          最近更新 更多