2010-09-15 81 views
1

我正计划一个URL重写器/编码器(也许重写器是一个更好的术语)。主要目的是从客户端隐藏确切的URL,因为如果他足够聪明,他可以弄清楚如何搞砸应用程序。URL编码的设计解决方案

URL编码器将是一个内射函数f(x) = y。解码器将是f的反函数,比如g,使得g(y) = x。这样我可以编码和解码我的网址。

的URL,如:

http://www.myapp.com/servlet/myapp/template/MyScreen.vm/action/MyAction 将被编码为类似:

http://www.myapp.com/uyatsd6787asv6dyuasgbdxuasydgb876876v

不要紧,什么是在编码的URL,只要它是不理解。

问题是我不知道如何操作浏览器显示的URL。我将JBoss用作servlet容器,并将Turbine servlet用作Web应用程序框架。 我需要一个接收编码的URL,解码它,将它传递给Turbine的模块,然后修改响应的URL以再次显示编码的URL。

以前曾试图解决这个问题: 我创建了一个Servlet过滤器,但由于滤波器接收一个ServletRequest是一个JBoss实现我无法访问URL。据我看来,似乎servlet过滤器不是一个好的选择来操纵URL。

回答

2

也许你可以做一些事情,比如写一个接受初始请求的servlet,解码URL,然后在内部转发到你现有的servlet。

例如,有一个servlet将接受:

www.myapp.com/enc/uyatsd6787asv6dyuasgbdxuasydgb876876v 

这个servlet可以被设置为处理与/ ENC /或其他一些标记开始的请求,指示URL需要去解码器servlet。使用类似

/servlet/myapp/template/MyScreen.vm/action/MyAction 

,然后在内部着这个网址上现有的servlet:这将解码的URL来

getServletContext().getRequestDispatcher(decoded_url).forward(req, res); 
+0

着如果我在内部解码后的URL会的浏览器中的URL仍然是原始的(编码的)? – Atticus 2010-09-15 13:39:51

+1

浏览器的URL应该保持不变,因为您的serlvet正在内部转发,而不是将重定向发回给用户。 – worpet 2010-09-15 16:01:02

+0

这似乎是一个很好的解决方案,但是你必须创建一个新的请求,因为在第一次请求之后,Turbine servlet将知道它的url模式,并且所有链接都将指向Turbine servlet。因此,您必须创建一个新的包装请求来重写getServletPath()方法,以返回新的让我们说过滤器servlet的url模式,它将请求转发到正确的目标。 – Atticus 2010-09-16 08:27:39