2011-07-15 25 views
0

私はJAASRealm認証(tomcat 7で)を使ってWebをやっています。これは、サーブレットフィルタからWebクライアントをリダイレクトする(AJAX経由のクライアント/サーバ接続)

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

したがって、データは受信されず、ログ記録ページにリダイレクトされません。この場合、私は何ができますか?ここで

+0

あなたは私たちあなたのAJAXリクエスト示しすることはできますか?私はあなたの問題が何であるかを知っていると思うが、そのコードが見えるまではわからない。私はそれがリクエストのコンテンツタイプと関係していると思います。 – oberger

答えて

2

は、私は問題を解決しますが

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

ありがとう! processSignInReturnMethod関数のコードはどこですか?アヤックスで –

0

...私は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 
     } 
    }); 

しかし、その方法を使用して、それをやってを行うAJAX要求を使用して、servler-フィルタでこのライン

httpServletResponse.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 

とクライアントでの使用、ページのリダイレクトを行うクライアントであり、クライアントに依存するのではなく、サーバーからやりたいと思います。

+0

上記の応答でクライアントにリロード/リダイレクトを依頼しています。 – oberger

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")); 
} 
+0

JSFを使用する場合、isAjaxメソッドを次のように変更する必要があります。if( "partial/ajax" .equals(request.getHeader( "Faces-Request"))){ \t \t \t return真; \t \t \t \t戻り値 "XMLHttpRequest" .equals(request.getHeader( "X-Requested-With")); – Ben

関連する問題