SpringMVC全面HTTP请求要素:参数获取、文件上传与Session管理
获取URL参数
1. 路径参数获取
使用@PathVariable
注解获取RESTful风格的路径参数:
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Long userId) {
// 使用userId查询用户信息
return "userDetail";
}
路径参数处理注意事项:
- 参数类型自动转换(String到Long)
- 可选参数需要设置required=false
- 正则表达式约束:
@GetMapping("/article/{year:\\d{4}}")
2. 查询参数获取
基本查询参数获取方式:
@GetMapping("/search")
public String search(@RequestParam String keyword) {
// 处理搜索逻辑
return "searchResults";
}
复杂参数处理:
// 处理多个同名参数
@RequestParam List<String> tags
// 设置默认值
@RequestParam(defaultValue = "1") Integer page
// 映射到对象
public class QueryParams {
private String keyword;
private Integer pageSize;
// getters/setters
}
@GetMapping("/advSearch")
public String advancedSearch(QueryParams params) {
// 自动绑定参数到对象
}
Cookie操作
1. 读取Cookie
通过@CookieValue
注解获取:
@GetMapping("/dashboard")
public String dashboard(@CookieValue("SESSIONID") String sessionId) {
// 使用sessionId进行验证
return "dashboard";
}
通过Servlet API获取:
@GetMapping("/profile")
public String profile(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
// 遍历cookies处理
}
2. 设置Cookie
使用HttpServletResponse添加Cookie:
@PostMapping("/login")
public String login(HttpServletResponse response) {
Cookie authCookie = new Cookie("AUTH_TOKEN", generateToken());
authCookie.setMaxAge(3600);
authCookie.setHttpOnly(true);
authCookie.setPath("/");
response.addCookie(authCookie);
return "redirect:/dashboard";
}
安全设置建议:
- 设置Secure标志(HTTPS环境)
- SameSite属性防止CSRF攻击
- 合理设置Domain和Path范围
Session管理
1. Session基本操作
通过@SessionAttribute
注解:
@PostMapping("/cart/add")
public String addToCart(@SessionAttribute("cart") ShoppingCart cart) {
// 操作购物车对象
return "cartView";
}
通过Servlet API操作:
@GetMapping("/checkout")
public String checkout(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("order", new Order());
// 设置session超时时间(秒)
session.setMaxInactiveInterval(1800);
return "checkoutPage";
}
2. Session生命周期管理
Spring配置:
# application.properties
server.servlet.session.timeout=1800
编程式管理:
// 使session失效
request.getSession().invalidate();
// 强制创建新session
request.getSession(true);
分布式Session方案:
- Redis存储Session(Spring Session实现)
- 数据库存储Session
- JWT令牌替代传统Session
Header处理
1. 获取请求头
使用@RequestHeader
注解:
@GetMapping("/mobile")
public String mobileVersion(@RequestHeader("User-Agent") String userAgent) {
// 判断移动端类型
return detectMobileView(userAgent);
}
获取多值头信息:
@RequestHeader("Accept-Language") List<Locale> locales
2. 设置响应头
通过HttpServletResponse设置:
@GetMapping("/download")
public void downloadFile(HttpServletResponse response) {
response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
// 设置其他下载头信息
}
使用ResponseEntity:
@GetMapping("/customHeader")
public ResponseEntity<String> customHeader() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Custom-Header", "value123");
return new ResponseEntity<>("Response Body", headers, HttpStatus.OK);
}
缓存控制头设置:
@GetMapping("/static/resource")
public ResponseEntity<Resource> getResource() {
return ResponseEntity.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.body(resource);
}
文件上传处理
1. 配置文件上传
Spring Boot配置:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=20MB
手动配置MultipartResolver:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSize(52428800); // 50MB
resolver.setDefaultEncoding("UTF-8");
return resolver;
}
2. 文件上传处理
基本文件上传处理:
@PostMapping("/upload")
public String handleUpload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
// 保存文件到指定位置
file.transferTo(new File("/uploads/" + fileName));
return "uploadSuccess";
}
return "uploadFailure";
}
批量文件上传:
@PostMapping("/multiUpload")
public String multiUpload(@RequestParam("files") MultipartFile[] files) {
Arrays.stream(files).forEach(file -> {
// 处理每个文件
});
return "multiUploadResult";
}
大文件分片上传处理方案:
- 前端分片上传
- 后端分片合并
- 断点续传实现
3. 文件下载实现
通过ResponseEntity下载:
@GetMapping("/download/{filename}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
Path filePath = Paths.get("/uploads/" + filename);
Resource resource = new InputStreamResource(Files.newInputStream(filePath));
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + filename + "\"")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
其他HTTP元素处理
1. 获取请求方法
@GetMapping("/method")
public String requestMethod(HttpServletRequest request) {
return "Request Method: " + request.getMethod();
}
2. 获取客户端信息
@GetMapping("/client")
public String clientInfo(HttpServletRequest request) {
String clientIP = request.getRemoteAddr();
String clientHost = request.getRemoteHost();
return "Client: " + clientIP + " (" + clientHost + ")";
}
3. 处理请求体
JSON数据处理:
@PostMapping("/user")
public ResponseEntity createUser(@RequestBody User user) {
// 处理用户对象
return ResponseEntity.created(URI.create("/user/" + user.getId())).build();
}
XML数据处理:
@PostMapping(value = "/data", consumes = MediaType.APPLICATION_XML_VALUE)
public void processXML(@RequestBody Document xmlDoc) {
// 处理XML文档
}
安全注意事项
- 文件上传安全:
- 限制文件类型
- 病毒扫描
- 重命名存储
- Cookie安全:
- 设置HttpOnly
- 启用Secure标志
- 合理设置SameSite属性
- Session安全:
- 定期更换Session ID
- 防止Session固定攻击
- 敏感操作二次验证
常见问题排查
- 文件上传大小限制异常:
- 检查Spring Boot配置
- 调整服务器(Tomcat)配置
- 处理MultipartException
- 中文乱码问题:
# application.properties
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
- 跨域请求处理:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST");
}
}
正文到此结束
相关文章
热门推荐
评论插件初始化中...