jsp状态管理
http协议的无状态性
无状态是指 当浏览器放松请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。
简单地说,就是服务器不会去记得你,所以就是无状态协议
保存用户的状态的两大机制:
Session
Cookie(客户端的技术)
什么是Cookie
Web服务器保存在客户端的一系列文本信息
1.判断是否已经登录网站(保存了登录信息)
2.购物车的处理
Cookie
- 对特定对象的追踪
- 保存用户网页浏览记录与习惯
- 简化登录
Cookie容易泄露用户信息
Jsp中创建与使用Cookie
创建Cookie对象
Cookie newCookie = new Cookie(String key,Object value)
写入Cookie对象
response.addCookie(newCookie);
读取Cookie对象
Cookie[]cookies=request.getCookies();
void setMaxAge(int expiry) 设置cookie有效期,以秒为单位
void setValue(String value)在cookie创建后,对cookie进行赋值
String getName()获取cookie的名称
String getValue()获取cookie的值
int getMaxAge()获取cookie的有效时间,以秒为单位
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.net.*" %>
<html>
<head>
<title>首页</title>
</head>
<body>
今天的日期<%= new java.util.Date().toString()%>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if(c.getName().equals("username")){
username=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")){
password=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<form action="login.jsp" method="post">
<table>
<tr>
<td>
用户名:
</td>
<td>
<input type="text" name="username" value="<%=username %>">
</td>
</tr>
<br>
<tr>
<td>密码</td>
<td><input type="password" name="password" value="<%=password %>"></td>
</tr>
<br>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookies" checked="checked">是否保存信息</td></tr>
<tr>
<td><input type="submit" value="登录" align="center"></td>
</tr>
</table>
</form>
</body>
</html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功</h1>
<hr>
<br>
<br>
<br>
<%
request.setCharacterEncoding("utf-8");
//首先判断用户是否选择了记住
String[] isUseCookies =request.getParameterValues("isUseCookies");
if(isUseCookies!=null&&isUseCookies.length>0) {
//把用户名和密码保存在Cookie对象里面
String username = URLEncoder.encode(request.getParameter("username"),"utf-8");
String password =URLEncoder.encode( request.getParameter("password"),"utf-8");
Cookie usernameCookie = new Cookie("username",username);
Cookie passwordCookie = new Cookie("password",password);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);
}
else{
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if(c.getName().equals("username")||c.getName().equals("password")){
c.setMaxAge(0);//设置Cookie失效
response.addCookie(c);//重新保存
}
}
}
}
%>
<a href="users.jsp" target="_blank">查看用户信息</a>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: HJCD
Date: 2020/5/16
Time: 11:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.net.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>用户信息</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies = request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if(c.getName().equals("username")){
username = URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")){
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<br>
<br>
<br>
用户名:<%=username%><br>
密码:<%=password%><br>
</body>
</html>
以上3个jsp页面使用了cookie存储信息
1.URLEncoder.encode(String s, String enc)
使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式
URLDecoder.decode(String s, String enc)
使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。
2.发送的时候使用URLEncoder.encode编码,接收的时候使用URLDecoder.decode解码,都按指定的编码格式进行编码、解码,可以保证不会出现乱码
3.主要用来http get请求不能传输中文参数问题。http请求是不接受中文参数的。
这就需要发送方,将中文参数encode,接收方将参数decode,这样接收方就能收到准确的原始字符串了。