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/1365668200http://www.cnblogs.com/notDog/p/5122106.html

 

时间: 2024-12-29 09:19:49

SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案(转)的相关文章

Office Excel 2007 工作表包含许多形状时指针移动和滚动很慢的解决方案

故障现象: 当 Microsoft Office Excel 2007 中的工作表包含许多形状时,指针移动和滚动速度很慢;即使当前屏幕上看不到任何形状,也会出现此问题,如何解决? 原因分析: 出现此问题的原因是,当您移动指针时,Excel 2007 会重新绘制工作表中的所有形状.即使当前屏幕上看不到任何形状,也会出现此问题.因此,屏幕外形状的自动重新计算就会减慢指针和滚动响应时间.此外,工作表中的形状越多,指针移动的速度就越慢. 解决方案: 一. 安装 Office Excel 2007修补程序

表单-WAF防护加上之后不能传递长参数

问题描述 WAF防护加上之后不能传递长参数 Web Firewall Log Details 时间 2015-12-07 10:27:20 客户端IP ..***.*** 客户端端口号 *** 服务IP:端口 ..***.*** :** 动作 DENY 后继动作 无 严重等级 Alert URL www.***.com/**/images/left-h-bg.png Method GET 攻击类型 Header value length exceeded 详细信息 length="715 byt

java正则表达式匹配斜杠

在正则表达式里面匹配一个斜杠,需要用4个斜杠: Java代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String textString = new String ("\\\&q

python 正则表达式 反斜杠(/)的麻烦和陷阱_正则表达式

要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四个"\\\\",完美匹配. 复制代码 代码如下: import re re_str_patt = "\\\\" reObj = re.compile(re_str_patt)

急问ie链接中多个反斜杠问题!

问题描述 我现在有个链接是这样格式:http://oa.jx.shxx.cn//test/aasji/..........,大家看到cn后有两个/,但打开链接后系统会自动去掉一个/变成http://oa.jx.shxx.cn//test/aasji/..........,也就是说打开链接没问题,我想知道这个会不会有什么问题??? 解决方案 解决方案二:打开后变成http://oa.jx.shxx.cn/test/aasji/..........,不好意思,打急了!解决方案三:你把你链接的格式改为

python 正则表达式 反斜杠(/)的麻烦和陷阱

要匹配字符串中1个反斜杠应该怎么写正则表达式?"\\",这样行吗?试试就知道了,re模块抛异常了,因为"\\"就是一个反斜杠,对于正则表达式解析器来说,是一个转义字符,但是后面啥也没有,自然就报错了,"\\\"三个肯定是不行的,试试四个"\\\\",完美匹配. 复制代码 代码如下: import re re_str_patt = "\\\\" reObj = re.compile(re_str_patt)

springmvc取不到表单传递的参数?怎么回事呢?

问题描述 springmvc取不到表单传递的参数?怎么回事呢? 前台向后台提交数据的时候,属性参数取到的全部是null. 通过request和userCustom取的都是null值. 为什么取不到值呢? html中代码如下: controller中的代码如下: @RequestMapping("/editUser") public String editUser(HttpServletRequest request,Integer id,UserCustom userCustom)th

DLL中传递STL参数

以下是自己在调测代码过程出现问题后,搜索出来的资料,虽然很乱,但明白了在跨DLL传递stl中的容器类对象时存在问题的原因及解决办法,故保存之. STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释. 原因分析: 一句话-----如果任何STL类使用了静态变量(无论是直接还是间接使用),那么就不要再写出跨执行单元访问它的代码. 除非你能够确

javaweb-jsp页面通过href向servlet类页面传递中文参数时出现乱码了怎么办?

问题描述 jsp页面通过href向servlet类页面传递中文参数时出现乱码了怎么办? jsp页面通过href向servlet类页面传递中文参数时出现乱码了怎么办?我在doGet方法中设置了response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8");所有的编码方式都是utf-8