1、要被拦截的Controller接口
我们需要一个更新用户信息接口,请求方式为POST,参数类型为对象类型(UserInfo),代码如下:
private UserService userService; /** * 更新用户信息 * * @param request * @param userInfo * @return */ value = "/updateUserInfo", produces = "application/json;charset=UTF-8", ( method = RequestMethod.POST) public JSONObject updateUserInfo(HttpServletRequest request, UserInfo userInfo) { ... userService.updateUserInfo(userInfo); ... }
2、拦截器
我们要在拦截器中拦截该接口,并获取其请求参数UserInfo对象。
如果只是获取普通的请求对象(eg:用户ID -> userId),我们可以直接在拦截器中,通过如下代码即可获取request请求体中的参数数据:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { ...... // user ID为string类型,所以可以直接拿到数据, // 但是如果参数是对象类型/JSON类型数据,则无法通过这种方式获取! String userId = request.getParameter("userId"); ..... }
3、HttpServletRequestWrapper解决这一问题
在拦截器中写一个内部类 RequestWrapper ,让其继承 HttpServletRequestWrapper:
class RequestWrapper extends HttpServletRequestWrapper {
RequestWrapper 重写父类方法,最终完整的拦截器代码如下:
这样,就可以在拦截器中,拦截request请求,并获取request请求体中的json/对象类型的参数啦!