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

SpringSecurity自定義登錄界面

 更新時(shí)間:2022年09月06日 11:07:26   作者:搞錢(qián)自律  
這篇文章主要為大家詳細(xì)介紹了SpringSecurity自定義登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

為什么需要自定義登錄界面?

答:因?yàn)镾pringBoot整合SpringSecurity時(shí),只需要一個(gè)依賴(lài),無(wú)需其他配置,就可以實(shí)現(xiàn)認(rèn)證功能。但是它的認(rèn)證登錄界面是固定那樣的,如下圖所示,但是我們希望自己搞個(gè)好看的登錄界面,所以需要自定義登錄界面。

第一步:創(chuàng)建springboot項(xiàng)目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? ? ?xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
? ? <modelVersion>4.0.0</modelVersion>
? ? <parent>
? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? <artifactId>spring-boot-starter-parent</artifactId>
? ? ? ? <version>2.6.6</version>
? ? ? ? <relativePath/> <!-- lookup parent from repository -->
? ? </parent>
? ? <groupId>com.example</groupId>
? ? <artifactId>spring-security-03</artifactId>
? ? <version>0.0.1-SNAPSHOT</version>
? ? <name>spring-security-03</name>
? ? <description>Demo project for Spring Boot</description>
? ? <properties>
? ? ? ? <java.version>1.8</java.version>
? ? </properties>
? ? <dependencies>
? ? ? ? <!--thymeleaf-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-thymeleaf</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-security</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-web</artifactId>
? ? ? ? </dependency>

? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? <artifactId>spring-boot-starter-test</artifactId>
? ? ? ? ? ? <scope>test</scope>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.security</groupId>
? ? ? ? ? ? <artifactId>spring-security-test</artifactId>
? ? ? ? ? ? <scope>test</scope>
? ? ? ? </dependency>
? ? </dependencies>

? ? <build>
? ? ? ? <plugins>
? ? ? ? ? ? <plugin>
? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>
? ? ? ? ? ? </plugin>
? ? ? ? </plugins>
? ? </build>

</project>

第二步:添加配置application.properties

#修改springSecurity默認(rèn)用戶(hù)名和密碼
spring.security.user.name=root
spring.security.user.password=root

#設(shè)置 thymeleaf 緩存為false,表示立即生效
spring.thymeleaf.cache=false

第三步:Controller

package com.example.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

? ? @RequestMapping("/hello")
? ? public String hello(){
? ? ? ? System.out.println("hello spring security");
? ? ? ? return "hello spring security";
? ? }
}
package com.example.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

? ? @RequestMapping("/index")
? ? public String hello(){
? ? ? ? System.out.println("hello index");
? ? ? ? return "hello index";
? ? }
}
package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {

? ? @RequestMapping("/loginHtml")
? ? public String loginHtml(){
? ? ? ? return "login";
? ? }
}

第四步:login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org/" lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <title>用戶(hù)登錄</title>
</head>
<body>
? ? <h1>用戶(hù)登錄</h1>
? ? <form th:action="@{/doLogin}" method="post">
? ? ? ? 用戶(hù)名:<input type="text" name="username"> <br>
? ? ? ? 密碼:<input type="text" name="password"><br>
? ? ? ? <input type="submit" value="登錄">
? ? </form>
</body>
</html>

第五步:配置自定義登錄界面

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {


? ? @Override
? ? public void configure(HttpSecurity http) throws Exception {

? ? ? ? //【注意事項(xiàng)】放行資源要放在前面,認(rèn)證的放在后面
? ? ? ? http.authorizeRequests()
? ? ? ? ? ? ? ? .mvcMatchers("/index").permitAll() //代表放行index的所有請(qǐng)求
? ? ? ? ? ? ? ? .mvcMatchers("/loginHtml").permitAll() //放行l(wèi)oginHtml請(qǐng)求
? ? ? ? ? ? ? ? .anyRequest().authenticated()//代表其他請(qǐng)求需要認(rèn)證
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .formLogin()//表示其他需要認(rèn)證的請(qǐng)求通過(guò)表單認(rèn)證
? ? ? ? ? ? ? ? //loginPage 一旦你自定義了這個(gè)登錄頁(yè)面,那你必須要明確告訴SpringSecurity日后哪個(gè)url處理你的登錄請(qǐng)求
? ? ? ? ? ? ? ? .loginPage("/loginHtml")//用來(lái)指定自定義登錄界面,不使用SpringSecurity默認(rèn)登錄界面 ?注意:一旦自定義登錄頁(yè)面,必須指定登錄url
? ? ? ? ? ? ? ? //loginProcessingUrl ?這個(gè)doLogin請(qǐng)求本身是沒(méi)有的,因?yàn)槲覀冎恍枰鞔_告訴SpringSecurity,日后只要前端發(fā)起的是一個(gè)doLogin這樣的請(qǐng)求,
? ? ? ? ? ? ? ? //那SpringSecurity應(yīng)該把你username和password給捕獲到
? ? ? ? ? ? ? ? .loginProcessingUrl("/doLogin")//指定處理登錄的請(qǐng)求url
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .csrf().disable(); //禁止csrf 跨站請(qǐng)求保護(hù)
? ? }
}

