我在尝试将用户从登录页面(春季)重定向到包含特殊德语字母(ä,ö,ü,ß)的URL时遇到此问题。这可能不仅限于它们,但这些在当前很重要。 工作流程如下:
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-1
和UTF-8
之间的URL进行编码和解码,但是没有运气。
我也尝试过并且似乎起作用的是将特殊字母手动转换为UTF-8编码(例如string.replace("ö", "%C3%B6");"
并以这种形式传递url。但是,这很丑陋,我宁愿不要为此。
关于如何正确处理此问题的任何建议?
谢谢。
答案 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/
时进行重定向。