zoukankan      html  css  js  c++  java
  • 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.0webappsprojects est

    假定你的web application 项目名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 

    则执行下面向行代码后打印出如下结果: 
    1、 System.out.println(request.getContextPath()); //可返回站点的根路径。也就是项目的名字 
    打印结果:/news 

    2、System.out.println(request.getServletPath()); 
    打印结果:/main/list.jsp 

    3、 System.out.println(request.getRequestURI()); 
    打印结果:/news/main/list.jsp 

    4、 System.out.println(request.getRealPath("/")); 

          request.getRealPath("/")已经不建议使用。

    改成req.getServletContext().getRealPath("/")

    getRealPath();

    返回一个字符串,包含一个给定虚拟路径的真实路径。

    struts2中:

    ServletContext ctx=ServletActionContext.getServletContext();

    String path=ctx.getRealPath("/");
    String path1=ctx.getRealPath("/files/view.jsp");

    输出:path为D:Javasoftwareapache-tomcat-7.0.70apache-tomcat-7.0.70webappsstruts2-1

             path1为D:Javasoftwareapache-tomcat-7.0.70apache-tomcat-7.0.70webappsstruts2-1filesview.jsp

    filesview.jsp这部分就是虚拟路径

    D:Javasoftwareapache-tomcat-7.0.70apache-tomcat-7.0.70webappsstruts2-1  为项目的绝对路径

     servlet中:

    private ServletConfig  config;

    public void init(ServletConfig config) throws ServletException {
    this.config=config;}

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    ServletContext ctx=config.getServletContext();
    String temp=ctx.getRealPath("/");
    }


    打印结果:F:Tomcat 6.0webapps ews est 

    注:

    URI=contextPath+servletPath

    现在项目做到加权限了,如何防止用户通过直接输入URL访问网页,去查资料,了解到在filter里用HttpServletRequest里的方法得到该请求的父URL-fatherURL,判断该fatherURL是否为空,如果为空就表示该请求是通过直接输入URL访问的。

    代码:

    1. public void doFilter(ServletRequest request, ServletResponse response,   
    2.           FilterChain chain) throws IOException, ServletException {  
    3.      //首先判断如果是在URL输入页面访问,直接非法  
    4.      HttpServletRequest req=(HttpServletRequest)request;  
    5.      HttpServletResponse resp=(HttpServletResponse)response;  
    6.      String fatherUrl = fatherUrl = req.getHeader("REFERER");//取得上一级页面的RUL  
    7.     
    8.      if("".equals(fatherUrl ) || null == fatherUrl ) {  
    9.              String url = req.getServletPath();  
    10.              //第一次转发  
    11.              if("//pages/login.jsp".equals(url )) {  
    12.                      chain.doFilter(request, response);  
    13.              } else {     //设置输出页面编码  
    14.                      resp.setContentType("text/html;charset=gb2312");   
    15.                      resp.getWriter().write("错误页面 ,无此页");  
    16.                      return ;  
    17.               }  
    18.       } else{     //如果不是直接URL输入访问  
    19.           if(null==req.getSession().getAttribute("inWebUser")) {  
    20.                  resp.getWriter().write("非法访问");  
    21.                  return;  
    22.           } else {  
    23.                  chain.doFilter(request, response);  
    24.           }  
    25.      }  
    26. }  


    知道这个方法后,感觉HttpServletRequest太好用了,就去了JavaEE API文档,看到HttpServletRequest里有几个得到URL的方法,既然有好几个,说明它们之间肯定有不同之处,针对各种实际情况运用。下面就说说它们的区别:

    getServletPath:得到相对项目的url,不带项目名称        如://sys/menu/gomain.htm

     

    1. String path = ((HttpServletRequest)req).getServletPath();  

    getRequestURI:得到相对服务器的url,和上面有不同之处,getRequestURI带有项目root,以项目名称为开头,如:/cms//sys/menu/gomain.htm

    1. String requestURI = ((HttpServletRequest)req).getServletURI();  


    getContextPath:得到部署的项目名(Context-root),不是URL,仅仅项目名字  如:/cms

    1. String ContextPath = ((HttpServletRequest)req).getContextPath();  


    getRequestURL:得到绝对地址url如:http://localhost:8080/cms//sys/menu/gomain.htm

    1. StringBuffer RequestURL = ((HttpServletRequest)req).getRequestURL();  


    getRealPath:得到应用程序部署在服务器上的绝对路径。如:D:apache-tomcat-5.5.23webappscms

    1. String realPath = this.fc.getServletContext().getRealPath("/");  

                   System.out.println("ServletPath:"+path+" "+"ContextPath:"+ContextPath+" "+"requestURI:"+requestURI+" "+"RequestURL:"+RequestURL+" "+"realPath:"+realPath);

    结果如下:

    ServletPath:/sys/menu/gomain.htm
    ContextPath:/cms
    requestURI:/cms//sys/menu/gomain.htm
    RequestURL:http://localhost:8080/cms//sys/menu/gomain.htm
    realPath:D:apache-tomcat-5.5.23webappscms 

    速记:

        • getServletPath与getRequestURI相似,区别在于有无项目名称
        • getRequestURL是带有HTTP协议的URL,
        • getContextPath得到项目的名称
        • getRealPath得到在服务器上的绝对路径

    Servlet的Request中和用户请求路径相关的操作有多个,下面一一列举:
    1.getQueryString(),&之后GET方法的参数部分。
    2.getServletPath(),web.xml中定义的Servlet访问路径。
    3.getPathInfo(),Servlet访问路径之后,QueryString之前的中间部分。
    4.getContextPath(),Context路径前缀(这个应该是最熟悉的啦)。
    5.getRequestURI(),等于getContextPath() + getServletPath() + getPathInfo()。
    6.getRequestURL(),等于getScheme() + "://" + getServerName() + ":" + getServerPort() + getRequestURI()。
    7.getPathTranslated(),等于getServletContext().getRealPath("/") + getPathInfo()。

    注意:
    1.getServletContext().getRealPath("/") 后包含当前系统的文件夹分隔符(windows系统是"",linux系统是"/"),而getPathInfo()以"/"开头。

    Java代码  
    1. windows 下面  
    2. E:apache-tomcat-6.0.20webappsstandardweb  


    2.getPathInfo()与getPathTranslated()在servlet的url-pattern被设置为/*或/aa/*之类的pattern时才有值,其他时候都返回null。
    3.在servlet的url-pattern被设置为*.xx之类的pattern时,getServletPath()返回的是getRequestURI()去掉前面ContextPath的剩余部分。 
    本篇文章来源于 Goldtimes.net 原文链接:http://www.goldtimes.net/teach/view/1124.htm


     

    Java代码  
      1.  request对象中的方法是比较实用的,大家应该对它们都有所了解。下面我们通过一个TestServlet来讲解一下常用的方法。TestServlet源代码如下:   
      2. package coresun;  
      3. import java.io.IOException;  
      4. import java.io.PrintWriter;  
      5. import javax.servlet.ServletException;  
      6. import javax.servlet.http.HttpServlet;  
      7. import javax.servlet.http.HttpServletRequest;  
      8. import javax.servlet.http.HttpServletResponse;  
      9. public class TestServlet extends HttpServlet {  
      10.   public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {  
      11.    response.setContentType("text/html;charset=gb2312");  
      12.    PrintWriter out = response.getWriter();  
      13.    out.println("<html><head><title>使用request中的方法</title></head><body><h2>");  
      14.      
      15.    out.println("request.getRequestURL()= "+request.getRequestURL()+"<br>");  
      16.    out.println("request.getRequestURI()= "+request.getRequestURI()+"<br>");  
      17.    out.println("request.getContextPath()= "+request.getContextPath()+"<br>");  
      18.    out.println("request.getServletPath()= "+request.getServletPath()+"<br>");  
      19.    out.println("request.getQueryString()= "+request.getQueryString()+"<br>");  
      20.    out.println("request.getPathInfo()= "+request.getPathInfo()+"<br>");  
      21.    out.println("request.getPathTranslated()= "+request.getPathTranslated());  
      22.    out.println("<br>");  
      23.    out.println("request.getProtocol()= "+request.getProtocol()+"<br>");  
      24.    out.println("request.getMethod()= "+request.getMethod()+"<br>");  
      25.    out.println("request.getScheme()= "+request.getScheme()+"<br>");  
      26.    out.println("request.getRequestedSessionId()= "+request.getRequestedSessionId()+"<br>");  
      27.    out.println("request.isRequestedSessionIdFromCookie()= "+request.isRequestedSessionIdFromCookie()+"<br>");  
      28.    out.println("request.isRequestedSessionIdFromURL()= "+request.isRequestedSessionIdFromURL()+"<br>");  
      29.    out.println("request.isRequestedSessionIdValid()= "+request.isRequestedSessionIdValid()+"<br>");  
      30.      
      31.    out.println("</h2></body></html>");  
      32.  }   
      33. }  
      34.   
      35. 此Servlet在web.xml文件中的部署如下:(只有关键代码)  
      36. <servlet>  
      37.   <servlet-name>test</servlet-name>  
      38.   <servlet-class>coresun.TestServlet</servlet-class>  
      39. </servlet>  
      40. <servlet-mapping>  
      41.   <servlet-name>test</servlet-name>  
      42.   <url-pattern>*.do</url-pattern>  
      43. </servlet-mapping>  
      44. *.do表示只要是以.do结尾的地址,都可以访问此Servlet。然后在地址栏中输入如下网址:(假设服务器为本地,端口8080,Web根目录为FilterWeb)  
      45. http://localhost:8080/FilterWeb/update.do?userName=zhangsan&age=20  
      46. 页面返回的结果如下:  
      47. request.getRequestURL() = http://localhost:8080/FilterWeb/update.do  
      48. request.getRequestURI() = /FilterWeb/update.do  
      49. request.getContextPath() = /FilterWeb  
      50. request.getServletPath() = /update.do  
      51. request.getQueryString() = userName=zhangsan&age=20  
      52. request.getPathInfo() = null  
      53. request.getPathTranslated() = null  
      54. request.getProtocol() = HTTP/1.1  
      55. request.getMethod() = GET  
      56. request.getScheme() = http  
      57. request.getRequestedSessionId() = 0D5219B7FF11D47EBE95B2E6A31076B5  
      58. request.isRequestedSessionIdFromCookie() = true  
      59. request.isRequestedSessionIdFromURL() = false  
      60. request.isRequestedSessionIdValid() = true  
      61. request.getAuthType() = null  
      62. 这些方法的含义大家通过它的名字应该能够揣摩出来的。  
      63.   
      64. 下面更改servlet的url-pattern地址,如下:  
      65. <servlet>  
      66.   <servlet-name>test</servlet-name>  
      67.   <servlet-class>coresun.TestServlet</servlet-class>  
      68. </servlet>  
      69. <servlet-mapping>  
      70.   <servlet-name>test</servlet-name>  
      71.   <url-pattern>/faces/*</url-pattern>  
      72. </servlet-mapping>  
      73. 以上表示只要是以/faces/开头的地址,此Servlet都可以访问  
      74. 浏览器的地址栏中填入如下地址:  
      75. http://localhost:8080/FilterWeb/faces/update?userName=zhangsan&age=20  
      76. 页面返回的结果如下:  
      77. request.getRequestURL() = http://localhost:8080/FilterWeb/faces/update  
      78. request.getRequestURI() = /FilterWeb/faces/update  
      79. request.getContextPath() = /FilterWeb  
      80. request.getServletPath() = /faces  
      81. request.getQueryString() = userName=zhangsan&age=20  
      82. request.getPathInfo() = /update  
      83. request.getPathTranslated() = D:FilterProjectFilterWebupdate  
      84. request.getProtocol() = HTTP/1.1  
      85. request.getMethod() = GET  
      86. request.getScheme() = http  
      87. request.getRequestedSessionId() = 0D5219B7FF11D47EBE95B2E6A31076B5  
      88. request.isRequestedSessionIdFromCookie() = true  
      89. request.isRequestedSessionIdFromURL() = false  
      90. request.isRequestedSessionIdValid() = true  
      91. request.getAuthType() = null 
  • 相关阅读:
    RSS简易阅读器vb.net源代码
    [建议]有关图片地址的建议
    [音乐欣赏]wind flowers
    有个叫计算机的比我笨
    一个朋友画的建筑设计手绘图与其想到的
    [推荐]华建小翻--QQ里的一个不错的服务商
    爆强的广告
    [学习日记]重构简易RSSREADER的UML类图
    [音乐欣赏]红颜
    [音乐欣赏]花与琴的流星
  • 原文地址:https://www.cnblogs.com/yasepix/p/7442368.html
Copyright © 2011-2022 走看看