【问题标题】:Servlet filter confusion, response redirect isn't happeningServlet 过滤器混淆,响应重定向没有发生
【发布时间】:2014-09-18 17:42:12
【问题描述】:

我有一个身份验证过滤器,它应该阻止用户浏览您需要登录的任何页面:

public class AuthenticationFilter implements Filter {

    private FilterConfig fc;
    private final String indexURL = "/index.xhtml";
    private final String registerUrl = "/register/register.xhtml";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.fc = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession();
        UserBean user = (UserBean) session.getAttribute("userBean");
        String requestUrl = req.getRequestURI();
        System.out.println("user is " + user);
        if (user != null) {
            System.out.println("username is " + user.getUsername());
            if (user.getUsername() == null || user.getUsername().equalsIgnoreCase("")) {
                System.out.println("request url is " + requestUrl);
                if (!requestUrl.equalsIgnoreCase(indexURL) && 
                        !requestUrl.equalsIgnoreCase(registerUrl) && !requestUrl.startsWith("/javax.faces.resource")) {
                    //Redirect back to indexpage
                    System.out.println("request url is not for index/register/resource, it is: " + requestUrl);
                    resp.sendRedirect(indexURL);
                };
            }
        } else {
            resp.sendRedirect(indexURL);
        }
        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {

    }

}

它实际上是在打印我所期望的,但它没有进行重定向,这是我的日志信息的(最后一部分):

Info:   request url is /javax.faces.resource/jquery/jquery.js.xhtml
Info:   user is be.kdg.repaircafe.beans.UserBean@350af1bb
Info:   username is null
Info:   request url is /javax.faces.resource/repaircafe_logo.png.xhtml
Info:   user is be.kdg.repaircafe.beans.UserBean@350af1bb
Info:   username is null
Info:   request url is /welcome.xhtml
Info:   request url is not for index/register/resource, it is: /welcome.xhtml
Severe:   Error Rendering View[/welcome.xhtml] --> I just told you to redirect! Why are you doing this to me??

编辑:经过一些调试,我发现调试器即使在重定向响应之后也命中了chain.doFilter(),为什么他仍然转发我欢迎而不是索引?

【问题讨论】:

  • 调试指针是否命中resp.sendRedirect(indexURL);
  • 如果requestUrlindexURL 相同,我认为它不会进入内部。
  • 如果你重定向,你不应该调用chain.doFilter(req, resp);之后。
  • 当页面是welcome.xhtml时,过滤器似乎被循环命中。
  • 是的,调试指针命中了重定向

标签: java redirect httpresponse servlet-filters


【解决方案1】:

我通过查看另一个 stackoverflow 答案解决了这个问题,如果我只是在重定向后点击返回,它将阻止过滤器继续前进。

Stop further processing when redirecting in a filter

【讨论】:

  • 如果你读过 cmets,你会更早发现:如果你重定向,你不应该调用 chain.doFilter(req, resp);紧接着
  • 我确实阅读了 cmets,但您没有提供我为什么不能这样做的依据。这似乎更像是一种预感而不是事实。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多