91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot采用JsonSerializer和Aop實(shí)現(xiàn)可控制的數(shù)據(jù)脫敏

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-11-06 16:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


1 起因

最近在寫(xiě)一個(gè)功能,對(duì)用戶敏感的數(shù)據(jù)進(jìn)行脫敏,在網(wǎng)上看一圈基本上都是全局范圍的,我覺(jué)得應(yīng)該更加靈活,在不同場(chǎng)景,不同業(yè)務(wù)下進(jìn)行脫敏更加合適。

JsonSerializer介紹就參考這位大佬的

https://juejin.cn/post/6872636051237240846

aop介紹參考這位大佬的

https://juejin.cn/post/6844903575441637390

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

2 初步嘗試

枚舉類

/**
*敏感信息枚舉類
*
**/
publicenumPrivacyTypeEnum{

/**
*自定義
*/
CUSTOMER,
/**
*用戶名,張*三,李*
*/
CHINESE_NAME,
/**
*身份證號(hào),110110********1234
*/
ID_CARD,
/**
*座機(jī)號(hào),****1234
*/
FIXED_PHONE,
/**
*手機(jī)號(hào),176****1234
*/
MOBILE_PHONE,
/**
*地址,北京********
*/
ADDRESS,
/**
*電子郵件,s*****o@xx.com
*/
EMAIL,
/**
*銀行卡,622202************1234
*/
BANK_CARD,
/**
*密碼,永遠(yuǎn)是******,與長(zhǎng)度無(wú)關(guān)
*/
PASSWORD,
/**
*密鑰,永遠(yuǎn)是******,與長(zhǎng)度無(wú)關(guān)
*/
KEY

}

注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})//作用于字段上
@JacksonAnnotationsInside//表示自定義自己的注解PrivacyEncrypt
@JsonSerialize(using=PrivacySerialize.class)//該注解使用序列化的方式
public@interfacePrivacyEncrypt{

/**
*脫敏數(shù)據(jù)類型,非Customer時(shí),將忽略refixNoMaskLen和suffixNoMaskLen和maskStr
*/
PrivacyTypeEnumtype()defaultPrivacyTypeEnum.CUSTOMER;

/**
*前置不需要打碼的長(zhǎng)度
*/
intprefixNoMaskLen()default0;

/**
*后置不需要打碼的長(zhǎng)度
*/
intsuffixNoMaskLen()default0;

/**
*用什么打碼
*/
StringmaskStr()default"*";

}

序列化類

publicclassPrivacySerializeextendsJsonSerializer<String>implementsContextualSerializer{
publicstaticfinalLoggerlogger=LoggerFactory.getLogger(PrivacySerialize.class);
privatePrivacyTypeEnumtype;

privateIntegerprefixNoMaskLen;

privateIntegersuffixNoMaskLen;

privateStringmaskStr;

publicPrivacySerialize(PrivacyTypeEnumtype,IntegerprefixNoMaskLen,IntegersuffixNoMaskLen,StringmaskStr){
this.type=type;
this.prefixNoMaskLen=prefixNoMaskLen;
this.suffixNoMaskLen=suffixNoMaskLen;
this.maskStr=maskStr;
}
publicPrivacySerialize(){
}

@Override
publicvoidserialize(Stringorigin,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{
if(StringUtils.isNotBlank(origin)&&null!=type){
switch(type){
caseCHINESE_NAME:
jsonGenerator.writeString(DesensitizedUtils.chineseName(origin));
break;
caseID_CARD:
jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin));
break;
caseFIXED_PHONE:
jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin));
break;
caseMOBILE_PHONE:
jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin));
break;
caseADDRESS:
jsonGenerator.writeString(DesensitizedUtils.address(origin));
break;
caseEMAIL:
jsonGenerator.writeString(DesensitizedUtils.email(origin));
break;
caseBANK_CARD:
jsonGenerator.writeString(DesensitizedUtils.bankCard(origin));
break;
casePASSWORD:
jsonGenerator.writeString(DesensitizedUtils.password(origin));
break;
caseKEY:
jsonGenerator.writeString(DesensitizedUtils.key(origin));
break;
caseCUSTOMER:
jsonGenerator.writeString(DesensitizedUtils.desValue(origin,prefixNoMaskLen,suffixNoMaskLen,maskStr));
break;
default:
thrownewIllegalArgumentException("Unknowsensitivetypeenum"+type);
}
}else{
jsonGenerator.writeString("");
}

}

