springMVC使用redirect导致URL加上无关参数

最近项目组在打开一个URL后根据参数请求转发到对应查看页面的时候,在IE上的时候会打不开,而chrome浏览器是没有问题。
一、使用Fiddler拦截获取请求信息

转发URL
http://localhost/seeyon/common/cap4/template/display/pc/report/0/dist/index.html?appId=-1045498304643708171
实际URL
http://localhost/seeyon/common/cap4/template/display/pc/report/0/dist/index.html?appId=-1045498304643708171&ctp_htmlAtt=+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22+&ctp_DTD=+%3C%21DOCTYPE+html+PUBLIC+%22-%2F%2FW3C%2F%2FDTD+XHTML+1.0+Transitional%2F%2FEN%22+%22%2Fseeyonseeyonoa%2Fui%2FDTD%2Fxhtml1-transitional.dtd%22%3E&ctp_uri=%2Fseeyon%2Freport4Result.do&ctp_url=%2Fseeyon%2Freport4Result.do&ctp_scheme=http&ctp_server=localhost&ctp_port=80&ctp_contextPath=%2Fseeyon

问题原因:比对两个URL可以发现转发的URL在后面加上了一堆参数导致傻逼的IE判断请求出错被浏览器被拦截。

二、分析URL后面那段参数从何而来
1. 比对代码,只有一部分的转发页面出了问题,发现大部分的逻辑是使用super.redirectModelAndView实现的,出问题的代码使用的是new ModelAndView(“redirect:XXXX”)实现的,大概可以定位是redirect在搞鬼了;
2. 将所有的逻辑改为使用super.redirectModelAndView重启环境验证问题解决。

三、解决办法分析
解决方案1:

//controller不部分
public RedirectView createUser(HttpServletRequest request, HttpServletResponse response) {// 模拟数据库保存
        return new RedirectView(url);
}
//拦截器部分
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception {
        final Map model = modelAndView.getModel();
        if (!(modelAndView.getView() instanceof RedirectView)) {
            model.put("param1", "value1");
            model.put("param2", "value2");
            model.put("param3", "value3");
        } else {
            //进行其它操作
        }
}

解决方案2:使用一个JSP做跳板,改变页面的location为转发URL搞定

//后台部分
public ModelAndView redirectModelAndView(String url) throws Exception{
ModelAndView mav = new ModelAndView("common/redirect");
mav.add("redirectURL", url);
return mav;
}
//JS部分
location.href = '${redirectURL}'

四、参考帖子:
1. SpringMVC的拦截器与Controller里return “redirect:XXX”的问题
2. Spring mvc interceptor addObject
3. SpringMVC redirect相关问题
4. spring mvc redirect转发后的url,怎么去掉?后面一堆信息

你可能感兴趣的:(Java基础)