返回博主主页

spring 服务端如何设置 Last-Modified If-Modified-Since

在Spring框架中,设置HTTP响应头Last-Modified和处理请求头If-Modified-Since是优化缓存和减少不必要数据传输的常用策略。Spring MVC提供了灵活的机制来实现这一点。

设置Last-Modified响应头

要在Spring MVC中设置Last-Modified响应头,你可以在你的Controller方法中返回一个ResponseEntity对象,或者在方法上添加@LastModifiedDate注解(如果你使用的是Spring Data JPA等库),或者在你的方法体内部直接操作HttpServletResponse

示例1:使用ResponseEntity

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
public class MyController {

    @GetMapping("/resource")
    public ResponseEntity<String> getResource() {
        // 假设这是你的资源最后修改时间
        Date lastModified = new Date(); // 这里应该是从数据源获取的

        // 创建ResponseEntity并设置状态码、body和headers
        return ResponseEntity.ok()
                .lastModified(lastModified) // 设置Last-Modified
                .body("Resource content");
    }
}

示例2:使用HttpServletResponse

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RestController
public class MyController {

    @GetMapping("/resource")
    public void getResource(HttpServletResponse response) throws IOException {
        // 假设这是你的资源最后修改时间
        Date lastModified = new Date(); // 这里应该是从数据源获取的

        // 设置Last-Modified响应头
        response.setDateHeader("Last-Modified", lastModified.getTime());

        // 设置响应体内容(这里示例为文本)
        response.getWriter().write("Resource content");
    }
}

处理If-Modified-Since请求头

当客户端发送一个包含If-Modified-Since请求头的请求时,你需要在你的Controller中读取这个请求头,并比较它与资源的最后修改时间。如果资源自该时间以来未被修改,则返回一个304 Not Modified状态码。

示例

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Date;

@RestController
public class MyController {

    @GetMapping("/resource")
    public void getResource(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 假设这是你的资源最后修改时间
        Date lastModified = new Date(System.currentTimeMillis() - 10000); // 示例:10秒前

        // 获取If-Modified-Since请求头
        long ifModifiedSince = request.getDateHeader("If-Modified-Since");

        // 将If-Modified-Since请求头转换为Date对象
        Date clientLastModified = new Date(ifModifiedSince);

        // 比较两个时间
        if (lastModified.before(clientLastModified) || lastModified.equals(clientLastModified)) {
            // 资源自If-Modified-Since指定的时间以来未修改,返回304 Not Modified
            response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        } else {
            // 资源已修改,正常返回资源内容
            response.setDateHeader("Last-Modified", lastModified.getTime());
            response.getWriter().write("Resource content (modified)");
        }
    }
}

注意,这个示例中我简化了资源内容的获取和返回,实际使用中你可能需要从数据库中查询资源的最后修改时间,并返回相应的资源内容。

posted @ 2024-07-18 16:01  懒惰的星期六  阅读(1)  评论(0编辑  收藏  举报

Welcome to here

主页