You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:48:25