============================================================================================

getContextPath、getServletPath、getRequestURI的区别

假定你的工程名称为projects,你在浏览器中输入请求路径:

http://127.0.0.1:8080/projects/pages/newForm.jsp

则执行下面向行代码后打印出如下结果:
1、 System.out.println(request.getContextPath());
打印结果:/projects
 2、System.out.println(request.getServletPath());
打印结果:/pages/newForm.jsp
 3、 System.out.println(request.getRequestURI());
打印结果:/projects/pages/newForm.jsp
 4、 System.out.println(request.getRealPath("/")); 
 JSP servlet API提供了getRealPath(path)方法,返回给定虚拟路径的真实路径,如果转换错误,则返回null。

打印结果:C:\Tomcat5.0\webapps\projects\test

============================================================================================
java中有一个sendRedirect函数这个用于跳转到另外一个页面,这个实际上是一个302跳转,但是不完全等同于302跳转

点击(此处)折叠或打开

  1. response.sendRedirect("login.jsp");
  2. 不等于
  3. response.addHeader("location", "login.jsp");
  4. response.setStatus(302);

1.比较

response.sendRedirect("login.jsp");的http请求过程如下:
response.addHeader("location", "login.jsp");
response.setStatus(302);
上面两个比较发现不同的是蓝色部分
response.sendRedirect("login.jsp");在重定向时多加了一段http://localhost:8080/xxxSearch/
 
2.分析
1)当我们浏览器的访问路径是http://localhost:8080/xxxSearch/时,
response.sendRedirect("login.jsp");  等于 response.addHeader("location", "login.jsp");response.setStatus(302);
这时在jsp使用request.getContextPath()获取访问绝对路径是可以的
2)但是当我们的浏览器的访问路径是http://localhost/时就出现问题了
像我公司经常是这样的结构:用apache做前端,代理后面的tomcat,在tomcat看来访问路径还是http://localhost:8080/xxxSearch/,而用户真实访问的是http://localhost/
若是用response.sendRedirect("login.jsp");的话,用户会跳转到
http://localhost:8080/xxxSearch/login.jsp
若是我们的防火墙不开放8080端口,我们就会看到无法访问的页面,而且我们也不想客户直接访问到tomcat上。
而用response.addHeader("location", "login.jsp");response.setStatus(302);的话,客户会访问到login.jsp,这个路径是一个相对的路径再加上客户浏览器的路径,客户实际访问的是
http://localhost/login.jsp
 
3.结论
因此我认为:
尽量使用
response.addHeader("location", "login.jsp");response.setStatus(302);
而且在jsp页面里尽量不要使用request.getContextPath()或者绝对路径,
这样我们的代码可以很好的通过不同方式访问,特别是对SEO优化非常有好处

http请求中java中的302和sendRedirect的区别的更多相关文章

  1. ACM中java中BigInteger和Decimal用到的主要函数

    java中大数以及高精度常用函数 使用java大数类解决问题时我们需要注意两个方面:1.不能有包名,也就是说我们要把主类放到默认的包里,如果你的代码里出现形如package cn.gov.test;这 ...

  2. java中的302和sendRedirect的区别

    java中有一个sendRedirect函数这个用于跳转到另外一个页面,这个实际上是一个302跳转,但是不完全等同于302跳转 点击(此处)折叠或打开 response.sendRedirect(&q ...

  3. 如何在win10中Java中JDK的安装和path,classpath的环境配置

    1,第一步,不用说肯定是去下一个java JDK了.目前最新版本的java JDK应该是JDK 7.0,这个就自己去百度一下了,好多网站都可以找到.2,第二步就是安装JDK虚拟机了,按照它里面的提示一 ...

  4. 在实际开发中Java中enum的用法

    在日常项目的开发中,往往会存在一些固定的值,而且"数据集"中的元素是有限的. 例如:st_code// 一些状态机制:01-激活  02-未激活  03 -注册..等等 还有一特性 ...

  5. java中模拟http(https)请求的工具类

    在java中,特别是java web中,我们经常需要碰到的一个场景是我们需要从服务端去发送http请求,获取到数据,而不是直接从浏览器输入请求网址获得相应.比如我们想访问微信接口,获取其返回信息. 在 ...

  6. spring MVC 管理HttpClient---实现在java中直接向Controller发送请求

    在spring MVC中,大多数时候是由客户端的页面通过ajax等方式向controller发送请求,但有时候需要在java代码中直接向controller发送请求,这时可以使用HttpCilent实 ...

  7. java中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  8. JAVA中使用Apache HttpComponents Client的进行GET/POST请求使用案例

    一.简述需求 平时我们需要在JAVA中进行GET.POST.PUT.DELETE等请求时,使用第三方jar包会比较简单.常用的工具包有: 1.https://github.com/kevinsawic ...

  9. Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)

    Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件) 一.HttpPost上传文件 public static String getSuffix(fi ...

随机推荐

  1. elasticsearch介绍集群,模拟横向扩展节点、节点宕机、改变分片

        出处:[http://www.cnblogs.com/dennisit/p/4133131.html] ,防楼主删博,故保留一份! elasticsearch用于构建高可用和可扩展的系统.扩展 ...

  2. 关于ftp操作内容记录

    ftp问题解决: http://www.linuxdiyf.com/viewarticle.php?id=272088 IPTABLES_MODULES="ip_nat_ftp ip_con ...

  3. javascript encode或者decode html

    function myHTMLEnCode(str) { var s = ""; if (str.length == 0) return ""; s = str ...

  4. linux服务之asterisk

    由于Asterisk过于专业且复杂,所以目前也存在大量衍生自Asterisk但简化过的通信系统,以让用户较容易使用.比如在欧美比较流行的elastix.trixbox.或以简体中文为基础的Freeir ...

  5. OpenJudge计算概论-寻找下标

    /*======================================================================== 寻找下标 总时间限制: 1000ms 内存限制: ...

  6. JavaScript中知而不全的this (转)

    原文引自:http://www.cnblogs.com/snandy/p/4773184.html 都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把函数式编程和面 ...

  7. web压力测试 - http_load

    http_load是基于linux平台的一个性能测工具 非常小巧易用,可以用并行方式运行,来测试web服务器的性能 测试方式 (1)准备测试url vim url.txt 填写要测试的url,可以写多 ...

  8. 【jmter】JDBC进行mysql数据库测试

    1.添加线程组 2.添加需要的驱动jar包 使用不同的数据库,我们需要引入不同的jar包. 方式1:直接将jar包复制到jmeter的lib目录 mysql数据库:无需引入其他数据库驱动jar包. s ...

  9. Matlab 计算大数的阶乘

    http://hi.baidu.com/dreamflyman/item/11e920165596280fd0d66d9f >> syms k;>> kfac=sym('k!' ...

  10. 【Flex学习】Flex4学习网站

    http://blog.minidx.com/category/flex  来自为知笔记(Wiz)