如果使用的是application/json请求呢
时间: 2023-08-06 17:01:47 浏览: 169
Android使用Retrofit2向服务器发送Application/Json请求
如果请求是 `application/json` 类型,那么参数是在请求体中的,而不是在 URL 中的。因此,在拦截器中获取请求参数需要先从请求体中读取,然后进行解密和修改,最后再将解密后的参数放回到请求体中。
以下是一个获取 `application/json` 请求体中参数并进行解密和修改的示例代码:
```java
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从请求体中获取加密参数
BufferedReader reader = request.getReader();
StringBuilder jsonBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
jsonBuilder.append(line);
}
String encryptedParam = jsonBuilder.toString();
// 解密参数
String decryptedParam = decrypt(encryptedParam);
// 修改参数
JSONObject json = new JSONObject(decryptedParam);
json.put("key", "value");
// 将解密后的参数放回到请求体中
String modifiedParam = json.toString();
request = new WrappedRequest(request, modifiedParam);
return true;
}
```
在上述代码中,我们首先通过 `request.getReader()` 获取请求体的 `BufferedReader` 对象,然后将其读取为字符串。接着,对请求体中的加密参数进行解密得到解密后的参数 `decryptedParam`。然后,我们使用 `JSONObject` 对象将解密后的参数转换为 JSON 对象,进行参数的修改。最后,将修改后的 JSON 对象转换为字符串,并使用自定义的 `WrappedRequest` 对象将其放回到请求体中。
需要注意的是,上述代码中使用了自定义的 `WrappedRequest` 类,用于包装修改后的请求体。这是因为 `HttpServletRequest` 对象的请求体是只读的,不能直接修改。因此,我们需要自定义一个类来包装修改后的请求体,并提供相应的读方法。以下是 `WrappedRequest` 类的示例代码:
```java
public class WrappedRequest extends HttpServletRequestWrapper {
private final String body;
public WrappedRequest(HttpServletRequest request, String body) {
super(request);
this.body = body;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new StringReader(body));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletInputStream = new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return servletInputStream;
}
}
```
在上述代码中,我们继承自 `HttpServletRequestWrapper` 类,重写了 `getReader()` 和 `getInputStream()` 方法,返回一个自定义的 `BufferedReader` 和 `ServletInputStream` 对象。这样,就可以将修改后的请求体放回到 `HttpServletRequest` 对象中。
阅读全文