前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前后端分离中使用 Session 域传输对象

前后端分离中使用 Session 域传输对象

作者头像
wsuo
发布2020-10-29 11:00:15
1.7K0
发布2020-10-29 11:00:15
举报
文章被收录于专栏:技术进阶之路技术进阶之路

前提

前端使用 Vue,后端使用 SpringBoot 框架,使用 Session 传值后端获取不到。

这里使用 Session 域来存储验证码,拿到后台去比对,验证是否正确。

前端代码如下,只是发送一个请求:

代码语言:javascript
复制
/**
 * 加载验证码
 */
loadImageCode() {
  let _this = this;
  _this.imageCodeToken = Tool.uuid(8);
  $('#image-code').attr('src', process.env.VUE_APP_SERVER + '/system/admin/kaptcha/image-code/' + _this.imageCodeToken);
},

login() {
  let _this = this;
  // 如果密码是从缓存带出来的: 则不需要重新加密
  let md5 = hex_md5(_this.user.password);
  let rememberUser = LocalStorage.get(LOCAL_KEY_REMEMBER_USER) || {};
  if (md5 !== rememberUser.md5) {
    _this.user.password = hex_md5(_this.user.password + KEY);
  }
  _this.user.imageCodeToken = _this.imageCodeToken;
  Loading.show();
  _this.$ajax.post(process.env.VUE_APP_SERVER + '/system/admin/user/login', _this.user).then(response => {
    Loading.hide();
    let resp = response.data;
    if (resp.success) {
      // resp.content: {id: "wAtUSitS", loginName: "test", name: "test"}
      let cont = resp.content;
      Toast.success('登陆成功');
      ····

后端是这样的:

代码语言:javascript
复制
@GetMapping("/image-code/{imageCodeToken}")
public void imageCode(@PathVariable(value = "imageCodeToken") String imageCodeToken, HttpServletRequest request, HttpServletResponse httpServletResponse) throws Exception{
    ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
    try {
        // 生成验证码字符串
        String createText = defaultKaptcha.createText();
        request.getSession().setAttribute(imageCodeToken, createText);
        ····
代码语言:javascript
复制
/**
 * 登陆
 *
 * @param userDto userDto
 * @return 返回响应
 */
@PostMapping("/login")
public ResponseDto<LoginUserDto> login(@RequestBody UserDto userDto, HttpServletRequest request) {
    LOG.info("用户登陆开始");
    // MD5 加密
    userDto.setPassword(DigestUtils.md5DigestAsHex(userDto.getPassword().getBytes()));
    ResponseDto<LoginUserDto> responseDto = new ResponseDto<>();
    
    // 根据验证码 token 去获取缓存中的验证码 判断和用户输入的验证码是否一致
    String imageCode = (String) request.getSession().getAttribute(userDto.getImageCodeToken());
    if (StringUtils.isEmpty(imageCode)) {
        responseDto.setSuccess(false);
        responseDto.setMessage("验证码已过期");
        LOG.info("用户登陆失败: 验证码已过期");
        return responseDto;
    }
    if (!imageCode.toLowerCase().equals(userDto.getImageCode().toLowerCase())) {
        responseDto.setSuccess(false);
        responseDto.setMessage("验证码不对");
        LOG.info("用户登录失败: 验证码不对");
        return responseDto;
    } else {
        // 验证码通过后 移除验证码
        request.getSession().removeAttribute(userDto.getImageCodeToken());
    }
    ····

解决

在 Vue 的 main.js 中添加这一句:

代码语言:javascript
复制
// 解决每次 ajax 请求, 对应的 sessionId 不一致的问题
axios.defaults.withCredentials = true;

同时设置一下跨域,这里给出一种方法,其他方法请看这篇文章 https://blog.csdn.net/weixin_43941364/article/details/109004806

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • 解决
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档