今天做网站【标签】筛选功能时,出现了这么个奇葩的问题。
我是直接通过<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错误的解决方案的更多相关文章

  1. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  2. springMVC实现REST开发详解(补充Json解析问题以及静态文件404错误解决办法)

    一.什么是REST? 符合REST约束风格和原则的应用程序或者设计就是REST 例如: /blog/1   HTTP GET    =>查询id=1的blog /blog/1   HTTP DE ...

  3. SpringMvc实现批量删除,使用post传值一直报404错误

    Ajax结合SpringMVC实现批量删除信息,在前台使用post向后台传递要删除的id的集合额时候,一直报404错误, 前台post传值的源码如下: 了解一下: (1)第二行的rows为前面得到的一 ...

  4. koa2 get请求后台正常接收参数 前端报404错误

    刚学习一门技术时,总会踩一些坑. 前端代码 function del(mId){ $.ajax({ type:"get", url:"/delUser", da ...

  5. springmvc项目,浏览器报404错误的问题

    问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...

  6. 对于springmvc 很奇妙的报404错误的记录

    @RequestMapping("/editItems") public ModelAndView editItems(Integer id) throws Exception { ...

  7. mysql 列名中 包含斜杠或者空格的处理方式

    今天客户那边遇到了一个比较奇葩的问题跑来问我,这个问题比较冷门,所以特别记录下. 问题描述 数据库的字段存在斜杠或者空格的时候,怎么用sql进行insert或者select操作. 问题解答 对于这种特 ...

  8. Postman:传递的参数是List类型时 传参格式的写法

    Postman传递的参数是List类型 实体类中引用了一个List,泛型为其他实体类 参数是List集合时,Postman中参数格式如下图所示: 有不明白的地方,欢迎留言

  9. sed命令替换字符包含斜杠\,引号的处理方法

    在字符替换中,可能会遇见引号,“/”等的替换,这时应该注意,sed的命令原型是: sed -i  "s/oldstring/goalstring/g" file 如果一个路径是da ...

随机推荐

  1. 清北学堂 Pa

    PA[题目描述]汉诺塔升级了:现在我们有?个圆盘和?个柱子,每个圆盘大小都不一样,大的圆盘不能放在小的圆盘上面,?个柱子从左到右排成一排.每次你可以将一个柱子上的最上面的圆盘移动到右边或者左边的柱子上 ...

  2. 安装spark1.3.1单机环境

    本文介绍安装spark单机环境的方法,可用于测试及开发.主要分成以下4部分: (1)环境准备 (2)安装scala (3)安装spark (4)验证安装情况 1.环境准备 (1)配套软件版本要求:Sp ...

  3. NodeJs简单七行爬虫--爬取自己Qzone的说说并存入数据库

    没有那么难的,嘿嘿,说起来呢其实挺简单的,或者不能叫爬虫,只需要将自己的数据加载到程序里再进行解析就可以了,如果说你的Qzone是向所有人开放的,那么就有一个JSONP的接口,这么说来就简单了,也就不 ...

  4. php echo字符串的连接格式

    echo "<td align=\"center\"><img src=\""; 1.  \"    \" 2. ...

  5. 讨论一下PHP相关技能的层次

    1.PHP编程能力 由于PHP的入门较为简单,所以暂时只有熟悉和精通两个级别. 1.熟悉PHP:精通PHP语法,掌握常用的函数,熟悉PHP5下的OOP应用,这个是基础,也没什么好说的. 2.精通PHP ...

  6. 【转】sublime text 2 中文乱码解决办法

    sublime text 2是一款非常优秀的跨平台文本及源代码编辑器,本人非常喜欢,但是不支持GB2312和GBK编码在某些时候比较麻烦.可以通过向sublime text 中添加编码类型转换包(比如 ...

  7. 十分钟让你的ASP.NET MVC网站变成PHP

    昨天从网上看来的,某个人发的方法: 第一:修改一下路由: 把RouteConfig中的: routes.MapRoute( name: "Default", url: " ...

  8. JUnit使用Eclipse建立Test Suite - 就是爱Java

    当JUnit有多个或所有的Test Case要执行,此时就需要Test Suite来管理众多的Test Case,利用Eclipse的整合开发环境,可以针对多个不相关的Test Case或Test S ...

  9. Codeforces 573B Bear and Blocks

    http://codeforces.com/problemset/problem/573/B  题目大意: 给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块. 思 ...

  10. 防止DC电源反接的方法——SS14的用法

    出处:http://blog.ednchina.com/tengjingshu 电源是PCB板的重要部分,每个芯片都需要电源供给.芯片其实是挺脆弱的,只要正负接反得话,大多数就会挂掉,相信很多人都有惨 ...