美文网首页
PHP面试常问问题

PHP面试常问问题

作者: TT出你的玄妙 | 来源:发表于2018-11-30 10:22 被阅读0次

    PHP变量类型:

    Boolean 布尔类型

    Integer 整型

    Float 浮点型

    String 字符串

    Array 数组

    Object 对象

    Resource 资源类型

    NULL

    Callback / Callable 类型

    session跨域问题:

    这时候就涉及到session跨域问题,因为域名不是父子关系,所以必须要实现完全跨域,想到了以下三个解决办法:

    1.URL传参:测试模块访问的时候,地址www.xyz.com后把主域名的session通过参数的形式传递过去,如:www.xyz.com;jsessionid=7D4DED1F2DB5BC53961EFED18BCE7E30

    2.SSO单点登录

    3.利用jsonp的跨域特性,通过ajax进行session传递

    第一种方案考虑URL传参数不美观以及URL需要分享给别人的时候就没法获取到session,所以放弃

    第二种SSO单点登录方案应该在三种方案中最优的,因为系统架构问题,所以也放弃

    目前采用的是第三种方案:

    1.把网站主域名的头部和测试模块的头部分开,在测试模块的头部加入以下js代码:

    (使用测试模块域名www.xyz.com进行网站访问的时候,利用jsonp跨域特性去主域名www.abc.com获取session信息,然后把session信息设置到测试模块域名中)

    varuser = '${sessionScope.username}';//获取session信息

    //先跨域去取主域名登录的session信息    $.getJSON(

    "www.abc.com/user/getname?callback=?",function(data){

            if(data !=null&& data != ""){          //把取到的session数据设置到当前域名的session信息中

    $.getJSON(

    "www.xyz.com/user/setname?data="+data+"&callback=?",function(data){

                    if((user ==null|| user == "") && data !=null&& data != ""){

                        window.location.reload();//需要重新加载一下当前页面,不然头部不会显示session信息

                    }

                });

            }else{

    //退出登录时清除session信息

    if(user !=null&& user != ""){

                    $.getJSON("www.xyz.com/user/setname?data=&callback=?",function(data){

    if(data !=null&& data != "" && data == 'ok'){

    window.location.reload();

    }

    });

    }

    }

    });

    2.后台实现代码:

    @RequestMapping(value="getname")

        @ResponseBody

        public String getName(HttpServletRequest request,HttpServletResponse response){

            //获取回调函数名String callback = request.getParameter("callback");

            String callRes = "";

            try{

    String username = (String) request.getSession().getAttribute("username");

    if(StringUtils.isBlank(username)){

    return callback + "()";

    }

    callRes = callback + "(" + JsonUtils.toJsonString(username) + ")";

            } catch (Exception e) {

                callRes = callback + "()";

                logger.error(e);

            }

            return callRes;

        }

        @RequestMapping(value="setname")

        @ResponseBody

        public String setName(HttpServletRequest request,HttpServletResponse response){

            String callRes = "";

            //获取回调函数名String callback = request.getParameter("callback");

            String data = request.getParameter("data");

            if(StringUtils.isBlank(data)){

                request.getSession().invalidate();

                returncallback + "("+JsonUtils.toJsonString("ok")+")";        }

        try {            request.getSession().setAttribute("username", data);

                callRes = callback + "("+JsonUtils.toJsonString("ok")+")";

            } catch (Exception e) {

                callRes = callback + "()";

                request.getSession().invalidate();

                logger.error(e);

            }

            return callRes;

        }

    获取session数据时是否进行数据加密,这个根据自己的需要,最好是把数据加密

    session已经实现了共享,这种方案的缺点就是访问测试模块的时候,需要和服务器交互很多次,性能上肯定不好

    相关文章

      网友评论

          本文标题:PHP面试常问问题

          本文链接:https://www.haomeiwen.com/subject/vauccqtx.html