2017-09-07 16 views
0

내 요구 사항은 서버에서 매번 요청하지 않고 브라우저 수준에서 일부 메타 데이터를 다시 사용하는 것입니다. 내 휴식 끝은 스프링 부트를 사용하여 작성되었으며 캐시 제어 및 최대 연령 헤더를 내 응답에 추가했습니다. 최대 나이를 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을 사용하고 있습니다. 응답 헤더에서 언급 한 최대 허용 값을 완료 한 후 응답 데이터를 지우고 싶습니다.

이것은 관련된 각도 성분입니다.

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 { 

} 

이 서블릿 필터 :

먼저이 구성 클래스 만들 urlPatterns을

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

을하고이 필터를 등록하고 추가 요소가 필요합니다

@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에 추가합니다.와의 연결은 /asset* 입니다.