SpringMVC对post提交的对象和对get提交的单个参数分别是如何校验的

本文介绍如何在SpringMVC中使用BeanValidation技术对输入参数进行校验,包括对Bean对象及RequestParam参数的有效性检查,并展示了如何配置全局异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

Spring MVC支持Bean Validation,通过这个验证技术,可以通过注解方式,很方便的对输入参数进行验证,之前使用的校验方式,都是基于Bean对象的,但是在@RequestParam中,没有Bean对象,这样使得校验无法进行,可以通过使用@Validated注解,使得校验可以进行。

校验bean对象

一般校验bean对象,为了可以自动的校验属性,可以通过两步解决:

一、声明对象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.github.yongzhizhan.draftbox.model;
 
import javax.validation.constraints.Size;
 
/**
  * 带验证的对象
  * @author zhanyongzhi
  */ public class Foo {
   private String validString;
 
   @Size (min = 1 , max = 5 )
   public String getValidString() {
     return validString;
   }
 
   public void setValidString( final String vValidString) {
     validString = vValidString;
   }
}

二、通过@Valid注解使用对象

?
1
2
3
4
5
6
7
8
@ResponseBody @RequestMapping (value = "validObject" , method = RequestMethod.POST)
@ResponseStatus (HttpStatus.OK)
public String validObject(
     @RequestBody ()
     @Valid Foo vFoo, BindingResult vBindingResult){
 
   return vFoo.getValidString();
}

校验RequestParams

使用校验bean的方式,没有办法校验RequestParam的内容,一般在处理Get请求的时候,会使用下面这样的代码:

?
1
2
3
4
5
6
7
8
@ResponseBody @RequestMapping (value = "validString" , method = RequestMethod.GET)
@ResponseStatus (HttpStatus.OK)
public String validString(
     @RequestParam (value = "str" , defaultValue = "" )
     String vStr){
 
   return vStr;
}

使用@Valid注解,对RequestParam对应的参数进行注解,是无效的,需要使用@Validated注解来使得验证生效。操作步骤如下:

一、声明错误处理类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.github.yongzhizhan.draftbox.controller;
 
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
 
import javax.validation.ValidationException;
 
@ControllerAdvice
@Component
public class GlobalExceptionHandler {
   @Bean
   public MethodValidationPostProcessor methodValidationPostProcessor() {
     return new MethodValidationPostProcessor();
   }
 
   @ExceptionHandler
   @ResponseBody
   @ResponseStatus (HttpStatus.BAD_REQUEST)
   public String handle(ValidationException exception) {
     System.out.println( "bad request, " + exception.getMessage());
     return "bad request, " + exception.getMessage();
   }
}

二、声明@Validated并加上校验注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.github.yongzhizhan.draftbox.controller;
 
import com.github.yongzhizhan.draftbox.model.Foo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
 
import javax.validation.Valid;
import javax.validation.constraints.Size;
 
@RestController
@SuppressWarnings ( "UnusedDeclaration" )
@Validated
public class IndexController {
   @ResponseBody
   @RequestMapping (value = "validString" , method = RequestMethod.GET)
   @ResponseStatus (HttpStatus.OK)
   public String validString(
       @RequestParam (value = "str" , defaultValue = "" )
       @Size (min = 1 , max = 3 )
       String vStr){
 
     return vStr;
   }
}

代码:spring-mvc-validator_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

原文链接:http://www.cnblogs.com/jeffen/p/6402475.html

