SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案
今天做网站【标签】筛选功能时,出现了这么个奇葩的问题。
我是直接通过<a>标签中href来跳转的,url中包含汉字
<a href="/tags/标签A">标签A</a>
后台代码是这样的:
@RequestMapping(value = "/tags/{tagname}")
public String tags(@PathVariable String tagname) {
// ISO-8859-1 ==> UTF-8 进行编码转换
tagname = encode_to_utf8(tagname);
// 其余处理略
}
按理说这样就行了,各大浏览器也正常执行了。
但是,一不下心发现,只要URL中出现“充”这个汉字,直接就报404错误
例如这样:
<a href="/tags/标签充A">标签充A</a>
奇葩吧。
经过漫长的调查发现,原因有可能是:
充这个汉字在URL中直接提交,经过浏览器转码后,会变成一串包含“/”的“乱码”。
后来经过类似测试发现,果然只要URL中包含“/”的参数,都无法通过@PathVariable正确匹配。
有人说不如改成这样:
方案1:
在Server端通过urlencode把汉字先进行UTF-8编码,然后扔到前端。
否决:这样做的话,URL就会变成这个丑样,这和乱码有什么区别?真心不喜欢。
<a href="/tags/%D6%D0%B9%FA">标签充A</a>
后来纵观各大站点,各有各的做法
方案2:
<a href="/tags?tagname=标签充A">标签充A</a>
然后在Controller中用@RequestParam来接收参数,这样确实是可以的。
否决:但是SEO大神说,url中包含?的动态参数后,有可能会被蜘蛛重复抓取,不利于SEO。
方案3 :把汉字便签转换成拼音
<a href="/tags/biaoqianchongA">标签充A</a>
否决:这样可以是可以,但是还要在搞一个汉字转拼音插件,而且看上去也不直观,不好。
方案4:给标签一个ID
<a href="/tags/T1">标签充A</a>
否决:这样可以是可以,但是我还要该表结构,蛋疼。
方案5:用JS阻断A的href,实现POST跳转
否决:现在百度已经可以解析JS了吗?
大家还有别的方案没有??
难道就没有办法在保持URL格式与汉字都不变的情况,实现这个功能吗?
最后终于发现,有人这样搞定了!
前端:
<a href="/tags/标签充A">标签充A</a>
后端:
@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 href="/tags/标签充A">标签充A</a>
<a href="/tags/标签充A/asd/asd">标签充A</a>
<a href="/tags/标签充A/BB/cc.html">标签充A</a> 参考原文地址:http://kamatama41.hatenablog.com/entry/20130411/1365668200
SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案的更多相关文章
- springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。
springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...
- springMVC实现REST开发详解(补充Json解析问题以及静态文件404错误解决办法)
一.什么是REST? 符合REST约束风格和原则的应用程序或者设计就是REST 例如: /blog/1 HTTP GET =>查询id=1的blog /blog/1 HTTP DE ...
- SpringMvc实现批量删除,使用post传值一直报404错误
Ajax结合SpringMVC实现批量删除信息,在前台使用post向后台传递要删除的id的集合额时候,一直报404错误, 前台post传值的源码如下: 了解一下: (1)第二行的rows为前面得到的一 ...
- koa2 get请求后台正常接收参数 前端报404错误
刚学习一门技术时,总会踩一些坑. 前端代码 function del(mId){ $.ajax({ type:"get", url:"/delUser", da ...
- springmvc项目,浏览器报404错误的问题
问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...
- 对于springmvc 很奇妙的报404错误的记录
@RequestMapping("/editItems") public ModelAndView editItems(Integer id) throws Exception { ...
- mysql 列名中 包含斜杠或者空格的处理方式
今天客户那边遇到了一个比较奇葩的问题跑来问我,这个问题比较冷门,所以特别记录下. 问题描述 数据库的字段存在斜杠或者空格的时候,怎么用sql进行insert或者select操作. 问题解答 对于这种特 ...
- Postman:传递的参数是List类型时 传参格式的写法
Postman传递的参数是List类型 实体类中引用了一个List,泛型为其他实体类 参数是List集合时,Postman中参数格式如下图所示: 有不明白的地方,欢迎留言
- sed命令替换字符包含斜杠\,引号的处理方法
在字符替换中,可能会遇见引号,“/”等的替换,这时应该注意,sed的命令原型是: sed -i "s/oldstring/goalstring/g" file 如果一个路径是da ...
随机推荐
- 【Oracle】-【权限-ORA-04043】- ORA-04043: object "SYS"."V_$DATABASE" does not exist
用非dba账号(但赋予了DBA角色)登录一个新的10g数据库想看下版本号, SQL> desc v$instance; ERROR: ORA-04043: object "SYS&qu ...
- Content-Disposition的作用及用法
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用户请求所得的内容存为一个 ...
- php 文件操作中几种方法整理
1.获取文件夹下所有文件个数 echo ShuLiang("../0503lianxi"); function ShuLiang($filename) { if(is_dir($f ...
- 你不了解PHP的10件事情
看到有人翻译的<10 things you (probably) didn’t know about PHP>,发现在此次之前2.8两条并不知道,1.3虽然熟知但是去没有实际应用. 由于阅 ...
- ubuntu 14.04解决gedit中文乱码的问题
终端输入 gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','GB18030','GB2 ...
- http://www.cnblogs.com/zhuli19901106/p/4356419.html
http://www.cnblogs.com/zhuli19901106/p/4356419.html
- C 语言 输入字符串 并计算输入的字符的长度
int main(void) { char a[50];int i=0;char *j;gets(a);//输入字符串j=a;while(*j!='\0'){j++;//指针指向下一个数组字符i++; ...
- unexpected problem
一个比较有趣的字符串问题,问题描述如下 大体意思就是给定一个字符串s以及一个整数m,找出一个能满足以上三个条件的字符串t的个数对10e9 + 7 取余输出. 第二三条是关键,t.s = s.t 举个例 ...
- 从汇编来看c语言
一. 学习过程 从C语言的角度提出一些问题,这些问题再从汇编的角度考虑,还真的很有意思. (1) 我们用高级语言编程时,一般不可能不用到变量,但是一定要用到变量吗?还有这些变量从汇编的角度是怎么实现的 ...
- hadoop集群的故障概率估算
hadoop集群的机器数业界(国内)最大的在5000左右,是什么限制了集群的规模呢?有好几个原因. 1. namenode的内存大小限制 2. 机器故障概率随着机器数目增大而增大,通常一份数据存储在h ...