jsessionid 所引起的404问题和解决方法
问题:
在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问题和解决方法的更多相关文章
- 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 ...
- Android通过Chrome Inspect调试WebView出现404页面的解决方法
无论是调试Web页面还是调试Hybrid混合应用,只要是调试Android的webview,都需要使用Chrome://inspect进行调试.但是国内开发者会出现404 Not Found错误: 解 ...
- jsp-status 404错误的解决方法汇总
接下来的解决方法实在一下情况下进行的: 1.tomcat配置是对的,能打开tomcat的主页(网址:http://localhost:8080/),如图, 但是在输入具体网址的时候,例如:http:/ ...
- elipse中开发servlet,直接run as 时出现404错误的解决方法
在elipse中开发servlet时,无论在IDE中运行,还是在浏览器中访问servlet时,一直报404错误, 后发现在build目录中没有生成相应的类文件,后反复采用project中的clean. ...
- wordpress设置“固定链接”后,页面404错误的解决方法
Nginx 解决方案: 网上盛传的方法是: 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.htm ...
- Wordpress“固定链接”页面出现404原因及解决方法
编辑配置文件:/etc/apache2/apache2.conf(非常靠后的位置),将里面的AllowOverride选项由None设置为All. <Directory /> Option ...
- ubuntu下sudo apt-get update Sources 404 Not Found 解决方法
刚安装了ubuntu之后的主要安装命令无非就是apt-get install了,然而很多都在这里就夭折了. 使用apt-get install ***需要先执行apt-get update 加载文件包 ...
- IIS HTTP 错误 404.17 - Not Found HTTP 错误 404.2 解决方法
出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 解决方法 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\as ...
- Atitit.url 汉字中文路径 404 resin4 resin 解决 v2 q329
Atitit.url 汉字中文路径 404 resin4 resin 解决 v2 q329 1. Pluginx机制1 2. Code1 3. 参考4 1. 原理 过滤器 ,,拦截jpg w ...
随机推荐
- vue样式操作与事件绑定
Vue笔记 1 Vue实例 (VM) var vm = new Vue({ el:'#app', //挂载元素 //数据 data: { title:'值', ...
- Java 堆内存和栈内存
看了一些别人总结的博客,感觉对堆内存和栈内存有了一个初步的认识.所以来写写自己对堆内存和栈内存的理解. Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象 ...
- OpenCV中CvMat的初始化[转]
一)cvCreateMat创建和分配数据CvCreateMat会创建CvMat,并为CvMat分配数据.cvCreateMat可以配合cvInitMatHeader来初始化CvMat对象.因为CvCr ...
- dialog样式的activity设置activity的title为隐藏属性
View view= this.findViewById(android.R.id.title);view.setVisibility(View.GONE);
- linux 下node升级
npm install -g n n stable 安装的路径: cd /usr/local/n/versions/node/10.15.3 修改环境变量 cd /etc sudo vim profi ...
- MySQL主服务配置文件
[mysql]port=3306socket=/var/lib/mysql/mysql.sockdefault-character-set = utf8mb4 [mysqld]server-id = ...
- HDU 4003 Find Metal Mineral (树形DP,经典)
题意:给定一棵树图,n个节点,有边权,要派k<11个机器人从节点s出发,遍历所有的点,每当1只机器人经过1条边时就会花费该边的边权,边是可重复走的.问遍历完所有点的最小花费? 思路: 非常经典, ...
- leetcode_1052. Grumpy Bookstore Owner
1052. Grumpy Bookstore Owner https://leetcode.com/problems/grumpy-bookstore-owner/ 题意:每个时刻i会有custome ...
- 用valgrind检查内存问题
Valgrind Valgrind作为一个免费且优秀的工具包,平时大部分人可能都是使用valgrind检测内存问题,如内存泄露,越界等. Valgrind工具包包含多个工具,如Memcheck,Cac ...
- tomcat中如何禁止和允许主机或地址访问
1.tomcat中如何禁止和允许列目录下的文件 在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下: <servlet>...< ...