如何使用servlet和jsp进行身份验证



我使用的是带有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内。。因此CCD_ 13文件中的CCD_。

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);
}

您的问题属于servlet规范13.2(声明安全性)

安全模型适用于web的静态内容部分应用程序中的servlet和筛选器由客户端请求。当servlet使用RequestDispatcher来调用静态资源或servlet使用forward或include。

基本上,您的安全约束只会被初始请求获取,而被servlet转发忽略。

解决方法是将所有安全JSP移到WEB-INF文件夹下,这样就不能直接访问它们。更新到那里的前进路径。然后指出您的安全约束以覆盖servlet而不是JSP。

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

最新更新