问题:

在SpringMvc使用RedirectView或者"redirect:"前缀来做重定向时,Spring MVC最后会调用:

response.sendRedirect(response.encodeRedirectURL(url));

对于某些浏览器来说,打开一个新的浏览器窗口,第一次访问服务器时,encodeRedirectURL()会在url后面附加上一段jsessionid,

如果初始的url为"http://www.sina.com.cn",最终得到的url为"http://www.sina.com.cn;jsessionid=126AFFB8D83764DB4843889A72C0E4B6"

这是典型的Java做事的方式,其他语言的服务器端平台并不会这样做。这个jsessionid很多时候会引起严重的问题,例如,如果你使用上述带有jsessionid的url直接访问新浪的网站,IE会向你报告:找不到服务器。

解决方法:

不通过Spring MVC做重定向,自己直接调用:

response.sendRedirect(url);
return null; //告诉Spring MVC我已经完成了处理

基于拓展知识的需要,如果问题已经解决,以下内容可以不看。

其他方案:

1) 还有说通过重写覆写dofilter方法:

/**
* @ClassName: CorsFilter
* @Description: (跨域过滤器)
*/
@Component
public class CorsFilter implements Filter {
private static Logger logger = LoggerFactory.getLogger(CorsFilter.class); @Override
public void init(FilterConfig config) throws ServletException {
} @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,Accept");
response.setHeader("P3P", "CP=CAO PSA OUR");
HttpServletResponseWrapper wrappedResponse = null;
if (req instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) req;
if (httpRequest.isRequestedSessionIdFromURL()) {
logger.info("doFilter isRequestedSessionIdFromURL");
HttpSession session = httpRequest.getSession();
if (session != null) {
session.invalidate();
}
// wrap response to remove URL encoding
wrappedResponse = new HttpServletResponseWrapper(response) { @Override
public String encodeRedirectUrl(String url) {
logger.info("doFilter encodeRedirectUrl=" + url);
return url;
} @Override
public String encodeRedirectURL(String url) {
logger.info("doFilter encodeRedirectURL=" + url);
return url;
} @Override
public String encodeUrl(String url) {
logger.info("doFilter encodeUrl=" + url);
return url;
} @Override
public String encodeURL(String url) {
logger.info("doFilter encodeURL=" + url);
return url;
}
};
}
}
chain.doFilter(req, wrappedResponse != null ? wrappedResponse : resp);
} @Override
public void destroy() {
}

核心点是把

response.sendRedirect(response.encodeRedirectURL(url));
改为:response.sendRedirect(url);

亲测后,好像并不能解决问题。

2)Cookie欺骗

encodeRedirectURL()仅在无法确定浏览器是否支持cookie的时候才会在url后面附加上jsessionid,如果它能找到一个jsessionid的cookie,它就认为浏览器是支持cookie的。
因此可以自己创建一个jsessionid的cookie来欺骗encodeRedirectURL()。

Cookie cookie = new Cookie("jsessionid", "xxxxxxxxxxxxxxxxxxxx");
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
然后再调用Spring MVC的重定向功能就没有问题了。

这种方法没有测试过。

jsessionid 所引起的404问题和解决方法的更多相关文章

  1. ASP.NET MVC 3 loginUrl自动变成Account/Login,并且发生404错误的解决方法

    http://www.cnblogs.com/think8848/archive/2011/07/08/2100814.html ASP.NET MVC 3 loginUrl自动变成Account/L ...

  2. Android通过Chrome Inspect调试WebView出现404页面的解决方法

    无论是调试Web页面还是调试Hybrid混合应用,只要是调试Android的webview,都需要使用Chrome://inspect进行调试.但是国内开发者会出现404 Not Found错误: 解 ...

  3. jsp-status 404错误的解决方法汇总

    接下来的解决方法实在一下情况下进行的: 1.tomcat配置是对的,能打开tomcat的主页(网址:http://localhost:8080/),如图, 但是在输入具体网址的时候,例如:http:/ ...

  4. elipse中开发servlet,直接run as 时出现404错误的解决方法

    在elipse中开发servlet时,无论在IDE中运行,还是在浏览器中访问servlet时,一直报404错误, 后发现在build目录中没有生成相应的类文件,后反复采用project中的clean. ...

  5. wordpress设置“固定链接”后,页面404错误的解决方法

    Nginx 解决方案: 网上盛传的方法是: 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.htm ...

  6. Wordpress“固定链接”页面出现404原因及解决方法

    编辑配置文件:/etc/apache2/apache2.conf(非常靠后的位置),将里面的AllowOverride选项由None设置为All. <Directory /> Option ...

  7. ubuntu下sudo apt-get update Sources 404 Not Found 解决方法

    刚安装了ubuntu之后的主要安装命令无非就是apt-get install了,然而很多都在这里就夭折了. 使用apt-get install ***需要先执行apt-get update 加载文件包 ...

  8. IIS HTTP 错误 404.17 - Not Found HTTP 错误 404.2 解决方法

    出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 解决方法 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\as ...

  9. Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329

    Atitit.url 汉字中文路径  404 resin4 resin  解决  v2 q329 1. Pluginx机制1 2. Code1 3. 参考4 1. 原理 过滤器  ,,拦截jpg  w ...

随机推荐

  1. mysql实现计数器

    本文转自:https://blog.csdn.net/stevendbaguo/article/details/70889449 如果是在非常高的并发之下,还是建议用内存数据库redis去实现计数的功 ...

  2. Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    Note:这篇文章是基于Android Studio 3.01版本的,NDK是R16. step1:创建一个包含C++的项目 其他默认就可以了. C++ Standard 指定编译库的环境,其中Too ...

  3. nuget用法

    Update-Package -reinstall -ProjectName Cardin.HeartCare.Service.ChatService

  4. Linux基础知识介绍

    1.Linux知识说明1)文件位置 1)/etc/inittab2)模式介绍 0:挂起模式-不推荐 1:单用户模式-只有管理员可以进入该模式,可以修改root密码,处理有登录权限而没有修改文件的权限问 ...

  5. 增加和减少mongodb复制集中的节点

    MongoDB Replica Sets不仅提供高可用性的解决方案,同时也提供负载均衡的解决方案,增减 Replica Sets节点在实际应用中非常普通.例如,当应用的读压力暴增时,3台节点的环境已不 ...

  6. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...

  7. 如何启动Intel VT-x

    如何启动Intel VT-x 5 在64bit win7系统下安装了Vmware10,然后安装64位的UbuntuKylin 14.04,想要打开UbuntuKylin,弹出如下对话框: 请问该如何启 ...

  8. UVA 1625 Color Length 颜色的长度 (预处理+dp)

    dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费. 转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数 ...

  9. springboot-i18n国际化

    简介 In computing, internationalization and localization are means of adapting computer software to di ...

  10. 选择法数组排序参考(Java)

    package com.swift; public class Xuanze { public static void main(String[] args) { int[] arr= {28,2,3 ...