登录功能之添加验证码(Session)

从客户端发送请求(login.jsp)开始分析流程,

1.用户访问login.jsp时,登录界面的验证码图片部分,向服务器端发送请求。

    验证码部分发送的请求给VerifyCodeServlet,VerifyVodeServlet中会有以下流程:

    (1)生成验证码图片

    (2)保存生成验证码的文本。该文本应当保存在session中。因为用户访问登陆界面的过程向服务器发送了两次请求,因此不能使用request保存,而session是跟踪会话至浏览器关闭。也可以看出,当在选择用什么域来储存数据时,首先需要考虑的就是访问服务器过程中会发送几次请求(例如,重定向和请求转发两个方式的不同所使用的域选择不同)

    (3)将图片通过response响应给客户端

2.用户提交表单,向服务器端发送第二次请求。因此,当客户端访问login.jsp时发送了两次请求

       提交表单发送请求到loginServlet中,其处理流程为:

      (1)获取表单中的验证码

      (2)通过session获取验证码文本

      (3)比较验证码填写,如果相同,向下执行,如果不相同,保存错误信息到request域,转发到login.jsp.

               (请求转发)通过request,getRequestDispatcher("");转发到新的login.jsp页面,并且通过forward方法将request,response一同转发给login.jsp。login.jsp就能通过请求转发来的request域中获取各种数据

login.jsp登陆页面: 

<body>
 
 <%
 	String mmsg = "";
 	if(request.getAttribute("Mmsg") != null){
 		mmsg = (String)request.getAttribute("Mmsg");
 	}
 
 	String cmsg="";
 	if(request.getAttribute("Cmsg") != null){
 		cmsg = (String)request.getAttribute("Cmsg");
 	}
 	
 	String username = "";
 	String password = "";
 	Cookie[] cookies = request.getCookies();
 	if(cookies != null){
 		for(Cookie c:cookies){
 			if("CSDN".equals(c.getName())){
 				username = c.getName();
 				password = c.getValue();
 			}
 		}
 	}
 %>
 
 <form action="/VerifyCode/msgServlet" method="post">
 Username:<input type="text" name="username" value="<%=username %>"/><br/>
 Password:<input type="text" name="password" value="<%=password %>"/><br/>
 <font color="red"><b><%=mmsg %></b></font><br/>
 VerifyCode:<input type="text" name="writeCode"/>  
 		<img  src="/VerifyCode/VerifyCodeServlet"/>
	 <br/>
	 <font color="red"><b><%=cmsg %></b></font><br/>
 	<input type="submit" value="Submit"/>
 </form>
	
  </body>
package cn.itcast.servlet;

import icn.itcast.image.VerifyCode;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class VerifyCodeServlet extends HttpServlet {

	/**
	 * 1.生成验证码图片    
	 * 2.保存生成验证码的文本
	 * 3.将图片通过response响应给客户端
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//生成验证码图片
		VerifyCode vc = new VerifyCode();
		//得到图片
		BufferedImage image = vc.getImage();
		//保存生成验证码的文本
		request.getSession().setAttribute("text", vc.getText());
		
		//通过response将验证码图片响应给客户端
		VerifyCode.output(image,response.getOutputStream());
	}

}
package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class msgServlet extends HttpServlet {

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("username");
		String password = request.getParameter("password");
		String writeCode = request.getParameter("writeCode");
		if(name.equals("CSDN") && password.equals("12345")){
			
			if(writeCode.equalsIgnoreCase((String)request.getSession().getAttribute("text"))){
				Cookie cookie0 = new Cookie("username",name);
				response.addCookie(cookie0);
				
				Cookie cookie1 = new Cookie("password",password);
				response.addCookie(cookie1);
				
				response.sendRedirect("/VerifyCode/sucess.jsp");
			}else{
				request.setAttribute("Cmsg", "验证码错误");
				RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
				rd.forward(request, response);
			}
		}else{
			request.setAttribute("Mmsg", "用户名或密码错误");
			RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
			rd.forward(request, response);
		}
	
	}

}

该验证码程序中的用户密码没有涉及到数据库,(之后的博客会写到)

发布了27 篇原创文章 · 获赞 1 · 访问量 2029

猜你喜欢

转载自blog.csdn.net/yangyiyun199863/article/details/104316157