|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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>
复制代码
在你的代码中,注册成功后,使用 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 。
你可以根据自己的实际情况进行选择,希望这对你有所帮助。
|
|