鱼C论坛

 找回密码
 立即注册
查看: 1012|回复: 1

[已解决]Java web开发中网页重定向后中文显示乱码

[复制链接]
发表于 2023-6-11 16:31:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
使用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>
最佳答案
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 。

你可以根据自己的实际情况进行选择,希望这对你有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 。

你可以根据自己的实际情况进行选择,希望这对你有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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