使用 URL 中的请求参数从页面重定向
Posted
技术标签:
【中文标题】使用 URL 中的请求参数从页面重定向【英文标题】:Redirecting from page with request parameters in the URL 【发布时间】:2013-12-16 01:15:45 【问题描述】:我有几个具有相同主模板的页面,其中包含带有注销按钮的标题。当我尝试从所有页面注销时,它可以正常工作,除了一个 - 在其 URL 中有请求参数的那个。
注销(会话失效)后,我将重定向回登录页面,如下所示:
return "/login.xhtml?faces-redirect=true";
当我在这样的 URL 上按注销时,
http://localhost:8080/WPA_MOVIEDATABASE/app/index.xhtml
然后重定向工作正常,我最终进入:
http://localhost:8080/WPA_MOVIEDATABASE/login.xhtml
但是,当我在带有这样的请求参数的 URL 上按注销时,
http://localhost:8080/WPA_MOVIEDATABASE/app/movie.xhtml?id=135
然后我被重定向回没有查询字符串的相同 URL:
http://localhost:8080/WPA_MOVIEDATABASE/app/movie.xhtml
我的重定向是错误的,还是这类 URL 的正常行为?
【问题讨论】:
您是否暗示http://localhost:8080/WPA_MOVIEDATABASE/app/movie.xhtml?id=135
在您通过在浏览器的地址栏中输入/复制粘贴该 URL 直接打开它时不会给出 404,而不是被重定向到它?
@BalusC 输入该页面工作正常,但是当我尝试从该页面注销时,我得到 404。
@BalusC 我编辑了问题,希望现在问题会更清楚。
确实好多了!重定向的结果 URL 是什么? (正如您在浏览器的地址栏中看到的那样)。两种情况都一样吗?
@BalusC 当它正确重定向时:http://localhost:8080/WPA_MOVIEDATABASE/login.xhtml
但对于 404 它只是剥离参数http://localhost:8080/WPA_MOVIEDATABASE/app/movie.xhtml
【参考方案1】:
在HTTP Server Monitor中我发现按下注销按钮后,首先有一个POST request
来
http://localhost:8080/WPA_MOVIEDATABASE/app/movie.xhtml
然后会跟随GET request
到
http://localhost:8080/WPA_MOVIEDATABASE/login.xhtml
.
那时我知道问题出在退出按钮..
我正在使用:
<h:form>
<h:commandLink value="Log out" action="#userBB.logout"/>
</h:form>
将代码更改为以下解决了问题:
<h:button value="LOG OUT" outcome="#userBB.logout()" />
一百万感谢 BalusC,他的提示让我发现了真正的问题!
【讨论】:
嗯,你的问题真的解决了吗? HTTP 流量看起来不错。您的“解决方案”只是在打开页面时立即执行注销方法。 @BalusC 这两个请求将在按下注销按钮后触发。现在按下按钮后,只有/WPA_MOVIEDATABASE/login.xhtml
的GET请求
您使用命令组件的初始代码是处理注销的正确代码。新代码就像您在视图中放置了一个普通的#userBB.logout()
,所以这绝对不是问题的原因,也不是解决问题的方法。
@skuntsel 很好地使用命令组件,然后是对WPA_MOVIEDATABASE/app/movie.xhtml
的 POST 请求,没有触发 500 的参数。但是我认为过滤页面后不会出现此问题对于未登录的用户.. 我实际上是在尝试验证 url preRender,如此处所述***.com/questions/15068446/… 但如果完全省略参数,它似乎不起作用
所以问题似乎是点击链接时丢失的参数。默认情况下,它应该向带有参数的 url 发出 POST 请求。您可以尝试使用 h:commandButton 而不是 h:commandLink(可能是一些配置/编码错误导致 commandLink js 搞砸了参数)?以上是关于使用 URL 中的请求参数从页面重定向的主要内容,如果未能解决你的问题,请参考以下文章
在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL