我正在尝试在我的网页上创建一个登录操作,该操作应该调用servlet传递所需的参数,然后将JSON对象返回给浏览器。我正在使用jQuery中的$ .getJSON()方法来实现此目的。
以下是我的登录表单的HTML -
<form class="form" method="post" id="loginFrm" name="loginFrm">
<div class="form-group">
<label for="username">Email</label>
<input name="email" id="email" type="text" placeholder="Email" style="color: black;">
</div>
<div class="form-group">
<label for="password">Password</label>
<input name="password" id="password" type="password" placeholder="Password" style="color: black;"><br>
<span class="text-danger" id="error-box"></span>
</div>
<button id="btnLogin" class="btn btn-primary" style="margin-top: 17px;">Login</button>
</form>
以下是点击登录按钮时执行的JavaScript代码 -
// Add an onlick handler to the login button
$('#btnLogin').on('click', loginAction);
function loginAction() {
var userEmail = $('#email').val();
var userPassword = $('#password').val();
if (userEmail == "") {
$('#error-box').html("Please enter your email");
$('#email').focus();
return false;
}
if (userPassword == "") {
$('#error-box').html("Please enter your password");
$('#password').focus();
return false;
}
var credentials = $('#loginFrm').serialize();
// alert(credentials);
var url = "/login?" + credentials;
$.getJSON(url, function (data) {
alert("Inside getJSON callback method");
alert(data);
});
}
此外,这是LoginServlet的代码。 Servlet映射到URL模式/登录
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
logger.info("Inside LoginServlet");
response.setContentType("application/json");
String email = request.getParameter("email") == null ? "" : request.getParameter("email");
String password = request.getParameter("password") == null ? "" : request.getParameter("password");
logger.info("email:: " + email + " password::" + password);
Customer customer = null;
Developer developer = null;
JsonObjectBuilder objBuilder = Json.createObjectBuilder();
JsonObject responseObject = null;
PrintWriter pout = response.getWriter();
if (!email.equals("") && !password.equals("")) {
boolean loginSuccess = false;
logger.info("Trying to load customer entity");
customer = ofy().load().key(Key.create(Customer.class, email)).now();
if (null == customer) {
logger.info("customer entity not found. Trying to load developer entity");
developer = ofy().load().key(Key.create(Developer.class, email)).now();
if (developer != null) {
logger.info("developer entity found");
if (developer.getPassword().equals(password)) {
logger.info("Developer login successful");
loginSuccess = true;
responseObject = objBuilder.add("status", "success").add("userType", "developer").add("forwardUrl", "Home.jsp").build();
logger.info("JsonObject constructed as:: " + responseObject);
pout.println(responseObject.toString());
pout.flush();
// request.getRequestDispatcher("Home.jsp").forward(request, response);
}
}
} else {
if (customer.getPassword().equals(password)) {
logger.info("Customer login successful");
loginSuccess = true;
responseObject = objBuilder.add("status", "success").add("userType", "customer").add("forwardUrl", "Home.jsp").build();
logger.info("JsonObject constructed as:: " + responseObject);
pout.println(responseObject.toString());
pout.flush();
// request.getRequestDispatcher("Home.jsp").forward(request, response);
}
}
if (!loginSuccess) {
// Login Failure
responseObject = objBuilder.add("status", "faliure").build();
logger.info("Login Faliure. JsonObject constructed as:: " + responseObject);
pout.println(responseObject.toString());
pout.flush();
}
}
}
我的问题是Servlet似乎没有返回对getJSON()的响应。来自Firefox的网络选项卡没有显示来自请求的任何响应。 它甚至不打印请求的HTTP状态代码。
但是,我知道请求到达LoginServlet,从以下日志中可以看出 -
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doGet
[INFO] INFO: Request inside doGet method. Calling doPost with it
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: Inside LoginServlet
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: email:: prateekmathur1991@gmail.com password::prateek
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: Trying to load customer entity
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: customer entity not found. Trying to load developer entity
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: developer entity found
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: Developer login successful
[INFO] Jul 20, 2015 10:42:13 PM com.allissues.logic.LoginServlet doPost
[INFO] INFO: JsonObject constructed as:: {"status":"success","userType":"developer","forwardUrl":"Home.jsp"}
但是AJAX请求的响应是空的,我很难理解代码出错的地方。
有人可以帮帮我吗?提前谢谢。
修改 此外,当我从网页访问此URL时 - http://localhost:8080/login?email=prateekmathur1991@gmail.com&password=prateek
它给了我正确的JSONObject,我期待 - { “状态”: “成功”, “用户类型”: “显影剂”, “forwardUrl”: “回到Home.jsp”}
答案 0 :(得分:2)
这里有很多问题。
使用GET传递登录凭据是 非常 的坏主意。 URL通常以纯文本形式缓存在浏览器,服务器日志和其他易于阅读的区域中。使用POST传递凭据,确保它们通过SSL传递
永远不要记录凭据(你可能只是为了调试而这样做,这很自然,但这是一个非常糟糕的做法)
您的servlet已连接到doPost()
,但您正在使用AJAX GET传递数据。根据您的日志,您可能会从doPost
内委派给doGet
,但这仍然不是一个好习惯 - 只需从一开始就使用POST。 / p>
您正在使用button
元素触发登录操作,但未指定type
属性或禁止默认点击行为。默认情况下,button
元素充当submit
按钮,这意味着用户单击该按钮将首先触发AJAX行为,然后触发本机表单提交行为(即,提交包含在其中的数据)通过POST将#loginFrm
添加到当前加载的URL中。由于默认情况下会重新加载页面,因此AJAX回调不会按预期触发。
要修复,请做两件事:
1)清理您的安全
:一种。使用POST而不是GET。 jQuery将负责为您解析JSON:
$.post("/login", credentials, function (data) {
alert("Inside getJSON callback method");
alert(data);
});
<强> B中。从日志中删除敏感数据。还要记住删除将敏感用户数据转储到日志的服务器端日志记录语句。
<强>℃。不要响应来自Login servlet的GET请求。您的doGet()
servlet方法应返回404,不记录任何敏感数据,不要尝试对该数据执行任何操作。
2)取消默认操作
您希望方法体中使用jQuery的preventDefault()
方法。不要忘记添加表单提交处理程序以防止默认表单提交行为并委托给您的loginAction
方法:
$('#btnLogin').on('click', loginAction);
$('#loginFrm').on('submit', loginAction);
function loginAction(eventObject) {
eventObject.preventDefault();
var userEmail = $('#email').val();
...