超详细的Java知识点路线图
会话就是客户端和服务器之间从连接到断开的过程。
Http协议是无状态的,也就是说断开连接后服务器不会记录用户的状态,有时候我们需要知道之前会话的用户状态,这就需要会话跟踪技术。
会话跟踪的几种实现:
/getInfo;jsessionid=A34322BFEA000021112
Cookie(小饼干),是一种文本文件,保存在浏览器的某个目录中,保存用户信息。
可以保存浏览商品信息、账号、密码等。
特点:
优缺点:
创建Cookie:
Cookie cookied = new Cookie("名称","值");
Cookie 常用方法:
添加Cookie
HttpServletResponse对象.addCookie(Cookie对象)
在响应头中会出现Set-Cookie: name=value
读取Cookie:
先遍历Cookie数组,找到getName和查找名称相同的Cookie:
Cookie[] HttpServletRequest对象.getCookies();
注意:Cookie中不能直接保存中文
解决方法:
保存时,使用URLEncoder.encode对Cookie的名称和值进行编码
读取时,使用URLDecoder.decode对Cookie的名称和值进行解码
案例:用Cookie保存用户名
/**
* Cookie工具类
* @author xray
*
*/
public class CookieUtils {
public static final int MAX_AGE = 24 * 60 * 60;
/**
* 保存Cookie
* @param resp
* @param name
* @param value
*/
public static void save(HttpServletResponse resp,String name,String value){
//创建Cookie对象
try {
Cookie cookie = new Cookie(
URLEncoder.encode(name, "UTF-8"),
URLEncoder.encode(value, "UTF-8"));
//设置路径
cookie.setPath("/");
//设置保存时间
cookie.setMaxAge(MAX_AGE);
//添加Cookie
resp.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 读取Cookie
* @param req
* @param name
* @return
*/
public static String read(HttpServletRequest req,String name){
//读取Cookie数组
Cookie[] cookies = req.getCookies();
//查找username的Cookie
try{
for(Cookie cookie : cookies){
if(name.equals(URLDecoder.decode(cookie.getName(), "UTF-8"))){
return URLDecoder.decode(cookie.getValue(), "UTF-8");
}
}
}catch(Exception ex){
ex.printStackTrace();
throw new RuntimeException(ex);
}
return null;
}
}
通过过滤器读取Cookie
/**
* 在登陆页面前读取Cookie
* @author xray
*
*/
public class ReadCookieFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//从Cookie读取账号,保存到request中
req.setAttribute("username",
CookieUtils.read((HttpServletRequest)req, "username"));
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
Session就是服务器上的一块内存空间,每个用户访问网站时,都会开辟一块内存,用于保存该用户相关的数据。
Session的实现原理
问题:服务器如何知道Session是属于哪个用户的?
获取HttpSession对象:
HttpSession session = request.getSession();
主要方法
Session的关闭
30
Session的持久化
如何保证服务器关闭后Session的数据不会丢失?
对比Cookie和Session