Весенние и немецкие буквы в выпуске URL - PullRequest
0 голосов
/ 10 февраля 2019

Я столкнулся с этой проблемой при попытке перенаправить пользователя со страницы входа (Spring) на URL-адрес, содержащий специальные немецкие буквы (ä, ö, ü, ß).Это, вероятно, не ограничивается ими, но они важны в данный момент.Рабочий процесс выглядит следующим образом:

Глядя на трассировку URL Redirect, кажется, что (Spring?) Кодирует ö в %F6 (Unicode?)вместо %C3%B6 (UTF-8).

Пружинный контейнер (Tomcat) настроен на кодирование UTF-8.Я также пытался кодировать и декодировать URL-адреса к ISO-8859-1 и UTF-8, но без удачи.

Я также пытался и, похоже, работал, чтобы вручную преобразовать специальные буквы в их UTF-8 кодировки (например, string.replace("ö", "%C3%B6");" и передать URL в этой форме. Однако, это уродливо, и я бы предпочел не делать этого.

Любые предложения о том, как правильно обрабатывать это?

Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2019

При условии, что вы находитесь в контексте приложения Spring MVC, перенаправления могут быть реализованы с использованием RedirectView или просто с префиксом redirect: в качестве возвращаемого значения метода контроллера.Поймайте его как RequestParam во время инициализации формы и сохраните его в сеансе, как показано в следующем примере:

Модель:

public class LoginForm implements Serializable {

    private String username;
    private String password;
    private String redirectUrl;
    // getters and setters omitted
}

Просмотр:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
        <form:form method="POST" modelAttribute="loginForm" acceptCharset="UTF-8" action="login/doLogin">
            <table>
                <tr>
                   <td><form:label path="username">User Name</form:label></td>
                   <td><form:input path="username"/></td>
                </tr>
                <tr>
                    <td><form:label path="password">Password</form:label></td>
                    <td><form:password path="password"/></td>
                </tr>
            </table>
            <div>
                <input type="submit" value="Submit"/>
            </div>
        </form:form>
    </body>
</html>

Контроллер:

@Controller
@RequestMapping("login")
@SessionAttributes(LoginController.FORM_NAME)
public class LoginController {

    static final String FORM_NAME = "loginForm";
    private static final String DEFAULT_REDIRECT_URL = "https://google.com";

    @ModelAttribute(FORM_NAME)
    public LoginForm createForm() {
        return new LoginForm();
    }

    @GetMapping
    public String showForm(Model model, @ModelAttribute(FORM_NAME) LoginForm loginForm, @RequestParam(required = false) String redirectUrl) {
        loginForm.setRedirectUrl(redirectUrl);
        model.addAttribute(FORM_NAME, loginForm);
        return "login/login-form";
    }

    @PostMapping("/doLogin")
    public String processFormCredentials(LoginForm loginForm) {
        // input validation omitted ...
        return "redirect:" + (loginForm.getRedirectUrl() != null ? loginForm.getRedirectUrl() : DEFAULT_REDIRECT_URL);
    }
}

При использовании этого кода перенаправление с umlauts прекрасно работает на Tomcat - http://<url>/login?redirectUrl=http%3A%2F%2Fwww.example.com%2F%25C3%25B6l%2F перенаправляет при отправке формы наhttp://www.example.com/öl/.

...