Tomcat servlet,将所有URL重定向到单个网页

时间:2015-11-12 18:04:58

标签: javascript tomcat servlets web-deployment

我在tomcat中部署了一个servlet“csvreports”。 csvreports中的“index.html”从data/文件夹中选择csv文件,并显示为html表格。

网址格式为

localhost:8080/csvreports/?csv=test.csv

我正在解析index.html中的网址以获取csv文件名,并在代码中从/data/test.csv读取。

现在,网址已更改为localhost:8080/csvreports/folder1/?csv=test.csv, localhost:8080/csvreports/folder2/?csv=test.csv等。

folder1和folder2会动态生成,并假设文件夹已存在于tomcat/webapps/csvreports/

我需要为所有网址执行相同的index.html。我的想法是解析url以获取路径并最终使用路径来读取csv。

我想如何将localhost:8080/csvreports/*/?csv=test.csv重定向到单个网页。

如何实现这一点的任何其他想法将不胜感激。

1 个答案:

答案 0 :(得分:3)

将所有网址映射到同一网页

使用index.jsp代替index.html。您可以直接重命名文件,而无需更改任何内容。

然后在您的web.xml中,您可以指定所有以/csvreports开头的网址都应该路由到您的index.jsp

<servlet>
    <servlet-name>index</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>index</servlet-name>
    <url-pattern>/csvreports/*</url-pattern>
</servlet-mapping>

用于提取路径的正则表达式

index.jsp中,您可以在网址上使用带有两个捕获组的正则表达式。

var regex = /.*csvreports\/(.*)\?csv=(.*)/g;

第一个.*将告诉它匹配csvreports之前的任何字符。这样,无论您的主机名是什么,它都会匹配。例如,目前它是localhost:8080,但如果将其部署到测试或生产服务器,或者如果其他人从另一台计算机上攻击您的Web服务器,则会有所不同。

接下来,它匹配csvreports,这意味着在主机名之后,URL必须包含确切的字符串csvreports

接下来,它会查找单个斜杠/

然后,第一个捕获组(.*)出现。括号表示它是匹配组。 .*告诉它匹配任何字符。因此,它会匹配您网址中第一个/与问号?之间的所有字符。

然后,它会查找?csv=

最后,第二个捕获组(.*)用于捕获=之后的任何字符。

现在您已将所有正则表达式设置为与您的网址匹配,您可以在正则表达式上调用.exec()方法,并将其传递给您的网址。

var match = regex.exec(url);

最后,您可以从调用match返回的.exec()变量中提取捕获的组。

var directories = match[1];
var csvfilename = match[2];

您可以通过连接这两个匹配的组来获取您的路径。您可能还需要检查以确保/末尾有directories。例如,正则表达式应该匹配localhost:8080/csvreports/folder1?csv=file.csv,但在这种情况下directories='folder1'csvfilename=file.csv,所以当你连接它们时,你会得到'folder1file.csv',当你想要的是{ {1}}。因此,在连接它们之前,请检查'folder1/file.csv'中的最后一个字符是否为directories,如果不是,请在//之间添加directories

实施例

这是一个显示此正则表达式的简单示例。

csvfilename
function getPathFromUrl() {
  var url = document.getElementById('url').value;

  var regex = /.*csvreports\/(.*)\?csv=(.*)/g;
  var match = regex.exec(url);
  
  var span = document.getElementById('path');
  
  
  var directories = match[1];
  var csvfilename = match[2];
  
  var path = directories;
  
  if (path[path.length-1] !== '/') {
    path += '/'
  }
  
  path += csvfilename;    
  
  span.innerHTML = path;
}