diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java
index 8eaf6671..9d3a8b7e 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java
@@ -45,7 +45,16 @@ public interface SaRequest {
*/
public default boolean isParam(String name, String value) {
String paramValue = getParam(name);
- return paramValue != null && paramValue.equals(value);
+ return SaFoxUtil.isNotEmpty(paramValue) && paramValue.equals(value);
+ }
+
+ /**
+ * 检测请求是否提供了指定参数
+ * @param name 参数名称
+ * @return 是否提供
+ */
+ public default boolean hasParam(String name) {
+ return SaFoxUtil.isNotEmpty(getParam(name));
}
/**
@@ -106,7 +115,7 @@ public interface SaRequest {
}
/**
- * 返回当前请求的url,例:http://xxx.com/
+ * 返回当前请求的url,不带query参数,例:http://xxx.com/
* @return see note
*/
public String getUrl();
@@ -124,5 +133,14 @@ public interface SaRequest {
public default boolean isAjax() {
return getHeader("X-Requested-With") != null;
}
+
+ /**
+ * 转发请求
+ * @param url 转发地址
+ * @return 任意值
+ */
+ public default Object forward(String path) {
+ throw new SaTokenException("No implementation");
+ }
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoConsts.java
index 5f39d710..8f049dae 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoConsts.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoConsts.java
@@ -68,7 +68,10 @@ public class SaSsoConsts {
/** 表示OK的返回结果 */
public static final String OK = "ok";
+ /** 表示自己 */
+ public static final String SELF = "self";
+
/** 表示请求没有得到任何有效处理 {msg: "not handle"} */
public static final String NOT_HANDLE = "{\"msg\": \"not handle\"}";
-
+
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java
index a45c2b92..ccb27877 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java
@@ -247,11 +247,9 @@ public class SaSsoHandle {
// 开始处理
stpLogic.logout();
- if(req.getParam(ParamName.back) == null) {
- return SaResult.ok("单点注销成功");
- } else {
- return res.redirect(req.getParam(ParamName.back, "/"));
- }
+
+ // 返回
+ return ssoLogoutBack(req, res);
}
/**
@@ -273,14 +271,12 @@ public class SaSsoHandle {
// 调用SSO-Server认证中心API,进行注销
String url = SaSsoUtil.buildSloUrl(stpLogic.getLoginId());
String body = String.valueOf(cfg.sendHttp.apply(url));
- if(SaSsoConsts.OK.equals(body)) {
- if(req.getParam(ParamName.back) == null) {
- return SaResult.ok("单点注销成功");
- } else {
- return res.redirect(req.getParam(ParamName.back, "/"));
- }
+ if(SaSsoConsts.OK.equals(body) == false) {
+ return SaResult.error("单点注销失败");
}
- return SaResult.error("单点注销失败");
+
+ // 返回
+ return ssoLogoutBack(req, res);
}
/**
@@ -301,4 +297,28 @@ public class SaSsoHandle {
return SaSsoConsts.OK;
}
+ /**
+ * 封装:单点注销成功后返回结果
+ * @param req SaRequest对象
+ * @param res SaResponse对象
+ * @return 返回结果
+ */
+ public static Object ssoLogoutBack(SaRequest req, SaResponse res) {
+ /*
+ * 三种情况:
+ * 1. 有back参数,值为SELF -> 回退一级并刷新
+ * 2. 有back参数,值为url -> 跳转back地址
+ * 3. 无back参数 -> 返回json数据
+ */
+ String back = req.getParam(ParamName.back);
+ if(SaFoxUtil.isNotEmpty(back)) {
+ if(back.equals(SaSsoConsts.SELF)) {
+ return "";
+ }
+ return res.redirect(back);
+ } else {
+ return SaResult.ok("单点注销成功");
+ }
+ }
+
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
index d2236828..a30656ee 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java
@@ -212,8 +212,7 @@ public class SaSsoTemplate {
}
// 3、是否在[允许地址列表]之中
- String authUrl = SaManager.getConfig().getSso().getAllowUrl().replaceAll(" ", "");
- List 当前会话是否登录:" + StpUtil.isLogin() + "Sa-Token SSO-Client 应用端
" +
"
当前会话是否登录:" + StpUtil.isLogin() + "
" + ""; + " 注销"; return str; } diff --git a/sa-token-demo/sa-token-demo-sso3-client/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-sso3-client/src/main/resources/application.yml index 282d7db7..3f6194dd 100644 --- a/sa-token-demo/sa-token-demo-sso3-client/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-sso3-client/src/main/resources/application.yml @@ -4,12 +4,6 @@ server: # sa-token配置 sa-token: - # Token名称 - token-name: satoken - # Token有效期 - timeout: 2592000 - # Token风格 - token-style: uuid # SSO-相关配置 sso: # SSO-Server端 单点登录地址 diff --git a/sa-token-doc/doc/sso/sso-cd.md b/sa-token-doc/doc/sso/sso-cd.md index a65563a2..878cc3e8 100644 --- a/sa-token-doc/doc/sso/sso-cd.md +++ b/sa-token-doc/doc/sso/sso-cd.md @@ -14,7 +14,7 @@ ``` ##### 1.2、后端拦截重定向 -在后端注册全局过滤器(或拦截器),拦截需要登录后才能访问的页面资源,将未登录的访问重定向至登录接口 +在后端注册全局过滤器(或拦截器、或全局异常处理),拦截需要登录后才能访问的页面资源,将未登录的访问重定向至登录接口 ``` java /** * Sa-Token 配置类 diff --git a/sa-token-doc/doc/sso/sso-type2.md b/sa-token-doc/doc/sso/sso-type2.md index eaa6eae9..74522ab3 100644 --- a/sa-token-doc/doc/sso/sso-type2.md +++ b/sa-token-doc/doc/sso/sso-type2.md @@ -195,7 +195,7 @@ public class SsoClientController { String str = "当前会话是否登录:" + StpUtil.isLogin() + "
" + ""; + "注销"; return str; } diff --git a/sa-token-doc/doc/sso/sso-type3.md b/sa-token-doc/doc/sso/sso-type3.md index da518519..a97af5fd 100644 --- a/sa-token-doc/doc/sso/sso-type3.md +++ b/sa-token-doc/doc/sso/sso-type3.md @@ -182,7 +182,7 @@ sa-token: 点击 **`[注销]`** 按钮,即可单点注销成功 - +  diff --git a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickBean.java b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickBean.java index 0b6017a6..6055e238 100644 --- a/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickBean.java +++ b/sa-token-plugin/sa-token-quick-login/src/main/java/cn/dev33/satoken/quick/SaQuickBean.java @@ -1,8 +1,5 @@ package cn.dev33.satoken.quick; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -11,11 +8,11 @@ import org.springframework.context.annotation.Import; import org.springframework.core.annotation.Order; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.satoken.quick.config.SaQuickConfig; import cn.dev33.satoken.quick.web.SaQuickController; -import cn.dev33.satoken.spring.SpringMVCUtil; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaTokenConsts; @@ -65,26 +62,16 @@ public class SaQuickBean implements WebMvcConfigurer { .addExclude("/favicon.ico", "/saLogin", "/doLogin", "/sa-res/**"). // 认证函数: 每次请求执行 setAuth(r -> { - // System.out.println("---------- 进入sa-token全局认证 -----------"); - // 未登录时直接转发到login.html页面 if (SaQuickManager.getConfig().getAuth() && StpUtil.isLogin() == false) { - try { - HttpServletRequest request = SpringMVCUtil.getRequest(); - HttpServletResponse response = SpringMVCUtil.getResponse(); - request.getRequestDispatcher("/saLogin").forward(request, response); - } catch (Exception e) { - e.printStackTrace(); - } + SaHolder.getRequest().forward("/saLogin"); // 抛出异常,不再继续执行 throw NotLoginException.newInstance(StpUtil.getLoginType(), ""); } - }). // 异常处理函数:每次认证函数发生异常时执行此函数 setError(e -> { - // System.out.println("---------- 进入sa-token异常处理 -----------"); return e.getMessage(); }); } diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java index 44c8a38d..634c2060 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/context/SaReactorHolder.java @@ -16,6 +16,11 @@ public class SaReactorHolder { */ public static final Class