最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot參數(shù)校驗的一些實戰(zhàn)應(yīng)用

 更新時間:2024年11月09日 14:51:55   作者:cxykk1217  
這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗的一些實戰(zhàn)應(yīng)用,包括使用內(nèi)置的參數(shù)校驗注解、嵌套對象校驗、分組校驗以及自定義校驗注解,通過這些方法,可以有效地提高系統(tǒng)的穩(wěn)定性和安全性,需要的朋友可以參考下

在日常項目開發(fā)中,我們都知道參數(shù)驗證是必不可少的一環(huán),但是有時候為了偷懶,把參數(shù)校驗交給前端開發(fā)人員去處理,這樣很容易影響系統(tǒng)穩(wěn)定性和安全性,畢竟現(xiàn)在有很多手段可以繞過前端,直接后端請求接口。

本文就來介紹一下在 SpringBoot 應(yīng)用中怎么進(jìn)行參數(shù)校驗。

一、使用參數(shù)校驗注解

在 SpringBoot 項目中可以引用 spring-boot-starter-validation 實現(xiàn)數(shù)據(jù)驗證。spring-boot-starter-validation 不僅支持 JSR-303(Bean Validation 1.0)規(guī)范,還提供了對 JSR-380(Bean Validation 2.0)規(guī)范的全面支持。可以利用 Bean Validation 2.0 的新特性,更靈活地定義驗證規(guī)則,包括對集合、嵌套對象的驗證等。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
  <version>2.4.3</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

通常在實體類上的字段上使用標(biāo)準(zhǔn)的 Bean Validation 注解,以下是一些常用的參數(shù)校驗注解以及相關(guān)例子。

注解名稱

功能

@Null

檢查該字段為空

@NotNull

不能為null

@NotBlank

不能為空,常用于檢查空字符串

@NotEmpty

不能為空,多用于檢測list是否size是0

@Max

該字段的值只能小于或等于該值

@Min

該字段的值只能大于或等于該值

@Past

檢查該字段的日期是在過去

@Future

檢查該字段的日期是否是屬于將來的日期

@Email

檢查是否是一個有效的email地址

@Pattern(regex=,flag=)

被注釋的元素必須符合指定的正則表達(dá)式

@Range(min=,max=,message=)

被注釋的元素必須在合適的范圍內(nèi)

@Size(min=, max=)

檢查該字段的size是否在min和max之間,可以是字符串、數(shù)組、集合、Map等

@Length(min=,max=)

檢查所屬的字段的長度是否在min和max之間,只能用于字符串

@AssertTrue

用于boolean字段,該字段只能為true

@AssertFalse

該字段的值只能為false

1.1、基本用法

1.@NotNull:校驗元素值不能為空,如果為空,則校驗失敗。

@NotNull(message = "名字不能為空")
private String userName;

2.@NotBlank:校驗字符串值不能為null和空字符串,必須包含至少一個非空字符即執(zhí)行trim(之后不為’‘)。如果元素為null或者’',則驗證失敗。

    @NotBlank(message = "昵稱不能為null和空字符串")
    private String nickName;

3.@NotEmpty:校驗集合或者數(shù)組或者字符串是否非空,通常用于集合和數(shù)組字段,需要集合和數(shù)組元素個數(shù)大于0。也可以作用于字符串,此時校驗字符串不能為null或空串(可以是一個空格)。

    @NotEmpty(message = "postIds不能為空")
    private Long[] postIds;

4.@Max:校驗數(shù)字元素最大值。

    @Max(value=100,message = "年齡最大100")
    private String age;

5.@Min:校驗數(shù)字元素最小值。

    @Min(value=18,message = "年齡最小100")
    private String age;

6.@Past:校驗日期或時間元素是否在當(dāng)前時間之前。即是否是過去時間。作用于Date相關(guān)類型的字段。

    @Past(message = "")
    private Date createTime;

7.@Future:校驗日期或時間元素是否在當(dāng)前時間之前。即是否是過去時間。作用于Date相關(guān)類型的字段。

    @Future(message = "")
    private Date createTime;

8.@Email:校驗字符串元素是否為有效的電子郵件地址。

    @Email(message = "")
    private String email;

