form表格提交post请求,到后端变成了get请求,这个坑怎么填?!

前端的post请求到后端变成了get请求,什么鬼?

本人在编写flask服务器项目过程中,需要从前端接收用户的登录信息,将用户信息保存进session和cookie中。
后端代码如下:

@app.route('/login',methods=['GET','POST'])
def login_views():
    if request.method == 'GET':
        # 判断是否已经在登录状态:session中是否有uname值
        if 'uname' in session:
            # 已经登录成功,直接去首页
            return redirect('/')
        else:
            # 未在登录状态,继续判断cookie
            if 'uname' in request.cookies:
                # 曾经记录过用户,取出值,保存进session
                uname = request.cookies['uname']
                session['uname'] = uname
                return redirect('/')
            else:
                # 去往登录页
                return render_template('login.html')
    else:
        # 先处理登录,登录成功回首页;否则回登录页面。
        uname = request.form.get('uname')
        upwd = request.form.get('upwd')
        print('********************')
        print(uname)
        print(upwd)
        print('********************')
        if uname == 'admin' and upwd == 'admin':
            # 声明重定向首页的对象
            resp = redirect('/')
            # 登录成功
            # 先将数据保存近session
            session['uname'] = uname
            # 是否要记住密码
            if 'isSaved' in request.form:
                # 需要记住密码,将信息保存进cookies
                resp.set_cookie('uname',uname,60*60*24*31)
            return resp
        else:
            # 登录失败
            return redirect('/login')

在点击登录前,控制台中的cookie和session数据为空:
在这里插入图片描述
目标结果图片如下:
在这里插入图片描述
但实际结果却是下图所示:
在这里插入图片描述
本人不死心,找来前端核心代码查看,代码如下:

<form action="/login" method="post">
    <p>
        用户名:<input type="text" name="uname">
    </p>
    <p>
        用户密码:<input type="password" name="upwd">
    </p>
    <p>
        记住密码:<input type="checkbox" name="isSaved">
    </p>
    <p>
        <input type="submit" name="login" value="登录">
    </p>                  
</form>
有错么???!!窃以为,没有!!!
我不服!重写代码如下:
<form action="/login" method="post">
    <p>
        用户名:<input type="text" name="uname">
    </p>
    <p>
        用户密码:<input type="password" name="upwd">
    </p>
    <p>
        记住密码:<input type="checkbox" name="isSaved">
    </p>
    <p>
        <input type="submit" name="login" value="登录">
    </p>                  
</form>
运行,成功!!!结果如下:

在这里插入图片描述
上面两端代码有区别么?

我从前到后看来10遍!10遍!!!没有发现问题!!!!

于是决定从后向前一句一句地替换,当只剩下第一条语句还没有检查时,问题依然没有发现。也就是说,问题出现在下面这句代码:

错误代码:
<form action="/login" method="post">
正确代码:
<form action="/login" method="post">

我依然认为这两句代码是一模一样的,但是问题果然出现在这一句。WHY???!!!
正当我开始怀疑人生时,居然发现,这两句代码虽然是一个爹生的,但貌似长度不一样。问题出现在下面两个单词中间的空格上!!

"/login" method   #中间隐藏了一个中文空格
"/login" method

把空格改掉之后,果然如此!!

原因原来是这样:
当post请求代码中出现语法错误时,代码本身有时候是不报错的。但是post请求却无法提交,而是将post请求信息封装到url地址中,以get请求方式提交。

也就出现了下面的这种url地址:

http://127.0.0.1:6060/login?uname=admin&upwd=admin&isSaved=on&login=%E7%99%BB%E5%BD%95
当然,具体什么语法错误,要就事论事!!
此坑已填!!!!!
  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是一个简单的基于MVC模式和MySQL数据库的后端管理员RSA加密登录的代码实现,使用了JSP和Servlet来处理请求和响应,同时利用了Ajax接口请求来实现异步验证登录信息。 1. 创建一个名为“admin”的MySQL数据库,其包含一个名为“users”的表格,用于存储管理员的用户名和RSA加密后的密码。 CREATE DATABASE admin; USE admin; CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); 2. 在Java实现RSA加密算法。 这里使用了Java内置的RSA算法库,通过生成公钥和私钥来实现加密和解密操作。 import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.Cipher; public class RSAEncryption { private static final String ALGORITHM = "RSA"; private static final int KEY_SIZE = 2048; private static PrivateKey privateKey; private static PublicKey publicKey; static { try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM); keyGen.initialize(KEY_SIZE); KeyPair keyPair = keyGen.generateKeyPair(); privateKey = keyPair.getPrivate(); publicKey = keyPair.getPublic(); } catch (Exception e) { e.printStackTrace(); } } public static byte[] encrypt(String input) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(input.getBytes()); } catch (Exception e) { e.printStackTrace(); return null; } } public static String decrypt(byte[] input) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); return new String(cipher.doFinal(input)); } catch (Exception e) { e.printStackTrace(); return null; } } } 3. 在Java实现数据库操作类。 这里使用了JDBC连接MySQL数据库,并提供了一个方法用于查询指定用户名的RSA加密后的密码。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class UserDAO { private static final String URL = "jdbc:mysql://localhost:3306/admin"; private static final String USERNAME = "root"; private static final String PASSWORD = "root"; public static String getPassword(String username) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); PreparedStatement ps = conn.prepareStatement("SELECT password FROM users WHERE username = ?"); ps.setString(1, username); ResultSet rs = ps.executeQuery(); if (rs.next()) { return rs.getString("password"); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } } 4. 在Java实现Servlet类,用于处理登录请求。 这里使用了Ajax接口请求来实现异步验证登录信息,如果用户名和密码都正确,则返回一个“success”字符串,否则返回一个“fail”字符串。 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String encryptedPassword = UserDAO.getPassword(username); if (encryptedPassword != null && encryptedPassword.equals(RSAEncryption.encrypt(password))) { response.getWriter().write("success"); } else { response.getWriter().write("fail"); } } } 5. 在JSP实现登录页面。 这里使用了jQuery库来实现Ajax接口请求,并将输入的密码通过RSA加密后再发送给服务器端进行验证。 <!DOCTYPE html> <html> <head> <title>管理员登录</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script> function login() { var username = $("#username").val(); var password = $("#password").val(); var encryptedPassword = btoa(String.fromCharCode.apply(null, RSAEncryption.encrypt(password))); $.ajax({ type: "POST", url: "LoginServlet", data: { username: username, password: encryptedPassword }, success: function(result) { if (result === "success") { window.location.href = "dashboard.jsp"; } else { alert("用户名或密码错误!"); } } }); } </script> </head> <body> <h1>管理员登录</h1> <form> <label>用户名:</label> <input type="text" id="username" name="username"><br> <label>密码:</label> <input type="password" id="password" name="password"><br> <button type="button" onclick="login()">登录</button> </form> </body> </html> 以上就是一个简单的基于MVC模式和MySQL数据库的后端管理员RSA加密登录的代码实现,使用了JSP和Servlet来处理请求和响应,同时利用了Ajax接口请求来实现异步验证登录信息。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值