3

更新:當完全移除<auth-constraint>元素時,代碼正常工作。任何人都可以解釋爲什麼現在不工作?如何解決Tomcat訪問被拒絕的請求的資源?

我正在寫一些代碼的做法,在部署描述符確保一個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(); 
} 
} 
+0

您好傑夫,是你能找到的原因是什麼?我也注意到我的盒子上也有同樣的問題。如果你能在這裏分享,我將不勝感激。謝謝。 – Tariq

+0

嗨塔裏克 - 到目前爲止還沒有運氣。我在爲OCWCD考試進行學習的過程中提出了這個問題,因此我開始轉向其他主題。我打算重新審視文本中的下一遍,如果我找到答案,我一定會發帖。 –

+0

謝謝傑夫。我明白:) :) – Tariq

回答

4

如果啓用安全爲你的Web應用程序(如您已通過添加<security-constraint>條款做到web.xml),您還需要在t中定義相應的用戶/角色/密碼omcat-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基本身份驗證輸入用戶名/密碼。如果您使用上述用戶標識之一,則應該能夠成功登錄。

2

您需要添加在你的web.xml如下:

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

,然後你還可以編輯tomcat-user.xml添加角色和用戶名。在這些之後重新部署應用程序,這個問題應該消失。

相關問題