真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中接口加密解密統(tǒng)一處理

我們與客戶(hù)端的接口互動(dòng)的時(shí)候,為了更高的安全性,我們可能需要對(duì)接口加密(請(qǐng)求參數(shù)加密,服務(wù)端解密)、返回信息加密(服務(wù)端加密,客戶(hù)端解密),但是也不是所有的接口都這樣,有些接口可能不需要,我們可以使用注解來(lái)輕松達(dá)到此要求。

合川ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!

將接口參數(shù)的加密解密和返回信息的加密解密分開(kāi),分別定義注解,利用Controller的ControllerAdvice來(lái)攔截所有的請(qǐng)求,在其中判斷是否需要加密解密,即可達(dá)到要求。

使用方法:使用 DecryptRequest 和 EncryptResponse 注解即可,可以放在Controller的類(lèi)和方法上,其中一個(gè)為false就不執(zhí)行了。像這樣:

@RestController

@RequestMapping("/test")

//@DecryptRequest

@EncryptResponse

public class TestController {

@Autowired

@Qualifier("rrCrypto")

private Crypto crypto;

@DecryptRequest(false)

@EncryptResponse(false)

@RequestMapping(value = "/enc" , method = RequestMethod.POST)

public String enc(@RequestBody String body){

return crypto.encrypt(body);

}

}

定義參數(shù)解密的注解,DecryptRequest。

/**

* 解密注解

*

*

加了此注解的接口(true)將進(jìn)行數(shù)據(jù)解密操作(post的body) 可

* 以放在類(lèi)上,可以放在方法上

* @author xiongshiyan

*/

@Target({ElementType.METHOD , ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DecryptRequest {

/**

* 是否對(duì)body進(jìn)行解密

*/

boolean value() default true;

}

定義返回信息加密的注解,EncryptResponse。

/**

* 加密注解

*

*

加了此注解的接口(true)將進(jìn)行數(shù)據(jù)加密操作

* 可以放在類(lèi)上,可以放在方法上

* @author 熊詩(shī)言

*/

@Target({ElementType.METHOD , ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface EncryptResponse {

/**

* 是否對(duì)結(jié)果加密

*/

boolean value() default true;

}

這兩個(gè)注解可以放在類(lèi)和方法上,遵循一樣的邏輯,即:類(lèi)上的注解 && 方法上的注解,一方?jīng)]有即為true,都為false為false。邏輯主要在 NeedCrypto 中。

/**

* 判斷是否需要加解密

* @author xiongshiyan at 2018/8/30 , contact me with email yanshixiong@126.com or phone 15208384257

*/

class NeedCrypto {

private NeedCrypto(){}

/**

* 是否需要對(duì)結(jié)果加密

* 1.類(lèi)上標(biāo)注或者方法上標(biāo)注,并且都為true

* 2.有一個(gè)標(biāo)注為false就不需要加密

*/

static boolean needEncrypt(MethodParameter returnType) {

boolean encrypt = false;

boolean classPresentAnno = returnType.getContainingClass().isAnnotationPresent(EncryptResponse.class);

boolean methodPresentAnno = returnType.getMethod().isAnnotationPresent(EncryptResponse.class);

if(classPresentAnno){

//類(lèi)上標(biāo)注的是否需要加密

encrypt = returnType.getContainingClass().getAnnotation(EncryptResponse.class).value();

//類(lèi)不加密,所有都不加密

if(!encrypt){

return false;

}

}

if(methodPresentAnno){

//方法上標(biāo)注的是否需要加密

encrypt = returnType.getMethod().getAnnotation(EncryptResponse.class).value();

}

return encrypt;

}

/**

* 是否需要參數(shù)解密

* 1.類(lèi)上標(biāo)注或者方法上標(biāo)注,并且都為true

* 2.有一個(gè)標(biāo)注為false就不需要解密

*/

static boolean needDecrypt(MethodParameter parameter) {

boolean encrypt = false;

boolean classPresentAnno = parameter.getContainingClass().isAnnotationPresent(DecryptRequest.class);

boolean methodPresentAnno = parameter.getMethod().isAnnotationPresent(DecryptRequest.class);

if(classPresentAnno){

//類(lèi)上標(biāo)注的是否需要解密

encrypt = parameter.getContainingClass().getAnnotation(DecryptRequest.class).value();

//類(lèi)不加密,所有都不加密

if(!encrypt){

return false;

}

}

if(methodPresentAnno){

//方法上標(biāo)注的是否需要解密

encrypt = parameter.getMethod().getAnnotation(DecryptRequest.class).value();

}

return encrypt;

}

}

然后定義ControllerAdvice,對(duì)于請(qǐng)求解密的,定義 DecryptRequestBodyAdvice ,實(shí)現(xiàn) RequestBodyAdvice 。

/**

* 請(qǐng)求數(shù)據(jù)接收處理類(lèi)

*

* 對(duì)加了@Decrypt的方法的數(shù)據(jù)進(jìn)行解密操作

*

* 只對(duì) @RequestBody 參數(shù)有效

* @author xiongshiyan

*/

@ControllerAdvice

@ConditionalOnProperty(prefix = "spring.crypto.request.decrypt", name = "enabled" , havingValue = "true", matchIfMissing = true)

public class DecryptRequestBodyAdvice implements RequestBodyAdvice {

@Value("${spring.crypto.request.decrypt.charset:UTF-8}")

private String charset = "UTF-8";

@Autowired

@Qualifier("rrCrypto")

private Crypto crypto;

@Override

public boolean supports(MethodParameter methodParameter, Type targetType,

Class> converterType) {

return true;

}

@Override

public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,

Type targetType, Class> converterType) {

return body;

}

@Override

public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,

Class> converterType) throws IOException {

if( NeedCrypto.needDecrypt(parameter) ){

return new DecryptHttpInputMessage(inputMessage , charset , crypto);

}

return inputMessage;

}

@Override

public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,

Class> converterType) {

return body;

}

}無(wú)錫人流多少錢(qián) http://www.bhnnk120.com/