9.@Pattern:根據(jù)正則表達(dá)式校驗字符串元素的格式。

    @Pattern(regexp = "[a-zA-Z0-9]+")
    private String userName;

10.@Size:校驗集合元素個數(shù)或字符串的長度在指定范圍內(nèi)。

@Size(min = 3, max = 10, message = "長度在3到10之間")
private String username;

11.@Length:校驗字符串元素的長度。作用于字符串。

@Length(min = 3, max = 10, message = "長度在3到10之間")
private String username;

以上只是部分注解和他們的功能,需要詳細(xì)的了解需要查看源碼。

1.2、用法示例

定義入?yún)⒄埱髤?shù)

package com.duan.pojo.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description SysUserVO
 * @since 2024/6/17
 */
@Data
public class SysUserVO {

    @ApiModelProperty("部門ID")
    private Long deptId;

    @NotBlank(message = "名字不能為空")
    @ApiModelProperty("用戶名")
    private String userName;

    @NotBlank(message = "昵稱不能為null和空字符串")
    @ApiModelProperty("昵稱")
    private String nickName;

    @ApiModelProperty("密碼")
    private String password;

    @ApiModelProperty("用戶性別(0男,1女")
    private Integer gender;


    @ApiModelProperty("手機(jī)號碼")
    private String phone;

    @Email(message = "請?zhí)顚懻_的郵箱地址")
    @ApiModelProperty("郵箱")
    private String email;

    @ApiModelProperty("頭像地址")
    private String avatarName;

    @ApiModelProperty("用戶類型(0管理員,1普通用戶")
    private Integer userType;

    @ApiModelProperty("狀態(tài):1啟用、0禁用")
    private Integer status;

    @ApiModelProperty("備注")
    private String remark;
}

定義mapper

package com.duan.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.duan.pojo.SysUser;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface UserMapper extends BaseMapper<SysUser> {
}

定義接口

package com.duan.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.duan.pojo.SysUser;


public interface UserService extends IService<SysUser> {

    void AddUser(SysUserVO sysUserVO);
}

定義接口實現(xiàn)

package com.duan.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.duan.mapper.UserMapper;
import com.duan.pojo.SysUser;
import com.duan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author db
 * @version 1.0
 * @description UserServiceImpl
 * @since 2024/4/15
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, SysUser> implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public void AddUser(SysUserVO sysUserVO) {
        SysUser sysUser = new SysUser();
        BeanUtils.copyProperties(sysUserVO,sysUser);
        userMapper.insert(sysUser);
    }
}

定義controller

package com.duan.controller;

import com.duan.pojo.ResponseResult;
import com.duan.pojo.Result;
import com.duan.pojo.SysUser;
import com.duan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author db
 * @version 1.0
 * @description UserController
 * @since 2024/4/15
 */
@RestController
@RequestMapping("/user")

public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public ResponseResult addUser(@RequestBody @Validated SysUserVO sysUserVO){
        userService.AddUser(sysUserVO);
        return ResponseResult.okResult();
    }
}

1.3、示例測試

調(diào)用增加用戶接口

注意:我們需要捕獲一下 MethodArgumentNotValidException,才能如上圖顯示的那樣。

1.4、嵌套對象的驗證

SysUserVO中增加一個address的校驗,即需要對嵌套對象進(jìn)行校驗。

package com.duan.pojo.vo;

import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description AddressVO
 * @since 2024/6/17
 */
@Data
public class AddressVO {

    @NotBlank(message = "省份不能為空")
    private String province;
    @NotBlank(message = "城市不能為空")
    private String city;
}

AddressVO 對象如下所示:

package com.duan.pojo.vo;

import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @author db
 * @version 1.0
 * @description AddressVO
 * @since 2024/6/17
 */
@Data
public class AddressVO {

    @NotBlank(message = "省份不能為空")
    private String province;
    @NotBlank(message = "城市不能為空")
    private String city;
}

測試

說明:為了能夠進(jìn)行嵌套對象驗證,必須手動在SysUserVO實體的addressVo字段上明確指出這個字段里面的實體需要驗證,由于@Vaildated不能作用在成員屬性上,而且 @Valid 能加在成員屬性上,同時配合controller中在方法參數(shù)上 @Validated 或 @Valid 來進(jìn)行嵌套驗證。

