鱼C论坛

 找回密码
 立即注册
查看: 248|回复: 3

[已解决]post方法保存中文数据到MySQL乱码的问题

[复制链接]
发表于 2023-12-30 13:26:32 | 显示全部楼层 |阅读模式
5鱼币
在Java Web开发中,创建了一个登录注册jsp页面,页面的表单中使用了post方法。但是数据保存到MySQL中就变成了符号,不能正常显示。其中Tomcat已设置成utf-8,MySQL的数据库编码也是utf-8m64。
jsp页面代码如下:
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>登录和注册</title>
  5.     <link rel="stylesheet" href="style/register.css"/>
  6.     <script src="script/ad.js" async></script>
  7.     <script src="script/confirm_password.js" async></script>
  8. </head>
  9. <body>
  10. <jsp:include page="header.jsp"/>
  11. <div class="box">
  12.     <!-- 用来处理登录的信息 -->
  13.     <div class="login">
  14.         <p>在此登录</p>
  15.         <form action="/theBlog/loginServlet" method="post" autocomplete="off">
  16.             用户名:<input type="text" name="username" placeholder="请输入用户名" required><br> 密码:
  17.             <input type="password" name="password" placeholder="请输入密码" required><br>
  18.             <button type="submit">登录</button>
  19.         </form>
  20.     </div>
  21.     <!-- 用来处理注册的信息 -->
  22.     <div class="register">
  23.         <p>没有账号?立即注册</p>
  24.         <form action="/theBlog/registerServlet" method="post" autocomplete="off" accept-charset="UTF-8">
  25.             用户名:<input type="text" name="username" placeholder="请输入用户名" required><br>
  26.             密码:<input type="password" name="password" placeholder="请输入密码" id="password" required><br>
  27.             确认密码:<input type="password" name="passwordc" placeholder="请确认密码" id="confirm_password" required><br>
  28.             <button type="submit">注册</button>
  29.         </form>
  30.     </div>
  31. </div>
  32. <jsp:include page="ad.jsp"/>
  33. <jsp:include page="footer.jsp"/>
  34. </body>
  35. </html>
复制代码

过滤器如下:
  1. package edu.zjku.filter;

  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import java.io.IOException;
  5. @WebFilter("/*")
  6. public class CharsetFilter implements Filter {
  7.     @Override
  8.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9.         //处理乱码
  10.         servletResponse.setContentType("text/html;charset=UTF-8");
  11.         //放行
  12.         filterChain.doFilter(servletRequest, servletResponse);
  13.     }
  14. }
复制代码
最佳答案
2023-12-30 13:26:33
在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8编码,这是正确的。但是,你的过滤器只设置了响应的字符编码,没有设置请求的字符编码。

为了解决乱码问题,你需要在过滤器中同时设置请求和响应的字符编码。修改`doFilter`方法如下:
  1. @Override
  2. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  3.     //处理请求的字符编码
  4.     servletRequest.setCharacterEncoding("UTF-8");
  5.     //处理响应的字符编码
  6.     servletResponse.setContentType("text/html;charset=UTF-8");
  7.     //放行
  8.     filterChain.doFilter(servletRequest, servletResponse);
  9. }
复制代码

这样设置后,请求的数据就可以正确地以UTF-8编码保存到MySQL中了,并且在页面上正常显示。

另外,为了防止SQL注入攻击,建议你使用预编译语句来执行数据库插入操作。下面是一个示例代码:
  1. // 获取请求参数
  2. String username = request.getParameter("username");
  3. String password = request.getParameter("password");
  4. // 进行数据库插入操作
  5. Connection conn = null;
  6. PreparedStatement pstmt = null;
  7. try {
  8.     conn = DriverManager.getConnection(url, user, password);
  9.     String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
  10.     pstmt = conn.prepareStatement(sql);
  11.     pstmt.setString(1, username);
  12.     pstmt.setString(2, password);
  13.     pstmt.executeUpdate();
  14.     // 插入成功,进行其他操作
  15. } catch (SQLException e) {
  16.     e.printStackTrace();
  17. } finally {
  18.     // 关闭连接和释放资源
  19.     if (pstmt != null) {
  20.         try {
  21.             pstmt.close();
  22.         } catch (SQLException e) {
  23.             e.printStackTrace();
  24.         }
  25.     }
  26.     if (conn != null) {
  27.         try {
  28.             conn.close();
  29.         } catch (SQLException e) {
  30.             e.printStackTrace();
  31.         }
  32.     }
  33. }
复制代码