標(biāo)上注解 ConditionalOnProperty 表示只有條件為true的時(shí)候才開(kāi)啟解密功能,一個(gè)配置即可打開(kāi)或者關(guān)閉解密功能。真正的解密邏輯留給 DecryptHttpInputMessage , 它又委托給 Crypto。

/**

*

* @author xiongshiyan

*/

public class DecryptHttpInputMessage implements HttpInputMessage {

private HttpInputMessage inputMessage;

private String charset;

private Crypto crypto;

public DecryptHttpInputMessage(HttpInputMessage inputMessage, String charset , Crypto crypto) {

this.inputMessage = inputMessage;

this.charset = charset;

this.crypto = crypto;

}

@Override

public InputStream getBody() throws IOException {

String content = IoUtil.read(inputMessage.getBody() , charset);

String decryptBody = crypto.decrypt(content, charset);

return new ByteArrayInputStream(decryptBody.getBytes(charset));

}

@Override

public HttpHeaders getHeaders() {

return inputMessage.getHeaders();

}

}

對(duì)于返回值加密,定義 EncryptResponseBodyAdvice,實(shí)現(xiàn) ResponseBodyAdvice。

/**

* 請(qǐng)求響應(yīng)處理類(lèi)

*

* 對(duì)加了@Encrypt的方法的數(shù)據(jù)進(jìn)行加密操作

*

* @author?

*

*/

@ControllerAdvice

@ConditionalOnProperty(prefix = "spring.crypto.response.encrypt", name = "enabled" , havingValue = "true", matchIfMissing = true)

public class EncryptResponseBodyAdvice implements ResponseBodyAdvice


網(wǎng)頁(yè)標(biāo)題:SpringBoot中接口加密解密統(tǒng)一處理
網(wǎng)站網(wǎng)址:http://weahome.cn/article/pdgchd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部