Javascript 在Grails应用程序中隐藏url

Javascript 在Grails应用程序中隐藏url,javascript,html,tomcat,grails,groovy,Javascript,Html,Tomcat,Grails,Groovy,是否有一种方法可以在Grails应用程序的地址栏中隐藏url。现在,web应用程序的用户可以从地址栏查看和更改请求参数值,并在显示页面中查看记录id 在Javascript或Groovy(URL映射)或Grails(.gsp)或HTML或Tomcat(server.xml或conf.xml或webapps中的web.xml内部应用程序)中是否有方法 前(http://www.example.com/hide/show /)我希望避免使用此url并始终看到(http://www.example.c

是否有一种方法可以在Grails应用程序的地址栏中隐藏url。现在,web应用程序的用户可以从地址栏查看和更改请求参数值,并在显示页面中查看记录id

在Javascript或Groovy(URL映射)或Grails(.gsp)或HTML或Tomcat(server.xml或conf.xml或webapps中的web.xml内部应用程序)中是否有方法

前(http://www.example.com/hide/show /)我希望避免使用此url并始终看到(http://www.example.com)或(http://www.example.com/hide/show)没有记录id


有什么方法可以防止这种情况发生吗?

没有,大多数浏览器不允许您隐藏地址字段,即使您使用
窗口打开新窗口。打开
。这是一个安全特性,因此一个站点不能轻易地伪装成另一个站点

应用程序应该进行安全检查,以便一个用户不能访问只有另一个用户才能看到的数据。不管怎么说,仅仅隐藏URL是不安全的,您可以使用内置在浏览器中的工具或现成的插件轻松绕过它。

这是grails实现的URL模式的一部分


隐藏URL的最佳方法是在您希望用户在其地址栏中看到的页面中使用。您可能可以使用Post/Redirect/Get的变体来处理此问题:

在我们的Grails站点上,我们有很多搜索字段。当用户单击分页链接时,所有这些搜索字段都会出现在URL中,从而创建了难看的URL:s,用户将这些地址添加到书签的风险更高,这可能意味着将来会出现问题

我们不仅将所有POST保存到会话中,还将GET with parameters保存到会话中,重定向到GET with parameters并将其再次附加到控制器中,从而解决了这个问题。这不仅创建了漂亮的URL:s,而且还创建了一个内存,这样,如果用户返回到以前的菜单,那么该菜单中选定的详细信息就会重新显示

对于您在“show/42”中隐藏id的特定请求,您可能也可以类似地处理,或者可能将Grails配置为使用“show?id=42”,但是我们没有这个要求,因此我没有进一步研究这个问题。祝你好运

忘了提一下:这不会增加太多的安全性,因为链接仍然包含ID,它只会清理地址栏

下面是一些应该可以工作的示例代码。如果调用show?id=42,它会将id=42保存在会话中,然后重定向到just show,并在进一步处理之前将id=42添加到params。它做你想做的事,但正如你所评论的那样,它可能并不总是一件明智的事情

def show = {
  if (request.method == 'GET' && !request.queryString) {
    if (session[controllerName]) {
      params.putAll(session[controllerName])
      // Add the typical code for show here...
     }
  } else {
    session[controllerName] = extractParams(params)
    redirect(action: 'show')
    return
  }

不太清楚您的意思,但我会更改UrlMappings.groovy中的默认根URL映射,使其看起来有点像这样:

    static mappings = {

    "/$controller/$action?/$id?"{
        constraints {
            // apply constraints here
        }
    }
    //Change it here!!!!
    "/"(controller: 'controllerName', action: 'actionName')
其中“actionName”和“controllerName”是您希望它们成为的内容,在您的示例中是“隐藏”、“显示”吗

要通过post而不是get传递所有参数,只需更改
方法

很明显,您仍然需要在控制器中执行其他海报所述的任何安全检查

谢谢


吉姆

我不喜欢在没有记录的情况下隐藏所有url ex()或()id@danny-伦敦:您可以使用框架集让用户看到站点URL,而不是框架的URL,但是这只会阻止URL出现在地址字段中,框架的URL仍然可以很容易地被发现和更改。@danny london:将一个框架集页面作为起始页,其中包含两个框架(这是最小值),并使用框架集中的
rows=“*,0”
隐藏第二个框架。在第一个框架中,您只需输入真实起始页的URL。请注意,这并不是一个好的设计,任何稍微复杂的用户仍然可以使用firebug之类的工具覆盖您试图隐藏的内容。这不应该被认为是一种安全的方式来阻止人们访问你应用程序中的其他URL。它还将打破简单的书签和深度链接,使开发和测试更加容易。没有发生任何变化,我在地址栏“show/42”中看到的地址与show?id=42版本应该使用的地址相同。您需要实现extractParams,以仅提取要保存的参数,或者更改为仅提取参数。把它当成是让你工作的一个例子,没有别的。