Cookie使用
作用:解决了发送的不同请求的数据共享间题
使用:
#创建Cookie对象
Cookie c=new Cookie(string name,String value);
#设置cookie(可选)
#设置有效期(默认存放在内存中,随着浏览器关闭而关闭)
c.setMaxAge(int seconds);
#设置有效路径(只有访问该路径,cookie才会附带上)
c.setPath(string uri)
#响应Cookie信息给客户端
resp.addCookie(c);
注意:
一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
特点:
浏览器端的数据存储技术。存储的数据声明在服务器端。
临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径
cookie获取
//获取Cookie信息数组
Cookie[]cks=req.getcookies();
//遍历数组获取Cookie信息
使用for循环遍历即可,示例:
if(cks!=nul1){
For(Cookie c:cks){
String name=c.getName();
String value=c.getValue();
system.out.print1n(name+":"+value);
}}
Session使用
sessionid生命周期
1、浏览器第一次请求服务器时,服务器会生成一个sessionId,并返回给浏览器,这个sessionId会被保存在浏览器的会话cookie中。
2、在浏览器不关闭的情况下,之后的每次请求请求头都会携带这个sessionId到服务器(一般会设置更新服务器session时间)
3、如果浏览器一直到30分钟后,才发起第二次请求,此时的服务器session已经清空,服务器就会生成一个新的sessionId给浏览器(伴随着一个新的session存在服务器),替代之前的浏览器的sessionid
4、第三次请求,就带上的新的sessionid(cookie中保存着sessionId,如果禁用了cookie,cookie就存不了sessionId,但是我们可以使用url重写技术,将sessionId当作参数放到url后面)。
默认情况,session在服务器上储存为30分钟,保存了用户的一些信息,一旦session清除,用户这次登陆的所有的数据都全部清除。那我们是不是又要手动重新登陆了?我们是需要重新登陆的,只是cookie帮我们自动登录了,一般服务器会给我们浏览器上保存一个cookie,用来验证身份登陆的。每次都会默默的帮我们登陆,其实每次我们打开浏览器,打开某一个网址,这时候,cookie就会帮我们默默等登陆,只是我们感受不到而已。
所以,我们一般验证用户信息的时候(拦截器),一般先看session中是否保存了user对象,如果没有,获取cookie中的账号和密码看看是否可以登录,如果还是不行,直接跳转到登录页面;
关于session存储问题
我们知道session是服务器保存用户的基本信息。
对于单独服务器,我们可以将session保存到本地服务器。
对于多台服务器,多个服务器共享session,我们就必须把session放到一个公共地方(比如redis),或者使用jwt
基本使用流程
请求login.html-->将需要的数据存放到session中,或者将后续反复使用的数据存放到session中
请求home.html-->获取session,取出我们之前存入到session中的数据。
使用:
创建session对象/获取session对象
HttpSession hs=req.getSession();如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象,
如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存放到浏览器上。
如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
session配置
设置session存储时间(单位:秒),默认30分钟,每一个请求都会重新设置失效时间
hs.setMaxInactiveInterval(5);
获取sessionid
hs.getId():
设置session强制失效
hs.invalidate();l
存储数据
hs.setAttribute("name",name);
获取数据
hs.getAttribute("name")
使用时机:
一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
直接配置session过期时间
1、在tomcat中的web.xml(conf目录下)修改这个时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
cookie免登陆和session综合使用
关于token:https://www.cnblogs.com/minsons/p/7058837.html
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie:cookies){
if ("username".equals(cookie.getName())){
String value = cookie.getValue();
//判断用户是否存在(查数据库,验证用户是否存在)
if ("admin".equals(value)){
//设置session,存放会话
HttpSession session = req.getSession();
session.setAttribute("username",value);
resp.sendRedirect("/home");
return;
}
}
}
resp.sendRedirect("/login.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
//查询数据库,如果有用户,就设置session
if (true){
//设置cookie,免登陆
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*5);
cookie.setPath("/");
resp.addCookie(cookie);
//设置session,存放会话
HttpSession session = req.getSession();
session.setAttribute("username",username);
session.setAttribute("pwd",pwd);
resp.sendRedirect("/home");
}
}
}
@WebServlet("/home")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
Object username = session.getAttribute("username");
if(username==null){
resp.sendRedirect("/login");
return;
}
resp.setHeader("content-type","text/html;charset=utf-8");
resp.getWriter().write((String)username+"登录成功");
}
}