[英]Servlet crashes when logging in with a registered user, but not when logging in automatically after registering an account
This is a college lab. 这是一个大学实验室。 I've been stuck for 3 days now.
我已经被困了三天了。 I'm building an image viewer website with Google App Engine and Java.
我正在使用Google App Engine和Java构建图像查看器网站。 I've made a web page with login functionality.
我制作了一个具有登录功能的网页。 On the welcome page the user can register an account or log in. If I register a new account there's no problem, the user data is saved, cookies are added to the http response and the user progresses to the next page where he/she can upload and view images in the category that they selected on registering an account.
用户可以在欢迎页面上注册一个帐户或登录。如果我注册了一个新帐户,就没有问题,将保存用户数据,将Cookie添加到http响应中,然后用户可以进入下一页上传和查看他们在注册帐户时选择的类别中的图像。 However, if I try to log in as a user that already has an account the app crashes after the successful login with a
NullPointerException
I cannot figure out what's wrong. 但是,如果我尝试以已经具有帐户的用户身份登录,则应用程序在成功登录后由于
NullPointerException
崩溃而崩溃,我无法弄清楚出了什么问题。
The process for registering and logging in is the same with the exception of saving to and reading from the database. 除了保存和读取数据库外,注册和登录的过程相同。
Here's my Welcome page: 这是我的欢迎页面:
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.blobtest.UserManager" %>
<%@ page import="com.blobtest.UserDatastore" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="java.util.List" %>
<%
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
UserManager userManager = new UserManager();
UserDatastore dataStore = new UserDatastore();
Cookie cookie = null;
Cookie[] cookies = null;
cookies = request.getCookies();
if(cookies != null){
System.out.println("");
System.out.println("============ From WELCOME.JSP =================");
System.out.println("");
System.out.println("Found Cookies!!");
for(int i = 0; i < cookies.length; i++){
cookie = cookies[i];
System.out.println("");
System.out.println("Name: " + cookie.getName());
System.out.println("Value: " + cookie.getValue());
System.out.println("Domain: " + cookie.getDomain());
}
System.out.println("");
System.out.println("============ From WELCOME.JSP =================");
System.out.println("");
}
%>
<html>
<head>
<title>Welcome</title>
<link rel="StyleSheet" type="text/css" href="Style.css" />
</head>
<body>
<h1>Welcome to the Picture Gallery!</h1>
<p>To log in enter your email and password and press "Login", to register enter your email, the password you want and select a role from the menu and press "Login"</p>
<form action="usermanager" method="post">
<label>E-Mail:</label>
<input name="username" type="text" size="30" maxlength="2048" />
<label>Password:</label>
<input name="password" type="password" size="30" maxlength="2048" />
<label>Role:</label>
<select name="register_role">
<%
List<Entity> registerRoles = dataStore.getRoles();
for(Entity role : registerRoles){
out.println("<option>" + role.getProperty("role") + "</option>");
}
%>
</select>
<input type="submit" value="Login">
</form>
<h1>Gallery Viewer</h1>
<p>Select a gallery from the menu below and press "Go" to view it</p>
<form action="/serve" method="get">
<select name="role">
<%
List<Entity> roles = dataStore.getRoles();
for(Entity role : roles){
out.println("<option>" + role.getProperty("role") + "</option>");
}
%>
</select>
<input type="submit" value="Go">
</form>
</body>
</html>
Here's my UserManager class: 这是我的UserManager类:
package com.blobtest;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.datastore.Entity;
public class UserManager extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 8824378069546886214L;
public final String ROLE_SOLDIER = "soldier";
public final String ROLE_PROGRAMMER = "programmer";
public final String ROLE_SINGER = "singer";
public final String ROLE_FOOTBALLER = "footballer";
public final String COOKIE_PROPERTY_ROLE = "role";
public final String COOKIE_PROPERTY_USER = "verifieduser";
public final String COOKIE_APP_DOMAIN = "ImageViewer.se";
private UserDatastore datastore;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
datastore = new UserDatastore();
checkCookies(request);
String email = request.getParameter("username");
String password = request.getParameter("password");
String role = request.getParameter("register_role");
Entity user = datastore.selectUser(email);
/*
* If the database returns a user, check the password matches, otherwise
* register the user
*/
if (user != null) {
if (password.equals(user.getProperty("password"))) {
message("REGISTERED USER FOUND:", true, 0);
message("user: " + user.getProperty("email") + "; Password: "
+ user.getProperty("password"), false, 0);
// request.getSession().setAttribute("loggedInUser", userName);
Cookie cookie = new Cookie(this.COOKIE_PROPERTY_ROLE, user
.getProperty("role").toString());
message("UserManager: New Cookie created with role: "
+ user.getProperty("role").toString(), false, 0);
cookie.setMaxAge(300); // -1 = persist for the duration of the
// session; 0 = remove cookie; value > 0
// = time in seconds.
response.addCookie(cookie);
Cookie userCookie = new Cookie(this.COOKIE_PROPERTY_USER, user
.getProperty("email").toString());
message("UserManager: New Cookie created with verifieduser: "
+ user.getProperty("email").toString(), true, 1);
userCookie.setMaxAge(300); // -1 = persist for the duration of
// the session; 0 = remove cookie;
// value > 0 = time in seconds.
response.addCookie(userCookie);
dispatch(request, response, "/loggedin.jsp");
} else {
message("Passwords don't match, invalidating session", true, 0);
message("", true, 1);
request.getSession().invalidate(); // need to dispose of cookies
// here, not currently using
// sessions
dispatch(request, response, "/welcome.jsp");
}
} else {
datastore.addUser(email, password, role);
message("NEW USER ADDED:", true, 0);
Cookie cookie = new Cookie(this.COOKIE_PROPERTY_ROLE, role);
message("UserManager: New Cookie created with role: " + role,
false, 0);
cookie.setMaxAge(300); // -1 = persist for the duration of the
// session; 0 = remove cookie; value > 0 =
// time in seconds.
response.addCookie(cookie);
Cookie userCookie = new Cookie(this.COOKIE_PROPERTY_USER, email);
message("UserManager: New Cookie created with verifieduser: "
+ email, true, 1);
userCookie.setMaxAge(300); // -1 = persist for the duration of the
// session; 0 = remove cookie; value > 0
// = time in seconds.
response.addCookie(userCookie);
dispatch(request, response, "/register.jsp");
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
}
protected void dispatch(HttpServletRequest request,
HttpServletResponse response, String page)
throws javax.servlet.ServletException, java.io.IOException {
RequestDispatcher dispatcher = getServletContext()
.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
private void checkCookies(HttpServletRequest request) {
Cookie cookie = null;
Cookie[] cookies = null;
cookies = request.getCookies();
if (cookies != null) {
message("Found Cookies!!", true, 0);
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
message("Name: " + cookie.getName(), false, 0);
message("Value: " + cookie.getValue(), false, 0);
message("Domain: " + cookie.getDomain(), false, 0);
}
message("", true, 1);
}
}
/**
* Formats the message and message wrapper
*
* @param message
* The message to print
* @param includeWrapper
* true to include header/footer labels
* @param position
* if includeWrapper is true, then set 0 for header 1 for footer,
* otherwise set 0.
*/
private void message(String message, boolean includeWrapper, int position) {
if (includeWrapper) {
if (position == 0) {
System.out.println("");
System.out
.println("==========From USERMANAGER===================");
System.out.println("");
System.out.println(message);
} else {
System.out.println(message);
System.out.println("");
System.out
.println("========== From USERMANAGER ===================");
System.out.println("");
}
} else {
System.out.println(message);
}
}
}
My "Login Successful" and "Registration Successful" pages are exactly the same, they simply redirect to the Uploader.jsp page below: 我的“登录成功”和“注册成功”页面完全相同,它们只是重定向到下面的Uploader.jsp页面:
<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.blobtest.UserManager" %>
<%@ page import="com.blobtest.UserDatastore" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<% //taglib xmlns:h="http://java.sun.com/jsf/html"prefix="h" %>
<%
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
UserManager userManager = new UserManager();
UserDatastore dataStore = new UserDatastore();
Cookie[] cookies = request.getCookies();
Cookie userCookie = null;
boolean ok = false;
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getName().equals(userManager.COOKIE_PROPERTY_USER)){
if(cookies[i].getValue() != null){
ok = true;
}
}else if(cookies[i].getName().equals(userManager.COOKIE_PROPERTY_ROLE)){
userCookie = cookies[i];
}
}
if(!ok){
System.out.println("Request failed, number of cookies found: " + cookies.length + ", redirecting to welcome.jsp");
for(int i = 0; i < cookies.length; i++){
System.out.println("Name: " + cookies[i].getName() + ", Value: " + cookies[i].getValue());
}
RequestDispatcher dispatcher = getServletContext()
.getRequestDispatcher("/welcome.jsp");
dispatcher.forward(request, response);
}
%>
<html>
<head>
<title>Upload Test</title>
<link rel="StyleSheet" type="text/css" href="style.css" />
</head>
<body>
<form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
<input type="text" name="description">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>
<form action="/usermanager" method="post" enctype="multipart/form-data">
</form>
<form action="/serve" method="get">
<select name="role">
<%
if(userCookie != null) out.println("<option>" + userCookie.getValue() + "</option>");
%>
</select>
<input type="submit" value="Go">
</form>
<%
Cookie cookie2 = null;
Cookie[] cookies2 = null;
// Get an array of Cookies associated with this domain
cookies2 = request.getCookies();
if( cookies2 != null ){
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++){
cookie2 = cookies2[i];
out.print("Name : " + cookie2.getName( ) + ", ");
out.print("Value: " + cookie2.getValue( )+" <br/>");
}
}else{
out.println("<h2>No cookies founds</h2>");
}
%>
<a href="/logout.jsp">Click to Log Out</a>
</body>
</html>
The page above is where the application crashes. 上面的页面是应用程序崩溃的地方。 If I try to log in with a previously registered user I get the following error (Some printouts from the UserManager Included):
如果我尝试使用以前注册的用户登录,则会出现以下错误(包括一些来自UserManager的打印输出):
Retreiving user: paul@email.com, 1234, programmer
==========From USERMANAGER===================
REGISTERED USER FOUND:
user: paul@email.com; Password: 1234
UserManager: New Cookie created with role: programmer
UserManager: New Cookie created with verifieduser: paul@email.com
========== From USERMANAGER ===================
mar 30, 2014 12:53:53 EM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /uploader.jsp
java.lang.NullPointerException
at org.apache.jsp.uploader_jsp._jspService(uploader_jsp.java:76)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:61)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:58)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:487)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
==========From USERMANAGER===================
NEW USER ADDED:
UserManager: New Cookie created with role: soldier
UserManager: New Cookie created with verifieduser: paul3@email.com
========== From USERMANAGER ===================
mar 30, 2014 12:54:32 EM com.google.appengine.api.datastore.dev.LocalDatastoreService$PersistDatastore persist
INFO: Time to persist datastore: 56 ms
As you can see above, when adding a new user I don't get any error, it proceeds to the uploader.jsp page as it should and I can upload and view pictures without any problems. 如您在上面看到的,添加新用户时我没有收到任何错误,它会继续按原样前进到uploader.jsp页面,我可以上传和查看图片而没有任何问题。 Any pointers would be greatly appreciated.
任何指针将不胜感激。
check cokkies
may be null
in bottom of your jsp for (int i = 0; i < cookies.length; i++){
line of code: for (int i = 0; i < cookies.length; i++){
,代码行中的check cokkies
可能为null
。
<%
Cookie cookie2 = null;
Cookie[] cookies2 = null;
// Get an array of Cookies associated with this domain
cookies2 = request.getCookies();
if( cookies2 != null ){
out.println("<h2> Found Cookies Name and Value</h2>");
for (int i = 0; i < cookies.length; i++){ //Here cookies may be null
cookie2 = cookies2[i];
out.print("Name : " + cookie2.getName( ) + ", ");
out.print("Value: " + cookie2.getValue( )+" <br/>");
}
}else{
out.println("<h2>No cookies founds</h2>");
}
%>
this answer may help you for how to use/retrive cokkies in jsp using jstl, you can avoid some NullPointerException
in this way. 这个答案可能会帮助您如何使用jstl在jsp中使用/检索cokkies ,您可以通过这种方式避免一些
NullPointerException
。
see also: 也可以看看:
how to avoid java code in jsp 如何避免JSP中的Java代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.