在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)");
}
}
}
注意,这个示例中我简化了资源内容的获取和返回,实际使用中你可能需要从数据库中查询资源的最后修改时间,并返回相应的资源内容。
标签:Last,spring,Since,Modified,lastModified,Date,import From: https://www.cnblogs.com/sunupo/p/18309759