這里必須要說明一下@Validated 和@Valid 的區(qū)別

  • 來源
  • @Validated:Spring 框架特有的注解,是標(biāo)準(zhǔn) JSR-303 的一個變種,提供了一個分組功能
  • @Valid:標(biāo)準(zhǔn) JSR-303 規(guī)范的標(biāo)記型注解。
  • 注解位置
  • @Validated:作用在類上、方法上、方法參數(shù)上,不能作用于成員屬性上。
  • @Valid:方法、構(gòu)造函數(shù)、方法參數(shù)、成員屬性上。
  • 分組
  • @Validated:支持分組驗證。
  • @Valid:支持標(biāo)準(zhǔn)的 Bean 驗證功能,不支持分組驗證。
  • 嵌套驗證
  • @Validated:不支持嵌套驗證。
  • @Valid:支持嵌套驗證。

二、分組驗證

同一個應(yīng)用中,會出現(xiàn)不同的場景,比如:用戶創(chuàng)建、用戶更新、用戶刪除,針對不同的場景,有些字段在一個場景中需要驗證,但是在另一個場景中該字段就不需要驗證,我們可以選擇新建不同的實體類去解決這類問題,比如:用戶創(chuàng)建 UserCreateVO、用戶更新 UserUpdate 等,但是這樣的做法會造成類的膨脹、代碼的冗余。其實我們可以使用分組校驗有選擇的執(zhí)行特定組的參數(shù)校驗。定義分組校驗需要注意兩點:

  • 定義分組必須使用接口。
  • 要校驗的字段必須加上分組,分組只對指定分組生效,不加分組不校驗。

2.1、創(chuàng)建分組

創(chuàng)建兩個分組接口,標(biāo)識不同的業(yè)務(wù)場景CreateGroup用于創(chuàng)建時指定的分組

package com.duan.validatedGroup;

/**
 * @author db
 * @version 1.0
 * @description CreateUserGroup
 * @since 2024/6/24
 */
public interface CreateUserGroup {
}

UpdateGroup用于更新時指定的分組

package com.duan.validatedGroup;

/**
 * @author db
 * @version 1.0
 * @description UpdateUserGroup
 * @since 2024/6/24
 */
public interface UpdateUserGroup {
}

2.2、使用分組校驗

分組校驗是通過在驗證注解上指定 groups 屬性來實現(xiàn)的。這個屬性允許你為驗證規(guī)則分配一個或多個驗證組。假設(shè)用戶創(chuàng)建時不傳遞用戶ID,其余的參數(shù)必傳,用戶更新接口必須傳遞用戶ID,可以不傳遞用戶名,其他參數(shù)必須傳遞。

package com.duan.pojo.vo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.duan.validatedGroup.CreateUserGroup;
import com.duan.validatedGroup.UpdateUserGroup;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author db
 * @version 1.0
 * @description SysUserVO
 * @since 2024/6/17
 */
@Data
public class SysUserVO {

    @NotBlank(message = "請選擇用戶",groups = UpdateUserGroup.class)
    private Long id;

    @ApiModelProperty("部門ID")
    private Long deptId;

    @NotBlank(message = "名字不能為空",groups = CreateUserGroup.class)
    @ApiModelProperty("用戶名")
    private String userName;

    @NotBlank(message = "昵稱不能為null和空字符串")
    @ApiModelProperty("昵稱")
    private String nickName;

    @ApiModelProperty("密碼")
    private String password;

    @ApiModelProperty("用戶性別(0男,1女")
    private Integer gender;


    @ApiModelProperty("手機(jī)號碼")
    private String phone;

    @Email(message = "請?zhí)顚懻_的郵箱地址")
    @ApiModelProperty("郵箱")
    private String email;

    @ApiModelProperty("頭像地址")
    private String avatarName;

    @ApiModelProperty("用戶類型(0管理員,1普通用戶")
    private Integer userType;

    @ApiModelProperty("狀態(tài):1啟用、0禁用")
    private Integer status;

    @ApiModelProperty("備注")
    private String remark;

    @NotNull(message = "請輸入地址信息")
    @Valid
    private AddressVO addressVO ;
}

