Quiero comunicarme con un servidor en el área de Java utilizando la clase RestTemplate. Pero cuando accedo a mi servidor con RestTemplate, muestra solo el error 403 (prohibido).

Mi código de controlador :

@Controller(value="homeController")
public class HomeController {

@RequestMapping(value="/test")
public @ResponseBody Map<String, String> test(@RequestParam(value="message", required=false, defaultValue="hell world") String message){

    Map<String, String> map = new HashMap<String,String>();
    map.put("greeting", message);

    return map;
}

Código del lado del cliente:

@Test
public void test2(){
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
    map.add("message", "test");

    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

    ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
    System.out.println(response.getBody());

}

Si el código funciona correctamente, la consola debería generar la palabra "prueba".

EDITAR: Cuando accedo al controlador, con mi navegador web, muestra los datos json correctamente.

Ahora, ¿cómo arreglo el código para comunicarme con el servidor en el método POST? Gracias

1
user5685187 1 ago. 2017 a las 12:39

2 respuestas

La mejor respuesta

Como dijiste, estás usando spring-security, simplemente puedes agregar un interceptor de solicitud y agregar autenticación. Spring creará una contraseña aleatoria si no establece una; se registrará en la consola para que pueda simplemente copiarlo desde allí.

RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new BasicAuthorizationInterceptor("username", "yourpassword")));

Otra (mejor) opción es configurar la autenticación usted mismo. Una autenticación simple en memoria haría

@Configuration
@EnableWebSecurity
public class RestSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().fullyAuthenticated();
        http.httpBasic();
        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("username").password("yourpassword").roles("ADMIN");
    }
}
2
baao 1 ago. 2017 a las 10:47

Debe especificar qué tipos de métodos HTTP maneja su método de "prueba". Puede hacer esto en la anotación @RequestMapping de esta manera:

@RequestMapping(path="/test", method = {RequestMethod.GET, RequestMethod.POST}, 
                consumes = "application/x-www-form-urlencoded")
0
Ilya Zinkovich 1 ago. 2017 a las 10:29