Dúvida com login

Criei uma tela de login e gostaria que toda vez que o usuário executasse uma tentativa de login inválido, uma mensagem como “credenciais incorretas” fosse mostrada para o usuário. Tentei fazer, porém, a mensagem de erro vai na url e não no corpo.

Código Java

@Controller
public class LoginController {


	@Autowired
	private ClienteDAO repositorio;

	@GetMapping(value = "/login")
	public String loginClientes() {

		return "Login";

	}

	@PostMapping(value = "/autentificar")
	public ModelAndView autentificar(@RequestParam("loginemail") String email,
			@RequestParam("loginsenha") String senha) {

		Cliente cliente = repositorio.findByEmailAndSenha(email, senha);

		if (cliente != null) {
			ModelAndView acessoAutorizado = new ModelAndView("redirect:/form");
			acessoAutorizado.addObject("dados", cliente);
			return acessoAutorizado;

		} else {
			ModelAndView acessoNegado = new ModelAndView("redirect:/login");
			acessoNegado.addObject("msg", "Credenciais incorretas!");
			return acessoNegado;

		}

	}

}

Formulário

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Login</title>
</head>
<body>

<form method="post" action="/autentificar">
<div>
E-MAIL:<input type="text" name="loginemail" required="required">
<br></br>
SENHA:<input type="password" name="loginsenha" required="required">
<br></br>
<button type="submit">Enviar</button>


<h5><c:out value="${msg}"></c:out> </h5>

</div>
</form>
</body>
</html>

Acho que a msg está sendo retornado na URL pq vc está forçando um redirect. E um redirect trata-se de um novo request GET solicitando uma determinada página e, pelo fato de ser GET, os parâmetros vão na URL mesmo.

Para teste, tente alterar o ModelAndView para não fazer redirect:

new ModelAndView("/login");

Eu já tentei fazer dessa forma, mas ele não aceita. Ele funciona quando eu faço passando a própria página no ModelAndView tipo assim:

new ModelAndView("Login");

Dessa forma a mensagem é retornada no corpo.

Sem%20t%C3%ADtulo

O problema é quando eu atualizo a página. Ele retorna essa tela. Acredito que o correto seria ele retornar a página atual de login.

Vc consegue contornar isso criando um método GET para /autenticar que apenas faça um redirect para a tela de login:

@GetMapping(value = "/autentificar")
public ModelAndView abrirTelaAutentificar() {
	if (<<usuarioLogado>>) {
		// envia para a parte segura do sistema
	} else {
		ModelAndView login = new ModelAndView("redirect:/login");
		return login;
	}
}

E vc pode até verificar se o usuário já está logado ou não e redirecionar para a parte segura do sistema caso ele já esteja logado.