springboot中vue前后端分离后端api通过注解解密例子
时间: 2024-03-23 14:43:19 浏览: 112
springboot+vue,前后端分离商城项目,有部署教程
5星 · 资源好评率100%
好的,我可以为您提供一个基于注解的例子。
首先,您需要创建一个注解类,例如:
```java
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Decrypt {
}
```
这个注解将用于标记需要解密的请求参数。
接下来,您需要创建一个参数解析器类,用于解析带有@Decrypt注解的请求参数。例如:
```java
@Component
public class DecryptArgumentResolver implements HandlerMethodArgumentResolver {
private static final String SECRET_KEY = "your_secret_key_here";
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(Decrypt.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
String encryptedData = request.getParameter(parameter.getParameterName());
if (encryptedData != null && !encryptedData.isEmpty()) {
String decryptedData = decrypt(encryptedData, SECRET_KEY);
if (decryptedData != null) {
return decryptedData;
}
}
return null;
}
private String decrypt(String encryptedData, String secretKey) {
try {
byte[] keyBytes = Arrays.copyOf(secretKey.getBytes("ASCII"), 16);
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedData, "UTF-8");
} catch (Exception e) {
return null;
}
}
}
```
这个参数解析器将解析带有@Decrypt注解的请求参数,并尝试解密参数值(使用AES加密算法)。如果解密成功,就返回解密后的数据;否则返回null。
现在,您需要在Spring Boot应用程序中注册这个参数解析器:
```java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private DecryptArgumentResolver decryptArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(decryptArgumentResolver);
}
}
```
现在,当您的Vue前端应用程序向后端API发送POST请求时,可以将需要解密的请求参数带上@Decrypt注解。例如:
```java
@RestController
@RequestMapping("/api/user")
public class UserController {
@PostMapping("/login")
public ResponseEntity<?> login(@Decrypt String data) {
// TODO: do something with the decrypted data
return ResponseEntity.ok().build();
}
}
```
这个控制器方法将使用@Decrypt注解标记请求参数,并且参数解析器将在解析参数时尝试解密参数值。
最后,当您的Vue前端应用程序发送POST请求时,只需要将需要解密的数据使用AES加密算法加密,并将加密后的数据作为请求参数发送即可。例如:
```javascript
axios.post('/api/user/login', {
data: encrypt(JSON.stringify({ username: 'foo', password: 'bar' }), 'your_secret_key_here')
}).then(response => {
console.log(response.data);
});
function encrypt(data, secretKey) {
let key = CryptoJS.enc.Utf8.parse(secretKey);
let encryptedData = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encryptedData.toString();
}
```
希望这个例子对您有所帮助!
阅读全文