采用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时已经使用了错误编码的响应内容。



















