我想通过删除文件扩展名和缩短 URL 来简化访问 Glassfish V3 应用程序的 URL。
我已经将我的应用程序设置为默认应用程序,因此无需在 URL 中包含上下文根。
我想要:
* 删除文件扩展名
* 缩短文件夹结构深处文件的 URL
我想使用模式匹配而不是基于每个文件来执行此操作(网站目前很小,但会经常更改和增长)。
我想要做的一些例子:
* foo.com/bar.html -> foo.com/bar
* foo.com/folder1/folder2/bar2.html -> foo.com/bar2
任何帮助都将不胜感激。谢谢。
干杯,
斤
答案1
取自http://www.sun.com/bigadmin/sundocs/articles/urlrdn.jsp看起来这就是你要找的东西。
域内的 URL 重定向
您可以使用 redirect_ 属性的 url-prefix 元素将 URL 转发到同一域中的另一个 URL。
以下步骤说明如何允许网站访问者输入http://www.mywebsite.com/myproduct1并重定向或转发至http://www.mywebsite.com/mywarname/products/myproduct1.jsp。
- 登录到 Sun Java System Application Server 或 GlassFish 的管理控制台。
- 在管理控制台中,展开“配置”节点。
展开服务器配置节点。
如果您正在运行开发人员域(没有集群功能的域),请忽略此步骤。
展开 HTTP 服务。
- 展开虚拟服务器。
- 单击服务器。
- 在编辑虚拟服务器页面上,单击添加属性按钮。
- 在名称列中,键入
redirect_1
。 如果您使用的是应用程序服务器 9.0,请
from=/<context-root>/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
在值列中键入。笔记- 您在此处提供的值
<context-root>
需要与 web.xml 或 application.xml 文件中指定的上下文根的值相匹配。如果您使用的是应用程序服务器 9.1,请
from=/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
在值列中键入。
答案2
在这种情况下,您应该编写一个 javax.servlet.Filter 实现,它可以识别缩短的 URL 并将请求转发到真实目标。
/**
*
* @author vrg
*/
@WebFilter(filterName = "SimplifiedUrlRequestDispatcher", urlPatterns = {"/*"})
public class ShortenedUrlRequestDispatcher implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//reading configuration from filterConfig
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String shortURI = httpRequest.getRequestURI();
String realURI = getRealURI(shortURI);
if (realURI == null) {
//in this case the filter should be transparent
chain.doFilter(request, response);
} else {
//forwarding request to the real URI:
RequestDispatcher rd = request.getRequestDispatcher(realURI);
rd.forward(request, response);
}
}
/**
* Calculates the real URI from the given URI if this is a shortened one,
* otherwise returns null.
* @param shortURI
* @return
*/
private String getRealURI(String shortURI) {
//TODO implement your own logic using regexp, or anything you like
return null;
}
@Override
public void destroy() {
}
}
答案3
很好!很好的入门书,但还有一件事——RequestDispatcher rd = request.getRequestDispatcher(realURI);
使用 servlet 路径操作,获取带有应用程序名称的 URI,会出现错误。所以——req.getServletPath()
在没有上下文的情况下给出正确的路径,调度程序就可以正常工作。