博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案(转)...
阅读量:5739 次
发布时间:2019-06-18

本文共 1754 字,大约阅读时间需要 5 分钟。

今天做网站【标签】筛选功能时,出现了这么个奇葩的问题。
我是直接通过标签中href来跳转的,url中包含汉字

后台代码是这样的:

@RequestMapping(value = "/tags/{tagname}")public String tags(@PathVariable String tagname) {
   // ISO-8859-1 ==> UTF-8 进行编码转换    tagname = encode_to_utf8(tagname);    // 其余处理略 }

按理说这样就行了,各大浏览器也正常执行了。

但是,一不下心发现,只要URL中出现“”这个汉字,直接就报404错误

例如这样:

奇葩吧。

经过漫长的调查发现,原因有可能是:

这个汉字在URL中直接提交,经过浏览器转码后,会变成一串包含“/”的“乱码”。

后来经过类似测试发现,果然只要URL中包含“/”的参数,都无法通过@PathVariable正确匹配。

 

有人说不如改成这样:

方案1:

在Server端通过urlencode把汉字先进行UTF-8编码,然后扔到前端。

否决:这样做的话,URL就会变成这个丑样,这和乱码有什么区别?真心不喜欢。

 

后来纵观各大站点,各有各的做法

方案2:

然后在Controller中用@RequestParam来接收参数,这样确实是可以的。

否决:但是SEO大神说,url中包含?的动态参数后,有可能会被蜘蛛重复抓取,不利于SEO。

 

方案3 :把汉字便签转换成拼音

否决:这样可以是可以,但是还要在搞一个汉字转拼音插件,而且看上去也不直观,不好。

 

方案4:给标签一个ID

否决:这样可以是可以,但是我还要该表结构,蛋疼。

 

方案5:用JS阻断A的href,实现POST跳转

否决:现在百度已经可以解析JS了吗?

 

大家还有别的方案没有??

 

难道就没有办法在保持URL格式与汉字都不变的情况,实现这个功能吗?

最后终于发现,有人这样搞定了!

前端:

后端:

复制代码
@RequestMapping(value = "/tags/**")public String tags(HttpServletRequest request) {   // ISO-8859-1 ==> UTF-8 进行编码转换  String tagname = extractPathFromPattern(request);      tagname = ToolUtils.encodeStr(tagname);   // 其余处理略}// 把指定URL后的字符串全部截断当成参数// 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题private static String extractPathFromPattern(            final HttpServletRequest request){     String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);     String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);     return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);}
复制代码

搞完之后,不管你输入什么样的URL,都能进入到指定的方法!

标签充A
标签充A
标签充A 参考原文地址:http://kamatama41.hatenablog.com/entry/20130411/1365668200 http://www.cnblogs.com/notDog/p/5122106.html

 

转载于:https://www.cnblogs.com/softidea/p/5122822.html

你可能感兴趣的文章
18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
理解WebKit和Chromium(电子书)
查看>>
爱——无题
查看>>
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>
【http】post和get请求的区别
查看>>
/etc/profile
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
2.1 sikuli 中编程运行
查看>>
python魔法函数(二)之__getitem__、__len__、__iter__
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
linux下使用过的命令总结(未整理完)
查看>>
ES6的一些文章
查看>>
时间助理 时之助
查看>>
自定义转场动画
查看>>