系统A已经完成了,系统B其实没什么差别,主要的逻辑都已经在Sso-server模块中完成,如果还有所不懂请参看文档:
单点登录-六-模块Sso-server
单点登录-七-模块System-a
1.确实相差不多,给一下源码即可,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="//layui.hcwl520.com.cn/layui/css/layui.css?v=201811010202" rel="stylesheet">
</head> <body> <h1></h1>
<div style="padding: 20px; background-color: #F2F2F2;"> <div class="layui-row layui-col-space15"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-header">系统B</div> <div class="layui-card-body"> 用户:<span th:text="${userInfo.userName}"></span>登录成功<br> ticket:<span th:text="${userInfo.ticket}"></span> </div> </div> <form class="layui-form" method="post" action="/logout"> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit="" >退出登录</button> </div> </div> </form> </div> </div> </div>
<script src="//layui.hcwl520.com.cn/layui/layui.js?v=201811010202"></script> </body> </html>
|
2.控制器,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
@Controller public class HomeController { @Autowired private RestTemplate restTemplate;
@RequestMapping("/home") public String goHome(HttpSession session, Model model, HttpServletRequest request){ Object userInfo = session.getAttribute("userInfo"); System.out.println(userInfo); model.addAttribute("userInfo",session.getAttribute("userInfo")); return "home"; }
@ResponseBody @RequestMapping("/logout") @SuppressWarnings("all") public String logout(HttpServletRequest request, HttpServletResponse response) { String ticket = SsoCookieUtil.getCookie(request,"ticket"); boolean isLogout = restTemplate.getForObject(ServerConstant.SSO_URL+"logout?ticket="+ticket,Boolean.class); if(isLogout){ SsoCookieUtil.setCookie(response,"ticket","",0); return "用户已登出"; } return "登出失败"; } }
|
3.restTemplate配置类,我也想A的配置类,但是着实实现不了,只能再写一次了,其实A和B系统都只用退出登录需要用到,需要嫌麻烦,可以不写退出,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
@Controller public class HomeController { @Autowired private RestTemplate restTemplate;
@RequestMapping("/home") public String goHome(HttpSession session, Model model, HttpServletRequest request){ Object userInfo = session.getAttribute("userInfo"); System.out.println(userInfo); model.addAttribute("userInfo",session.getAttribute("userInfo")); return "home"; }
@ResponseBody @RequestMapping("/logout") @SuppressWarnings("all") public String logout(HttpServletRequest request, HttpServletResponse response) { String ticket = SsoCookieUtil.getCookie(request,"ticket"); boolean isLogout = restTemplate.getForObject(ServerConstant.SSO_URL+"logout?ticket="+ticket,Boolean.class); if(isLogout){ SsoCookieUtil.setCookie(response,"ticket","",0); return "用户已登出"; } return "登出失败"; } }
|
4.拦截器配置,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
@Configuration public class InterceptorConfig implements WebMvcConfigurer { String[] addPathPatterns = { "/**" };
String[] excludePathPatterns = { "/user/error","/user/out" };
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns); } }
|
总结:
基本已经完成了逻辑代码的编写,下面就是开始测试,还有就是有关于cookie安全问题的思考,写的很乱,还请见谅。