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

时间:2012-08-21 12:45:47

标签: jsp authentication tomcat servlets servlet-filters

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

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

  1. MainPage.html
  2. Servlet1(java class)
  3. 一些jsp文件。 (其中一些仅适用于管理员 - 例如,driving_page.jsp
  4. 在主页面中,表单内有4个按钮,可以重定向到servlet。 当我点击一个按钮,它进入servlet,servlet重定向到driving_page.jsp,但首先它需要显示login.jsp页面,但它没有...

    在Chrome中,我输入了drive_page网址为localhost:8080/TaxiWeb/driving_page.jsp 在显示页面之前,它会显示“login.jsp页面,因为它需要。”

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

    注意: driving_page.jsp文件位于文件夹: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);
    }
    

2 个答案:

答案 0 :(得分:2)

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

  

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

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

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

答案 1 :(得分:0)

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