通过使用预编译语句,可以有效地防止SQL注入攻击,并确保插入到数据库中的数据完整和准确。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8编码,这是正确的。但是,你的过滤器只设置了响应的字符编码,没有设置请求的字符编码。 为了解决乱码问题,你需要在过滤器中同时设置请求和响应的字符编码。修改`doFilter`方法如下: 这样设置后,请求的数据就可以正确地以UTF-8编码保存到MySQL中了,并且在页面上正常显示。 另外,为了防止SQL注入攻击,建议你使用 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-30 13:26:33 | 显示全部楼层    本楼为最佳答案   
在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8编码,这是正确的。但是,你的过滤器只设置了响应的字符编码,没有设置请求的字符编码。

为了解决乱码问题,你需要在过滤器中同时设置请求和响应的字符编码。修改`doFilter`方法如下:
  1. @Override
  2. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  3.     //处理请求的字符编码
  4.     servletRequest.setCharacterEncoding("UTF-8");
  5.     //处理响应的字符编码
  6.     servletResponse.setContentType("text/html;charset=UTF-8");
  7.     //放行
  8.     filterChain.doFilter(servletRequest, servletResponse);
  9. }
复制代码

这样设置后,请求的数据就可以正确地以UTF-8编码保存到MySQL中了,并且在页面上正常显示。

另外,为了防止SQL注入攻击,建议你使用预编译语句来执行数据库插入操作。下面是一个示例代码:
  1. // 获取请求参数
  2. String username = request.getParameter("username");
  3. String password = request.getParameter("password");
  4. // 进行数据库插入操作
  5. Connection conn = null;
  6. PreparedStatement pstmt = null;
  7. try {
  8.     conn = DriverManager.getConnection(url, user, password);
  9.     String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
  10.     pstmt = conn.prepareStatement(sql);
  11.     pstmt.setString(1, username);
  12.     pstmt.setString(2, password);
  13.     pstmt.executeUpdate();
  14.     // 插入成功,进行其他操作
  15. } catch (SQLException e) {
  16.     e.printStackTrace();
  17. } finally {
  18.     // 关闭连接和释放资源
  19.     if (pstmt != null) {
  20.         try {
  21.             pstmt.close();
  22.         } catch (SQLException e) {
  23.             e.printStackTrace();
  24.         }
  25.     }
  26.     if (conn != null) {
  27.         try {
  28.             conn.close();
  29.         } catch (SQLException e) {
  30.             e.printStackTrace();
  31.         }
  32.     }
  33. }
复制代码

通过使用预编译语句,可以有效地防止SQL注入攻击,并确保插入到数据库中的数据完整和准确。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-30 15:48:37 | 显示全部楼层
FishC 发表于 2023-12-30 13:26
在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8 ...

什么是SQL注入攻击?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-30 15:48:53 | 显示全部楼层
ZhihanXing 发表于 2023-12-30 15:48
什么是SQL注入攻击?

SQL注入攻击是一种常见的网络安全威胁,它利用了应用程序对用户输入数据的不充分验证和过滤。攻击者通过在应用程序的输入字段中插入恶意的SQL语句片段,以获取敏感信息、修改数据库数据或者执行其他恶意操作。

简单来说,当应用程序接收用户输入并将其直接拼接到SQL查询或命令中时,如果未对用户输入进行正确的验证和处理,攻击者可以通过构造特定的输入来绕过应用程序的限制并执行意外的操作。

具体来说,SQL注入攻击通常通过以下方式实施:

1. 登录绕过:攻击者通过输入特殊字符使应用程序的登录系统绕过认证机制,从而以非法身份访问系统。

2. 数据泄露:攻击者通过恶意输入获取数据库中的敏感信息,例如用户名、密码和其他个人信息。

3. 数据篡改:攻击者通过注入恶意的SQL代码来修改数据库中的数据,包括删除、更新或插入数据。

4. 命令执行:攻击者可以通过SQL注入来执行系统命令,进而获取服务器上的敏感信息或者控制服务器。

为了防止SQL注入攻击,开发人员应该始终遵循以下最佳实践:

- 使用参数化查询或预编译语句:使用这些方法可以将用户输入作为参数传递给SQL查询,从而避免直接拼接用户输入到查询中。

- 输入验证和过滤:对于用户输入的数据,进行必要的验证和过滤,确保数据符合预期的格式和类型。

- 最小权限原则:为数据库用户分配尽可能少的权限,限制其对数据库的操作范围。

- 错误信息保护:不要向用户显示具体的数据库错误信息,避免攻击者获取有关数据库结构和配置的敏感信息。

通过采取这些安全措施,可以有效地防止SQL注入攻击,并确保应用程序和数据库的安全性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表