博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cas5.3.2单点登录-单点登出(十一)
阅读量:3784 次
发布时间:2019-05-22

本文共 5154 字,大约阅读时间需要 17 分钟。

原文地址,转载请注明出处:      © 

既然有单点登录,肯定就要有登出,之前的整合都是只针对了登录,对登出并没有关注,今天我们就来讲讲登出。

关于单点登出原理,参考博客:

参数说明

参考官网地址

官网共给出了以下几个属性值:

#配置单点登出#配置允许登出后跳转到指定页面cas.logout.followServiceRedirects=false#跳转到指定页面需要的参数名为 servicecas.logout.redirectParameter=service#登出后需要跳转到的地址,如果配置该参数,service将无效。cas.logout.redirectUrl=https://www.taobao.com#在退出时是否需要 确认退出提示   true弹出确认提示框  false直接退出cas.logout.confirmLogout=true#是否移除子系统的票据cas.logout.removeDescendantTickets=true#禁用单点登出,默认是false不禁止#cas.slo.disabled=true#默认异步通知客户端,清除session#cas.slo.asynchronous=true

cas 默认登出后默认会跳转到CASServer的登出页,若想跳转到其它资源,可在/logout的URL后面加上service=jumpurl,例如:

但默认servcie跳转不会生效,需要在 cas服务端的application.properties添加cas.logout.followServiceRedirects=true
这个参数也不一定非要叫 service, 可以通过cas.logout.redirectParameter 来修改它。
另外,默认退出的时候没有任何提示,直接就退出了,若想要有弹出提示,需要添加as.logout.confirmLogout=true
再另外,有一个cas.logout.redirectUrl的属性,可以配置默认登出之后跳转到的连接,若 配置该属性,service参数将无效。就算传了service参数,也是走的该页面,所以我们不需要配置此参数。
如果配置了cas.slo.disabled=true 将禁用单点登出。调用登出将无效。

配置过程

服务端配置

application.properties添加以下属性
#配置允许登出后跳转到指定页面cas.logout.followServiceRedirects=true#跳转到指定页面需要的参数名为 servicecas.logout.redirectParameter=service#在退出时是否需要 确认一下  true确认 false直接退出cas.logout.confirmLogout=true#是否移除子系统的票据cas.logout.removeDescendantTickets=true

客户端配置

可以直接在客户端的登出连接写成服务端的登出地址,不过我没有这样做。

我打算客户端写一个UserController,在各自的系统点击登出,先进入本服务的后台方法,在该方法中重定向到服务端的登出地址。

UserController.java
package com.wangsaichao.cas.controller;import com.wangsaichao.cas.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;/** * @author: wangsaichao * @date: 2018/8/1 * @description: 用户相关操作controller */@Controllerpublic class UserController {
@Autowired private UserService userService; @RequestMapping("insert") public String insert(String username){ userService.insert(username); return "result"; } /** * 跳转到默认页面 * @param session * @return */ @RequestMapping("/logout1") public String loginOut(HttpSession session){ session.invalidate(); //这个是直接退出,走的是默认退出方式 return "redirect:https://server.cas.com:8443/cas/logout"; } /** * 跳转到指定页面 * @param session * @return */ @RequestMapping("/logout2") public String loginOut2(HttpSession session){ session.invalidate(); //退出登录后,跳转到退成成功的页面,不走默认页面 return "redirect:https://server.cas.com:8443/cas/logout?service=http://app1.cas.com:8081"; }}

注意:每个退出方法内都有一个session.invalidate();在点击退出的时候,销毁当前服务的session,如果没有配置这一行代码,你会发现,点击退出之后,还需要刷新一下连接才能重新跳转回登录页。

index.jsp

为了方便测试,在index.jsp添加两种退出方式的连接,完整代码如下:

<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@ page import="java.util.Map" %><%@ page import="java.util.Iterator" %><%@ page import="java.util.List" %><%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %>    
CAS Example Java Web App

当前为客户端1

客户端1

客户端2

退出系统(方式1:跳转到默认页)退出系统(方式2:跳转到指定页)

A sample web application that exercises the CAS protocol features via the Java CAS Client.


Authenticated User Id: <%= request.getRemoteUser() %>

<% if (request.getUserPrincipal() != null) { AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); final Map attributes = principal.getAttributes(); if (attributes != null) { Iterator attributeNames = attributes.keySet().iterator(); out.println("Attributes:"); if (attributeNames.hasNext()) { out.println("

"); out.println("
"); out.println("
"); for (; attributeNames.hasNext(); ) { out.println("
"); } out.println("
Attributes
Key Value
"); String attributeName = (String) attributeNames.next(); out.println(attributeName); out.println(" "); final Object attributeValue = attributes.get(attributeName); if (attributeValue instanceof List) { final List values = (List) attributeValue; out.println("Multi-valued attribute: " + values.size() + ""); out.println("
    "); for (Object value : values) { out.println("
  • " + value + "
  • "); } out.println("
"); } else { out.println(attributeValue); } out.println("
"); } else { out.print("No attributes are supplied by the CAS server.

"); } } else { out.println("
The attribute map is empty. Review your CAS filter configurations.
"); } } else { out.println("
The user principal is empty from the request object. Review the wrapper filter configuration.
"); }%>

测试

1.先访问任意一个客户端登录

2.然后复制地址,打开另一个页面,让两个页面是不同的客户端
3.在任意一个客户端点击退出,刷新另一个服务的网页。
这里写图片描述

你可能感兴趣的文章
2019 我是怎样熬过来的?
查看>>
【C++学习计划】深入浅出——变量作用域(Day3)
查看>>
策略模式
查看>>
Spring Boot 实战 入门
查看>>
关于web系统整体优化提速总结
查看>>
分布式文件系统 - fastDFS
查看>>
BUAA OO 2019 第一单元作业总结
查看>>
格网编码查询方案在项目运用上的进一步探索
查看>>
BUAA-OO-2019 第三单元总结
查看>>
Matlab策略模式
查看>>
架构整洁之道
查看>>
支付渠道路由系统进化史
查看>>
行为型模式:解释器模式
查看>>
深入理解设计模式(22):享元模式
查看>>
spring boot
查看>>
Angular框架
查看>>
行为型模式:模板方法
查看>>
spring cloud之Feign的使用
查看>>
Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
查看>>
LeetCode刷题 --杂篇 --数组,链表,栈,队列
查看>>