5.1 請(qǐng)求參數(shù)名修改

上面的login.html用戶(hù)名必須為username,密碼必須為password,如果我們想要使用自定義的屬性名,按照如下修改

5.1.1 修改login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org/" lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <title>用戶(hù)登錄</title>
</head>
<body>
? ? <h1>用戶(hù)登錄</h1>
? ? <form th:action="@{/doLogin}" method="post">
? ? ? ? 用戶(hù)名:<input type="text" name="uname"> <br>
? ? ? ? 密碼:<input type="text" name="passwd"><br>
? ? ? ? <input type="submit" value="登錄">
? ? </form>
</body>
</html>

5.1.2 修改配置類(lèi)

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {


? ? @Override
? ? public void configure(HttpSecurity http) throws Exception {

? ? ? ? //【注意事項(xiàng)】放行資源要放在前面,認(rèn)證的放在后面
? ? ? ? http.authorizeRequests()
? ? ? ? ? ? ? ? .mvcMatchers("/index").permitAll() //代表放行index的所有請(qǐng)求
? ? ? ? ? ? ? ? .mvcMatchers("/loginHtml").permitAll() //放行l(wèi)oginHtml請(qǐng)求
? ? ? ? ? ? ? ? .anyRequest().authenticated()//代表其他請(qǐng)求需要認(rèn)證
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .formLogin()//表示其他需要認(rèn)證的請(qǐng)求通過(guò)表單認(rèn)證
? ? ? ? ? ? ? ? //loginPage 一旦你自定義了這個(gè)登錄頁(yè)面,那你必須要明確告訴SpringSecurity日后哪個(gè)url處理你的登錄請(qǐng)求
? ? ? ? ? ? ? ? .loginPage("/loginHtml")//用來(lái)指定自定義登錄界面,不使用SpringSecurity默認(rèn)登錄界面 ?注意:一旦自定義登錄頁(yè)面,必須指定登錄url
? ? ? ? ? ? ? ? //loginProcessingUrl ?這個(gè)doLogin請(qǐng)求本身是沒(méi)有的,因?yàn)槲覀冎恍枰鞔_告訴SpringSecurity,日后只要前端發(fā)起的是一個(gè)doLogin這樣的請(qǐng)求,
? ? ? ? ? ? ? ? //那SpringSecurity應(yīng)該把你username和password給捕獲到
? ? ? ? ? ? ? ? .loginProcessingUrl("/doLogin")//指定處理登錄的請(qǐng)求url
? ? ? ? ? ? ? ? .usernameParameter("uname") //指定登錄界面用戶(hù)名文本框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為username
? ? ? ? ? ? ? ? .passwordParameter("passwd")//指定登錄界面密碼密碼框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為password
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .csrf().disable(); //禁止csrf 跨站請(qǐng)求保護(hù)
? ? }
}

5.1 認(rèn)證成功跳轉(zhuǎn)路徑

修改配置類(lèi)successForwardUrl

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {


? ? @Override
? ? public void configure(HttpSecurity http) throws Exception {

? ? ? ? //【注意事項(xiàng)】放行資源要放在前面,認(rèn)證的放在后面
? ? ? ? http.authorizeRequests()
? ? ? ? ? ? ? ? .mvcMatchers("/index").permitAll() //代表放行index的所有請(qǐng)求
? ? ? ? ? ? ? ? .mvcMatchers("/loginHtml").permitAll() //放行l(wèi)oginHtml請(qǐng)求
? ? ? ? ? ? ? ? .anyRequest().authenticated()//代表其他請(qǐng)求需要認(rèn)證
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .formLogin()//表示其他需要認(rèn)證的請(qǐng)求通過(guò)表單認(rèn)證
? ? ? ? ? ? ? ? //loginPage 一旦你自定義了這個(gè)登錄頁(yè)面,那你必須要明確告訴SpringSecurity日后哪個(gè)url處理你的登錄請(qǐng)求
? ? ? ? ? ? ? ? .loginPage("/loginHtml")//用來(lái)指定自定義登錄界面,不使用SpringSecurity默認(rèn)登錄界面 ?注意:一旦自定義登錄頁(yè)面,必須指定登錄url
? ? ? ? ? ? ? ? //loginProcessingUrl ?這個(gè)doLogin請(qǐng)求本身是沒(méi)有的,因?yàn)槲覀冎恍枰鞔_告訴SpringSecurity,日后只要前端發(fā)起的是一個(gè)doLogin這樣的請(qǐng)求,
? ? ? ? ? ? ? ? //那SpringSecurity應(yīng)該把你username和password給捕獲到
? ? ? ? ? ? ? ? .loginProcessingUrl("/doLogin")//指定處理登錄的請(qǐng)求url
? ? ? ? ? ? ? ? .usernameParameter("uname") //指定登錄界面用戶(hù)名文本框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為username
? ? ? ? ? ? ? ? .passwordParameter("passwd")//指定登錄界面密碼密碼框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為password
? ? ? ? ? ? ? ? .successForwardUrl("/index")//認(rèn)證成功 forward 跳轉(zhuǎn)路徑
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .csrf().disable(); //禁止csrf 跨站請(qǐng)求保護(hù)
? ? }
}

