2017-09-07 13 views
0

私の要件は、サーバーから毎回要求するのではなく、ブラウザレベルでいくつかのメタデータを再利用することです。私の休暇の終点は春のブートを使って書かれています。私は自分のレスポンスにCache-controlとmax-ageのヘッダを追加しました。私は最大年齢を10秒に設定しました。私の理解によれば、私たちはcssやjsファイルのような固定資産に対してこれを行うことができます。オブジェクト(レスポンス)で行うことは可能ですか?スプリングブートコントローラでキャッシュ制御を使用して応答をキャッシュすることはできますか?

@CrossOrigin 
@RequestMapping(value = "/retrieve/{name}", method = RequestMethod.GET) 
public ResponseEntity<Course> getCourses(@PathVariable String name) { 
    Course course = new Course(); 
    HttpHeaders headers = new HttpHeaders(); 
    try { 
     System.out.println("Call is here."); 
     course = courseService.getCourse(name); 
     headers.add("Cache-control", "private"); 
     headers.add("max-age", "10"); 
    } catch (Exception e) { 
     return new ResponseEntity<>(course, HttpStatus.BAD_REQUEST); 
    } 
    return new ResponseEntity<>(course, headers, HttpStatus.OK); 
} 

フロントエンドレベルでは依然としてリクエストはサーバーに送信され、新しい応答を返します。クライアント側のフレームワークとしてangualrを使用しています。レスポンスヘッダーに記載されているmax-ageの値を入力した後で、応答データをクリアします。

これは、関連する角度成分です。

app.component('searchCourseComponent', { 
bindings: { 
    name: '<', 
}, 
templateUrl: 'components/course-search/course-search.component.html', 
controller: function (localStorageService, CourseService) { 

    var vm = this; 
    vm.searchCourseByName = function (name) { 

     if (localStorageService.isSupported) { 
      console.log("localStrage is supporting in this browser"); 
      var course = CourseService.searchCourse(name).then(function (response) { 
       localStorageService.set("course", response.data); 
      }); 
     } 
     else { 
      console.log("Local storage is not supporting"); 
     } 
    }; 
} 

});

答えて

1

angularJsでローカルストレージサービスを使用できます。これにはindex.htmlに<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-local-storage/0.7.1/angular-local-storage.min.js"></script>が含まれています。 LocalStorageModuleを angular.module( 'appName'、['LocalStorageModule']) のようにapp.moduleに挿入し、コントローラではlocalStorageServiceをコントローラに注入してください。ローカルストレージに保存する値を設定します。例えばlocalStorageService.set("nameForStoringData",dataToBeSet);

+0

私は、私の角張ったアプリケーションで同じことをしました。しかし、それはブラウザに値を保存することができます。しかし、私は再び要求を送信すると、サーバーに行きます。キャッシュコピーを使用しません。それが問題だ。 –

+0

よりわかりやすいように角度コードを共有できます –

+0

私はコードを追加しました。 –

0

これにはAngualr $ httpキャッシュを使用できます。同じリクエストを再度送信しません。

$http({ 
      method: type, 
      url: url, 
      params: params, 
      cache: true, 
      responseType: responseType 
     }).then(function (response) { 
      // success response 
     }, function (response) { 
      // when something went wrong 
     }); 
0

さらに良い方法で、servlet filterを作成し、必要なときに応答するヘッダーを追加します。

まず、この構成クラス作成:

import org.springframework.boot.autoconfigure.AutoConfigureAfter; 
import org.springframework.cache.annotation.EnableCaching; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@EnableCaching 
public class CacheConfiguration { 

} 

と、このサーブレットフィルタ:

import java.io.IOException; 
import java.util.concurrent.TimeUnit; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletResponse; 

public class CachingHttpHeadersFilter implements Filter { 

    // We consider the last modified date is the start up time of the server 
    private final static long LAST_MODIFIED = System.currentTimeMillis(); 

    private long CACHE_TIME_TO_LIVE = TimeUnit.DAYS.toMillis(1461L); 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     CACHE_TIME_TO_LIVE = TimeUnit.DAYS.toMillis(365); //365 days 
    } 

    @Override 
    public void destroy() { 
     // Nothing to destroy 
    } 

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

     HttpServletResponse httpResponse = (HttpServletResponse) response; 

     httpResponse.setHeader("Cache-Control", "max-age=" + CACHE_TIME_TO_LIVE + ", public"); 
     httpResponse.setHeader("Pragma", "cache"); 

     // Setting Expires header, for proxy caching 
     httpResponse.setDateHeader("Expires", CACHE_TIME_TO_LIVE + System.currentTimeMillis()); 

     // Setting the Last-Modified header, for browser caching 
     httpResponse.setDateHeader("Last-Modified", LAST_MODIFIED); 

     chain.doFilter(request, response); 
    } 
} 

と、このフィルタを登録し、必要urlPatternsを追加します。

@Bean 
public FilterRegistrationBean cachingHttpHeadersFilter() throws IOException { 
    log.info("Registering Caching HTTP Headers Filter"); 

    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new CachingHttpHeadersFilter()); 
    registration.setDispatcherTypes(EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC)); 
    registration.setName("cachingHttpHeadersFilter"); 
    List<String> urlPatterns = new ArrayList<>(); 
    urlPatterns.add("/asset*"); 
    registration.setUrlPatterns(urlPatterns); 
    return registration; 
} 

登録フィルタを01にキャッシュ制御ヘッダを追加するとの関連付け 。

関連する問題