采用Servlet登录验证,中文乱码问题解决
在Java Web开发中,往往采用Servlet完成前后端直接的控制和处理,例如:用户登录验证功能。
在采用如下Servle源码t完成用户名登录验证时,只要用户名涉及中文,对于正确的输入,也会始终提示:用户名密码错误!
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
String uName = request.getParameter("name");
String uPass = request.getParameter("password");
LoginDao loginDao = new LoginDao();
UsersEntity usersEntity = new UsersEntity(uName,uPass);
int res = loginDao.login(usersEntity);
if(res>0) {
HttpSession session = request.getSession();
session.setAttribute("uname", uName);
session.setAttribute("upass", uPass);
//response.sendRedirect("succ.jsp");//重定向
request.getRequestDispatcher("succ.jsp").forward(request, response);//请求转发
}else {
if(res<0){
out.println("连接数据库失败");
}
else{
out.println("用户名或密码错误!");
}
}
}
跟踪发现,uName取值乱码。
解决方案:
在doget()开始增加如下代码分别解决取值、页面跳转和response.getWriter输出中文乱码的问题:
response.setContentType("text/html; charset=UTF-8");//解决out输出中文乱码
response.setCharacterEncoding("UTF-8");//解决调用succ.jsp页面中文乱码
request.setCharacterEncoding("utf-8");//解决request中文取值乱码
结果如图:
- 进一步理解:
对于转发的succ.jsp开头已经用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
为什么在Servlet中还需要设置response.setCharacterEncoding(“UTF-8”)
原因是:
servlet响应时如果没有设置UTF-8,将缺省采用ISO-8859-1编码返回,会导致中文乱码。
即使succ.jsp中已经设置了utf-8,但是在呈现JSP时已经使用了错误编码的响应内容。