修改配置類(lèi)defaultSuccessUrl

package com.example.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {


? ? @Override
? ? public void configure(HttpSecurity http) throws Exception {

? ? ? ? //【注意事項(xiàng)】放行資源要放在前面,認(rèn)證的放在后面
? ? ? ? http.authorizeRequests()
? ? ? ? ? ? ? ? .mvcMatchers("/index").permitAll() //代表放行index的所有請(qǐng)求
? ? ? ? ? ? ? ? .mvcMatchers("/loginHtml").permitAll() //放行l(wèi)oginHtml請(qǐng)求
? ? ? ? ? ? ? ? .anyRequest().authenticated()//代表其他請(qǐng)求需要認(rèn)證
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .formLogin()//表示其他需要認(rèn)證的請(qǐng)求通過(guò)表單認(rèn)證
? ? ? ? ? ? ? ? //loginPage 一旦你自定義了這個(gè)登錄頁(yè)面,那你必須要明確告訴SpringSecurity日后哪個(gè)url處理你的登錄請(qǐng)求
? ? ? ? ? ? ? ? .loginPage("/loginHtml")//用來(lái)指定自定義登錄界面,不使用SpringSecurity默認(rèn)登錄界面 ?注意:一旦自定義登錄頁(yè)面,必須指定登錄url
? ? ? ? ? ? ? ? //loginProcessingUrl ?這個(gè)doLogin請(qǐng)求本身是沒(méi)有的,因?yàn)槲覀冎恍枰鞔_告訴SpringSecurity,日后只要前端發(fā)起的是一個(gè)doLogin這樣的請(qǐng)求,
? ? ? ? ? ? ? ? //那SpringSecurity應(yīng)該把你username和password給捕獲到
? ? ? ? ? ? ? ? .loginProcessingUrl("/doLogin")//指定處理登錄的請(qǐng)求url
? ? ? ? ? ? ? ? .usernameParameter("uname") //指定登錄界面用戶(hù)名文本框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為username
? ? ? ? ? ? ? ? .passwordParameter("passwd")//指定登錄界面密碼密碼框的name值,如果沒(méi)有指定,默認(rèn)屬性名必須為password
// ? ? ? ? ? ? ? ?.successForwardUrl("/index")//認(rèn)證成功 forward 跳轉(zhuǎn)路徑,forward代表服務(wù)器內(nèi)部的跳轉(zhuǎn)之后,地址欄不變 始終在認(rèn)證成功之后跳轉(zhuǎn)到指定請(qǐng)求
? ? ? ? ? ? ? ? .defaultSuccessUrl("/index")//認(rèn)證成功 之后跳轉(zhuǎn),重定向 redirect 跳轉(zhuǎn)后,地址會(huì)發(fā)生改變 ?根據(jù)上一保存請(qǐng)求進(jìn)行成功跳轉(zhuǎn)
? ? ? ? ? ? ? ? .and()
? ? ? ? ? ? ? ? .csrf().disable(); //禁止csrf 跨站請(qǐng)求保護(hù)
? ? }
}

訪(fǎng)問(wèn)http://localhost:8080/hello,認(rèn)證后

發(fā)現(xiàn)并沒(méi)有到/index的情況,這是defaultSuccessUrl一特性,如果你想硬跳到/index,修改java defaultSuccessUrl("/index",true)即可

訪(fǎng)問(wèn)http://localhost:8080/loginHtml,認(rèn)證后

defaultSuccessUrl和successForwardUrl區(qū)別

