пролетен mvc http прокси

Бих искал да напиша пролетен MVC Controller клас, който просто приема всяка http заявка във вход, добавя основни заглавки за удостоверяване към нея и препраща тази заявка към друг сървър. Опитвам нещо подобно без успех.

    @Controller
    @RequestMapping("/proxyws")
    public class ProxyController {

    @RequestMapping("/**")
    @ResponseBody
    public String mirrorRest( @RequestBody String body, HttpMethod method, HttpServletRequest request, HttpServletResponse response) throws URISyntaxException
    {

        String server = "localhost";
        int port = 8080;
        URI uri = new URI("http", null, server, port, request.getRequestURI(), request.getQueryString(), null);
        RestTemplate restTemplate=new RestTemplate();
        HttpEntity entity = new HttpEntity<String>(body);
        String plainCreds = "APP_CLIENT:APP_PASSWORD"; 
        byte[] plainCredsBytes = plainCreds.getBytes();
        byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
        String base64Creds = new String(base64CredsBytes);
        entity.getHeaders().add("Authorization", "Basic " + base64Creds);

        ResponseEntity<String> responseEntity = restTemplate.exchange(uri, method, entity, String.class);

        return responseEntity.getBody();
    }

За GET метод във входа получавам следното изключение: org.springframework.http.converter.HttpMessageNotReadableException: Липсва необходимото съдържание на тялото на заявката:

org.springframework.web.method.HandlerMethod$HandlerMethodParameter@8051792a
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleEmptyBody(RequestResponseBodyMethodProcessor.java:189)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:170)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:105)

За POST заявка получавам други проблеми с le basic auth заглавки:

java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.put(Collections.java:1342)
at org.springframework.http.HttpHeaders.add(HttpHeaders.java:831)

Благодаря за вашата помощ!


person C.Giraud    schedule 18.09.2015    source източник
comment
Въпреки че съм сигурен, че можете да накарате това да работи с известно хакване (вероятно ще трябва да отделите методите GET и POST за начало) и въпреки че обичам Spring MVC, случаят на използване, който представихте (просто добавяне на Basic Auth към заявката) е много неподходящ за MVC рамка. Можете да изпълните тази задача по-лесно и много по-производително с помощта на Nginx. Вижте това   -  person geoand    schedule 18.09.2015


Отговори (1)


Не можете да променяте заглавките на обекта HttpEntity, след като бъде създаден. Трябва да прехвърлите заглавките си през различен HttpEntity конструктор, напр.

public HttpEntity(T body, MultiValueMap<String, String> headers) {
    this.body = body;
    HttpHeaders tempHeaders = new HttpHeaders();
    if (headers != null) {
        tempHeaders.putAll(headers);
    }
    this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
}

Обърнете внимание на инициализацията на this.headers: там се създава копието само за четене.

person bcody    schedule 07.04.2016