在java web开发中,我们有时候会遇到需要修改request中请求值的问题,虽然这个不是特别常见。初看这是一个简单的问题,因为我们能通过HttpServletRequest对象拿到我们需要的所有关于当前这个请求的所有信息,想当然的也就可以修改所以这些信息。可实际情况是HttpServletReques中很多的属性只有getter方法,而没有setter方法,也就是说我们不可以修改他们。
记得第一次遇到这种问题还是初学编程的时候,最近又遇到这个问题,就记录一下。最近遇到的是在spring mvc中,使用@RequestBody注解把requestBody中的json映射到java的object。我们知道对于spring mvc来说,这样使用的时候需要在请求的header里面表明conten-type为application/json。如果完全是自己开发的系统,没有问题加上就是,但是当和第三方合作的时候,请求的发起方式就不是我们能控制住的了。现在的问题是如果使用spring mvc的这种开发模式,必须要在请求的header中设置content-type为application/json,但是第三方又不方便设置。所以只能在所有针对第三方的API中进行特殊处理。
sping mvc是基于servlet的,我们只要在请求进入servlet之前的拦截器设置header中content-type为application/json就ok了.

   /**
 * 统一token校验
 * @author luca
 */
public class GlobalInterceptorHandler extends HandlerInterceptorAdapter {
    private final Logger logger = LoggerFactory.getLogger(GlobalInterceptorHandler.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //如果是options请求直接放过
        if(request.getMethod().matches(HttpMethod.OPTIONS.name())){
            return true;
        }
        if(!(handler instanceof HandlerMethod)) {
            return true;
        }
        logger.info("request请求地址path[{}] uri[{}]", request.getServletPath(),request.getRequestURI());
        Map<String,String> headerses = new HashMap<>();
        headerses.put("content-type","application/json");
        modifyHeaders(request,headerses);
        return true;
    }

    /**
     * 修改请求头信息
     * @param headerses
     * @param request
     */
    private void modifyHeaders(HttpServletRequest request,Map<String, String> headerses) {
        if (headerses == null || headerses.isEmpty()) {
            return;
        }
        try {
            HttpServletRequestImpl httpRequest = (HttpServletRequestImpl) request;
            HttpServerExchange exchange = httpRequest.getExchange();
            HeaderMap headerMap = exchange.getRequestHeaders();
            for (Map.Entry<String, String> entry : headerses.entrySet()) {
                headerMap.add(new HttpString(entry.getKey()), entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {}
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