HttpServletRequest添加header

在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 {}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章