@Override
publicJsonSerializercreateContextual(SerializerProviderserializerProvider,BeanPropertybeanProperty)throwsJsonMappingException{
if(beanProperty!=null){
if(Objects.equals(beanProperty.getType().getRawClass(),String.class)){
PrivacyEncryptencrypt=beanProperty.getAnnotation(PrivacyEncrypt.class);
if(encrypt==null){
encrypt=beanProperty.getContextAnnotation(PrivacyEncrypt.class);
}
if(encrypt!=null){
returnnewPrivacySerialize(encrypt.type(),encrypt.prefixNoMaskLen(),
encrypt.suffixNoMaskLen(),encrypt.maskStr());
}
}
returnserializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
}
returnserializerProvider.findNullValueSerializer(null);
}
}

脫敏工具類

/**
*脫敏工具類
*
**/
publicclassDesensitizedUtils{

/**
*對(duì)字符串進(jìn)行脫敏操作
*@paramorigin原始字符串
*@paramprefixNoMaskLen左側(cè)需要保留幾位明文字段
*@paramsuffixNoMaskLen右側(cè)需要保留幾位明文字段
*@parammaskStr用于遮罩的字符串,如'*'
*@return脫敏后結(jié)果
*/
publicstaticStringdesValue(Stringorigin,intprefixNoMaskLen,intsuffixNoMaskLen,StringmaskStr){
if(origin==null){
returnnull;
}

StringBuildersb=newStringBuilder();
for(inti=0,n=origin.length();iif(icontinue;
}
if(i>(n-suffixNoMaskLen-1)){
sb.append(origin.charAt(i));
continue;
}
sb.append(maskStr);
}
returnsb.toString();
}

/**
*【中文姓名】只顯示最后一個(gè)漢字,其他隱藏為星號(hào),比如:**夢(mèng)
*@paramfullName姓名
*@return結(jié)果
*/
publicstaticStringchineseName(StringfullName){
if(fullName==null){
returnnull;
}
returndesValue(fullName,0,1,"*");
}

/**
*【身份證號(hào)】顯示前六位,四位,其他隱藏。共計(jì)18位或者15位,比如:340304*******1234
*@paramid身份證號(hào)碼
*@return結(jié)果
*/
publicstaticStringidCardNum(Stringid){
returndesValue(id,6,4,"*");
}

/**
*【固定電話】后四位,其他隱藏,比如****1234
*@paramnum固定電話
*@return結(jié)果
*/
publicstaticStringfixedPhone(Stringnum){
returndesValue(num,0,4,"*");
}

/**
*【手機(jī)號(hào)碼】前三位,后四位,其他隱藏,比如135****6810
*@paramnum手機(jī)號(hào)碼
*@return結(jié)果
*/
publicstaticStringmobilePhone(Stringnum){
returndesValue(num,3,4,"*");
}

/**
*【地址】只顯示到地區(qū),不顯示詳細(xì)地址,比如:北京市海淀區(qū)****
*@paramaddress地址
*@return結(jié)果
*/
publicstaticStringaddress(Stringaddress){
returndesValue(address,6,0,"*");
}

/**
*【電子郵箱郵箱前綴僅顯示第一個(gè)字母,前綴其他隱藏,用星號(hào)代替,@及后面的地址顯示,比如:d**@126.com
*@paramemail電子郵箱
*@return結(jié)果
*/
publicstaticStringemail(Stringemail){
returnemail.replaceAll("(w?)(w+)(w)(@w+.[a-z]+(.[a-z]+)?)","$1****$3$4");

}

/**
*【銀行卡號(hào)】前六位,后四位,其他用星號(hào)隱藏每位1個(gè)星號(hào),比如:622260**********1234
*@paramcardNum銀行卡號(hào)
*@return結(jié)果
*/
publicstaticStringbankCard(StringcardNum){
returndesValue(cardNum,6,4,"*");
}

/**
*【密碼】密碼的全部字符都用*代替,比如:******
*@parampassword密碼
*@return結(jié)果
*/
publicstaticStringpassword(Stringpassword){
if(password==null){
returnnull;
}
return"******";
}

/**
*【密鑰】密鑰除了最后三位,全部都用*代替,比如:***xdS脫敏后長(zhǎng)度為6,如果明文長(zhǎng)度不足三位,則按實(shí)際長(zhǎng)度顯示,剩余位置補(bǔ)*
*@paramkey密鑰
*@return結(jié)果
*/
publicstaticStringkey(Stringkey){
if(key==null){
returnnull;
}
intviewLength=6;
StringBuildertmpKey=newStringBuilder(desValue(key,0,3,"*"));
if(tmpKey.length()>viewLength){
returntmpKey.substring(tmpKey.length()-viewLength);
}
elseif(tmpKey.length()intbuffLength=viewLength-tmpKey.length();
for(inti=0;i0,"*");
}
returntmpKey.toString();
}
else{
returntmpKey.toString();
}
}

}

