2011-03-15 71 views
43

我试图找到一种方法来重定向我的请求从过滤器登录页面,但我不知道如何从servlet重定向。我搜查,但我发现是sendRedirect()方法。我无法在过滤器中找到此方法。原因是什么?我该如何解决这个问题?如何在servlet过滤器中重定向?

回答

60

在过滤器的响应将是ServletResponse而非HttpServletResponse 。因此做演员到HttpServletResponse

HttpServletResponse httpResponse = (HttpServletResponse) response; 
httpResponse.sendRedirect("/login.jsp"); 

如果使用上下文路径:

httpResponse.sendRedirect(req.getContextPath() + "/login.jsp"); 

而且不要忘记在最后调用return;

+0

是否有来解决使用一个ViewResolver的过滤器的内侧的JSP路径的方法吗? – FelipeKunzler 2016-03-03 23:20:53

+0

只有在请求来自浏览器时才有效。这是外部重定向。 – 2017-07-22 18:56:12

1

尝试和你的ServletResponse response的检查是instanceof HttpServletResponse就像这样:

if (response instanceof HttpServletResponse) { 
    response.sendRedirect(....); 
} 
+0

没有必要作为过滤方法是'公共无效的doFilter(HttpServletRequest的请求, \t \t \t HttpServletResponse的响应,FilterChain链) \t \t \t抛出IOException异常,的ServletException {' – 2015-06-11 10:59:34

+0

@ToKra这不是方法的签名,并导致编译错误。 – 2018-03-07 00:34:26

0

您的响应对象被声明为ServletResponse。要使用sendRedirect()方法,您必须将其投射到HttpServletResponse。这是一个扩展的接口,添加了与HTTP协议相关的方法。

+0

过滤器方法已经有一个'公共无效的doFilter(HttpServletRequest的请求, \t \t \t HttpServletResponse的响应,FilterChain链) \t \t \t抛出IOException异常,ServletException异常{' – 2015-06-11 11:00:08

8

我试图找到一种方法,以我的请求,从过滤器重定向到登录页面

不要

你刚才援引

chain.doFilter(request, response); 

从过滤器和正常流量将继续。

我不知道如何从servlet的重定向

您可以使用

response.sendRedirect(url); 

从servlet的重定向

+8

如果要中止请求,因为用户不是它的但是很有用登录。 – BalusC 2011-03-15 12:05:35

+0

'response'属于'ServletResponse'类型,它应该被转换为'HttpServletResponse'。 实施例: 'HttpServletResponse的RESP =(HttpServletResponse的)响应;'' resp.sendRedirect( “TEMPLATENAME || pathName中”);' – Andrius 2017-05-15 06:33:31

5

如果你也想保持哈希并获得参数,你可以做这样的事情(在过滤器初始化填写redirectMap):

String uri = request.getRequestURI(); 

String[] uriParts = uri.split("[#?]"); 
String path = uriParts[0]; 
String rest = uri.substring(uriParts[0].length()); 

if(redirectMap.containsKey(path)) { 
    response.sendRedirect(redirectMap.get(path) + rest); 
} else { 
    chain.doFilter(request, response); 
}