Session,一次会话的多次请求中共享数据

一、会话

用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话就结束。在一次会话中可以包含多次请求和响应

HTTP 协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现一次会话内数据共享

Cookie是存储在浏览器端,而Session是存储在服务器端

当用户首次访问一个Web应用时,服务器会为该用户创建一个会话,并分配一个唯一的会话标识符(session ID)。这个会话标识符通常以cookie的形式存储在用户的浏览器中

在用户访问过程中,浏览器会将会话标识符发送给服务器,服务器根据标识符来识别用户的会话,并在需要时更新会话状态。会话状态可以包括用户的登录状态、购物车内容、用户偏好设置等信息。

关于会话的生命周期,可以通过设置Session存储时间实现

二、登入为例,保存用户id

登录成功,将员工id存入Session并返回登录成功结果

        request.getSession().setAttribute("employee",emp.getId());
//json格式的数据,Employee对象接收,要加@RequestBody
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request,@RequestBody Employee employee){

        //1、将页面提交的密码password进行md5加密处理
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        //2、根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);

        //3、如果没有查询到则返回登录失败结果
        if(emp == null){
            return R.error("登录失败");
        }

        //4、密码比对,如果不一致则返回登录失败结果
        if(!emp.getPassword().equals(password)){
            return R.error("登录失败");
        }

        //5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
        if(emp.getStatus() == 0){
            return R.error("账号已禁用");
        }

        //6、登录成功,将员工id存入Session并返回登录成功结果
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }

使用session,为线程设置值

//判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));

            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);

            filterChain.doFilter(request,response);
            return;
        }

基于ThreadLocal封装工具类,用户保存和获取当前登录用户id,便于公共字段自动填充

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    /**
     * 设置当前线程的线程局部变量的值
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }

    /**
     * 返回当前线程所对应的线程局部变量的值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

公共字段自动填充,我们对数据的CRUD操作,数据是谁操作的?,session与ThreadLocal结合使用,保存用户的id

@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
    /**
     * 插入操作,自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        log.info(metaObject.toString());

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser",BaseContext.getCurrentId());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }

    /**
     * 更新操作,自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        log.info(metaObject.toString());

        long id = Thread.currentThread().getId();
        log.info("线程id为:{}",id);

        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}
  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python的requests库是一个非常强大和流行的HTTP请求库,它提供了一个方便的session对象,可以用来在多个请求之间共享状态和信息。 session对象的妙用之一是它可以保存cookie。在使用requests发送HTTP请求时,服务器会返回一个包含session ID的cookie,这个cookie可以保存在session对象,然后在后续的请求自动发送给服务器。这样就能够实现模拟登录一次,然后在之后的请求保持登录状态,无需重复登录。 另一个妙用是可以设置会话级的请求头。通过在session对象设置请求头,可以保持在多个请求共享相同的请求头。这对于需要在每个请求传递相同的用户代理、认证信息或其他常用的请求头字段的情况非常有用。 session对象还可以使用连接池来管理HTTP连接。在每个请求创建和关闭连接可能会产生很大的开销,而使用session对象可以实现连接的重用,从而提高性能和效率。 此外,session对象还提供了其他一些方便的功能,如跟踪重定向、处理SSL证书验证、处理请求超时等。它还支持将请求和响应数据保存到文件、自动处理网络代理等。 总而言之,Python的requests库session对象是一个非常强大和方便的工具,它可以帮助我们更好地管理HTTP请求,实现登录状态的保持,共享请求头和连接管理等功能。使用session对象可以提高代码的可维护性和性能,减少重复代码。它是进行Web开发、爬虫等各种与HTTP请求相关的任务时的必备工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值