从客户端发送请求(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);
}
}
}
该验证码程序中的用户密码没有涉及到数据库,(之后的博客会写到)