JavaWeb学习笔记——小任务 实现用户登录(加入验证码模块)

  下面的内容将会使用到Session技术来实现简单的用户登录的功能。

1.首先封装用户信息类

package cn.zhang.UserLogin;

public class User {
	private String userName;
	private String passWord;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String username) {
		this.userName = username;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String password) {
		this.passWord = password;
	}
}

2.创建Servlet

2.1首先创建Index类,用于显示网站首页面

package cn.zhang.UserLogin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

/**
 * Servlet implementation class Index
 * This document is used as the index page of the UserLogin project.
 * Author: TYUT_Zhang
 * Date: 2020-8-22
 */
@WebServlet("/Index")
public class Index extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码问题
		response.setContentType("text/html;charset=utf-8");
		//创建或者获取保存用户信息的Session对象
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("user");
		if(user == null) {
			response.getWriter().print("You are not logged in, please <a href='/UserLogin/login.html'>login</a>");
		}else {
			response.getWriter().print("Login successfully, welcome, " + user.getUserName() + " !");
			response.getWriter().print("<a href='/UserLogin/LogoutServlet'>LOGOUT</a>");
			//创建cookie存放Session标识号
			Cookie cookie = new Cookie("JSESSIONID",  session.getId());
			cookie.setMaxAge(60*30);
			cookie.setPath("/UserLogin");
			response.addCookie(cookie);
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  其中,如果用户没有登录,那么就会有提示登录的消息,否则提示已经登录。

2.2创建LoginServlet类,显示登录成功后的页面

package cn.zhang.UserLogin;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
/**
 * Servlet implementation class LoginServlet
 * This document is used as the page after login successfully.
 * Author: TYUT_Zhang
 * Date: 2020-8-22
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("userName");
		String password = request.getParameter("passWord");
		PrintWriter pw = response.getWriter();
		//匹配正确用户名与密码
		if(("zhangzuopeng").equals(username) && ("123").equals(password)) {
			User user = new User();
			user.setUserName(username);
			user.setPassWord(password);
			request.getSession().setAttribute("user", user);
			response.sendRedirect("/UserLogin/Index");
		}else {
			pw.write("Your username or password is ERROR, login failed !");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  如果登陆成功了,那么就跳转到首页面,否则提示错误,登录失败。

2.3创建LogoutServlet类,完成注销功能

package cn.zhang.UserLogin;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LogoutServlet
 * This document is used as the page to handle exiting.
 * Author: TYUT_Zhang
 * Date: 2020-8-22
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//把Session对象中的User对象移除
		request.getSession().removeAttribute("user");
		response.sendRedirect("/UserLogin/Index");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

  使得单击LOGOUT按钮时退出登录。

3.创建登陆页面login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>TYUT_zhang_UserLogin</title>
</head>
<body>
	<form name="reg" action="/UserLogin/LoginServlet" method="post">
		USERNAME: <input name="userName" type="text" /><br />
		PASSWORD: <input name="passWord" type="password" /><br />
				  <input type="submit" value="Submit" id="bt" />
	</form>
</body>
</html>

4.代码部分编写完毕,此时进行测试

  启动Tomcat,输入网址访问login.html,显示如下图
在这里插入图片描述
  输入用户名与密码,点击“Submit”登录,登录成功显示第一张图,登录失败显示第二张图。
在这里插入图片描述
在这里插入图片描述
  如果在登录成功后的页面中单机LOGOUT,那么就会注销登录,显示如下图。
在这里插入图片描述
  此时单击login,重新范围login.html页面。

  到这里,这项实现用户登录的简单小任务就做好了!



5.拓展部分:利用Session实现一次性验证码

  该部分将会加入新的类,同时也会修改已有的文件,来对上面描述的程序进行升级,加入我们常见的验证码部分。

5.1修改login.html

  仅展示body部分

<body>
	<form name="reg" action="/UserLogin/LoginServlet" method="post">
		USERNAME: <input name="userName" type="text" /><br />
		PASSWORD: <input name="passWord" type="password" /><br />
		CHECKCODE: <input type="text" name="check_code">
		     <img src="/UserLogin/CheckServlet"><br />
		 <input type="submit" value="Submit" id="bt" />
	</form>
</body>

5.2编写CheckServlet类,用于产生验证码图片

package cn.zhang.UserLogin;

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;

/**
 * Servlet implementation class CheckServlet
 * This document is used to create the check code.
 * Author: TYUT_Zhang
 * Date: 2020-8-22
 */
@WebServlet("/CheckServlet")
public class CheckServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static int WIDTH = 60;	//验证码图片宽度
	private static int HEIGHT = 20;	//验证码图片高度
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		response.setContentType("img/jpeg");
		ServletOutputStream sos = response.getOutputStream();
		//设置浏览器不要缓存此图片
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		//创建内存图像并获得其图形上下文
		BufferedImage image = new BufferedImage(WIDTH, HEIGHT,  BufferedImage.TYPE_INT_RGB);
		Graphics g =image.getGraphics();
		//产生随机验证码
		char[] rands = generateCheckCode();
		//结束图像的绘制过程,完成图像
		drawBackground(g);
		drawRands(g, rands);
		//将图像输出到客户端
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ImageIO.write(image, "JPEG", bos);
		byte[] buf = bos.toByteArray();
		response.setContentLength(buf.length);
		sos.write(buf);
		bos.close();
		sos.close();
		//将当前验证码存入Session中
		session.setAttribute("check_code", new String(rands));
	}
	//生成四字符的验证码
	private char[] generateCheckCode() {
		String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
		char[] rands = new char[4];
		for(int i=0; i<4; i++) {
			int rand = (int)(Math.random() * 36);
			rands[i] = chars.charAt(rand);
		}
		return rands;
	}
	private void drawRands(Graphics g, char[] rands) {
		g.setColor(Color.black);
		g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));//斜体或粗体,字号18
		//在不同的高度上输出验证码的每个字符
		g.drawString("" + rands[0], 1, 17);
		g.drawString("" + rands[1], 16, 15);
		g.drawString("" + rands[2], 31, 18);
		g.drawString("" + rands[3], 46, 16);
		System.out.println(rands);
	}
	private void drawBackground(Graphics g) {
		//画背景
		g.setColor(new Color(0xDCDCDC));
		g.fillRect(0, 0, WIDTH, HEIGHT);
		//随机产生120个干扰点
		for (int i=0; i<120; i++) {
			int x = (int)(Math.random() * WIDTH);
			int y = (int)(Math.random() * HEIGHT);
			int red = (int)(Math.random() * 255);
			int green = (int)(Math.random() * 255);
			int blue = (int)(Math.random() * 255);
			g.setColor(new Color(red, green, blue));
			g.drawOval(x, y, 1, 0);			
		}
	}
}

