导航到pushState网址

时间:2015-07-09 17:26:25

标签: javascript java jquery jsp pushstate

我正在使用window.history.pushState为文章设置友情链接。例如,有不同类别的文章和链接就像这样myweb.com/category/java/variables

pushState的问题在于您无法为其添加书签,导航到pushState生成的网址时会找不到404,如上所示。

我在没有任何框架的情况下使用java作为服务器端,如果可能的话,我很想使用任何内容,在javascript中执行大多数操作并使用jQuery大量使用AJAX。

为了解决这个问题,我使用http://tuckey.org/urlrewrite/ url-rewrite库设置如下:

<urlrewrite>
<rule>
    <from>^/intro</from> 
    <to type="redirect">http://localhost:8084/myweb.com/w?uri=intro</to>  
</rule>


<rule>
    <from>^/category/(.*)/(.*)</from> 
    <to type="redirect">http://localhost:8084/myweb.com/w?uri=category:$1:$2</to> 
</rule>
</urlrewrite>

servlet w做了一件非常简单的事情,它只是重定向到索引:

request.getRequestDispatcher("/index.jsp").forward(request, response);

因此,当用户导航到myweb.com/category/java/variables时,该网址将被重写为http://localhost:8084/myweb.com/w?uri=category:java:variables,此时此时我们在index.jsp上,而不是在我们收藏的网页上。

要解决此问题,我在页面加载时运行脚本:

href = window.location.href;
href = href.replace(/:/g,'/');
if(contains(href, "w?uri=")){
    pageRequest = href.split("=")[1];
    urlMap(pageRequest);
}

这会获得感兴趣的页面并将其转发到urlMap,后者处理所有网址(我简化了下一个方法,但它更通用):

function urlMap(href){
    if(href==="category/java/variables"){
    //here we do an ajax request to the server to get the content of the article. 
    //and also update the navbar url 
    window.history.pushState(state, title, "category/java/variables");

这可以正常工作,但浏览器导航栏中有轻微的闪烁,在按下输入网址后category/java/variables转动w?uri=category:java:variables 100毫秒,然后转回category/java/variables .. 。有更好的方法吗?

还有一些其他问题可以让这更容易:

  1. 是否可以在javaScript而不是服务器中捕获category/java/variables,或者如何以更好的方式传递它?
  2. 是否可以在没有重定向循环的情况下制定规则?像这样:

    <rule>
    <from>^/intro</from>
    <to type="redirect">http://localhost:8084/myweb.com/intro</to>   
    </rule>
    

    <rule>
    <from>^/category/(.*)/(.*)</from> 
    <to type="redirect">http://localhost:8084/myweb.com/category/$1/$2</to>  
    </rule>
    

1 个答案:

答案 0 :(得分:0)

我可以按照自己的意愿成功映射网址,没有闪烁和奇怪的网址更改,所以为此我做了下一步:

1-将规则更改为:

<rule>
    <from>^/intro</from> 
    <to>w?page=intro</to>  
</rule>

<rule>
    <from>^/([a-z]+)/([a-z]+)$</from>
    <to>/w?category=$1&amp;article=$2</to>
</rule>

删除type="redirect",因为这会更改导航栏网址。就像现在一样,它将<to> url作为ghost请求传递。

2-在servlet中设置一个像category=java这样的cookie和另一个像post=variables这样的cookie。假设frommyweb.com/java/variables类似。然后转发索引。

3-网站加载的第一件事是告诉javaScript检查cookie并获取像/java/variables这样的url引用,然后pushState新的url,即使是没有必要也很难。