<think>好的,我现在需要帮助用户解决Spring MVC后端配置CORS的问题。用户之前已经询问过关于CORS错误的解决方案,现在特别想知道如何在Spring MVC中修改后端代码。 首先,回顾之前的对话,用户遇到的是跨域请求被拦截的问题,前端在8082端口,后端在8080端口。我之前提供了几种解决方案,包括后端配置、前端临时绕过代理。现在用户明确询问Spring MVC的修改方法,说明他们可能正在使用传统的Spring MVC框架,而不是Spring Boot。 接下来,我需要考虑Spring MVC中配置CORS的不同方法。通常有两种方式:使用XML配置或通过注解,以及在过滤器中设置响应头。用户可能对这两种方式都需要指导,但需要分步骤说明。 首先,方法一:使用@CrossOrigin注解。这是最直接的方式,适用于有控制器的情况。需要检查用户的控制器是否基于注解,如果是,直接在方法或类上添加注解即可。但需要注意,这种方式可能需要Spring 4.2及以上版本,所以需要提醒用户版本要求。 方法二:XML全局配置。如果用户的项目使用的是XML配置,而不是Java配置,那么需要在springmvc.xml中添加CORS配置。这里需要给出具体的XML代码示例,并说明allowed-originsallowed-methods的参数设置。 方法三:配置CORS过滤器。这种方法适用于更复杂的情况,或者用户希望统一处理所有请求。需要创建一个Filter,并在web.xml中注册。这里需要注意的是,设置响应头时要正确指定允许的来源、方法、头部等,并且要处理OPTIONS预检请求。 然后,需要考虑用户可能的疑问,比如是否所有方法都需要添加注解,或者全局配置是否更高效。因此,在比较不同方法时,要说明各自的优缺点,推荐使用全局配置以减少重复代码。 另外,要提醒用户在生产环境中避免使用通配符*,明确指定允许的域名,以增强安全性。同时,检查Spring版本是否符合要求,避免因版本不支持导致配置无效。 最后,总结推荐的方法,可能根据用户的实际情况,如果他们使用的是较新的Spring版本,推荐注解或XML配置;如果是旧版本,可能需要过滤器的方式。确保步骤清晰,示例代码正确,避免用户操作时出错。</think>以下是针对 **Spring MVC** 框架(非 Spring Boot)的 CORS 配置方法: --- ### **1. 方法一:使用 `@CrossOrigin` 注解(适用于单个接口)** 在控制器(Controller)的类或方法上添加 `@CrossOrigin` 注解,指定允许跨域的域名: ```java @Controller @RequestMapping("/admin/search") @CrossOrigin(origins = "http://localhost:8082") // 允许 8082 端口访问 public class TestController { @RequestMapping("/singleTableQuery/gettest.do") @ResponseBody public String getTest() { return "Hello CORS!"; } } ``` --- ### **2. 方法二:XML 全局配置(推荐)** 在 `springmvc.xml` 配置文件中,通过 `<mvc:cors>` 标签全局启用 CORS: ```xml <mvc:cors> <mvc:mapping path="/**" allowed-origins="http://localhost:8082" allowed-methods="GET, POST, PUT, DELETE" allowed-headers="*" allow-credentials="true" max-age="3600" /> </mvc:cors> ``` - **关键参数**: - `allowed-origins`: 允许访问的域名(多个用逗号分隔) - `allowed-methods`: 允许的 HTTP 方法 - `allowed-headers`: 允许的请求头(`*` 表示全部) --- ### **3. 方法三:配置 CORS 过滤器** 创建一个自定义过滤器,手动添加 CORS 响应头: ```java public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "http://localhost:8082"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Max-Age", "3600"); chain.doFilter(req, res); } } ``` 在 `web.xml` 中注册过滤器: ```xml <filter> <filter-name>CorsFilter</filter-name> <filter-class>com.yourpackage.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` --- ### **4. 方法对比** | 方法 | 适用场景 | 优点 | 缺点 | |--------------|------------------------------|--------------------------|--------------------------| | `@CrossOrigin` | 单个接口配置 | 简单直接 | 需为每个接口添加注解 | | XML 全局配置 | 统一管理所有接口 | 高效,避免重复代码 | 需熟悉 XML 配置语法 | | 过滤器 | 旧版本 Spring 或复杂需求 | 灵活,可自定义逻辑 | 需要手动处理预检请求 | --- ### **关键注意事项** 1. **预检请求(OPTIONS)**:若请求包含自定义头(如 `Authorization`),浏览器会先发送 `OPTIONS` 请求,需确保后端能处理。 2. **版本兼容性**: - `@CrossOrigin` 需要 Spring 4.2+。 - XML 配置需要 Spring 4.2+。 3. **生产环境安全**:避免使用 `allowed-origins="*"`,明确指定可信域名。 --- ### **总结** 推荐使用 **XML 全局配置** 或 **过滤器** 解决 Spring MVC 的跨域问题。若项目已升级到 Spring 4.2+,优先选择 XML 配置;若需兼容旧版本,则使用过滤器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值