0

我正在使用带有 tomcat 7.0 的 Eclipse IDE。

我有一个 Web 应用程序,现在在我的 Web 应用程序中:

  1. MainPage.html
  2. Servlet1(java类)
  3. 一些jsp文件。(其中一些仅供管理员使用 - 例如,driving_page.jsp

在主页中,我在重定向到 servlet 的表单中有 4 个按钮。当我单击一个按钮时,它会转到 servlet,servlet 重定向到driving_page.jsp但首先它需要显示login.jsp页面并且它没有..

在 chrome 中,我在显示页面之前输入了driving_page URL localhost:8080/TaxiWeb/driving_page.jsp ,它向我显示了login.jsp需要的页面。

但是如果我点击MainPage.html上面提到的按钮,它会跳过login.jsp页面并直接进入driving_page.jsp页面。为什么?

注意:driving_page.jsp文件位于 FOLDER:AdminPages.. 中,因此文件url-pattern中的web.xml内容是正确的。

tomcat-users.xml:

<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>  
  <user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>

my web.xml file:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<security-constraint>
  <web-resource-collection>
      <web-resource-name>Driving page</web-resource-name>
      <url-pattern>/AdminPages/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
      <role-name>role1</role-name>
  </auth-constraint>
  </security-constraint>
  <security-role><role-name>role1</role-name></security-role>

  <login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/login_error.jsp</form-error-page>
  </form-login-config>
  </login-config>
  !-- ********************************************************************** -->
  <servlet>
     <servlet-name>Servlet1</servlet-name>
     <servlet-class>pack.servlets.servlet1</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>Servlet1</servlet-name>
     <url-pattern>/Servlet1</url-pattern>
   </servlet-mapping>

和 servlet 代码:注意:我只是在 servlet 中添加提到的按钮代码:

    else if (request.getParameter("submit").equals("Show Taxis at Driving"))
{
   request.getRequestDispatcher("AdminPages/driving_page.jsp").forward(request,response);
}
4

2 回答 2

2

您的问题属于servlet 规范 13.2 (Declarative Security)

安全模型适用于 Web 应用程序的静态内容部分以及应用程序中客户端请求的 servlet 和过滤器。当 servlet 使用 RequestDispatcher 调用静态资源或使用转发的 servlet 时,安全模型不适用或包含。

基本上,您的安全约束只会被初始请求接收并被您的 servlet 转发忽略。

解决此问题的方法是将所有安全 JSP 移动到 WEB-INF 文件夹下,以便无法直接访问它们。更新您到那里的前进路径。然后将您的安全约束指向您的 servlet 而不是 JSP。

于 2012-08-23T12:46:40.497 回答
0

在这里,您需要使用. 此response.sendRedirect(String location)方法将响应连同状态码和新页面位置一起发送回浏览器。现在,浏览器再次发送重定向“位置”的新请求。
在这里,您需要Filter在该 URL 上有一个,并且在该过滤器中,您需要检查是否允许用户查看此页面。

于 2012-08-23T14:03:00.163 回答