注解使用

d20e65cc-7c44-11ee-939d-92fbcf53809c.pngd2406482-7c44-11ee-939d-92fbcf53809c.png

的確實(shí)現(xiàn)了數(shù)據(jù)脫敏,但是有個(gè)問(wèn)題現(xiàn)在的脫敏針對(duì)的是 只要對(duì)該實(shí)體類進(jìn)行了使用返回的接口,中的數(shù)據(jù)都會(huì)進(jìn)行脫敏,在有些場(chǎng)景下是不需要的,所以說(shuō)要進(jìn)行改進(jìn)。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

3 第二版改進(jìn)

我的思路是在該實(shí)體類中在繼承一個(gè) 父類其中定義一個(gè)字段,使其作為是否進(jìn)行脫敏的開(kāi)關(guān),并且該實(shí)體類字段不參與序列化 脫敏控制類

publicclassDataMaskKeyimplementsSerializable{
//不進(jìn)行序列化,設(shè)置key來(lái)進(jìn)行過(guò)濾的把控,默認(rèn)不開(kāi)啟
privatetransientBooleanisPrivacyKey=false;

publicBooleangetPrivacyKey(){
returnisPrivacyKey;
}

publicvoidsetPrivacyKey(BooleanprivacyKey){
isPrivacyKey=privacyKey;
}
}

更新之后的序列化類

思路就是通過(guò)反射獲取,該成員的屬性,因?yàn)椴恢罆?huì)繼承多少,所以要進(jìn)行遞歸查找需要的字段

publicclassPrivacySerializeextendsJsonSerializer<String>implementsContextualSerializer{
publicstaticfinalLoggerlogger=LoggerFactory.getLogger(PrivacySerialize.class);
privatePrivacyTypeEnumtype;

privateIntegerprefixNoMaskLen;

privateIntegersuffixNoMaskLen;

privateStringmaskStr;

publicPrivacySerialize(PrivacyTypeEnumtype,IntegerprefixNoMaskLen,IntegersuffixNoMaskLen,StringmaskStr){
this.type=type;
this.prefixNoMaskLen=prefixNoMaskLen;
this.suffixNoMaskLen=suffixNoMaskLen;
this.maskStr=maskStr;
}
publicPrivacySerialize(){
}

@Override
publicvoidserialize(Stringorigin,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{
booleanflag=false;
//反射獲取對(duì)象
ObjectcurrentValue=jsonGenerator.getOutputContext().getCurrentValue();
//反射獲取class
ClassaClass=jsonGenerator.getOutputContext().getCurrentValue().getClass();
ListfieldList=getFieldList(aClass);
for(Fieldfield:fieldList){
//開(kāi)始反射獲取
Stringname=field.getName();
if("isPrivacyKey".equals(name)){
try{
//進(jìn)行重新賦值
flag=(boolean)field.get(currentValue);
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
}
}
//反射進(jìn)行進(jìn)行開(kāi)關(guān)判定
if(flag){
//logger.info("進(jìn)行脫敏處理");
if(StringUtils.isNotBlank(origin)&&null!=type){
switch(type){
caseCHINESE_NAME:
jsonGenerator.writeString(DesensitizedUtils.chineseName(origin));
break;
caseID_CARD:
jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin));
break;
caseFIXED_PHONE:
jsonGenerator.writeString(DesensitizedUtils.fixedPhone(origin));
break;
caseMOBILE_PHONE:
jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin));
break;
caseADDRESS:
jsonGenerator.writeString(DesensitizedUtils.address(origin));
break;
caseEMAIL:
jsonGenerator.writeString(DesensitizedUtils.email(origin));
break;
caseBANK_CARD:
jsonGenerator.writeString(DesensitizedUtils.bankCard(origin));
break;
casePASSWORD:
jsonGenerator.writeString(DesensitizedUtils.password(origin));
break;
caseKEY:
jsonGenerator.writeString(DesensitizedUtils.key(origin));
break;
caseCUSTOMER:
jsonGenerator.writeString(DesensitizedUtils.desValue(origin,prefixNoMaskLen,suffixNoMaskLen,maskStr));
break;
default:
thrownewIllegalArgumentException("Unknowsensitivetypeenum"+type);
}
}else{
jsonGenerator.writeString("");
}
}else{
//logger.info("不進(jìn)行脫敏處理");
jsonGenerator.writeString(origin);
}

}

