【问题标题】:How to redirect in a servlet filter?如何在 servlet 过滤器中重定向?
【发布时间】:2011-07-15 14:14:53
【问题描述】:

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

【问题讨论】:

    标签: java servlets redirect servlet-filters


    【解决方案1】:

    在过滤器中,响应是ServletResponse 而不是HttpServletResponse。因此对HttpServletResponse进行强制转换。

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

    如果使用上下文路径:

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

    最后别忘了给return;打电话。

    【讨论】:

    • 有没有办法在过滤器中使用 viewResolver 来解析 jsp 路径?
    • 只有当请求来自浏览器时才有效。这是外部重定向。
    • 如果使用 sendredirec,conversationContext 参数丢失,我如何使用 conversationContext 参数重定向?
    【解决方案2】:

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

    不要

    你只需调用

    chain.doFilter(request, response);
    

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

    我不知道如何从 servlet 重定向

    你可以使用

    response.sendRedirect(url);
    

    从 servlet 重定向

    【讨论】:

    • 如果您想中止请求,因为用户没有登录,这很有用。
    • response 的类型为 ServletResponse,应转换为 HttpServletResponse。示例:HttpServletResponse resp = (HttpServletResponse) response;resp.sendRedirect("templateName || pathName");
    • 你为什么告诉他不要从过滤器重定向到认证页面?请详细说明?
    • 这根本没有解决问题。
    【解决方案3】:

    如果你还想保留 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);
    }
    

    【讨论】:

    • 据我所知,浏览器不会在 URI 中的“#”之后向后端发送任何内容。那么,它应该如何工作呢?
    • 你是对的。但我记得我因为服务器中的哈希而出错。也许是因为我使用了 curl 或其他一些客户端。无论如何,100% 确定是很便宜的
    【解决方案4】:

    尝试检查您的ServletResponse response 是否为instanceof HttpServletResponse,如下所示:

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

    【讨论】:

    • 不需要过滤方法是public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    • @ToKra 这不是方法签名,会导致编译器错误。
    【解决方案5】:

    你为什么使用响应对象。它是一个 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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • filters 方法已经有 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
      猜你喜欢
      • 2014-08-13
      • 2011-01-12
      • 1970-01-01
      • 2015-05-02
      • 2010-12-04
      • 2013-09-02
      • 2014-09-18
      • 2016-05-20
      相关资源
      最近更新 更多