1、successForwardUrl是forward跳轉(zhuǎn),defaultSuccessUrl是重定向redirect跳轉(zhuǎn)
2、successForwardUrl始終在認(rèn)證成功之后跳轉(zhuǎn)到指定請(qǐng)求,defaultSuccessUrl根據(jù)上一保存請(qǐng)求進(jìn)行成功跳轉(zhuǎn)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于json解析多層嵌套并轉(zhuǎn)為對(duì)應(yīng)類(lèi)(List)

    關(guān)于json解析多層嵌套并轉(zhuǎn)為對(duì)應(yīng)類(lèi)(List)

    在進(jìn)行JSON解析時(shí),遇到多層嵌套結(jié)構(gòu)可通過(guò)遞歸或?qū)S脦?kù)來(lái)實(shí)現(xiàn),重要的是將嵌套的JSON對(duì)象準(zhǔn)確轉(zhuǎn)化為對(duì)應(yīng)的Java類(lèi),通常需要依賴(lài)如Gson或Jackson等庫(kù),將JSONObject轉(zhuǎn)為JavaBean時(shí),關(guān)注字段匹配與數(shù)據(jù)類(lèi)型轉(zhuǎn)換
    2024-10-10
  • Spring使用event-stream進(jìn)行數(shù)據(jù)推送

    Spring使用event-stream進(jìn)行數(shù)據(jù)推送

    這篇文章主要介紹了Spring使用event-stream進(jìn)行數(shù)據(jù)推送,前端使用EventSource方式向后臺(tái)發(fā)送請(qǐng)求,后端接收到之后使用event-stream方式流式返回,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • VsCode搭建Spring Boot項(xiàng)目并進(jìn)行創(chuàng)建、運(yùn)行、調(diào)試

    VsCode搭建Spring Boot項(xiàng)目并進(jìn)行創(chuàng)建、運(yùn)行、調(diào)試

    這篇文章主要介紹了VsCode搭建Spring Boot項(xiàng)目并進(jìn)行創(chuàng)建、運(yùn)行、調(diào)試 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 一文詳解Java中流程控制語(yǔ)句

    一文詳解Java中流程控制語(yǔ)句

    在一個(gè)程序執(zhí)行的過(guò)程中,各條語(yǔ)句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的。也就是說(shuō),程序的流程對(duì)運(yùn)行結(jié)果有直接的影響。所以,我們必須清楚每條語(yǔ)句的執(zhí)行流程。本文就來(lái)通過(guò)一些示例帶大家詳細(xì)了解一下
    2022-10-10
  • Spring boot jpa 刪除數(shù)據(jù)和事務(wù)管理的問(wèn)題實(shí)例詳解

    Spring boot jpa 刪除數(shù)據(jù)和事務(wù)管理的問(wèn)題實(shí)例詳解

    這篇文章主要介紹了Spring boot jpa 刪除數(shù)據(jù)和事務(wù)管理的問(wèn)題實(shí)例詳解,涉及業(yè)務(wù)場(chǎng)景的一些知識(shí)和遇到的的問(wèn)題,需要的朋友可以參考。
    2017-09-09
  • 詳解Java中的mapstruct插件使用

    詳解Java中的mapstruct插件使用

    mapstruct 的插件是專(zhuān)門(mén)用來(lái)處理 domin 實(shí)體類(lèi)與 model 類(lèi)的屬性映射的,我們只需定義 mapper 接口,mapstruct 在編譯的時(shí)候就會(huì)自動(dòng)的幫我們實(shí)現(xiàn)這個(gè)映射接口,避免了麻煩復(fù)雜的映射實(shí)現(xiàn),對(duì)Java?mapstruct使用相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理

    Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理

    這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談Spring Boot Web 應(yīng)用性能優(yōu)化

    淺談Spring Boot Web 應(yīng)用性能優(yōu)化

    這篇文章主要介紹了淺談Spring Boot Web 應(yīng)用性能優(yōu)化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java 超詳細(xì)講解抽象類(lèi)與接口的使用

    Java 超詳細(xì)講解抽象類(lèi)與接口的使用

    對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一,在 Java 中可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類(lèi),下面這篇文章主要給大家介紹了關(guān)于Java入門(mén)基礎(chǔ)之抽象類(lèi)與接口的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java中類(lèi)的定義和初始化示例詳解

    Java中類(lèi)的定義和初始化示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中類(lèi)的定義和初始化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

沧州市| 光山县| 阜康市| 延川县| 佛教| 府谷县| 茂名市| 卢龙县| 桑植县| 清水县| 苏尼特左旗| 启东市| 虞城县| 名山县| 白银市| 交城县| 白城市| 定襄县| 五河县| 云梦县| 确山县| 罗江县| 南京市| 建阳市| 闻喜县| 锦屏县| 郑州市| 庆元县| 靖宇县| 班玛县| 舒城县| 榆林市| 辽阳县| 安龙县| 应用必备| 玛沁县| 马尔康县| 林芝县| 黑龙江省| 越西县| 灌云县|