SpringMVC全面HTTP请求要素:参数获取、文件上传与Session管理

获取URL参数

1. 路径参数获取

使用@PathVariable注解获取RESTful风格的路径参数:

@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Long userId) {
    // 使用userId查询用户信息
    return "userDetail";
}

路径参数处理注意事项:

  1. 参数类型自动转换(String到Long)
  2. 可选参数需要设置required=false
  3. 正则表达式约束:
@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";
}

安全设置建议:

  1. 设置Secure标志(HTTPS环境)
  2. SameSite属性防止CSRF攻击
  3. 合理设置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方案:

  1. Redis存储Session(Spring Session实现)
  2. 数据库存储Session
  3. 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";
}

大文件分片上传处理方案:

  1. 前端分片上传
  2. 后端分片合并
  3. 断点续传实现

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文档
}

安全注意事项

  1. 文件上传安全:
  • 限制文件类型
  • 病毒扫描
  • 重命名存储
  1. Cookie安全:
  • 设置HttpOnly
  • 启用Secure标志
  • 合理设置SameSite属性
  1. Session安全:
  • 定期更换Session ID
  • 防止Session固定攻击
  • 敏感操作二次验证

常见问题排查

  1. 文件上传大小限制异常:
  • 检查Spring Boot配置
  • 调整服务器(Tomcat)配置
  • 处理MultipartException
  1. 中文乱码问题:
# application.properties
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
  1. 跨域请求处理:
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST");
    }
}
正文到此结束
评论插件初始化中...
Loading...