2017-05-11 15 views
0

私は、SpringセキュリティとフロントエンドreactJSでSpringブートを使用してアプリケーションを構築しています。私のコードは認証とうまく機能します。しかし今、私は彼が再びログインする必要がある場合に備えて、前のリクエストされたページにユーザーをリダイレクトする予定です。ログイン成功後のオリジナルページへのリダイレクトURL名の代わりに生データを返します

successhandlerからtargetUrl、つまり前のページを抽出できますが、UIでconsole.log(data)を実行すると、私はURL名の代わりに生のhtmlデータを取得します。なぜ、どうやってそのような生のHTMLコードを開くのかわからないのですが、代わりにsuccesshandlerからちょうどHTMLのURLの名前を送ることができますか?どんな入力も高く評価されます。

期待にconsole.log(データ) - https://localhost:8080/addpage.html

実際にconsole.log(データ) - addpage.html

の生のHTMLデータApplicationSecurity.java

public class ApplicationSecurity extends WebSecurityConfigurerAdapter { 
@Autowired 
private UserDetailsService userDetailsService; 

@Autowired 
private RESTAuthenticationEntryPoint authenticationEntryPoint; 
@Autowired 
private RESTAuthenticationFailureHandler authenticationFailureHandler; 
@Autowired 
private RESTAuthenticationSuccessHandler authenticationSuccessHandler; 
@Bean 
public BCryptPasswordEncoder bCryptPasswordEncoder() { 
    return new BCryptPasswordEncoder(); 
} 


@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
    .authorizeRequests() 
     .antMatchers("/CSS/*").permitAll() 
     .antMatchers("/JS/*").permitAll() 
     .antMatchers("/login.html").permitAll() 
     .antMatchers("/*").authenticated() 
     .and() 
     .sessionManagement().maximumSessions(5).and().invalidSessionUrl("/login.html"); 
    http.csrf().disable(); 
    http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint); 
    http.formLogin().successHandler(authenticationSuccessHandler); 
    http.formLogin().failureHandler(authenticationFailureHandler); 
    http.logout().logoutSuccessUrl("/login.html"); 

} 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{ 
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); 

} 
} 

RESTAuthenticationSuccessHandler.java

@Component 
public class RESTAuthenticationSuccessHandler extends 
SavedRequestAwareAuthenticationSuccessHandler { 

    private RequestCache requestCache = new HttpSessionRequestCache(); 

@Override 
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws IOException, ServletException { 

    SavedRequest savedRequest = requestCache.getRequest(request, response); 

    System.out.println(savedRequest); 

    if (savedRequest == null) { 
     HttpSession session = request.getSession(); 
     if (session != null) { 
      String redirectUrl = (String) session.getAttribute("url_prior_login"); 
      if (redirectUrl != null) { 
       session.removeAttribute("url_prior_login"); 
       getRedirectStrategy().sendRedirect(request, response, redirectUrl); 
      } else { 
       super.onAuthenticationSuccess(request, response, authentication); 
      } 
     } else { 
      super.onAuthenticationSuccess(request, response, authentication); 
     } 

     return; 
    } 

    String targetUrlParameter = getTargetUrlParameter(); 
    System.out.println(targetUrlParameter); 
    if (isAlwaysUseDefaultTargetUrl() 
      || (targetUrlParameter != null && StringUtils.hasText(request.getParameter(targetUrlParameter)))) { 
     requestCache.removeRequest(request, response); 
     super.onAuthenticationSuccess(request, response, authentication); 

     return; 
    } 

    clearAuthenticationAttributes(request); 

    // Use the DefaultSavedRequest URL 
    String targetUrl = savedRequest.getRedirectUrl(); 
    System.out.println(targetUrl); 
    logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl); 
    getRedirectStrategy().sendRedirect(request, response, targetUrl); 


    } 


} 

UIコード:

$.ajax({ 
       type: "POST", 
       url: "/login", 
       data: data, 
       success: function(data){ 
        console.log(data); 
       }.bind(this), 
       error:function(data) 
       { 
        alert(data.responseJSON.message); 
       } 
      }); 

console.log(data) - htmlファイルとして開くことができないtargetURLの生のHTMLコードを返します。私は、ファイルを開くためにwindow.location.hrefを使うことができるように、successhandlerからtargetURLによって返されたhtmlファイル名が必要です

答えて

1

あなたは応答にredirect urlを返すことができます。

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
    Authentication authentication) throws IOException, ServletException { 
// ... get target url 
String targetUrl = ""; 
try { 
      response.setStatus(HttpServletResponse.OK); 
      PrintWriter writer = response.getWriter(); 
      writer.write(targetUrl); 
      writer.flush(); 
      writer.close(); 
     } catch (IOException e) { 
      // ignore 
      logger.error(e.getMessage(), e); 
     } 

}

0

mimeタイプの問題のような音です。クロムを使用してWebトラフィックを検査点検し、あなたのヘッダが正しく設定されていることを確認します

レスポンスヘッダを:

のContent-Type:text/htmlの。文字セット= UTF-8

リクエストヘッダ:

受け入れ:text/htmlの

など

関連する問題