如何在servlet过滤器中重定向?

时间:2011-03-15 07:44:36

标签: java servlets redirect servlet-filters

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

6 个答案:

答案 0 :(得分:70)

在过滤器中,响应属于ServletResponse而非HttpServletResponse。因此,转换为HttpServletResponse

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

如果使用上下文路径:

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

也不要忘记最后致电return;

答案 1 :(得分:8)

  

我正在尝试找到一种方法将我的请求从过滤器重定向到登录页面

不要

您只需调用

chain.doFilter(request, response);

来自过滤器,正常流程将继续。

  

我不知道如何从servlet重定向

您可以使用

response.sendRedirect(url);

从servlet重定向

答案 2 :(得分:6)

如果你还想保留hash和get参数,你可以这样做(在filter init处填充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);
}

答案 3 :(得分:1)

尝试检查ServletResponse responseinstanceof HttpServletResponse是这样的:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你为什么使用响应对象。它是一个 ServletResponse 对象,它不提供 sendRedirect() 方法。而是使用 ServletRequest 的请求对象来转发请求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        request.getRequestDispatcher("login.html").forward(request,response);
        return;
        
    }

javadoc