检查用户是否使用会话登录:java servlet

时间:2014-07-15 13:22:24

标签: java nullpointerexception

我有两种类型的用户:admin和user。 这是我在登录servlet

中所做的事情
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    String user=request.getParameter("user");
    String pass=request.getParameter("pass");

    HttpSession session=request.getSession();


    String name="user",type;
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con=DriverManager.getConnection(url,user,pass);

        PreparedStatement ps=con.prepareStatement("select utype from users where email=? and pass=?");

        ps.setString(1, user);
        ps.setString(2, pass);

        ResultSet rs=ps.executeQuery();

        if(rs.next()) 
        {
            type=rs.getString(1);
            if(type.equals("a"))
            {
                session.setAttribute("loggedIn", "admin");
                RequestDispatcher rd=request.getRequestDispatcher("admin.jsp");
                rd.forward(request, response);
            }
            else
            {
                session.setAttribute("loggedIn", "user");
                RequestDispatcher rd=request.getRequestDispatcher("home.jsp");
                rd.include(request, response);
            }


        }
        else
        {
            request.setAttribute("message","Username or password error!");
                RequestDispatcher rd=request.getRequestDispatcher("login.jsp");
            rd.include(request, response);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

}

account.jsp 页面上,我正在检查用户是否已登录。这是代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
 <%@ include file="headpl.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <script>
              //have some code here
        </script>
    </head>
    <body>

    <%
        if(session.getAttribute("loggedIn").equals("admin"))
            {
                response.sendRedirect("admin.jsp");
          }else
           if(!session.getAttribute("loggedIn").equals("user"))
        {
            response.sendRedirect("index.jsp");
         }  
   %>
     //some html code here
  </body>
  </html>

在添加会话检查之前,代码运行正常。 现在,当管理员登录并输入帐户页面的URL时,他被重定向到 admin.jsp (这很好),当用户登录时,他被允许去到帐户页面,但是当没有人登录时,我得到一个例外:

  exception

org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause

java.lang.NullPointerException
org.apache.jsp.account_jsp._jspService(org.apache.jsp.account_jsp:128)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.11 logs.

我认为NullPointerException是由于没有人登录而没有会话变量的事实。我在SO上看到了几个答案,但没有一个对我有效。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

缺少“loggedIn”会话属性,因此equals方法调用拒绝NPE。

您可以在管理其值之前尝试检查“loggedIn”会话属性的空值。

这样的事情:

if (session.getAttribute("loggedIn") == null) {
     response.sendRedirect("login.jsp");
} else if(session.getAttribute("loggedIn").equals("admin")) {
     response.sendRedirect("admin.jsp");
} else if(!session.getAttribute("loggedIn").equals("user")) {
     response.sendRedirect("index.jsp");
}

答案 1 :(得分:1)

在与session.getAttribute("loggedIn")admin字符串进行比较之前,您需要先查看天气user是否为空。
如果当时没有用户登录,则您在会话中没有会话属性loggedIn,并且当尝试使用null和{{1从会话中读取值时,您获得session.getAttribute("loggedIn")抛出异常,因为它将您的字符串与null进行比较。

equals

在与任何字符串或任何具有其他对象的对象进行比较之前,最好先检查if(session.getAttribute("loggedIn")!=null && session.getAttribute("loggedIn").equals("admin")) { response.sendRedirect("admin.jsp"); } else if(session.getAttribute("loggedIn")!=null && !session.getAttribute("loggedIn").equals("user")) { response.sendRedirect("index.jsp"); } else { response.sendRedirect("defaultPage.jsp"); } 值。

答案 2 :(得分:0)

或者只是使用:

String username = request.getRemoteUser();
if ("user".equalsIgnoreCare(username)) {
    .....do something....
}