zoukankan      html  css  js  c++  java
  • window.location.href

    1. session 丢失

    在后端代码中,返回一个字符串,内容为重定向地址。

    @ResponseBody
    @RequestMapping("autoLogin")
    public String doctorAutoLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session,
                                         @RequestParam(value="account", required=true) String account) {
          clearSessionAndLogout(request);
          String url = request.getRequestURL().toString();
    
          url = url.substring(0, url.indexOf("/login"));
          String loginUrl = url + "/portal/index/person";
    
          ...
          // 处理请求会话,在 session 中存入 user
          successLoginHandle(request, response, session, user, loginToken);
          ...
    
          return loginUrl;
    }
    

    前端代码:

    class App extends Component {
      constructor(props) {
        super(props);
        this.autoLogin = this.autoLogin.bind(this);
      }
      render() {
        return (
            <div>
              <a onClick={this.autoLogin}>自动登陆</a>
            </div>
        );
      }
      autoLogin() {
        axios.post("http://localhost:3000/login/autoLogin").then((res) => {
          window.location.href = res.data.data;
        }).catch((e) => {
          console.log(e);
        })
      }
    }
    

    执行结果事与愿违,页面虽然进行了重定向,但是没有自动登录成功。通过后台代码断点查看,在登陆时获取 session 中的 user 时,返回为 null。

    网上文章 session lost with window.location.href 的说法是:window.location.href 之后,重新创建了一个新的 httpcontext ,所以导致 session 丢失了。

    问题的解决方式:

    1. 把 session 数据带到你重定向的页面去(未验证)。Session lost window.location.href

      window.onbeforeunload = function() {
            localStorage.setItem( "session", JSON.stringify( window.sessvars) );
      };
      
      window.onload = function() {
            window.sessvars = JSON.parse( localStorage.getItem( "session") || "{}" );;
      };
      
    2. 把重定向操作放到后台去做,这样页面就不会创建新的 httpContext,session 数据就能获取到了

      @RequestMapping("autoLogin")
      public String doctorAutoLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session,
                                     @RequestParam(value="account", required=true) String account) {
            clearSessionAndLogout(request);
            String url = request.getRequestURL().toString();
      
            url = url.substring(0, url.indexOf("/login"));
            String loginUrl = "redirect:" + url + "/portal/index/person";
      
            ...
            // 处理请求会话,在 session 中存入 user
            successLoginHandle(request, response, session, user, loginToken);
            ...
      
            return loginUrl;
      }
      

      去掉 @ResponseBody 标注,如果有这个标注,返回值将作为响应体的内容返回。在 loginUrl 前面拼接 redirect: 字符串。

    js window.location.href之后,session丢失的问题

  • 相关阅读:
    Java中内部类中使用外面变量为什么final修饰?
    Java正则表达式
    Java内部类复习
    MyEclipse建立SpringMVC入门HelloWorld项目
    java中的System类
    java 中的Scanner
    Freemarker判断是否为空
    HQL多种查询实现
    查询功能实现
    EF生成 类型“System.Data.Entity.DbContext”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/dins/p/14062984.html
Copyright © 2011-2022 走看看