@Override
publicJsonSerializercreateContextual(SerializerProviderserializerProvider,BeanPropertybeanProperty)throwsJsonMappingException{
if(beanProperty!=null){
if(Objects.equals(beanProperty.getType().getRawClass(),String.class)){
PrivacyEncryptencrypt=beanProperty.getAnnotation(PrivacyEncrypt.class);
if(encrypt==null){
encrypt=beanProperty.getContextAnnotation(PrivacyEncrypt.class);
}
if(encrypt!=null){
returnnewPrivacySerialize(encrypt.type(),encrypt.prefixNoMaskLen(),
encrypt.suffixNoMaskLen(),encrypt.maskStr());
}
}
returnserializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
}
returnserializerProvider.findNullValueSerializer(null);
}

privateListgetFieldList(Classclazz){
if(null==clazz){
returnnull;
}
ListfieldList=newArrayList<>();
//遞歸查找需求的字段
ClassaClass=ClassRecursionUtils.getClass(clazz,"isPrivacyKey");
Field[]declaredFields=aClass.getDeclaredFields();
for(Fieldfield:declaredFields){
if(field!=null){
//設(shè)置屬性的可訪問(wèn)性
field.setAccessible(true);
//過(guò)濾靜態(tài)
if(Modifier.isStatic(field.getModifiers())){
continue;
}
Stringname=field.getName();
//過(guò)濾非布爾類型
Classtype=field.getType();
//并且只添加isPrivacyKey
if(type.isAssignableFrom(Boolean.class)&&"isPrivacyKey".equals(name)){
fieldList.add(field);
}
}
}
returnfieldList;
}

}

遞歸工具類

publicclassClassRecursionUtils{
publicstaticClassgetClass(Classc,StringfieldName){
if(c!=null&&!hasField(c,fieldName)){
returngetClass(c.getSuperclass(),fieldName);
}
returnc;
}

publicstaticbooleanhasField(Classc,StringfieldName){
Field[]fields=c.getDeclaredFields();
for(Fieldf:fields){
if(fieldName.equals(f.getName())){
returntrue;
}
}
returnfalse;
}
}

現(xiàn)在只需要在進(jìn)行實(shí)體類 封裝數(shù)據(jù)時(shí),在進(jìn)行手動(dòng)set即可

4 最終方案

在上述情況下可以實(shí)現(xiàn) 手動(dòng)控制是否在某些場(chǎng)景下的脫敏,但是需要對(duì)原來(lái)的代碼進(jìn)行修改,我覺(jué)得不友好,所以采用aop的形式進(jìn)行控制

項(xiàng)目的返回類型基本上為兩種

  • 實(shí)體類作為返回
  • 分頁(yè)返回

aop注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})//作用于方法上
public@interfacePrivacyKeyAnnotation{

/**
*是否啟用序列化脫敏默認(rèn)開(kāi)啟
*/
booleanisKey()defaulttrue;

/**
*是否為PageInfo(分頁(yè)對(duì)象)
*/
booleanisPageKey()defaultfalse;
}

