为什么Ant在部署时返回403?

cod*_*der 8 java ant tomcat tomcat7

我正在尝试部署到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
Run Code Online (Sandbox Code Playgroud)

这是我的构建文件

<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>
Run Code Online (Sandbox Code Playgroud)

小智 15

manager.username和manager.password中提到的帐户必须是"manager-script"(或"admin-script",如果不起作用).

似乎"经理"和"管理员"角色在Tomcat 7中更改为"manager-gui","admin-gui","manager-script"(用于文本连接),"admin-script"(用于文本连接) .

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

403访问被拒绝

您无权查看此页面.

如果您已将Manager应用程序配置为允许访问,并且您已使用浏览器后退按钮,使用已保存的书签或类似标记,那么您可能已触发已为HTML启用的跨站点请求伪造(CSRF)保护Manager应用程序的界面.您需要返回主Manager页面重置此保护.返回此页面后,您将能够继续正常使用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角色.如果通过浏览器访问text或jmx接口(例如,为了测试,因为这些接口用于工具而非人类),则必须在之后关闭浏览器以终止会话.有关更多信息,请参阅Manager App HOW-TO.


小智 7

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

  • +1这是我修复它的原因. (3认同)