1.创建cookie
/**
* 在服务器端创建Cookie,并且发送给浏览器
* Cookie本身就是字符串的键值对,每个Cookie只能保存一个键值对
*/
@WebServlet("/Demo1WriteCookieServlet")
public class Demo1WriteCookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象。
Cookie man = new Cookie("user", "NewBoy");
//2.设置过期时间(单位是:秒),必须在发送之前设置
man.setMaxAge(60 * 10); //10分钟
//3.发送给浏览器
response.addCookie(man);
//存储中文(tomcat8.0以上值可以是中文,但键不能是中文,否则会出现500异常)
Cookie cn = new Cookie("Country", "中国");
response.addCookie(cn);
//可选:输出一点信息
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向浏览器写入了Cookie的信息");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.读取cookie
/**
* 读取Cookie的信息,显示在浏览器上
*/
@WebServlet("/Demo2ReadCookieServlet")
public class Demo2ReadCookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//1.通过请求对象的方法获取所有的Cookie信息
Cookie[] cookies = request.getCookies();
//2.如果浏览器端没有Cookie,获取到null,所以要判断一下
if (cookies == null) {
out.println("浏览器端没有Cookie信息");
}
//3.不为空才遍历数组,输出每个Cookie的键和值
else {
for (Cookie cookie : cookies) {
out.print("键:" + cookie.getName() + ",值:" + cookie.getValue() + "<br/>");
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.cookie存储时间
4.get session 获取会话对象
/**
* 向会话域中添加键和值
* 底层是Map结构:可以保存多个键和值,键是String类型,值是Object类型
*/
@WebServlet("/Demo3SetSessionServlet")
public class Demo3SetSessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.通过请求对象,获取会话对象。第1次访问创建新的会话,以后每次访问使用之前创建好的会话。不同的用户之间,会话数据不能共享
HttpSession session = request.getSession();
//2.向会话域中添加键和值
session.setAttribute("product", "LV牌包包");
session.setAttribute("price", 2000);
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("向会话域中添加了键和值<br/>");
out.print("会话ID:" + session.getId() + "<br/>");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
5.从会话中读取值以及设置超时
/**
* 从会话域中获取
*/
@WebServlet("/Demo4GetSessionServlet")
public class Demo4GetSessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取会话对象,第二次访问获取的是上一次相同的会话对象
HttpSession session = request.getSession();
//2.从会话域中获取数据
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("获取会话域中数据:<hr/>");
out.print("商品名:" + session.getAttribute("product") + "<br/>");
out.print("价格:" + session.getAttribute("price") + "<br/>");
out.print("会话ID:" + session.getId() + "<br/>");
//设置过期时间为10秒
session.setMaxInactiveInterval(10);
//销毁会话:会话马上无效
//session.invalidate();
//获取会话过期的时间
out.print("会话过期时间是:" + session.getMaxInactiveInterval() + "秒");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
6.session的钝化和激活
也可以在web.xml里配置会话过期时间
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置会话过期的时间 -->
<session-config>
<!-- 单位是:分钟 -->
<session-timeout>5</session-timeout>
</session-config>
</web-app>
7.注册面加上验证码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎注册</title>
<link href="css/register.css" rel="stylesheet">
</head>
<body>
<div class="form-div">
<div class="reg-content">
<h1>欢迎注册</h1>
<span>已有帐号?</span> <a href="login.jsp">登录</a>
</div>
<form id="reg-form" action="RegisterServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td class="inputs">
<input name="username" type="text" id="username">
<br>
<span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
</td>
</tr>
<tr>
<td>密码</td>
<td class="inputs">
<input name="password" type="password" id="password">
<br>
<span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
</td>
</tr>
<tr>
<td>验证码</td>
<td class="inputs" style="text-align: left;">
<!-- 输入验证码 -->
<input name="verifyCode" type="text" id="verifyCode" style="width: 100px;">
<!-- 验证码图片:通过Servlet生成的图片 -->
<img src="VerifyCodeServlet" id="imgCode" onclick="changeVerifyCode()" title="看不清,点击换一张"/>
<script type="text/javascript">
//换一张验证码
function changeVerifyCode() {
//重新访问服务器换一张新的,替换src属性。浏览器发现地址相同,就不再访问服务器了。每次提交不同的参数即可。
document.getElementById("imgCode").src = "VerifyCodeServlet?num=" + Math.random();
}
</script>
</td>
</tr>
</table>
<div class="buttons">
<input value="注 册" type="submit" id="reg_btn">
</div>
<br class="clear">
</form>
</div>
</body>
</html>
/**
* 验证码访问地址,生成一张图片
*/
@WebServlet("/VerifyCodeServlet")
public class VerifyCodeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用工具类生成图片。参数:宽,高,输出流,验证码长度。返回生成的字符串验证码
String code = CheckCodeUtil.outputVerifyImage(120, 50, response.getOutputStream(), 4);
//2.将验证码放到会话域中
HttpSession session = request.getSession();
session.setAttribute("code", code);
//3.输出到控制台
System.out.println("验证码是:" + code);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//如果注册有汉字,考虑汉字乱码的问题
request.setCharacterEncoding("utf-8");
//模板代码:rout
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//0.先判断验证码是否正确
String verifyCode = request.getParameter("verifyCode"); //用户提交的
//从会话域中获取服务器生成的验证码
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
//如果不等于 (不区分大小写)
if (!verifyCode.equalsIgnoreCase(code)) {
out.print("验证码错误<a href='register.html'>请重试</a>");
//不再继续
return;
}
//1.获取用户名和密码 ctrl+d 复制一行
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.判断用户名是否存在
User user = new User();
user.setUsername(username);
user.setPassword(password);
//3.调用业务层
UserService userService = new UserService();
boolean success = userService.register(user);
//3.如果存在,提示:注册失败 快捷键:inn 和 ifn
if (success) {
//输出注册成功
out.println("注册成功,<a href='login.jsp'>请登录</a>");
}
//4.否则就添加用户,提示:注册成功
else {
out.print("用户名:" + username + ",已经存在,<a href='register.html'>请重试</a>");
}
}