我有两种类型的用户: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上看到了几个答案,但没有一个对我有效。
有什么建议吗?
答案 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....
}