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中的参数的问题。当然,具体选择哪种方式取决于具

体的需求和项目架构。


本文标签: 参数 拦截器 处理 请求 进行