修复前端提交同名cookie时的框架错读现象

This commit is contained in:
click33 2024-08-28 00:28:41 +08:00
parent acd1bcb518
commit 3eaa6b9baf
9 changed files with 237 additions and 2 deletions

View File

@ -131,6 +131,20 @@ public interface SaRequest {
*/
String getCookieValue(String name);
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
* @param name
* @return
*/
String getCookieFirstValue(String name);
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
String getCookieLastValue(String name);
/**
* 返回当前请求path (不包括上下文名称)
* @return /

View File

@ -95,6 +95,26 @@ public class SaRequestForDubbo implements SaRequest {
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -95,6 +95,26 @@ public class SaRequestForDubbo3 implements SaRequest {
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -82,6 +82,26 @@ public class SaRequestForGrpc implements SaRequest {
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
// 不传播 cookie 参数
return null;
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -109,6 +109,14 @@ public class SaRequestForServlet implements SaRequest {
*/
@Override
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
@ -120,6 +128,25 @@ public class SaRequestForServlet implements SaRequest {
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
String value = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie != null && name.equals(cookie.getName())) {
value = cookie.getValue();
}
}
}
return value;
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -101,6 +101,14 @@ public class SaRequestForReactor implements SaRequest {
*/
@Override
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
HttpCookie cookie = request.getCookies().getFirst(name);
if(cookie == null) {
return null;
@ -108,6 +116,36 @@ public class SaRequestForReactor implements SaRequest {
return cookie.getValue();
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
String value = null;
String cookieStr = getHeader("Cookie");
if(SaFoxUtil.isNotEmpty(cookieStr)) {
String[] cookieItems = cookieStr.split(";");
for (String item : cookieItems) {
String[] kv = item.split("=");
if (kv.length == 2) {
if (kv[0].trim().equals(name)) {
value = kv[1].trim();
}
}
}
}
return value;
// 此种写法无法获取到最后一个 CookieWebFlux 底层代码应该是有bug前端提交多个同名Cookie时只能解析出第一个来
// List<HttpCookie> cookies = request.getCookies().get(name);
// if(cookies.isEmpty()) {
// return null;
// }
// return cookies.get(cookies.size() - 1).getValue();
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -101,6 +101,14 @@ public class SaRequestForReactor implements SaRequest {
*/
@Override
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
HttpCookie cookie = request.getCookies().getFirst(name);
if(cookie == null) {
return null;
@ -108,6 +116,36 @@ public class SaRequestForReactor implements SaRequest {
return cookie.getValue();
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
String value = null;
String cookieStr = getHeader("Cookie");
if(SaFoxUtil.isNotEmpty(cookieStr)) {
String[] cookieItems = cookieStr.split(";");
for (String item : cookieItems) {
String[] kv = item.split("=");
if (kv.length == 2) {
if (kv[0].trim().equals(name)) {
value = kv[1].trim();
}
}
}
}
return value;
// 此种写法无法获取到最后一个 CookieWebFlux 底层代码应该是有bug前端提交多个同名Cookie时只能解析出第一个来
// List<HttpCookie> cookies = request.getCookies().get(name);
// if(cookies.isEmpty()) {
// return null;
// }
// return cookies.get(cookies.size() - 1).getValue();
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -109,6 +109,14 @@ public class SaRequestForServlet implements SaRequest {
*/
@Override
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
@ -120,6 +128,25 @@ public class SaRequestForServlet implements SaRequest {
return null;
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
String value = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie != null && name.equals(cookie.getName())) {
value = cookie.getValue();
}
}
}
return value;
}
/**
* 返回当前请求path (不包括上下文名称)
*/

View File

@ -68,8 +68,39 @@ public class SaRequestForSolon implements SaRequest {
}
@Override
public String getCookieValue(String s) {
return ctx.cookie(s);
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
return ctx.cookie(name);
}
/**
* [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name
* @return
*/
@Override
public String getCookieLastValue(String name){
String value = null;
String cookieStr = ctx.header("Cookie");
if(SaFoxUtil.isNotEmpty(cookieStr)) {
String[] cookieItems = cookieStr.split(";");
for (String item : cookieItems) {
String[] kv = item.split("=");
if (kv.length == 2) {
if (kv[0].trim().equals(name)) {
value = kv[1].trim();
}
}
}
}
return value;
}
@Override