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> 在你的代码中,注册成功后,使用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]