在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 {}
}