|  | 
 
5鱼币 
| 在Java Web开发中,创建了一个登录注册jsp页面,页面的表单中使用了post方法。但是数据保存到MySQL中就变成了符号,不能正常显示。其中Tomcat已设置成utf-8,MySQL的数据库编码也是utf-8m64。 jsp页面代码如下:
 
 复制代码<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录和注册</title>
    <link rel="stylesheet" href="style/register.css"/>
    <script src="script/ad.js" async></script>
    <script src="script/confirm_password.js" async></script>
</head>
<body>
<jsp:include page="header.jsp"/>
<div class="box">
    <!-- 用来处理登录的信息 -->
    <div class="login">
        <p>在此登录</p>
        <form action="/theBlog/loginServlet" method="post" autocomplete="off">
            用户名:<input type="text" name="username" placeholder="请输入用户名" required><br> 密码:
            <input type="password" name="password" placeholder="请输入密码" required><br>
            <button type="submit">登录</button>
        </form>
    </div>
    <!-- 用来处理注册的信息 -->
    <div class="register">
        <p>没有账号?立即注册</p>
        <form action="/theBlog/registerServlet" method="post" autocomplete="off" accept-charset="UTF-8">
            用户名:<input type="text" name="username" placeholder="请输入用户名" required><br>
            密码:<input type="password" name="password" placeholder="请输入密码" id="password" required><br>
            确认密码:<input type="password" name="passwordc" placeholder="请确认密码" id="confirm_password" required><br>
            <button type="submit">注册</button>
        </form>
    </div>
</div>
<jsp:include page="ad.jsp"/>
<jsp:include page="footer.jsp"/>
</body>
</html>
过滤器如下:
 
 复制代码package edu.zjku.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class CharsetFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //处理乱码
        servletResponse.setContentType("text/html;charset=UTF-8");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8编码,这是正确的。但是,你的过滤器只设置了响应的字符编码,没有设置请求的字符编码。 
为了解决乱码问题,你需要在过滤器中同时设置请求和响应的字符编码。修改`doFilter`方法如下:
 复制代码@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {    //处理请求的字符编码    servletRequest.setCharacterEncoding("UTF-8");    //处理响应的字符编码    servletResponse.setContentType("text/html;charset=UTF-8");    //放行    filterChain.doFilter(servletRequest, servletResponse);}
这样设置后,请求的数据就可以正确地以UTF-8编码保存到MySQL中了,并且在页面上正常显示。
 
另外,为了防止SQL注入攻击,建议你使用预编译语句来执行数据库插入操作。下面是一个示例代码:
 复制代码// 获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");// 进行数据库插入操作Connection conn = null;PreparedStatement pstmt = null;try {    conn = DriverManager.getConnection(url, user, password);    String sql = "INSERT INTO users (username, password) VALUES (?, ?)";    pstmt = conn.prepareStatement(sql);    pstmt.setString(1, username);    pstmt.setString(2, password);    pstmt.executeUpdate();    // 插入成功,进行其他操作} catch (SQLException e) {    e.printStackTrace();} finally {    // 关闭连接和释放资源    if (pstmt != null) {        try {            pstmt.close();        } catch (SQLException e) {            e.printStackTrace();        }    }    if (conn != null) {        try {            conn.close();        } catch (SQLException e) {            e.printStackTrace();        }    }}
通过使用预编译语句,可以有效地防止SQL注入攻击,并确保插入到数据库中的数据完整和准确。
 
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 | 
 
最佳答案
查看完整内容 在Java Web开发中,出现乱码问题通常是由于字符编码设置不正确引起的。你已经在Tomcat和MySQL中设置了UTF-8编码,这是正确的。但是,你的过滤器只设置了响应的字符编码,没有设置请求的字符编码。
为了解决乱码问题,你需要在过滤器中同时设置请求和响应的字符编码。修改`doFilter`方法如下:
这样设置后,请求的数据就可以正确地以UTF-8编码保存到MySQL中了,并且在页面上正常显示。
另外,为了防止SQL注入攻击,建议你使用 ... |