aop類

@Component
@Aspect
publicclassPrivacyKeyAspect{
publicstaticfinalLoggerlogger=LoggerFactory.getLogger(PrivacyKeyAspect.class);

/**
*@Description:環(huán)繞通知包含此注解的
*@param:ProceedingJoinPointjoinPoint
*@return:Object
*/
@Around(value="@annotation("aop注解地址xxxxx")")
publicObjectrepeatSub(ProceedingJoinPointjoinPoint)throwsThrowable{
returnjoinPoint.proceed();
}

/**
*@Description:后置通知
*/
@AfterReturning(value="@annotation("aop注解地址")",returning="result")
publicvoidsetPrivacyKeyType(JoinPointjoinPoint,Objectresult)throwsThrowable{
//進(jìn)行注解值獲取
MethodSignaturesignature=(MethodSignature)joinPoint.getSignature();
Methodmethod=signature.getMethod();
//是否開(kāi)啟脫敏
booleanflag=method.getDeclaredAnnotation(PrivacyKeyAnnotation.class).isKey();
//是否對(duì)分頁(yè)進(jìn)行脫敏
booleanstatus=method.getDeclaredAnnotation(PrivacyKeyAnnotation.class).isPageKey();
if(!status){
//進(jìn)行返回值反射
ClassaClass=ClassRecursionUtils.getClass(result.getClass(),"isPrivacyKey");
if(null!=aClass){
setFieldMethod(result,flag,aClass);
}
}else{
//反射分頁(yè)page
//反射list類型
Parameter[]parameters=signature.getMethod().getParameters();
//泛型名稱
Stringname=parameters[0].getName();
//泛型class
Classtype=parameters[0].getType();
//包名
StringtypeName=type.getName();
PropertyDescriptor[]ps=Introspector.getBeanInfo(result.getClass(),Object.class).getPropertyDescriptors();
for(PropertyDescriptorprop:ps){
if(prop.getPropertyType().isAssignableFrom(List.class)){//List集合類型
Objectobj=result.getClass().getMethod(prop.getReadMethod().getName()).invoke(result);
if(obj!=null){
ListlistObj=(List)obj;
for(Objectnext:listObj){
ClassclassObj=Class.forName(typeName);
//獲取成員變量
ClasskeyClass=ClassRecursionUtils.getClass(classObj,"isPrivacyKey");
setFieldMethod(next,flag,keyClass);
}
}

}
}
}
}

/**
*內(nèi)容填充
*/
privatevoidsetFieldMethod(Objectresult,booleanflag,ClassaClass)throwsIllegalAccessException{
Field[]declaredFields=aClass.getDeclaredFields();
for(Fieldfield:declaredFields){
//設(shè)置屬性的可訪問(wèn)性
field.setAccessible(true);
//只獲取isPrivacyKey
Stringname=field.getName();
//過(guò)濾非布爾類型
Classtype=field.getType();
//并且只添加isPrivacyKey
if(type.isAssignableFrom(Boolean.class)&&"isPrivacyKey".equals(name)){
//重新寫(xiě)入
field.set(result,flag);
}
}
}
}

使用 在service implement類方法上寫(xiě)入

最后,另一種實(shí)現(xiàn)方式,可以參考:

https://juejin.cn/post/7242145254057410615


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AOP
    AOP
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    11526
  • 數(shù)據(jù)權(quán)限

    關(guān)注

    0

    文章

    4

    瀏覽量

    6165
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    177

    瀏覽量

    689

