在我们写前端页面发起请求时,一般写法有三种

  1. 以斜杠开头的 例如href=‘/应用上下文/login.jsp’
  2. 不以斜杠开头的href=‘login.jsp’
  3. 有前缀请求方式的href=‘http://www.baidu.com’
    其中第三种方式大家都了解,就是直接跳转到百度的页面,地址栏直接填充www.baidu.com,这个就不多说了,那么前两种方式都有什么区别呢
    曾经这是个令我头疼的问题,必须记录下来

第一种方式

第一种以斜杠开头的链接,其中它的斜杠表示根目录,这个根目录是相对于浏览器的,对应的就是
协议://服务名:端口号/,最常见的就是http://localhost:8080/这种,所以我们一般使用这种方式时都需要加上应用上下文的名字,不然光凭借http://localhost:8080/+访问的资源是会出现404的,因为中间少了应用上下文
解决方案:一般都不会直接使用斜杠作为开头,因为如果你这样做了,那么你还需要手动在斜杠后面填写应用上下文然后才可以写路径,非常的麻烦。
所以一般都是使用EL表达式${pageContext.request.contextPath}来做为链接的开头
例如<a href="${pageContext.request.contextPath}/image/car.jpg">点击访问图片</a>,这种方式在浏览器解析的时候就会把${pageContext.request.contextPath}解析成/你的应用上下文给填入到此链接中,所以就变为<a href="/你的应用上下文/image/car.jpg">点击访问图片</a>,你看,这样的链接前面就自动填充了斜杠,就可以正常访问静态资源和请求了

第二种方式

第二种是不以斜杠开头的链接,这种方式请求资源是以浏览器自动帮你把前面的内容填充上的,举个最简单的例子,比如我新建一个web工程,应用上下文叫ABC

我前端默认的index.jsp写一个A标签,链接填入一个请求Test/doSome,后端有对应的处理方法,后端接收到此请求会内部转发到index.jsp。就是这么一个脱裤子放屁的操作,会出问题

启动tomcat,访问index.jsp

RequestBodyAdviceAdapter 请求路径 http请求中路径填写什么_斜杠


点击刷新本页面之后的地址栏

确实发送了test/doSome请求,由于是内部转发,所以地址栏不会变为index.jsp而是保持发送请求的样子

RequestBodyAdviceAdapter 请求路径 http请求中路径填写什么_地址栏_02


再次点击刷新本页面,报错404

此时URL已经变为http://localhost:8080/ABC/test/test/doSome

RequestBodyAdviceAdapter 请求路径 http请求中路径填写什么_斜杠_03


这是为什么呢?因为浏览器是区分资源名称和资源路径的,

举个最简单的例子,当我第一次访问index.jsp时,对于浏览器来说

资源路径=http://localhost:8080/ABC/资源名称=index.jsp

合起来就是完整的路径http://localhost:8080/ABC/index.jsp

由于我a标签中的链接前面没有用斜杠开头,浏览器会自动帮我补上这部分空白的路径,而这部分空白的路径参考的就是我上面写的资源路径=http://localhost:8080/ABC/,所以第一次请求没问题,地址栏被正常填充为http://localhost:8080/ABC/test/doSome,但是当我第二次点击a标签发请求的时候,这个时候,对于浏览器来说,当前的资源名称和路径分别为

资源路径=http://localhost:8080/ABC/test/

资源名称=doSome

那么这次发的请求就被填充为了http://localhost:8080/ABC/test/+test/doSome,对于服务器来说无法处理,所以就会报404

解决方案:使用HTML中的base标签将浏览器自动填充的路径替换为给定的一个固定值

RequestBodyAdviceAdapter 请求路径 http请求中路径填写什么_地址栏_04