URL问题中的春季和德语字母

时间:2019-02-10 13:12:25

标签: java spring utf-8 iso-8859-1

我在尝试将用户从登录页面(春季)重定向到包含特殊德语字母(ä,ö,ü,ß)的URL时遇到此问题。这可能不仅限于它们,但这些在当前很重要。 工作流程如下:

  • 用户转到带有redirectUrl请求参数的登录页面,例如:http://www.example.com/login.do?redirectUrl=http%3A%2F%2Fwww.example.com%2F%25C3%25B6l%2F,其中%25C3%25B6l转换为öl
  • 成功登录后,应将用户重定向到http://www.example.com/öl/。但是,出于某些奇怪的原因,实际的URL是http://www.example.com/�l/

看着URL重定向跟踪,似乎(Spring?)将ö编码为%F6(Unicode?)而不是%C3%B6(UTF-8)。

spring容器(Tomcat)都设置为具有UTF-8编码。 我也尝试过对ISO-8859-1UTF-8之间的URL进行编码和解码,但是没有运气。

我也尝试过并且似乎起作用的是将特殊字母手动转换为UTF-8编码(例如string.replace("ö", "%C3%B6");"并以这种形式传递url。但是,这很丑陋,我宁愿不要为此。

关于如何正确处理此问题的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:0)

假设您使用的是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/时进行重定向。