原文標(biāo)題:SpringBoot 采用 JsonSerializer 和 Aop 實(shí)現(xiàn)可控制的數(shù)據(jù)脫敏

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    IWR6843AOP毫米波傳感器:工業(yè)雷達(dá)應(yīng)用的理想之選

    傳感器,憑借其高度集成的特性和卓越的性能,成為了眾多工業(yè)應(yīng)用的理想解決方案。 文件下載: iwr6843aop.pdf 1. 核心特性 1.1 集成度高 IWR6843AOP采用了天線封裝(A
    的頭像 發(fā)表于 02-11 15:30 ?129次閱讀

    AWR6843AOP:汽車毫米波雷達(dá)的理想之選

    AWR6843AOP:汽車毫米波雷達(dá)的理想之選 在當(dāng)今汽車電子領(lǐng)域,毫米波雷達(dá)技術(shù)正扮演著越來(lái)越重要的角色。它為汽車提供了精準(zhǔn)的環(huán)境感知能力,是實(shí)現(xiàn)高級(jí)駕駛輔助系統(tǒng)(ADAS)和自動(dòng)駕駛的關(guān)鍵技術(shù)
    的頭像 發(fā)表于 02-11 15:00 ?144次閱讀

    AWR1843AOP毫米波傳感器:汽車?yán)走_(dá)設(shè)計(jì)的理想之選

    、AWR1843AOP的特性亮點(diǎn) 1. 高度集成的硬件架構(gòu) AWR1843AOP采用了TI的低功耗45 - nm RFCMOS工藝,在極小的封裝內(nèi)實(shí)現(xiàn)
    的頭像 發(fā)表于 02-11 14:00 ?194次閱讀

    解鎖毫米波雷達(dá)新潛力:AWR1843AOP深度解析

    魅力和應(yīng)用潛力。 文件下載: awr1843aop.pdf 一、AWR1843AOP概述 AWR1843AOP是一款工作在76 - 81GHz頻段的天線封裝(AOP)器件,
    的頭像 發(fā)表于 01-26 16:05 ?234次閱讀

    IWR1843AOP毫米波傳感器:工業(yè)應(yīng)用的理想之選

    高達(dá)4 GHz的連續(xù)線性調(diào)頻帶寬。它采用了德州儀器的低功耗45 - nm RFCMOS工藝,在極小的外形尺寸下實(shí)現(xiàn)了前
    的頭像 發(fā)表于 01-26 11:05 ?331次閱讀

    IWRL6432AOP:工業(yè)雷達(dá)傳感器的技術(shù)解析與應(yīng)用展望

    IWRL6432AOP:工業(yè)雷達(dá)傳感器的技術(shù)解析與應(yīng)用展望 在工業(yè)雷達(dá)傳感器領(lǐng)域,TI 的 IWRL6432AOP 憑借其卓越的性能和豐富的功能,成為了眾多工程師關(guān)注的焦點(diǎn)。今天,我們就來(lái)深入剖析
    的頭像 發(fā)表于 01-25 16:55 ?926次閱讀

    晶臺(tái)可控硅光耦如何“守護(hù)”智能家電?

    在智能家居浪潮中,集可控硅與光電耦合功能于一體的可控硅光耦,通過(guò)光電隔離實(shí)現(xiàn)強(qiáng)弱電信號(hào)的精準(zhǔn)控制,為家電設(shè)備提供多重保護(hù)屏障。▲可控硅光耦器
    的頭像 發(fā)表于 01-12 11:23 ?310次閱讀
    晶臺(tái)<b class='flag-5'>可控</b>硅光耦如何“守護(hù)”智能家電?

    奧特可控硅光耦:賦能燈光控制的核心器件與選型策略

    在現(xiàn)代燈光控制系統(tǒng)中,安全隔離、精準(zhǔn)調(diào)光與穩(wěn)定運(yùn)行是核心訴求。可控硅光耦作為實(shí)現(xiàn)“弱電控制強(qiáng)電”的關(guān)鍵器件,憑借其電氣隔離特性、無(wú)觸點(diǎn)開(kāi)關(guān)優(yōu)勢(shì),廣泛應(yīng)用于智能家居照明、工業(yè)照明、商業(yè)調(diào)
    的頭像 發(fā)表于 01-06 16:52 ?912次閱讀
    奧特<b class='flag-5'>可控</b>硅光耦:賦能燈光<b class='flag-5'>控制</b>的核心器件與選型策略

    可控硅光耦的核心應(yīng)用場(chǎng)景及選型指南

    在現(xiàn)代家居家用電器中,可控硅光耦(Thyristooptocoupler)憑借著其獨(dú)特的交流輸出控制、電器隔離、無(wú)觸點(diǎn)的特點(diǎn),成為了實(shí)現(xiàn)安全、高效、高功率控制的關(guān)鍵元件。
    的頭像 發(fā)表于 12-09 16:58 ?1304次閱讀
    <b class='flag-5'>可控</b>硅光耦的核心應(yīng)用場(chǎng)景及選型指南

    如何使用SpringBoot、Vue2.0、MySQL開(kāi)發(fā)一套云診所系統(tǒng)?

    SpringBoot是Java領(lǐng)域非常流行的快速開(kāi)發(fā)框架,提供了豐富的生態(tài)和自動(dòng)化配置,適合構(gòu)建微服務(wù)和單體應(yīng)用。 它可以很好地處理業(yè)務(wù)邏輯、數(shù)據(jù)持久化、安全性(Spring Security)和API接口
    的頭像 發(fā)表于 11-27 16:02 ?293次閱讀
    如何使用<b class='flag-5'>SpringBoot</b>、Vue2.0、MySQL開(kāi)發(fā)一套云診所系統(tǒng)?

    可控硅光耦在工業(yè)電機(jī)控制中的精準(zhǔn)調(diào)速應(yīng)用

    在工業(yè)自動(dòng)化領(lǐng)域,可控硅光耦憑借其電氣隔離與信號(hào)精準(zhǔn)傳遞特性,成為電機(jī)調(diào)速系統(tǒng)的核心元件。晶臺(tái)光電推出的可控硅光耦,通過(guò)光耦合技術(shù)實(shí)現(xiàn)控制電路與高壓主回路的完全隔離,有效避免電磁干擾對(duì)
    的頭像 發(fā)表于 10-17 08:56 ?2119次閱讀
    <b class='flag-5'>可控</b>硅光耦在工業(yè)電機(jī)<b class='flag-5'>控制</b>中的精準(zhǔn)調(diào)速應(yīng)用

    ?Texas Instruments AWR1843AOP汽車?yán)走_(dá)傳感器數(shù)據(jù)手冊(cè)摘要

    Texas Instruments AWR1843AOP汽車?yán)走_(dá)傳感器是封裝天線器件,在76GHz至81GHz頻段內(nèi)工作。AWR1843AOP采用TI’的低功耗45nm RFCMOS工藝,在微型外形中
    的頭像 發(fā)表于 09-26 14:52 ?926次閱讀
    ?Texas Instruments AWR1843<b class='flag-5'>AOP</b>汽車?yán)走_(dá)傳感器<b class='flag-5'>數(shù)據(jù)</b>手冊(cè)摘要

    SAP 數(shù)據(jù)脫敏工具:SNP TDO如何滿足新頒敏感信息政策要求

    面對(duì)我國(guó)新頒《數(shù)據(jù)安全法》《個(gè)保法》敏感信息政策,本篇文章將詳細(xì)解答企業(yè)數(shù)據(jù)合規(guī)三大剛需:國(guó)家機(jī)密防護(hù)、商業(yè)數(shù)據(jù)保護(hù)、個(gè)人隱私脫敏。
    的頭像 發(fā)表于 08-19 09:49 ?435次閱讀

    可控硅光耦怎么使用?

    自動(dòng)控制系統(tǒng)中,可作為大功率驅(qū)動(dòng)器件,實(shí)現(xiàn)用小功率控件控制大功率設(shè)備。它在交直流電機(jī)調(diào)速系統(tǒng)、調(diào)功系統(tǒng)及隨動(dòng)系統(tǒng)中得到了廣泛的應(yīng)用。而可控硅光耦(SCR光耦)憑借其高隔
    的頭像 發(fā)表于 07-15 10:12 ?1658次閱讀
    <b class='flag-5'>可控</b>硅光耦怎么使用?

    可控硅的控制奧秘:依賴直流還是交流?

    。它的主要功能是控制電流的通過(guò),從而實(shí)現(xiàn)對(duì)電路的調(diào)節(jié)和控制。可控硅的工作原理和控制方式是理解其應(yīng)用和性能的關(guān)鍵。
    的頭像 發(fā)表于 04-03 11:59 ?2096次閱讀
    <b class='flag-5'>可控</b>硅的<b class='flag-5'>控制</b>奧秘:依賴直流還是交流?