前言
我的上一篇博客我们学会了用Cookie对象,这次我们做个小案例,用Cookie做一个三天免登录。
我们会用到上次的那个案例:第三个Web项目(Servlet登录案例 - 附源码)。
dao、pojo和service都一样。不同的是Servlet包下的代码。
为了减少代码冗余相同的代码我就不贴上来了,如:dao、pojo和service。
同时Servlet包下的代码会继续放在示例代码中。
注意:我为了尽可能的简单描述Cookie的使用,代码可能只是简单的作为一个参考。具体的情况需要具体分析!
一、创建项目
1.包结构
和上次的一样,修改的只是servlet包下的类而已。
2.示例代码
LoginPageServlet类:返回一个登录页面。
在这个页面中判断了是否三天免登录。
如果Cookie中有三天免登,那么就直接返回登录成功页面。否则继续去登录页面登录。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 返回一个登录页面
*
* @author changsheng
*/
@WebServlet("/LoginPageServlet")
public class LoginPageServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应编码格式,返回html
resp.setHeader("content-type", "text/html;charset=utf-8");
// 判断Cookie中是否有三天免登,如果有直接登录成功,就不需要进行下面的操作了。
Cookie[] cookies = req.getCookies();
boolean isAvoidLogin = false; // 不是免登录
if (null != cookies) { // 有Cookie才遍历
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
if (name.equals("cookieUsername")) { // Cookie中cookieUsername的存在。那么说明还在免登录期间
isAvoidLogin = true; // 免登录
}
}
}
if (isAvoidLogin) { // 免登录
resp.getWriter().append("登录成功!");
System.out.println("Cookie信息还在,三天免登录成功!");
return;
}
// 没有三天免登录,请登录
// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
StringBuilder html = new StringBuilder();
html.append("<html>")
.append("<body>")
.append("<h1>登录页面</h1>")
.append("<form method=\"post\" action=\"/LoginServlet\">") // 引号需要使用 \ 转换。action="另一个Servlet的URI路径"
.append("用户名:<input type=\"text\" name=\"username\"><br>")
.append("密码:<input type=\"text\" name=\"password\"><br>")
.append("<input type=\"checkBox\" name=\"avoidLogin\">三天免登录(选中按钮三天内免登陆)<br>") // 三天免登录按钮,选中按钮三天内免登陆
.append("<input type=\"submit\" value=\"登录\">")
.append("</form>")
.append("</body>")
.append("</html>");
// 设置响应实体
resp.getWriter().write(html.toString());
}
}
LoginServlet类:处理点击登录按钮登录功能
在第一次登录成功后,会判断用户是否勾选三天免登录按钮。
如果勾选了,那么接下来会在浏览器写入一个Cookie(cookieUsername),并且设置时间为三天,访问登录页面时就直接到登录成功页面。
如果没有勾选,下一次还是需要登录。
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.changsheng.login.pojo.User;
import com.changsheng.login.service.IUserService;
import com.changsheng.login.service.impl.UserServiceImpl;
/**
* 处理点击登录按钮登录功能
*
* @author changsheng
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
IUserService us = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置请求编码格式
req.setCharacterEncoding("utf-8");
// 2.设置响应编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");
// 3.获取请求信息
String username = req.getParameter("username"); // 获取用户名。如果是中文用户名,需要转换编码格式
String password = req.getParameter("password"); // 获取密码
String avoidLogin = req.getParameter("avoidLogin"); // 获取是否免登录
System.out.println("输入的用户名为:"+username+" 密码:"+password+" 是否三天免登录:"+avoidLogin);
// 4.处理请求信息
User user = new User(); // 创建User对象,存放值
user.setUsername(username); // 这边获取的信息在控制台打印时没有乱码,所以就不转换编码格式了。如果出现乱码需要转换编码!
user.setPassword(password);
List<User> list = us.selectUserList(user); // 查询该用户对象是否存在
// 5.响应处理结果
if (list == null || list.isEmpty()) { // 如果查询到的list为null或者为空,说明登录失败
System.out.println("登录失败!\n"+user);
// 重定向到登录页Servlet
resp.sendRedirect(req.getContextPath() + "/LoginPageServlet");
} else { // 登录成功
if ("on".equals(avoidLogin)) { // 判断是否需要写入Cookie信息。如果用户点击了三天免登录按钮,则写入Cookie
User u = list.get(0); // 获取登录的用户信息
Cookie c = new Cookie("cookieUsername", u.getUsername()); // 将登录用户的用户名写入Cookie。(按道理应该是将id写入的,当初写User类的时候忘记了,所以这里就写用户名了)
c.setMaxAge(60*60*24*3); // 最大时间为3天
c.setPath("/"); // Cookie携带的路径为所有路径
resp.addCookie(c); // 响应中加入Cookie信息
}
resp.getWriter().append("登录成功!");
}
}
}
二、演示
访问登录页面
输入正确的账号密码,且勾选三天免登录。
登录成功!
此时再去访问登录页面。因为我登录成功了,且勾选了三天免登录,所以此时应该时直接返回登录成功页面。且Cookie中应该也携带了我们设置的三天免登录信息。
至此三天免登录案例做完。
需要注意的是:如果你写代码的时候在测试,需要把浏览器的缓存清除一下。不然Cookie信息一直存在会影响测试!
源码链接
源码下载链接分享:https://pan.baidu.com/s/1CDFzTS5UbZORCt02YTVrlQ
提取码:h55u
相关链接:
上一篇:Java EE基础(12):Cookie对象介绍与使用
当前篇:Java EE基础(13):Cookie三天免登录案例
下一篇:Java EE基础(14):Session对象介绍与使用
我的Java EE学习路线:我的Java EE学习路线