今天和大家分享一个小案例,也是我的课程作业,就是使用Cookie存储的方式,来完成用户登录界面功能的一个实现。
首先我们要知道,cookie实际上是客户端浏览器的一种存储方式,他是依赖于客户端浏览器的存储文本,也就是说我们可以用它把数据存在浏览器中来保证我们项目对数据的引用,但是它并不是很安全,不过我们这也只是作业,目的是为了让我们更熟练的掌握罢了,话不多说,开始我们项目的搭建:
这个项目分为两个大的部分:Servlet部分和jsp部分,我们分别来说:
Servlet部分:
首先是要实现三个功能:注册、登录和验证,那么我们就需要三个Servlet来分别完成这个工作。
registerServlet:
主要是创建Cookie对象,并将从前端获取的数据存储进去,由于Cookie是键值对形式存储的,起初我是想用Cookie的name做用户名,用Value来做用户的密码,从而形成一个键值对的关系,但是因为Cookie的Name不能是中文,所以就需要变通一下,使用name做密码,然后用Value来做用户名就好了,同样形成了一个键值对的关系,源码如下:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "registerServlet", value = "/registerServlet")
public class registerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type","text/html;charset=UTF-8");//设置浏览器编码为utf-8,防止出现中文乱码
//接收前端表单输入的用户名和密码
String username = request.getParameter("Username");
String userPassword = request.getParameter("UserPassword");
//创建cookie,并将上文接收的用户名和密码存入cookie中
Cookie cookie=new Cookie(userPassword,username);
cookie.setMaxAge(60*10);//设置cookie存活时间为10分钟
//发送cookie至客户端,并跳转至注册成功页面
response.addCookie(cookie);
String massage="<meta http-equiv='refresh' content='3;url=/Cookie_war_exploded/Login.jsp'>三秒后跳转到登陆页面,如果没有跳转,请点击<a href='login.jsp'>跳转按钮</a>";//实现三秒之后自动跳转功能。
request.setAttribute("massage",massage);
request.getRequestDispatcher("/registerVictory.jsp").forward(request,response);
}
}
LoginServlet:
它主要是通过判断逻辑,来判断输入的用户名和密码与Cookie中存储的用户名密码是否匹配,匹配则登录成功,否则登陆失败。
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type","text/html;charset=UTF-8");
String username = request.getParameter("Username");//获取输入的用户名
String userPassword = request.getParameter("UserPassword");//获取输入的密码
Cookie[] cookies = request.getCookies();//获取Cookie信息
//定义一个布尔变量flag=false,用于用户登陆条件的判断
boolean flag=false;
//使用for循环遍历获取到的cookie,并判断cookie.getName是否与输入的密码一致,
// 进而判断cookie.getValue是否与输入的用户名一致,如果两者都满足,则令flag=true,否则不变
for (Cookie cookie : cookies) {
if(cookie.getName().equals(userPassword)){
if(cookie.getValue().equals(username)){
flag=true;
}
}
}
//这里对flag进行判断,如果为true,则表示登陆条件满足,否则不满足登陆条件,执行else最后弄得语句
if(flag){
request.getRequestDispatcher("/Victory.jsp").forward(request,response);
//这里没有使用重定向,因为想要把用户名转发到欢迎界面,让欢迎界面输出欢迎用户名登陆的字样,所以使用转发
}else {
String err="";//定义存储错误字符串
err="用户名或密码输入错误,请重新输入!";
request.setAttribute("err",err);//发送存储错误字符串到页面
request.getRequestDispatcher("/Login.jsp").forward(request,response);
//这里将错误提示字符串转发到登录界面,由登录界面的EL表达式进行接收给出错误提示信息。
}
}
}
deleteServlet:
主要用于Cookie的删除,但是并没有直接删除Cookie的方法,一般我们都是使用同名的0时长cookie覆盖要删除的cookie,从而达到立即消失的效果。
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "DeleteServlet", value = "/DeleteServlet")
public class DeleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type","text/html;charset=UTF-8");
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
Cookie DeleteCookie=new Cookie(cookie.getName(),cookie.getValue());//创建同名cookie
DeleteCookie.setMaxAge(0);//设置存活时间为0
response.addCookie(DeleteCookie);//将原先cookie覆盖,使之立刻消失。
}
response.sendRedirect("Login.jsp");//注销完毕所有cookie后,重定向至登录页面。
//使用for循环,将所有用户的cookie都用同名0时长的cookie覆盖,所有用户的信息都将被注销!!
}
}
到了这里,我们就实现了创建、验证、注销的三个功能了,接下来就是要与前端结合起来:
JSP部分:
在这里有四个jsp页面,分别负责注册、注册成功、登陆、登录成功界面,由于jsp是动态页面,所以我们可以多使用EL表达式,来实现页面内容的灵活变化,同时我们也可以使用bootstra