Перенаправление веб-клиента из сервлет-фильтра (соединение клиент-сервер через AJAX) - PullRequest
1 голос
/ 15 июля 2011

Я делаю веб с аутентификацией JAASRealm (в Tomcat 7).Это фильтр для сервлетов:

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);
        }
    }
}

И я объявил об этом в 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>

Моя проблема в том, что я не аутентифицирован, и я вызываю сервлет черезAJAX, эта строка фильтра не работает

httpServletResponse.sendRedirect(loginPage);

Итак, я не получил никаких данных и не перенаправлен на страницу входа.Что я могу сделать в этом случае?

Ответы [ 3 ]

7 голосов
/ 11 октября 2012

Я пытался использовать какое-то элегантное решение, но ни одно не помогло.Я нашел этот форум, где работал премьер-министр, и работал над чистым JSF-приложением.

Я использовал веб-фильтр:

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"));
}
2 голосов
/ 16 июля 2011

Вот как я отправляю перенаправления при фильтрации запросов AJAX ...

Код AJAX (jQuery)

$.ajax({
    type: 'post',
    url: '/signMeInServlet',
    data: {
        'name': name,
        'pass': passW,
        },
    dataType: 'json',
    success: processSignInReturnMethod,
    error: function (xhr, ajaxOptions, thrownError){
        if (thrownError.redirect.length) {
            window.location.replace(thrownError.redirect);
        } else {
            alert('There was an error processing your request, please try again');
        }
    }
});

Соответствующий код фильтра

// Rest of your Filter processing and logic here, once you know you want
// to redirect, use the below code, which works for both AJAX and regualar
// requests

HttpServletRequest hreq = (HttpServletRequest) request;
String redirectUrl = "/redirected.jsp";

if (hreq.getHeader("x-requested-with") != null && 
        hreq.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {

    // Set up your response here
    HttpServletResponse hres = (HttpServletResponse) response;
    hres.setContentType("text/json; charset=UTF-8");

    PrintWriter out = hres.getWriter();

    String json = "[{\"redirect\":\"" + redirectUrl + "\"}]";

    out.write(json);
    out.flush();
    out.close();

} else {

    ((HttpServletResponse)response).sendRedirect(redirectUrl);
}
0 голосов
/ 18 июля 2011

Я решил проблему, но не так, как хотел бы.Я использую в servler-filter эту строку

httpServletResponse.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

и в клиенте, используя запрос ajax, я фиксирую это состояние и затем делаю перенаправление

var fAjaxRedirect = function(response, textStatus) {
    /* 301 is the code SC_MOVED_PERMANENTLY */
    if (response.status == 301) {
        location.reload(); //or location.href = 'xxxx.jsp';
 }};

    $.ajaxSetup({
        scriptCharset: "utf-8", 
        contentType: "application/x-www-form-urlencoded; charset=UTF-8"
    });
    $.ajax({
      type: "POST",
      url: "myServlet",
      complete: fAjaxRedirect,
      success: function(val) { 
          //something here
      }
    });

Но делаю это с помощьютаким образом, клиент выполняет перенаправление страницы, и я хотел бы сделать это с сервера, независимо от клиента.

...