ZhihanXing 发表于 2023-6-11 16:31:42

Java web开发中网页重定向后中文显示乱码

使用Javaweb开发过程中,从一个含有web表单的网页提交数据后重定向到首页,首页原本正常显示的中文出现了乱码,请问是怎么回事?
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<form action="/myBlog/signIn" method="get" autocomplete="off">
    用户名:<input type="text" name="userCode" required="required"><br>
    昵称:<input type="text" name="userName" required="required"><br>
    密码:<input type="password" name="password" id="password" required="required"><br>
    确认密码:<input type="password" name="confirmPassword" id="confirm_password" required="required"><br>
    性别:<input type="text" name="gender" required="required"><br>
    <button type="submit">注册</button>
    <script>
      //这是一个验证密码和确认密码是否一致的脚本
      //定义及获取密码和确认密码变量
      let password=document.getElementById("password")
      let confirmPass=document.getElementById("confirm_password")
      //定义验证密码的函数
      function validatePassword(){
            if(password.value != confirm_password.value) {
                confirm_password.setCustomValidity("两次输入的密码不一致!");
            } else {
                confirm_password.setCustomValidity('');
            }
      }
      password.onchange = validatePassword;
      confirm_password.onkeyup = validatePassword;
    </script>
</form>
</body>
</html>
package com.zhihan.servlet;

import com.zhihan.bean.User;
import com.zhihan.dao.UserMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

//这是注册的Servlet
@WebServlet("/signIn")
public class SignIn extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("注册Servlet已运行!");
      //获取用户输入的信息
      String userCode = req.getParameter("userCode");
      String userName=req.getParameter("userName");
      String password = req.getParameter("password");
      String gender=req.getParameter("gender");
      //封装用户信息
      User user = new User(userCode,password,userName,gender);
      //保存用户信息
      BufferedWriter bw = new BufferedWriter(new FileWriter("C:/thesis-project/blog/user.txt",true));
      bw.write(user.getUserCode() + "\t");
      bw.write(user.getUserName() + "\t");
      bw.write(user.getPassword() + "\t");
      bw.write(user.getGender() + "\t");
      bw.newLine();
      bw.close();
      //通过定时刷新功能响应给浏览器
      resp.getWriter().write("注册成功!两秒后返回首页");
      resp.setHeader("Refresh","2;URL=/myBlog/index.html");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req, resp);
    }
}

package com.zhihan.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//解决显示中文乱码的过滤器
@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      //将请求和响应转换为HTTP相关协议
      HttpServletRequest req=(HttpServletRequest)servletRequest;
      HttpServletResponse resp=(HttpServletResponse)servletResponse;
      //设置编码格式
      req.setCharacterEncoding("UTF-8");
      resp.setContentType("text/html;charset=UTF-8");
      //放行
      filterChain.doFilter(req,resp);
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的博客-主页</title>
</head>
<body>
<a href="signUp.html">登录</a>
<a href="signIn.html">注册</a>
<a href="/myBlog/readBlog">看博客</a>
<a href="writeBlog.html">写博客</a>
</body>
</html>

isdkz 发表于 2023-6-11 16:39:07

在你的代码中,注册成功后,使用resp.setHeader("Refresh","2;URL=/myBlog/index.html");进行了重定向。在这种情况下,即使你在 Filter 中设置了响应的字符集编码,重定向发生时可能会使用不同的编码设置。对于重定向到的页面,可能使用的是服务器的默认编码,例如 ISO-8859-1,这可能是导致乱码的原因。

你可以尝试以下两种方法来解决这个问题:

1. 在你的HTML页面中,将 <meta charset="UTF-8"> 改为 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 。这样可以强制浏览器将页面解析为UTF-8编码。

2. 使用 Response 的 sendRedirect 方法替代 Refresh 进行重定向。在Java中, sendRedirect方法发送一个临时重定向响应到客户端,使用这种方式可以保证编码设置的一致性。这样修改你的代码:

resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("注册成功!两秒后自动返回首页");
resp.sendRedirect("/myBlog/index.html");


注意在sendRedirect中,你需要提供绝对URL或相对于当前请求URL的相对URL。如果你使用的是相对URL,那么它会相对于当前的servlet URL。也就是说,如果你当前的servlet URL是/myBlog/signIn ,你应该提供的重定向URL是../index.html 。

你可以根据自己的实际情况进行选择,希望这对你有所帮助。
页: [1]
查看完整版本: Java web开发中网页重定向后中文显示乱码