5.3对LoginServlet类修改,加入对验证码的判断

  下面的代码为修改之后的代码

package cn.zhang.UserLogin;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
/**
 * Servlet implementation class LoginServlet
 * This document is used as the page after login successfully.
 * Author: TYUT_Zhang
 * Date: 2020-8-22
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("userName");
		String password = request.getParameter("passWord");
		String checkCode = request.getParameter("check_code");
		String savedCode = (String) request.getSession().getAttribute("check_code");
		PrintWriter pw = response.getWriter();
		//匹配正确用户名与密码
		if(("zhangzuopeng").equals(username) && ("123").equals(password) && checkCode.equals(savedCode)) {
			User user = new User();
			user.setUserName(username);
			user.setPassWord(password);
			request.getSession().setAttribute("user", user);
			response.sendRedirect("/UserLogin/Index");
		}else if(checkCode.equals(savedCode)){
			pw.write("Your username or password is ERROR, login failed !");
		}else {
			pw.write("Check code is ERROR !!!");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

5.4最终效果

  此时启动Tomcat,输入地址,显示下图登录页面
在这里插入图片描述
  如果三项均正确,则正常进行,不再重复展示,如果验证码错误,那么会显示下面图片的内容
在这里插入图片描述
  至此,简单用户登录的基本部分与拓展部分写完。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值