前后端分离项目:
const singleLogin = async () => {
const currentUrl = window.location.href;
const url = SINGLE_LOGIN;
if (currentUrl.indexOf('code') == -1) {
window.location.href = url;
}
};
const gotoIndex = async (code: string) => {
setSubmitting(true);
try {
// 登录
const msg = await singlesLogin(code);
if (msg.code === '0') {
message.success('登录成功!');
setToken(msg.data || '');
replaceGoto();
setTimeout(() => {
refresh();
}, 0);
return;
}
// 如果失败去设置用户错误信息
setUserLoginState(msg);
} catch (error) {
message.error('登录失败,请重试!');
}
setSubmitting(false);
}
useEffect(() => {
let code = getCode(window.location.href)
console.log(code != '')
if (code != '') {
gotoIndex(code)
}
}, [])
判断是否第一次登陆(请求参数是否含有code),不包含则去第三方登录,带有code的登录页面请求,直接跳转后台认证(只校验username便于获取角色信息)与授权完成登陆
await outSingleLogin().then(res=>{
if(res.code=='0'){
const url = SINGLE_LOGOUT;
window.location.href = url;
}
});
removeToken();
@PostMapping(value="/outLogin")
@ResponseBody
public ApiResult<Object> logout(HttpServletResponse httpServletResponse) {
if(httpSession.getAttribute("access_token")!=null) {
String token = httpSession.getAttribute("access_token").toString();
oAuth2SsoKit.deleteToken(token);
}
return ApiResult.SUCCESS;
}
登出调用第三方sdk删除token,前台跳转登录页面,后面完成客户端系统的正常退出(删除token)