我先描述下我的场景:
最近两天刚好对接一个单点登录的功能,和以往最大的差异就是跳转过来的请求方法是POST,即用户信息是表单数据(之所以是表单的方式是因为他们的用户信息是通过加密之后传过来的加密串,不是直接的用户信息,并且要使用用户信息需要后端用统一认证的jar做解密之后方可使用);
这个问题就比较恶心,以往都是跳转过来是个get请求用户参数也不是加密的,直接拼在url后面,所以前端拿到这个路径里面的参数直接往后端走校验,校验通过后返回前端,前端再走进去系统首页的接口就完事儿了。
但是这里的post前端没法取到表单参数,更不用说将参数送去后端校验了。
所以这个取加密参数需要后端去做(同时使用jar解密出用户信息),那这是后端去拿到的数据,前后端分离的项目要进入系统是前端去发请求登录校验通过后方可进系统,后端光拿个数据怎么进系统呢?
此时,我就想到了后端重定向到前端地址带并且地址栏带上我解密出来的这些用户信息不就行了吗,重点就在这里,问题不是那么简单的,如果光走个接口路径,虽然是发送到前端地址上去了,但是没什么屌用,还是直接就到后端了,前端根本收不到校验结果然后走登录逻辑进首页,这句红话要好好理解。我们平台自身登录的时候这个地址,在地址栏敲这个路径是不是就是登陆页面,而不是接口,更不会到达当接口发到后端,所以同志们应该想到了,后端重定向的路径就是要这个路径,并且拼接上我们的用户信息,前端根据浏览器访问这个页面地址的时候,拿到参数做登录校验逻辑进入系统,至此大功告成。
后端解密之后重定向代码:
private String targetURL="http://127.0.0.1:9010";//前端地址 private void acs(HttpServletRequest req, HttpServletResponse resp,String samlResponseParam,String AxMxSessionToken){ String comingAxMxSessionToken=req.getParameter("AxMxSessionToken"); if(comingAxMxSessionToken == null){ comingAxMxSessionToken = (String) req.getSession().getAttribute("AxMxSessionToken"); } Map<String,String> attrMap= ReadAttribute.parseResponseParam(samlResponseParam);//解密用户信息并放入map for (String key : attrMap.keySet()) { System.out.println("Key+"+key+"-------"+attrMap.get(key)); } req.setAttribute("userIdentity",attrMap.get("userid"));//用户账号 req.setAttribute("userAttributes",attrMap.toString()); req.setAttribute("AxMxSessionToken",comingAxMxSessionToken); req.getSession().setAttribute("AxMxSessionToken",AxMxSessionToken); resp.setStatus(200); resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); resp.setHeader("Access-Control-Max-Age", "3600"); resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type"); try { resp.sendRedirect(targetURL+"/login?username="+attrMap.get("userid")+"&isAcs=true");//重定向到前端登录页根据自己实际情况定需要带哪些参数直接全部拼到这 } catch (IOException e) { e.printStackTrace(); log.info("单点登录跳转重定向平台登录时异常!"); } }
前端的代码我就不粘了!我标红的地方注意理解。说白了就是自身系统登录的功能是完善的,我们只需要将跳转过来的用户信息再次给到前端登录页,登录页能接收到这个这些参数,再去走改校验的逻辑,最终进入系统就好啦。