java web----cookie/session

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+"登录成功");
    }
}

  

 

posted @ 2020-10-12 16:23  小名的同学  阅读(184)  评论(0编辑  收藏  举报