从servlet过滤器重定向Web客户端(通过AJAX进行客户端 - 服务器连接)

Jon*_*der 1 authentication jquery servlets servlet-filters

我正在使用JAASRealm身份验证进行Web(在tomcat 7中).这是servlet的过滤器:

private String loginPage = "welcome.jsp";

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {

    if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        if (httpServletRequest.getUserPrincipal() == null) {
            // User is not logged in, redirect to login page.
            httpServletRequest.setAttribute("from", httpServletRequest.getRequestURI());
            httpServletResponse.sendRedirect(loginPage);
        }
        else {
            filterChain.doFilter(request, response);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在web.xml中声明了它

<filter>
    <filter-name>login-filter</filter-name>
    <filter-class>LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>login-filter</filter-name>
    <url-pattern>/sampleServlet</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

我的问题是当我没有经过身份验证并且我通过AJAX调用servlet时,这行过滤器不起作用

httpServletResponse.sendRedirect(loginPage);
Run Code Online (Sandbox Code Playgroud)

所以,我没有收到任何数据,我没有被重定向到登录页面.在这种情况下我该怎么办?

小智 7

我尝试使用一些优雅的解决方案,但没有一个工作.我发现这一个吃了primefaces论坛,并且还在一个纯JSF应用程序上工作.

我使用了Web过滤器:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    if(!identity.isLoggedIn()){
        if (isAjax(httpRequest)) {
            httpResponse.getWriter().print(xmlPartialRedirectToPage(httpRequest, "/login.xhtml"));
            httpResponse.flushBuffer();                
        }else{
            httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.xhtml");
        }
    }else{
        chain.doFilter(request, response);
    }
}

private String xmlPartialRedirectToPage(HttpServletRequest request, String page) {
    StringBuilder sb = new StringBuilder();
    sb.append("<?xml version='1.0' encoding='UTF-8'?>");
    sb.append("<partial-response><redirect url=\"").append(request.getContextPath()).append(request.getServletPath()).append(page).append("\"/></partial-response>");
    return sb.toString();
}

private boolean isAjax(HttpServletRequest request) {
    return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
}
Run Code Online (Sandbox Code Playgroud)