如何在AJAX success()中用session.setAttribute传数据至下页(不暴露URL)
问题分析与解决思路
你当前的核心问题是:前端AJAX里的setAttribute()是浏览器端DOM元素的方法,和服务器端的HttpSession完全无关,所以根本没法把数据存入Session。要实现登录后将用户ID传递到新页面,必须通过服务器端代码操作Session,再配合前端跳转完成。
具体修正方案
1. 修正Servlet代码(关键:在服务器端存入Session)
先修复你Servlet里的语法错误,再添加Session操作逻辑:
public class Login extends HttpServlet { // 类名首字母大写,符合Java规范 public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("application/json"); PrintWriter out = res.getWriter(); StringBuffer sbuffer = new StringBuffer(); String inLine = null; String sUsername = "", sUserPwd = ""; try { BufferedReader reader = req.getReader(); while ((inLine = reader.readLine()) != null) sbuffer.append(inLine); if (sbuffer.length() != 0) { JSONObject jsObj = new JSONObject(sbuffer.toString()); sUsername = jsObj.optString("userName"); sUserPwd = jsObj.optString("userPwd"); } } catch (Exception e) { out.print("{\"status\":\"ERROR\",\"msg\":\"请求解析失败\"}"); return; } // 字符串比较必须用equals(),不能用== if ("userA".equals(sUsername)) { // 1. 获取当前请求绑定的Session HttpSession session = req.getSession(); // 2. 将用户ID存入Session session.setAttribute("ID", "1"); JSONObject jsonResp = new JSONObject(); // 修复原代码的变量名错误 jsonResp.put("status", "SUCCESS"); jsonResp.put("requestId", "1"); jsonResp.put("url", "LoginOK.jsp"); out.println(jsonResp.toString()); } else { // 登录失败返回错误信息 JSONObject jsonResp = new JSONObject(); jsonResp.put("status", "ERROR"); jsonResp.put("url", "LoginError.jsp"); out.println(jsonResp.toString()); } } }
2. 修正前端AJAX代码(跳转页面,依赖Session传递数据)
前端不需要尝试操作Session,只需在AJAX回调中跳转到目标页面,页面直接从服务器Session读取数据:
function submitForm(thisObj, thisEvent) { var sLogin = $('#userName').val(); var sPwd = $('#userPwd').val(); var myData = { "userName": sLogin, "userPwd": sPwd }; $.ajax({ type: "POST", url: "login", data: JSON.stringify(myData), contentType: "application/json", // 必须添加,告诉服务器请求体是JSON格式 dataType: "json", success: function(result){ if (result.status == "SUCCESS"){ // 跳转到主页,服务器已将ID存入Session window.location.href = result.url; } else { // 登录失败跳转到错误页 window.location.href = result.url; } }, error: function(){ // 处理AJAX请求失败的情况 window.location.href = "LoginError.jsp"; } }); return false; }
3. 在LoginOK.jsp中获取Session数据
在主页直接通过EL表达式或Java代码读取Session中的ID:
<!-- EL表达式方式(推荐) --> <h1>欢迎登录,用户ID:${ID}</h1> <!-- 或者用Java代码方式 --> <% String userId = (String) session.getAttribute("ID"); %> <h1>欢迎登录,用户ID:<%= userId %></h1>
补充说明
- 前端JS无法直接操作服务器的Session,所有Session的读写必须通过服务器端代码完成。
- 实际项目中,密码需要和数据库存储的加密密码对比,不要用明文判断(当前示例为简化逻辑)。
- AJAX请求必须添加
contentType: "application/json",否则服务器可能无法正确解析JSON请求体。
内容的提问来源于stack exchange,提问作者stockton
相关产品推荐
相关产品推荐

