为什么在HandlerInterceptor修改完参数后Controller得到的参数依然是修改前的呢
时间: 2023-12-04 07:02:43 浏览: 50
如果在HandlerInterceptor中修改了GET请求的参数,但在Controller中获取到的参数依然是修改前的值,可能是因为HandlerInterceptor没有正确地将修改后的请求对象传递给下一个处理器。
在HandlerInterceptor的preHandle方法中,我们可以通过修改请求对象的方式来修改参数值。然后,我们需要使用FilterChain的doFilter方法将修改后的请求对象传递给下一个处理器(可以是下一个拦截器或Controller)。
以下是一个示例代码,演示了如何在HandlerInterceptor中正确传递修改后的请求对象:
```java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ModifyGetParameterInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getMethod().equals("GET")) {
// 获取原始参数值
String originalParamValue = request.getParameter("paramName");
// 修改参数值
String modifiedParamValue = originalParamValue + "_modified";
// 创建一个新的请求对象,并设置修改后的参数值
ModifiedRequestWrapper modifiedRequest = new ModifiedRequestWrapper(request);
modifiedRequest.addParameter("paramName", modifiedParamValue);
// 将修改后的请求对象传递给下一个处理器
return super.preHandle(modifiedRequest, response, handler);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在postHandle方法中不需要进行任何操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在afterCompletion方法中不需要进行任何操作
}
}
```
在上述示例代码中,我们使用super.preHandle方法将修改后的请求对象传递给下一个处理器。这样,在Controller中获取到的参数将会是修改后的值。
需要注意的是,如果有多个HandlerInterceptor,确保在每个HandlerInterceptor的preHandle方法中都正确地传递修改后的请求对象。只有在最后一个HandlerInterceptor的preHandle方法中调用super.preHandle方法才能将请求传递给Controller。