这个程序在原来的程序基础上加入了密码验证。
一、增加一个error.jsp页面,用于跳转出现用户名和密码错误显示信息。
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%request.setCharacterEncoding("utf-8"); %> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 7 <title>登录错误</title> 8 </head> 9 10 <body> 11 <!-- 此处才是重要代码 --> 12 <% 13 String err=(String)request.getAttribute("error"); 14 %> 15 <%=err %><br> 16 <a href="login.jsp">返回登录</a> 17 <!-- 此处才是重要代码 --> 18 </body> 19 </html>
二、改写loginserv.java。
1 package com.kaly.servlet; 2 3 import java.io.IOException; 4 import java.sql.Connection; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import javax.servlet.http.HttpSession; 14 15 import com.kaly.data.GetData; 16 import com.kaly.data.User; 17 18 public class loginserv extends HttpServlet { 19 public void doGet(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 doPost(request, response); 22 } 23 24 public void doPost(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 String realusername=null;//经过验证的有效用户名 27 //以下三行主要解决中文乱码问题 28 request.setCharacterEncoding("utf-8"); 29 response.setCharacterEncoding("utf-8"); 30 response.setContentType("text/html);charset=utf-8"); 31 //获得表单请求信息 32 String getUser=request.getParameter("username");//用户名 33 String getpassword=request.getParameter("password");//密码,这个小程序暂时未验证密码 34 String otherAction=request.getParameter("action");//获取退出登录等信息 35 //验证登录信息 36 GetData data=new GetData();//实例化自定义的GetData对象 37 Connection connection=data.getConnection();//从data中获得数据连接对象 38 ResultSet rs;//游标对象 39 User user=new User(); 40 String uPassWord=null; 41 HttpSession session=request.getSession();//获得会话对象 42 try { 43 PreparedStatement pStatement=connection.prepareStatement("select * from user where username=?"); 44 pStatement.setString(1, getUser); 45 //把经过查询得到的符合条件的记录交给游标对象rs 46 rs=pStatement.executeQuery(); 47 //在游标对象rs中找到每一条记录,实际上如果用户名username不允许重复,则记录只有一条 48 while(rs.next()){ 49 //把查询的数据封装到User对象,以后使用时只需要使用这个对象就可以了 50 user.setUserData(rs.getString(2), rs.getString(4), rs.getString(5)); 51 uPassWord=rs.getString(3); 52 } 53 data.close();//关闭数据连接 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 //验证用户名和密码。按照登录用户名查找用户,读取密码,如果没有记录,则用户名错误,如果密码不争取,则密码错误 58 if("logout".equals(otherAction)){//这个地方必须要用到equals,用原来的==会出错,不知道为什么。 59 //如果得到了"退出登录"的请求,则将登录的用户名信息置为null 60 session.setAttribute("lUserName", null); 61 //重定向到login.jsp页面 62 response.sendRedirect("login.jsp"); 63 }else{//否则就验证用户名和密码 64 if(user.getUsename()==null){//如果从数据库得到的用户名为null,表示数据库中根本没有该用户 65 request.setAttribute("error", "用户名错误"); 66 request.getRequestDispatcher("error.jsp").forward(request, response); 67 }else if(!getpassword.equals(uPassWord)){//否则检查请求的密码是否和从数据库中读出来的密码匹配 68 request.setAttribute("error", "密码输入错误"); 69 request.getRequestDispatcher("error.jsp").forward(request, response); 70 }else{//如果用户名和密码都对,则写入信息重定向网页,显示已经登录 71 session.setAttribute("lUserName", user.getNickname());//向会话对象写入数据 72 //重定向到login.jsp页面 73 response.sendRedirect("login.jsp"); 74 } 75 } 76 } 77 }
三、数据库有以下用户记录。
四、重启服务并加载login.jsp页面。输入一个不存在的用户名。
点击登录后,跳转到error.jsp页面,显示用户名错误。
点击返回登录,输入存在的用户名和错误的密码。
点击登录,跳转到error.jsp页面,显示密码错误。
再点击返回登录,输入完全正确的用户名和密码。
点击登录后,跳转到login.jsp页面。
如果点击退出登录,则返回到未登录状态。表示程序调试正常。