单点登录:单点登录就是在一处登录之后再其他域也可以用到登录信息,单点登录用jsonP实现的跨域访问。
jsonP: javascript动态的在html页面中生成一个‘script’标签,把我们要发送给其他域名的参数用GET方式带在src的url后面,其他域把处理好的数据用js函数调用的方式包装放回给我们的网站域名
单点登录基本思路:将用户登陆成功之后的Token为key值,用户的id或者用户对象的json字符串为value值存到redis中,再将token为value存到cookie中(比如名字为User),用jsonP获取cookie的名字,将cookie的名字传给后台然后再Redis中获取用户信息
JsonP如何实现跨域访问的: 发起一个ajax请求, 配置一个dataType:'jsonp',就可以发起一个跨域请求。jsonp指定服务器返回的数据类型为jsonp格式,可以看发起的请求路径,自动带了一个callback=xxx,xxx是jquery随机生成的一个回调函数名称。代码如下
<script> 7 8 $(document).ready(function () { 9 10 $("#btn").click(function () { 11 12 $.ajax({ 13 url: "http://localhost:9090/student", 14 type: "GET", 15 dataType: "jsonp", //指定服务器返回的数据类型 16 success: function (data) { 17 var result = JSON.stringify(data); //json对象转成字符串 18 $("#text").val(result); 19 } 20 }); 21 22 }); 23 24 }); 25 </script>
服务端代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 response.setCharacterEncoding("UTF-8"); 3 response.setContentType("text/html;charset=UTF-8"); 4 5 //数据 6 List<Student> studentList = getStudentList(); 7 8 9 JSONArray jsonArray = JSONArray.fromObject(studentList); 10 String result = jsonArray.toString(); 11 12 //前端传过来的回调函数名称 13 String callback = request.getParameter("callback"); 14 //用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了 15 result = callback + "(" + result + ")"; 16 17 response.getWriter().write(result); 18 }