【问题标题】:How to hide the .jsp extension in my web server urls如何在我的 Web 服务器 url 中隐藏 .jsp 扩展名
【发布时间】:2009-01-20 06:43:59
【问题描述】:

我有一个 JSP Web 服务器,所有页面都以 .jsp 扩展名结尾。

如何在不使用非 Java 技巧(例如 apache 重写)的情况下将其隐藏在我的 Web 服务器 url 中?

例如: 而不是输入http://www.sample.com/search.jsp?xxx 用户只需键入 http://www.sample.com/search?xxx

【问题讨论】:

    标签: java jsp


    【解决方案1】:

    您可以像这样创建一个 servlet 映射:

    <servlet-mapping>
       <servlet-name>MappingServlet</servlet-name>
       <url-pattern>path/*</url-pattern>
     </servlet-mapping>
    

    必须根据您的需要编辑 url 模式。您当然需要创建 servlet 以便将 url 映射到实际的 jsp。大多数 MVC 框架都使用这种技术。

    【讨论】:

    • 用 jsp-file 标签替换上面的 URL-pattern 标签,并在它的正文中包含您想要的实际好的 URL...不需要 apache URL 重写 - servlet 规范完全支持你想要什么 。正确的方法就是我刚才描述的...
    • 您好!我对你的方法很感兴趣,你能详细说明一下吗。谢谢
    • Spring MVC 例如使用这种技术。您可以查看源代码以获取详细信息。 Spring MVC 实现了一个完整的框架,所以这将是一个复杂的解决方案。 MappingServlet 以最简单的形式检查请求路径,提取视图名称并从合适的存储库中加载它。
    • @kgiannakakis - 那么 MappingServlet 会是什么样子呢?我试过这样的东西,但它不完整......stackoverflow.com/questions/40006723/…
    【解决方案2】:

    在您的 web.xml 文件中使用此 servlet 映射。

    <servlet>   
      <servlet-name>search</servlet-name>
      <jsp-file>/search.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
      <servlet-name>search</servlet-name>
      <url-pattern>/search</url-pattern>
    </servlet-mapping>
    

    【讨论】:

      【解决方案3】:

      UrlRewrite 是一个很好的灵活的基于 Java 的独立于框架的解决方案。

      这比 web.xml 中的 Servlet 映射要好,因为它的功能太有限,而且比基于 Apache 的解决方案要好,因为它是 Web 应用程序的一部分,因此您不需要将 Apache 放入应用程序服务器的前端。

      【讨论】:

        【解决方案4】:

        将 .jsp 映射为 servlet,但使用 标签而不是 标签。

        <servlet>
          <servlet-name>myjsp</servlet-name>
          <jsp-file>/myjsp.jsp</jsp-file>
        </servlet>
        

        【讨论】:

          【解决方案5】:

          如果您选择 Apache 重写规则,而不是应用程序服务器映射/过滤器(如我所做的那样),您可能还想做更多的事情,而不仅仅是查找 "^([0-9a-zA-Z]+) $"

          如果 apache 面向非 jsp 资源提供服务,您可能需要确认该 url 不是确实存在的目录或文件。并确认 JSP 存在,并进行传递而不是重定向,并附加任何可能的查询字符串。

          RewriteCond %{REQUEST_URI} !^/.*\.(jsp)$
          RewriteCond %{REQUEST_FILENAME} !-f
          RewriteCond %{REQUEST_FILENAME} !-d
          RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.jsp -f
          RewriteRule ^(.+)$ /$1.jsp [PT,QSA,L]
          

          为了确保用户只能通过 /search 而不是 /search.jsp 看到此内容,那么您还想重写反向代码

          RewriteRule ^(.+)\.jsp$ $1 [R=301,QSA,L]
          RewriteRule ^(.+)index$ $1 [R=301,QSA,L]
          

          这对于 SEO 来说是一个好主意,这样搜索引擎就不会因为在多个 url 上复制内容而对您不利。

          【讨论】:

            【解决方案6】:

            我有一个位于 data/feed.jsp 的 jsp 将此添加到我的 web.xml 意味着我可以在数据/提要中访问它...

            <servlet>   
              <servlet-name>feed</servlet-name>
              <jsp-file>/data/feed.jsp</jsp-file>
            </servlet>
            <servlet-mapping>
              <servlet-name>feed</servlet-name>
              <url-pattern>/data/feed</url-pattern>
            </servlet-mapping>
            

            【讨论】:

              【解决方案7】:
              RewriteEngine On
              
              RewriteRule ^([0-9a-zA-Z]+)$  $1.jsp
              

              在您的 .htaccess 中应该将所有 URL 重写为 .jsp。因此,正如您所描述的,search.jsp 将只是搜索。

              【讨论】:

              • 我不是正则表达式专家,但这不是只有在 jsp 文件的名称中包含字母或数字时才有效吗?例如,advanced-search.jsp 将不起作用。
              • @styfle...是的...在 ] 之前添加 \- 以支持连字符
              【解决方案8】:

              我不是 JSP 专家,但我认为您可以在 web.xml 中定义 URL 映射来为您的 servlet 和 jsps 提供别名。

              【讨论】:

                猜你喜欢
                • 2019-01-02
                • 1970-01-01
                • 2012-03-06
                • 2012-11-25
                • 2014-03-23
                • 1970-01-01
                • 2011-09-08
                • 1970-01-01
                • 2021-02-08
                相关资源
                最近更新 更多