springboot中vue前后端分离后端api拦截器解密例子
时间: 2023-07-23 08:41:18 浏览: 197
spring boot+vue前后端分离
好的,我可以为您提供一个简单的例子。
首先,您需要在Spring Boot应用程序中创建一个拦截器类,例如:
```java
@Component
public class ApiInterceptor implements HandlerInterceptor {
private static final String SECRET_KEY = "your_secret_key_here";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if ("POST".equals(request.getMethod()) && request.getRequestURI().startsWith("/api/")) {
String encryptedData = request.getParameter("data");
if (encryptedData != null && !encryptedData.isEmpty()) {
String decryptedData = decrypt(encryptedData, SECRET_KEY);
if (decryptedData != null) {
request.setAttribute("data", decryptedData);
return true;
}
}
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return false;
}
return true;
}
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;
}
}
}
```
这个拦截器会拦截所有以“/api/”开头且请求方法为POST的请求,并且会尝试解密请求参数中名为“data”的加密数据(使用AES加密算法)。如果解密成功,就将解密后的数据存储到请求的属性中,以便后面的控制器使用。
接下来,在您的Spring Boot应用程序中注册这个拦截器:
```java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private ApiInterceptor apiInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(apiInterceptor);
}
}
```
现在,当您的Vue前端应用程序向后端API发送POST请求时,可以将请求参数中的数据使用AES加密算法加密,并将加密后的数据作为名为“data”的参数发送。例如:
```javascript
axios.post('/api/user/login', { username: 'foo', password: 'bar' }, {
params: {
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();
}
```
这个例子使用了CryptoJS库来实现AES加密算法。当然,您也可以使用其他的加密库来实现加密算法。
最后,当您的控制器处理这个请求时,可以通过请求的属性来获取解密后的数据:
```java
@RestController
@RequestMapping("/api/user")
public class UserController {
@PostMapping("/login")
public ResponseEntity<?> login(HttpServletRequest request, @RequestBody Map<String, Object> body) {
String username = (String) body.get("username");
String password = (String) body.get("password");
String decryptedData = (String) request.getAttribute("data");
// TODO: do something with the decrypted data
return ResponseEntity.ok().build();
}
}
```
希望这个例子能对您有所帮助!
阅读全文