Skip to content

Commit

Permalink
Merge pull request #9487 from carlyin0801/issue_9445_i18n_cache_fix
Browse files Browse the repository at this point in the history
bug:接口返回对象缓存在内存时做国际化切换可能导致接口返回对象的国际化值不符合预期 #9445
  • Loading branch information
bkci-bot authored Sep 20, 2023
2 parents 1fe2180 + 219ad69 commit 24ef0b6
Show file tree
Hide file tree
Showing 28 changed files with 42 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ interface UserAuthApplyResource {
@GET
@Path("listResourceTypes")
@ApiOperation("资源类型列表")
@BkInterfaceI18n(keyPrefixNames = ["{data[*].resourceType}"])
@BkInterfaceI18n(keyPrefixNames = ["{data[*].resourceType}"], responseDataCacheFlag = true)
fun listResourceTypes(
@ApiParam(name = "用户名", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
Expand All @@ -42,7 +42,7 @@ interface UserAuthApplyResource {
@GET
@Path("listActions")
@ApiOperation("展示动作列表")
@BkInterfaceI18n(keyPrefixNames = ["{data[*].action}"])
@BkInterfaceI18n(keyPrefixNames = ["{data[*].action}"], responseDataCacheFlag = true)
fun listActions(
@ApiParam(name = "用户名", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
Expand Down Expand Up @@ -80,7 +80,7 @@ interface UserAuthApplyResource {
@GET
@Path("{groupId}/getGroupPermissionDetail")
@ApiOperation("查询用户组权限详情")
@BkInterfaceI18n(keyPrefixNames = ["{data[*].actionId}"])
@BkInterfaceI18n(keyPrefixNames = ["{data[*].actionId}"], responseDataCacheFlag = true)
fun getGroupPermissionDetail(
@ApiParam(name = "用户名", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ import javax.ws.rs.NameBinding
@NameBinding
annotation class BkInterfaceI18n(
// 字段前缀名称数组(支持二种方式,1、常量名称:xxx写法 2、动态名称:{xxx}写法,值会根据花括号中的xxx去实体对象获取)
val keyPrefixNames: Array<String> = []
val keyPrefixNames: Array<String> = [],
val responseDataCacheFlag: Boolean = false // 接口响应数据是否从缓存中获取,如果从缓存中获取拦截器一定会做国际化替换
)
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@
package com.tencent.devops.common.web

import com.tencent.devops.common.api.util.JsonUtil
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.redis.RedisOperation
import com.tencent.devops.common.service.BkTag
import com.tencent.devops.common.service.config.CommonConfig
import com.tencent.devops.common.web.interceptor.BkWriterInterceptor
import com.tencent.devops.common.web.jasypt.DefaultEncryptor
import com.tencent.devops.common.web.runner.BkServiceInstanceApplicationRunner
Expand Down Expand Up @@ -100,7 +102,10 @@ class WebAutoConfiguration {
fun jmxAutoConfiguration(environment: Environment) = JmxAutoConfiguration(environment)

@Bean
fun bkWriterInterceptor() = BkWriterInterceptor()
fun bkWriterInterceptor(commonConfig: CommonConfig, client: Client) = BkWriterInterceptor(
commonConfig = commonConfig,
client = client
)

@Bean
fun bkServiceInstanceApplicationRunner(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import com.tencent.devops.common.api.util.MessageUtil
import com.tencent.devops.common.api.util.ShaUtils
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.service.config.CommonConfig
import com.tencent.devops.common.service.utils.SpringContextUtil
import com.tencent.devops.common.web.service.ServiceI18nMessageResource
import com.tencent.devops.common.web.utils.I18nUtil
import javax.ws.rs.container.ResourceInfo
Expand All @@ -28,7 +27,10 @@ import org.springframework.web.context.request.ServletRequestAttributes
@Provider
@BkInterfaceI18n
@Component
class BkWriterInterceptor : WriterInterceptor {
class BkWriterInterceptor(
private val commonConfig: CommonConfig,
private val client: Client
) : WriterInterceptor {

@Context
private var resourceInfo: ResourceInfo? = null
Expand All @@ -45,17 +47,19 @@ class BkWriterInterceptor : WriterInterceptor {
* @param context 拦截器上下文
*/
override fun aroundWriteTo(context: WriterInterceptorContext?) {
// 判断请求用户的语言是否和默认语言是否一致,如果一致则无需进行国际化替换
val defaultLanguage = SpringContextUtil.getBean(CommonConfig::class.java).devopsDefaultLocaleLanguage
val i18nLanguage = I18nUtil.getLanguage(I18nUtil.getRequestUserId())
if (context == null || resourceInfo == null || i18nLanguage == defaultLanguage) {
if (context == null || resourceInfo == null) {
context?.proceed()
return
}
// 1、只需拦截标上BkInterfaceI18n注解的接口
val method = resourceInfo!!.resourceMethod
// 判断请求用户的语言是否和默认语言是否一致,如果一致且接口的响应数据不是从缓存中获取的则无需进行国际化替换
val defaultLanguage = commonConfig.devopsDefaultLocaleLanguage
val i18nLanguage = I18nUtil.getLanguage(I18nUtil.getRequestUserId())
val bkInterfaceI18nAnnotation = AnnotationUtils.findAnnotation(method, BkInterfaceI18n::class.java)
if (bkInterfaceI18nAnnotation == null) {
if (bkInterfaceI18nAnnotation == null ||
(i18nLanguage == defaultLanguage && !bkInterfaceI18nAnnotation.responseDataCacheFlag)
) {
context.proceed()
return
}
Expand Down Expand Up @@ -235,7 +239,6 @@ class BkWriterInterceptor : WriterInterceptor {
// 根据用户ID获取语言信息
val language = I18nUtil.getLanguage(userId)
val i18nMessageMap = mutableMapOf<String, String>()
val client = SpringContextUtil.getBean(Client::class.java)
val i18nKeys = dbI18ndbKeyMap.values.toList()
// 切割国际化key列表,分批获取key的国际化信息
ListUtils.partition(i18nKeys, SIZE).forEach { rids ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
*/
package com.tencent.devops.store.api.image.user

import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.pojo.Page
import com.tencent.devops.common.api.pojo.Result
Expand Down Expand Up @@ -60,9 +59,6 @@ interface UserImageProjectResource {
@POST
@Path("/image/install")
fun installImage(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand All @@ -74,9 +70,6 @@ interface UserImageProjectResource {
@GET
@Path("/image/installedProjects/{imageCode}")
fun getInstalledProjects(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand All @@ -89,9 +82,6 @@ interface UserImageProjectResource {
@GET
@Path("/image/availableImages")
fun getAvailableImagesByProjectCode(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down Expand Up @@ -119,9 +109,6 @@ interface UserImageProjectResource {
@GET
@Path("/image/jobMarketImages")
fun getJobMarketImagesByProjectCode(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand All @@ -146,9 +133,6 @@ interface UserImageProjectResource {
@POST
@Path("/image/jobMarketImages/search")
fun searchJobMarketImages(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
*/
package com.tencent.devops.store.api.image.user

import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.pojo.Result
import com.tencent.devops.common.web.annotation.BkField
Expand Down Expand Up @@ -60,9 +59,6 @@ interface UserImageReleaseResource {
@POST
@Path("/image/imageCodes/{imageCode}/store/rel")
fun addMarketImage(
@ApiParam("PAAS_CC Token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
package com.tencent.devops.store.api.atom

import com.tencent.devops.common.api.annotation.BkInterfaceI18n
import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID_DEFAULT_VALUE
import com.tencent.devops.common.api.pojo.Page
Expand Down Expand Up @@ -71,9 +70,6 @@ interface UserAtomResource {
keyPrefixNames = ["ATOM", "{data.records[*].atomCode}", "{data.records[*].version}", "releaseInfo"]
)
fun listAllPipelineAtoms(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
package com.tencent.devops.store.api.atom

import com.tencent.devops.common.api.annotation.BkInterfaceI18n
import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.pojo.Page
import com.tencent.devops.common.api.pojo.Result
Expand Down Expand Up @@ -139,9 +138,6 @@ interface UserMarketAtomResource {
keyPrefixNames = ["ATOM", "{data.records[*].atomCode}", "{data.records[*].version}", "releaseInfo"]
)
fun listMyAtoms(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down Expand Up @@ -213,9 +209,6 @@ interface UserMarketAtomResource {
@POST
@Path("/atom/install")
fun installAtom(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand All @@ -227,9 +220,6 @@ interface UserMarketAtomResource {
@GET
@Path("/atom/installedProjects/{atomCode}")
fun getInstalledProjects(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@

package com.tencent.devops.store.api.common

import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.pojo.Result
import com.tencent.devops.store.pojo.common.StoreMemberItem
Expand Down Expand Up @@ -117,9 +116,6 @@ interface UserStoreMemberResource {
@PUT
@Path("/test/project/change")
fun changeMemberTestProjectCode(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@

package com.tencent.devops.store.api.template

import com.tencent.devops.common.api.auth.AUTH_HEADER_DEVOPS_ACCESS_TOKEN
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.pojo.Page
import com.tencent.devops.common.api.pojo.Result
Expand Down Expand Up @@ -154,9 +153,6 @@ interface UserTemplateResource {
@POST
@Path("/template/install")
fun installTemplate(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand All @@ -168,9 +164,6 @@ interface UserTemplateResource {
@GET
@Path("/template/installedProjects/{templateCode}")
fun getInstalledProjects(
@ApiParam("token", required = true)
@HeaderParam(AUTH_HEADER_DEVOPS_ACCESS_TOKEN)
accessToken: String,
@ApiParam("userId", required = true)
@HeaderParam(AUTH_HEADER_USER_ID)
userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ class SampleImageInitService @Autowired constructor(
val projectCode = imageInitRequest?.projectCode ?: "demo"
val userId = imageInitRequest?.userId ?: "admin"
val imageCode = imageInitRequest?.imageCode ?: DEFAULT_IMAGE_CODE
val accessToken = imageInitRequest?.accessToken ?: ""
val ticketId = imageInitRequest?.ticketId
logger.info("begin init image: $imageInitRequest")
// 创建demo项目
Expand Down Expand Up @@ -108,7 +107,6 @@ class SampleImageInitService @Autowired constructor(
return Result(true)
}
val addImageResult = imageReleaseService.addMarketImage(
accessToken = accessToken,
userId = userId,
imageCode = imageCode,
marketImageRelRequest = MarketImageRelRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class UserImageProjectResourceImpl @Autowired constructor(
private val storeProjectService: StoreProjectService
) : UserImageProjectResource {

override fun installImage(accessToken: String, userId: String, installImageReq: InstallImageReq): Result<Boolean> {
override fun installImage(userId: String, installImageReq: InstallImageReq): Result<Boolean> {
return imageProjectService.installImage(
userId = userId,
projectCodeList = installImageReq.projectCodeList,
Expand All @@ -60,15 +60,17 @@ class UserImageProjectResourceImpl @Autowired constructor(
}

override fun getInstalledProjects(
accessToken: String,
userId: String,
imageCode: String
): Result<List<InstalledProjRespItem>> {
return storeProjectService.getInstalledProjects(accessToken, userId, imageCode, StoreTypeEnum.IMAGE)
return storeProjectService.getInstalledProjects(
userId = userId,
storeCode = imageCode,
storeType = StoreTypeEnum.IMAGE
)
}

override fun getAvailableImagesByProjectCode(
accessToken: String,
userId: String,
projectCode: String,
agentType: ImageAgentTypeEnum?,
Expand All @@ -79,7 +81,6 @@ class UserImageProjectResourceImpl @Autowired constructor(
): Result<Page<JobImageItem>?> {
return Result(
imageProjectService.getJobImages(
accessToken = accessToken,
userId = userId,
projectCode = projectCode,
agentType = ImageAgentTypeEnum.getImageAgentType(agentType?.name ?: ""),
Expand All @@ -92,7 +93,6 @@ class UserImageProjectResourceImpl @Autowired constructor(
}

override fun getJobMarketImagesByProjectCode(
accessToken: String,
userId: String,
projectCode: String,
agentType: ImageAgentTypeEnum,
Expand All @@ -102,7 +102,6 @@ class UserImageProjectResourceImpl @Autowired constructor(
): Result<Page<JobMarketImageItem?>?> {
return Result(
imageProjectService.getJobMarketImagesByProjectCode(
accessToken = accessToken,
userId = userId,
projectCode = projectCode,
agentType = agentType,
Expand All @@ -115,7 +114,6 @@ class UserImageProjectResourceImpl @Autowired constructor(
}

override fun searchJobMarketImages(
accessToken: String,
userId: String,
projectCode: String,
agentType: ImageAgentTypeEnum,
Expand All @@ -129,7 +127,6 @@ class UserImageProjectResourceImpl @Autowired constructor(
): Result<Page<JobMarketImageItem?>?> {
return Result(
imageProjectService.searchJobMarketImages(
accessToken = accessToken,
userId = userId,
projectCode = projectCode,
agentType = agentType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,11 @@ class UserImageReleaseResourceImpl @Autowired constructor(
}

override fun addMarketImage(
accessToken: String,
userId: String,
imageCode: String,
marketImageRelRequest: MarketImageRelRequest
): Result<String> {
return imageReleaseService.addMarketImage(accessToken, userId, imageCode, marketImageRelRequest)
return imageReleaseService.addMarketImage(userId, imageCode, marketImageRelRequest)
}

override fun updateMarketImage(
Expand Down
Loading

0 comments on commit 24ef0b6

Please sign in to comment.