2.3、在Controller中使用分組

使用@Validated 注解,并指定要執(zhí)行的驗證。

package com.duan.controller;

import com.duan.pojo.ResponseResult;
import com.duan.pojo.Result;
import com.duan.pojo.SysUser;
import com.duan.pojo.vo.SysUserVO;
import com.duan.service.UserService;
import com.duan.validatedGroup.CreateUserGroup;
import com.duan.validatedGroup.UpdateUserGroup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author db
 * @version 1.0
 * @description UserController
 * @since 2024/4/15
 */
@RestController
@RequestMapping("/user")

public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public ResponseResult addUser(@RequestBody @Validated(value = CreateUserGroup.class) SysUserVO sysUserVO){
        userService.addUser(sysUserVO);
        return ResponseResult.okResult();
    }

    @PostMapping("/updateUser")
    public ResponseResult updateUser(@RequestBody @Validated(value = UpdateUserGroup.class) SysUserVO sysUserVO){
        userService.updateUser(sysUserVO);
        return ResponseResult.okResult();
    }
}

2.4、測試

  • 創(chuàng)建用戶接口

username 不傳值,即不滿足 username 不能為空的條件,應(yīng)該校驗不通過。通過測試發(fā)現(xiàn),會提示username不能為空。

  • 更新用戶update接口

id寫成0,username還是為空,只是報了id不能小于1

三、自定義驗證注解

在項目開發(fā)中,我們也經(jīng)常使用自定義注解去完成字段校驗。自定義校驗注解步驟如下:

  • 編寫一個自定義校驗注解
  • 編寫一個自定義的校驗器
  • 關(guān)聯(lián)自定義的校驗器和自定義的校驗注解

假如:user實體中的password字段,格式是大于八位且包含數(shù)字大寫字母小寫字母,這個自定義校驗怎么實現(xiàn)呢?

1、首先定義一個注解PasswordValid

package com.duan.anno;

import com.duan.config.PasswordValidValidator;

import javax.validation.Constraint;
import javax.validation.Payload;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Constraint(validatedBy = { PasswordValidValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface PasswordValid {
    String message() default "{密碼格式不對}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

2、定義一個校驗器PasswordValidValidator

自定義校驗器需要實現(xiàn) ConstraintValidator<A extends Annotation, T>這個接口,第一個泛型是校驗注解,第二個是參數(shù)類型。

package com.duan.config;

import com.duan.anno.PasswordValid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author db
 * @version 1.0
 * @description PasswordValidValidator
 * @since 2024/6/25
 */
public class PasswordValidValidator implements ConstraintValidator<PasswordValid,String> {
    @Override
    public void initialize(PasswordValid constraintAnnotation) {

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }

        boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase);
        boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase);
        boolean hasDigit = value.chars().anyMatch(Character::isDigit);

        return value.length() >= 8 && hasUppercase && hasLowercase && hasDigit;
    }
}

3、關(guān)聯(lián)自定義的校驗器和自定義的校驗注解

當(dāng)你使用 @Constraint(validatedBy = EnumValidator.class) 注解時,Java Bean Validation 的實現(xiàn)框架會自動發(fā)現(xiàn)并注冊相應(yīng)的驗證器。

@Constraint(validatedBy = { PasswordValidValidator.class})

SysUserVO中使用

    @PasswordValid(groups = CreateUserGroup.class)
    @ApiModelProperty("密碼")
    private String password;

模擬輸入password為純數(shù)字時,校驗不通過。

代碼地址:https://gitee.com/duan138/practice-code/tree/master/paramValidated

四、總結(jié)

本文我們了解和實踐在 SpringBoot 項目中,怎么去使用基本的校驗注解、嵌套校驗、分組校驗,同時又學(xué)習(xí)了怎么使用自定義校驗注解,在項目中合理地使用相關(guān)校驗注解,可以簡化代碼、提高代碼可讀性和可維護(hù)性。

