用户登录jsp servlet后阻止返回登录页面

时间:2011-04-24 17:07:20

标签: java jsp session servlets servlet-filters

我正在使用jsp servlet创建一个Web应用程序,我想阻止用户显示登录页面,如果他已经登录,我会做一个过滤器检查,但它仍然显示登录页面,即使用户有一个有效的session,这是Filter中的代码。

  HttpSession session = httpreq.getSession(false);

    if(session == null){
        System.out.println("not logged, redirect ");
          httpres.sendRedirect("../Login.jsp");

    }
    else{
            System.out.println("could be logged");
           String logged = (String) session.getAttribute("Login");
           if(logged != null){
                   System.out.println(" logged  "+logged);
               if (!logged.equals("ok")) { // user is not logged
                    System.out.println("not logged, redirect ");
                    httpres.sendRedirect("../Login.jsp");
                    return;
                } else {  // if user has a session redirect his to the page he was opened
                       System.out.println("redirect to the  same page");
                    chain.doFilter(request, response);
                    System.out.println("redirect to the  same page");
                    httpres.setCharacterEncoding("UTF-8");
                    httpres.sendRedirect(httpreq.getRequestURI());
                }
           }else
           {
                 System.out.println("not logged, redirect login ");
                    httpres.sendRedirect("../Login.jsp");
                    return;
           }

    }

我只对位于WEB-INF文件夹之外的文件夹进行会话。

修改:以下是检查用户有效性并向会话添加属性的代码

  isVaild = StudentManagement.isValidUser(connection, studentUserName, password);
               //     I have more than one roles in the system..
            }
            if (isVaild) {

                System.out.println("create session");
                HttpSession session = request.getSession();
                session.setAttribute("Login", "ok");
                session.setAttribute("userName", userName);
                session.setAttribute("role", role);
                if (role == UserRole.STUDENT) {  //student role
                    url = "/ParentManagementServlet?pageName=StudentActivationPage";

                    forward(request, response, url);
                } else if (role == UserRole.ADMIN) {  //admin role
                    url = "/Admin/MainPage.jsp";
                    forward(request, response, url);
                }

编辑2: 这是web.xml文件中的URL映射

 <filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/Admin/*</url-pattern>
</filter-mapping>

因为Admin是位于WEB-INF文件夹之外的文件夹。

1 个答案:

答案 0 :(得分:0)

除了过滤器映射外,一切似乎都很好,试试 -

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/protected directory/*</url-pattern>
</filter-mapping>

我假设您要保护目录中的所有内容,并且上面的url模式将检查整个目录..您可以根据需要微调模式。
但重点是 - 问题中提到的模式(<url-pattern>/Admin/*</url-pattern>拦截Login.jsp这就是为什么它无法执行会话检查并呈现Login.jsp即使对于有效会话也是如此。
您可以在现有过滤器中执行检查 - 请求是否针对Login.jsp然后可以做出决定(我不知道这是否是一个好方法)否则将Login.jsp保持在受保护目录之外并编写另一个仅匹配Login.jsp

的过滤器