【问题标题】:How to fix Tomcat access to the requested resouce which has been denied?如何修复Tomcat访问被拒绝的请求资源?
【发布时间】:2013-08-21 01:40:56
【问题描述】:

更新:当<auth-constraint> 元素被完全删除时,代码可以正常工作。谁能解释为什么它在存在时不起作用?

我正在编写一些代码来练习在部署描述符中保护 servlet,我在浏览器中得到以下信息:

HTTP Status 403 - Access to the requested resource has been denied
type Status report
message Access to the requested resource has been denied
description Access to the specified resource has been forbidden.
Apache Tomcat/7.0.42

关于我做错了什么有什么想法吗?我已经对以前的帖子进行了一些搜索,似乎 Tomcat 7 中的角色名称可能已经更新 - 我已经玩过这个,但到目前为止还没有成功。 (代码如下)。

web.xml

<?xml version="1.0" ?>
<web-app version="2.4" 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">

<servlet>
    <servlet-name>CheckedServlet</servlet-name>
    <servlet-class>webcert.ch05.ex0502J.CheckedServlet</servlet-class>
    <security-role-ref>
        <role-name>MGR</role-name>
        <role-link>manager</role-link>
    </security-role-ref>
</servlet>
<servlet-mapping>
    <servlet-name>CheckedServlet</servlet-name>
    <url-pattern>/CheckedServlet</url-pattern>
</servlet-mapping>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>CheckedServletConstraint</web-resource-name>
        <url-pattern>/CheckedServlet</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>
<security-role>
    <role-name>manager</role-name>
</security-role>

CheckedServlet.java

package webcert.ch05.ex0502J;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.security.*;

public class CheckedServlet extends HttpServlet{

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException{

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.write("<html><head><title>CheckedServlet</title></head><body>");

    String userMessage;
    Principal user = request.getUserPrincipal();
    if(user == null)
        userMessage = "Access denied.";
    else
        userMessage = "Access granted.";

    out.write("<br>" + userMessage + " Principal name is " + user +
              "<br>If authorized, you should see some more text below:");

    if(request.isUserInRole("manager"))
        out.write("<br>Here's some super secret extra text since your " +
                "role is manager.");

    out.write("</body></html>");
    out.flush();
    out.close();
}
}

【问题讨论】:

  • 您好 Jeff,您找到原因了吗?我在我的盒子上也注意到了同样的问题。如果您能在这里分享,我将不胜感激。谢谢。
  • 嗨 Tariq - 目前还没有运气。我在为 OCWCD 考试学习的背景下提出了这个问题,因此我已经转向其他主题。我计划在下一次通过文本时重新访问,如果我找到答案,我一定会发布。
  • 谢谢杰夫。我很感激:)

标签: servlets tomcat7 http-status-code-403 security-constraint


【解决方案1】:

如果您为您的 Web 应用程序启用了安全性(就像您通过在 web.xml 中添加 &lt;security-constraint&gt; 子句所做的那样),您还需要在 tomcat-user.xml 中定义相应的用户/角色/密码。该文件通常位于 tomcat 安装的 conf 文件夹中。以下是您可以添加到安装的 tomcat-user.xml 文件中的示例行:

<role rolename="MGR"/>  
<user password="mypassword" roles="MGR" username="user1"/>
<user password="mypassword2" roles="MGR" username="user2"/>

现在,当您访问您的应用程序时,您的应用程序不会收到状态 403 错误消息,而是提示您使用 HTTP 基本身份验证输入用户 ID/密码。如果您使用上述用户 ID 之一,您应该能够成功登录。

【讨论】:

    【解决方案2】:

    您需要在 web.xml 中添加以下内容:

    <login-config>
      <auth-method>BASIC</auth-method>
    </login-config>
    

    然后您还可以编辑您的tomcat-user.xml 以添加角色和用户名。在这些之后重新部署应用程序,这个问题应该消失了。

    【讨论】:

      【解决方案3】:

      其他成员的两句话是正确的。总结添加角色的要点,登录配置和相应的tomcat用户配置,您可以看看这篇文章:

      How to fix Tomcat HTTP Status 403: Access to the requested resource has been denied?

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 2011-08-14
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 2017-10-07
        • 2023-02-14
        • 2020-06-06
        相关资源
        最近更新 更多