20 / 2018

GitHub Pages agora suporta HTTPS em domínios personalizados

Let’s Encrypt the world.

Let’s Encrypt is a nonprofit, our mission is to create a more secure and privacy-respecting Web by promoting the widespread adoption of HTTPS.

Let’s Encrypt fornece certificados do tipo DV (Domain Validation, ou seja, aqueles em que se verifica somente a propriedade do domínio) gratuitamente com o objetivo de espalhar a adoção de SSL. Boa alternativa para quem deseja apenas tráfego seguro, pois não há garantia de confiança na entidade por trás do domínio.

Quer saber, no mínimo garante uma comunicação privada entre o cliente e o servidor e garante contra o ataque mais básico de DNS1 no qual o atacante redireciona o endereço para outro servidor.

Ah! Se você já usa ou pretende usar, DOE!

1: Sabe quando você se conecta a uma rede Wi-Fi desconhecida e ainda usa o serviço DNS deles? Qual é a sua garantia de que está sendo direcionado ao servidor correto dado um endereço (URL)?

Usar Java 8 DateTime em Spring MVC controllers requer especificar o formato do tipo a cada método como por exemplo @RequestParam @DateTimeFormat(iso = ISO.DATE) date.

Spring Boot 2, devido a abordagem convention over configuration adotou ISO como padrão, conforme registrado no issue, através deste commit. Ver também este blog.

Para demais aplicações, é possível registrar o formatador sobrescrevendo conforme abaixo:

@Configuration
@EnableWebMvc
public class Application implements WebMvcConfigurer {
	@Override
	public void addFormatters(FormatterRegistry registry) {
		DateTimeFormatterRegistrar dateTime = new DateTimeFormatterRegistrar();
		*dateTime.setUseIsoFormat(true);*
		dateTime.registerFormatters(registry);
	}
}

É claro: se a API é REST, então ela deve responder HTTP 201 Created com o campo Location devidamente preenchido em resposta a comandos POST que criam recursos no sistema.

ServletServerHttpRequest httpRequest = new ServletServerHttpRequest(request);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpRequest(httpRequest);
URI uri = builder.path("/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(uri).body(object);

Como alternativa para não precisar injetar o HttpServletRequest:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequest();
URI uri = builder.path("/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(uri).body(object);

Cuidado: Nessas abordagens, path() concatena um caminho a URI já contida no builder, podendo trazer resultados indesejáveis quanto o objetivo for referenciar outro recurso.

Outra alternativa interessante é criar o caminho a partir de um método já condigurado no MVC:

URI uri = MvcUriComponentsBuilder.fromMethodCall(MvcUriComponentsBuilder.on(this.getClass())
			.getById(object.getId())).build().toUri();
return ResponseEntity.created(uri).body(object);