到此這篇關(guān)于SpringBoot參數(shù)校驗的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用MyBatis TypeHandler實現(xiàn)數(shù)據(jù)加密與解密的具體方案

    使用MyBatis TypeHandler實現(xiàn)數(shù)據(jù)加密與解密的具體方案

    在我們?nèi)粘5拈_發(fā)工作中,經(jīng)常會遇到一些敏感數(shù)據(jù)需要存儲,比如用戶的手機(jī)號、身份證號、銀行卡號等,為了保障數(shù)據(jù)安全,我們通常會對這些敏感信息進(jìn)行加密后再存入數(shù)據(jù)庫,所以本文給大家介紹了如何使用MyBatis TypeHandler實現(xiàn)數(shù)據(jù)加密與解密,需要的朋友可以參考下
    2025-11-11
  • Java泛型最全知識總結(jié)

    Java泛型最全知識總結(jié)

    面試被問到Java泛型怎么辦,有了這篇文章,讓你直接保送,文中有非常詳細(xì)的知識總結(jié)及相關(guān)代碼示例,需要的朋友可以參考下
    2021-06-06
  • 一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)

    一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)

    在使用springMVC框架構(gòu)建web應(yīng)用,客戶端常會請求字符串、整型、json等格式的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于通過一文教會Java新手使用Spring?MVC中的查詢字符串和查詢參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 如何使用 Shell 腳本查看多個服務(wù)器的端口是否打開的方法

    如何使用 Shell 腳本查看多個服務(wù)器的端口是否打開的方法

    這篇文章主要介紹了如何使用 Shell 腳本來查看多個服務(wù)器的端口是否打開的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Mybatis執(zhí)行插入語句后并返回主鍵ID問題

    Mybatis執(zhí)行插入語句后并返回主鍵ID問題

    這篇文章主要介紹了Mybatis執(zhí)行插入語句后并返回主鍵ID問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java使用異常鏈傳遞錯誤信息的詳細(xì)指南

    Java使用異常鏈傳遞錯誤信息的詳細(xì)指南

    作為一名Java開發(fā)者,相信你一定見過各種奇奇怪怪的異常報錯,但有沒有遇到過這樣的情況:明明只調(diào)用了一個方法,卻看到異常信息像俄羅斯套娃一樣一層層展開?所以本文給大家介紹了Java異常鏈(Exception Chaining)機(jī)制,需要的朋友可以參考下
    2025-09-09
  • Java current并發(fā)包超詳細(xì)分析

    Java current并發(fā)包超詳細(xì)分析

    current并發(fā)包、在JDK1.5之前Java并沒有提供線程安全的一些工具類去操作多線程,需要開發(fā)人員自行編寫實現(xiàn)線程安全,但仍然無法完全避免低性能、死鎖、資源管理等問題。在JDK1.5時新增了java.util.current并發(fā)包,其中提供了許多供我們使用的并發(fā)編程工具類
    2023-02-02
  • Java實力彈彈球?qū)崿F(xiàn)代碼

    Java實力彈彈球?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Java實力彈彈球?qū)崿F(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring AOP的使用詳解

    Spring AOP的使用詳解

    這篇文章主要介紹了Spring AOP的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 基于Java實現(xiàn)Word中插入附件的操作指南(支持所有文件格式)

    基于Java實現(xiàn)Word中插入附件的操作指南(支持所有文件格式)

    文章介紹了如何使用Java在Word文檔中嵌入附件,并通過OLE方式實現(xiàn),主要步驟包括:引入依賴、組裝附件圖標(biāo)、默認(rèn)附件圖標(biāo)、組裝Ole對象、插入附件到Word文檔以及使用模板,文章末尾提供了實現(xiàn)代碼和下載OLE模板的鏈接,需要的朋友可以參考下
    2025-12-12

最新評論

凤凰县| 北川| 冕宁县| 聊城市| 嘉黎县| 富锦市| 红安县| 天津市| 杭锦旗| 依安县| 象山县| 双鸭山市| 芒康县| 渭源县| 二连浩特市| 界首市| 定南县| 淮南市| 会昌县| 乌拉特中旗| 望城县| 广昌县| 锡林浩特市| 铁岭县| 达尔| 高陵县| 沁水县| 东乡| 紫阳县| 长沙市| 吉林市| 红河县| 嘉黎县| 叙永县| 大田县| 盐池县| 民勤县| 诏安县| 横山县| 灵武市| 万安县|