鱼C论坛

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

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

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

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

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

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

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

  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.BufferedWriter;
  10. import java.io.FileWriter;
  11. import java.io.IOException;

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

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

  37.     @Override
  38.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  39.         doGet(req, resp);
  40.     }
  41. }
复制代码
  1. package com.zhihan.filter;

  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;

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

  12.     }

  13.     @Override
  14.     public void destroy() {

  15.     }

  16.     @Override
  17.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  18.         //将请求和响应转换为HTTP相关协议
  19.         HttpServletRequest req=(HttpServletRequest)servletRequest;
  20.         HttpServletResponse resp=(HttpServletResponse)servletResponse;
  21.         //设置编码格式
  22.         req.setCharacterEncoding("UTF-8");
  23.         resp.setContentType("text/html;charset=UTF-8");
  24.         //放行
  25.         filterChain.doFilter(req,resp);
  26.     }
  27. }
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>我的博客-主页</title>
  6. </head>
  7. <body>
  8. <a href="signUp.html">登录</a>
  9. <a href="signIn.html">注册</a>
  10. <a href="/myBlog/readBlog">看博客</a>
  11. <a href="writeBlog.html">写博客</a>
  12. </body>
  13. </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  方法发送一个临时重定向响应到客户端,使用这种方式可以保证编码设置的一致性。这样修改你的代码:

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


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

你可以根据自己的实际情况进行选择,希望这对你有所帮助。
小甲鱼最新课程 -> https://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  方法发送一个临时重定向响应到客户端,使用这种方式可以保证编码设置的一致性。这样修改你的代码:

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


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

你可以根据自己的实际情况进行选择,希望这对你有所帮助。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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