Servlet过滤器重定向,url没有改变
Posted
技术标签:
【中文标题】Servlet过滤器重定向,url没有改变【英文标题】:Servlet filter redirect, url not changed 【发布时间】:2013-09-02 19:33:55 【问题描述】:我的身份验证过滤器有问题。当过滤器重定向到登录页面时,所有以前的页面(主页面)都显示在登录页面中。 如果我手动进入登录页面,它工作正常。
这是我的过滤器:
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
String loginURL = req.getContextPath() + SiteMap.LOGIN_CONTROLLER;
boolean sessionCreated = session != null && !session.isNew();
if (sessionCreated)
chain.doFilter(request, response);
else
res.sendRedirect(loginURL);
我还注意到,当过滤器重定向到登录页面时,浏览器栏中的 URL 保持不变。主要问题是我从登录页面的其他页面获取内容。不知道哪里出了问题。
【问题讨论】:
如果您已经有权访问某个页面,那么getSession
将始终返回一个“非新会话”,这将导致您的if
语句的第一种情况。
我认为if
语句工作正常,因为它重定向正确,唯一的问题是 URL 没有更改为“/login”。
好的,在这个过滤器之前还有其他的 servlet 过滤器吗?响应中不应包含任何过滤器,否则 sendRedirect
将无法工作。
不,这是唯一的过滤器。我有:res.sendRedirect(loginURL);
你是什么意思写在回复上?我正在帮助这个link
@extra90 您如何从登录页面调用其他页面..??是使用request.forward还是redirect,您可以发布代码吗
【参考方案1】:
我遇到了完全相同的问题。 真正的问题是我和你都忘记添加以下行:
response.setContentType("text/html");
添加此行后,我的重定向工作正常。在此之前,我的 servlet 将留在 与空白页面相同的页面(因为没有任何内容写入响应输出流)。
希望这可以帮助遇到此问题的其他人。在测试这种可能性之前,我花了一些痛苦的时间。
【讨论】:
【参考方案2】:在浏览器中更改 URl 并不取决于过滤器,而是取决于您如何调用页面/servlet。您可以通过两种方式调用您的 servlet/jsp
RequestDispatcher : 将控制权转移给同一请求下的其他人(相同的URL)
Send Redirect : 发起一个新请求(New Url)
注意:过滤器所做的只是对请求进行验证
【讨论】:
【参考方案3】:您传递的 loginURL 的值是什么。发送相对路径。
【讨论】:
http://***.com/questions/2190733/java-servlet-filter-redirect-problem?rq=1 发现应该直接重定向到登录页面。 重定向到 /login.jsp 您可以使用 'fiddler' 监控您的请求并检查发生了什么 这不是答案,应该是评论。以上是关于Servlet过滤器重定向,url没有改变的主要内容,如果未能解决你的问题,请参考以下文章
从 Web 应用程序中的 servlet 过滤器重定向到上一页
从 servlet 过滤器重定向到 jsf 会返回未呈现为 html 的实际 jsf 代码
身份验证过滤器重定向回 Laravel 中的原始 POST 请求