admin 管理员组文章数量: 1086019
2024年3月20日发(作者:墨茶花)
使用拦截器时controller中不能再次获取body中的参
数
拦截器是在请求进入controller之前或者离开controller之后,对
请求和响应进行一系列处理的机制。在拦截器中,我们可以进行一些通用
的处理逻辑,比如验证用户的登录状态、记录请求日志、校验参数等。
在拦截器中,我们可以获取到请求的一些信息,比如URL、请求方法、
请求头等,但是我们不能再次获取到body中的参数。这是因为在
Servlet中,body中的参数只能读取一次,当拦截器读取了body中的参
数后,在controller中就不能再次读取了。
所以如果我们需要在拦截器中对参数进行处理,或者在拦截器中校验
参数的合法性,我们可以采取以下几种方式:
1. 将参数存储到HttpServletRequest的Attribute中:
在拦截器中,我们可以将参数存储到HttpServletRequest的
Attribute中,然后在controller中通过HttpServletRequest获取到这
些参数。
拦截器代码示例:
```java
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception
// 从请求的body中读取参数
String param =
der(.lines(.collect(g();
// 将参数存储到Attribute中
ribute("param", param);
return true;
```
Controller代码示例:
```java
public String handle(HttpServletRequest request)
// 从Attribute中获取参数
String param = (String) ribute("param");
//处理参数
//...
return "success";
```
2.使用自定义参数解析器:
我们可以在拦截器中使用自定义的参数解析器来对参数进行处理,然
后在controller中直接获取这些处理后的参数。
自定义参数解析器代码示例:
```java
public class CustomArgumentResolver implements
HandlerMethodArgumentResolver
public boolean supportsParameter(MethodParameter parameter)
//判断是否支持该参数类型
return ameterType(.equals();
}
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception
// 从请求的body中读取参数
String param =
iveRequest().getReader(
.lines(.collect(g();
//处理参数
//...
return processedParam;
}
```
拦截器中注册自定义参数解析器:
```java
public void
addArgumentResolvers(List
resolvers)
(new CustomArgumentResolver();
```
Controller代码示例:
```java
public String handle(Param param)
//处理参数
//...
return "success";
```
通过上述两种方式,我们可以在拦截器中对参数进行处理,并且在
controller中获取到这些处理后的参数。这样可以有效解决在拦截器中
无法再次获取body中的参数的问题。当然,具体选择哪种方式取决于具
体的需求和项目架构。
版权声明:本文标题:使用拦截器时controller中不能再次获取body中的参数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710896411a578480.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论