Java 如何在spring框架中编码url?
大家好 我在控制器中有一个post方法,它重定向到一个新页面 我喜欢这样的方式:Java 如何在spring框架中编码url?,java,spring,servlets,spring-mvc,spring-security,Java,Spring,Servlets,Spring Mvc,Spring Security,大家好 我在控制器中有一个post方法,它重定向到一个新页面 我喜欢这样的方式: @RequestMapping(method = RequestMethod.POST) public String post(HttpServletRequest request) { return "redirect:http://www.x.appName.com/myPage"; } 假设用户在重定向之前已经有一个会话 我想在重定向之前对新url进行编码,以维护用户会话
@RequestMapping(method = RequestMethod.POST)
public String post(HttpServletRequest request) {
return "redirect:http://www.x.appName.com/myPage";
}
假设用户在重定向之前已经有一个会话
我想在重定向之前对新url进行编码,以维护用户会话
如何执行此操作?您可以将
HttpServletResponse
作为参数传递,并使用以下方法:
但首先要确保spring不会自动为您执行此操作。spring文档是此类问题的终极资源。此外,您还可以从github下载正确版本的代码,并进行调试以获得答案。对于这个问题,请点击这里,或者点击下面的类RedirectView的源代码(适用于spring 4.1.0):
受保护的void appendqueryproperty(StringBuilder targetUrl、映射模型、字符串编码方案)
抛出不支持的DencodingException{
//提取锚定片段(如有)。
字符串片段=null;
int anchorIndex=targetUrl.indexOf(“#”);
如果(锚定索引>-1){
fragment=targetUrl.substring(anchorIndex);
delete(anchorIndex,targetUrl.length());
}
//如果还没有一些参数,我们需要一个“?”。
boolean first=(targetUrl.toString().indexOf(“?”)<0);
对于(Map.Entry:queryProperties(model).entrySet()){
对象rawValue=entry.getValue();
迭代器估值器;
if(rawValue!=null&&rawValue.getClass().isArray()){
valueIter=Arrays.asList(ObjectUtils.toObjectArray(rawValue)).iterator();
}
else if(集合的原始值实例){
valueIter=((集合)rawValue).iterator();
}
否则{
valueIter=Collections.singleton(rawValue.iterator();
}
while(valueIter.hasNext()){
Object value=valueIter.next();
如果(第一){
targetUrl.append(“?”);
第一个=假;
}
否则{
targetUrl.append('&');
}
字符串encodedKey=urlEncode(entry.getKey(),encodingScheme);
字符串encodedValue=(value!=null?urlEncode(value.toString(),encodingScheme):“”);
append(encodedKey).append('=').append(encodedValue);
}
}
//将锚定片段(若有)附加到URL的末尾。
if(片段!=null){
追加(片段);
}
}
简而言之,如果您知道将值放在何处,Spring会为您执行此操作。UriComponentsBuilder的构建方法默认为“false”,这将触发编码:
UriComponentsBuilder.fromHttpUrl(url).build().toString()
谢谢,但我不确定spring是否会自动执行此操作,请使用spring的专家告诉我们:“尝试”是一种非常糟糕的方法。它可能在他使用的版本/设置中以一种方式工作,而在另一种版本/设置中以不同的方式工作(如在生产中)。从这个答案开始已经过了很多时间,现在您是否了解Spring(安全)是否自动执行此操作的信息?我不知道:)如果您进行调查并得到答案,请告诉我们依赖默认值是有风险的,显式编码更好/更安全。不能保证默认值在将来的版本中不会改变。
protected void appendQueryProperties(StringBuilder targetUrl, Map<String, Object> model, String encodingScheme)
throws UnsupportedEncodingException {
// Extract anchor fragment, if any.
String fragment = null;
int anchorIndex = targetUrl.indexOf("#");
if (anchorIndex > -1) {
fragment = targetUrl.substring(anchorIndex);
targetUrl.delete(anchorIndex, targetUrl.length());
}
// If there aren't already some parameters, we need a "?".
boolean first = (targetUrl.toString().indexOf('?') < 0);
for (Map.Entry<String, Object> entry : queryProperties(model).entrySet()) {
Object rawValue = entry.getValue();
Iterator<Object> valueIter;
if (rawValue != null && rawValue.getClass().isArray()) {
valueIter = Arrays.asList(ObjectUtils.toObjectArray(rawValue)).iterator();
}
else if (rawValue instanceof Collection) {
valueIter = ((Collection<Object>) rawValue).iterator();
}
else {
valueIter = Collections.singleton(rawValue).iterator();
}
while (valueIter.hasNext()) {
Object value = valueIter.next();
if (first) {
targetUrl.append('?');
first = false;
}
else {
targetUrl.append('&');
}
String encodedKey = urlEncode(entry.getKey(), encodingScheme);
String encodedValue = (value != null ? urlEncode(value.toString(), encodingScheme) : "");
targetUrl.append(encodedKey).append('=').append(encodedValue);
}
}
// Append anchor fragment, if any, to end of URL.
if (fragment != null) {
targetUrl.append(fragment);
}
}
UriComponentsBuilder.fromHttpUrl(url).build().toString()