CherryPy如何获取Ajax GET请求的用户名返回登录访问令牌
问题原因
你当前无法在auth方法中获取到用户名参数,核心是两处写法错误:
- 前端
$.get传参逻辑错误:GET请求无请求体,你对参数做JSON.stringify后传入,jQuery不会自动将其拼接为URL查询参数,服务端根本接收不到该字段。 - 后端
auth方法未定义参数接收入口:CherryPy会自动将URL查询参数绑定到暴露方法的同名形参上,你当前方法未声明接收username的形参,自然无法拿到传入值。
修正方案
1. 调整前端请求代码
去掉JSON.stringify逻辑,直接向$.get传入JS对象,jQuery会自动将对象序列化为标准URL查询参数拼接在请求地址后:
$(document).ready(function() { let username = sessionStorage.getItem('username'); // 直接传对象,无需转JSON字符串 var requestParams = { "username": username }; $.get("/user/auth", requestParams, function(res) { console.log(res); // 可补充校验失败跳转逻辑 if(res.authentication !== "Ok") { location.href = "/"; } }); });
2. 调整后端auth方法
给方法增加username形参用于接收入参,补全登录状态校验逻辑:先校验参数是否存在,再校验该用户对应的session是否有效,校验通过再返回访问令牌,校验失败返回对应错误状态码:
@cherrypy.expose def auth(self, username=None): # 校验参数是否存在 if not username: cherrypy.response.status = 400 cherrypy.response.headers["Content-Type"] = "application/json" return json.dumps({"authentication": "Failed", "msg": "参数缺失"}).encode('utf8') # 校验登录状态:判断全局sessions中是否存在该用户的有效登录记录 user_session = sessions.get(username) if not user_session: cherrypy.response.status = 401 cherrypy.response.headers["Content-Type"] = "application/json" return json.dumps({"authentication": "Failed", "msg": "未登录或登录状态失效"}).encode('utf8') # 校验通过返回合法令牌 res = {"authentication": "Ok", "token": str(uuid4())} cherrypy.response.headers["Content-Type"] = "application/json" return json.dumps(res).encode('utf8')
优化提示
- 你当前的session存储逻辑存在缺陷:全局字典存储的session无过期机制,且登录失败分支执行
sessions[username] = None时,若username为None会直接抛出异常,建议补充session过期逻辑,优先采用Cookie携带session标识的方案,比前端从sessionStorage读用户名传参的安全性更高。 - 现有逻辑存在安全风险:用户密码明文存储、前端可任意伪造用户名传参绕过校验,建议后续对密码做加盐哈希处理,避免用户信息泄露。
内容的提问来源于stack exchange,提问作者dyxcvi
相关产品推荐
相关产品推荐

