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

詳解SpringMVC中使用Interceptor攔截器

 更新時(shí)間:2016年12月30日 14:53:35   作者:234390216  
SpringMVC 中的Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶(hù)的請(qǐng)求并進(jìn)行相應(yīng)的處理,這篇文章主要介紹了詳解SpringMVC中使用Interceptor攔截器,有興趣的可以了解一下。

SpringMVC 中的Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶(hù)的請(qǐng)求并進(jìn)行相應(yīng)的處理。比如通過(guò)它來(lái)進(jìn)行權(quán)限驗(yàn)證,或者是來(lái)判斷用戶(hù)是否登陸,或者是像12306 那樣子判斷當(dāng)前時(shí)間是否是購(gòu)票時(shí)間。

 一、定義Interceptor實(shí)現(xiàn)類(lèi)

SpringMVC 中的Interceptor 攔截請(qǐng)求是通過(guò)HandlerInterceptor 來(lái)實(shí)現(xiàn)的。在SpringMVC 中定義一個(gè)Interceptor 非常簡(jiǎn)單,主要有兩種方式,第一種方式是要定義的Interceptor類(lèi)要實(shí)現(xiàn)了Spring 的HandlerInterceptor 接口,或者是這個(gè)類(lèi)繼承實(shí)現(xiàn)了HandlerInterceptor 接口的類(lèi),比如Spring 已經(jīng)提供的實(shí)現(xiàn)了HandlerInterceptor 接口的抽象類(lèi)HandlerInterceptorAdapter ;第二種方式是實(shí)現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實(shí)現(xiàn)了WebRequestInterceptor的類(lèi)。

(一)實(shí)現(xiàn)HandlerInterceptor接口

HandlerInterceptor 接口中定義了三個(gè)方法,我們就是通過(guò)這三個(gè)方法來(lái)對(duì)用戶(hù)的請(qǐng)求進(jìn)行攔截處理的。

(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,顧名思義,該方法將在請(qǐng)求處理之前進(jìn)行調(diào)用。SpringMVC 中的Interceptor 是鏈?zhǔn)降恼{(diào)用的,在一個(gè)應(yīng)用中或者說(shuō)是在一個(gè)請(qǐng)求中可以同時(shí)存在多個(gè)Interceptor 。每個(gè)Interceptor 的調(diào)用會(huì)依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法,所以可以在這個(gè)方法中進(jìn)行一些前置初始化操作或者是對(duì)當(dāng)前請(qǐng)求的一個(gè)預(yù)處理,也可以在這個(gè)方法中進(jìn)行一些判斷來(lái)決定請(qǐng)求是否要繼續(xù)進(jìn)行下去。

該方法的返回值是布爾值Boolean 類(lèi)型的,當(dāng)它返回為false 時(shí),表示請(qǐng)求結(jié)束,后續(xù)的Interceptor 和Controller 都不會(huì)再執(zhí)行;當(dāng)返回值為true 時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor 的preHandle 方法,如果已經(jīng)是最后一個(gè)Interceptor 的時(shí)候就會(huì)是調(diào)用當(dāng)前請(qǐng)求的Controller 方法。

(2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解釋我們知道這個(gè)方法包括后面要說(shuō)到的afterCompletion 方法都只能是在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時(shí)才能被調(diào)用。

postHandle 方法,顧名思義就是在當(dāng)前請(qǐng)求進(jìn)行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會(huì)在DispatcherServlet 進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個(gè)方法中對(duì)Controller 處理之后的ModelAndView 對(duì)象進(jìn)行操作。postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說(shuō)先聲明的Interceptor 的postHandle 方法反而會(huì)后執(zhí)行,這和Struts2 里面的Interceptor 的執(zhí)行過(guò)程有點(diǎn)類(lèi)型。Struts2 里面的Interceptor 的執(zhí)行過(guò)程也是鏈?zhǔn)降?,只是在Struts2 里面需要手動(dòng)調(diào)用ActionInvocation 的invoke 方法來(lái)觸發(fā)對(duì)下一個(gè)Interceptor 或者是Action 的調(diào)用,然后每一個(gè)Interceptor 中在invoke 方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke 方法之后的內(nèi)容就是反向的。

(3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是需要當(dāng)前對(duì)應(yīng)的Interceptor 的preHandle 方法的返回值為true 時(shí)才會(huì)執(zhí)行。顧名思義,該方法將在整個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行。這個(gè)方法的主要作用是用于進(jìn)行資源清理工作的。

下面是一個(gè)簡(jiǎn)單的代碼說(shuō)明:

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.springframework.web.servlet.HandlerInterceptor; 
import org.springframework.web.servlet.ModelAndView; 
 
public class SpringMVCInterceptor implements HandlerInterceptor { 
 
 
  /** 
   * preHandle方法是進(jìn)行處理器攔截用的,顧名思義,該方法將在Controller處理之前進(jìn)行調(diào)用,SpringMVC中的Interceptor攔截器是鏈?zhǔn)降模梢酝瑫r(shí)存在 
   * 多個(gè)Interceptor,然后SpringMVC會(huì)根據(jù)聲明的前后順序一個(gè)接一個(gè)的執(zhí)行,而且所有的Interceptor中的preHandle方法都會(huì)在 
   * Controller方法調(diào)用之前調(diào)用。SpringMVC的這種Interceptor鏈?zhǔn)浇Y(jié)構(gòu)也是可以進(jìn)行中斷的,這種中斷方式是令preHandle的返 
   * 回值為false,當(dāng)preHandle的返回值為false的時(shí)候整個(gè)請(qǐng)求就結(jié)束了。 
   */ 
  @Override 
  public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 
    // TODO Auto-generated method stub 
    return false; 
  } 
   
  /** 
   * 這個(gè)方法只會(huì)在當(dāng)前這個(gè)Interceptor的preHandle方法返回值為true的時(shí)候才會(huì)執(zhí)行。postHandle是進(jìn)行處理器攔截用的,它的執(zhí)行時(shí)間是在處理器進(jìn)行處理之 
   * 后,也就是在Controller的方法調(diào)用之后執(zhí)行,但是它會(huì)在DispatcherServlet進(jìn)行視圖的渲染之前執(zhí)行,也就是說(shuō)在這個(gè)方法中你可以對(duì)ModelAndView進(jìn)行操 
   * 作。這個(gè)方法的鏈?zhǔn)浇Y(jié)構(gòu)跟正常訪問(wèn)的方向是相反的,也就是說(shuō)先聲明的Interceptor攔截器該方法反而會(huì)后調(diào)用,這跟Struts2里面的攔截器的執(zhí)行過(guò)程有點(diǎn)像, 
   * 只是Struts2里面的intercept方法中要手動(dòng)的調(diào)用ActionInvocation的invoke方法,Struts2中調(diào)用ActionInvocation的invoke方法就是調(diào)用下一個(gè)Interceptor 
   * 或者是調(diào)用action,然后要在Interceptor之前調(diào)用的內(nèi)容都寫(xiě)在調(diào)用invoke之前,要在Interceptor之后調(diào)用的內(nèi)容都寫(xiě)在調(diào)用invoke方法之后。 
   */ 
  @Override 
  public void postHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 
    // TODO Auto-generated method stub 
     
  } 
 
  /** 
   * 該方法也是需要當(dāng)前對(duì)應(yīng)的Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。該方法將在整個(gè)請(qǐng)求完成之后,也就是DispatcherServlet渲染了視圖執(zhí)行, 
   * 這個(gè)方法的主要作用是用于清理資源的,當(dāng)然這個(gè)方法也只能在當(dāng)前這個(gè)Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。 
   */ 
  @Override 
  public void afterCompletion(HttpServletRequest request, 
      HttpServletResponse response, Object handler, Exception ex) 
  throws Exception { 
    // TODO Auto-generated method stub 
     
  } 
   
} 

(二)實(shí)現(xiàn)WebRequestInterceptor 接口

WebRequestInterceptor 中也定義了三個(gè)方法,我們也是通過(guò)這三個(gè)方法來(lái)實(shí)現(xiàn)攔截的。這三個(gè)方法都傳遞了同一個(gè)參數(shù)WebRequest ,那么這個(gè)WebRequest 是什么呢?這個(gè)WebRequest 是Spring 定義的一個(gè)接口,它里面的方法定義都基本跟HttpServletRequest 一樣,在WebRequestInterceptor 中對(duì)WebRequest 進(jìn)行的所有操作都將同步到HttpServletRequest 中,然后在當(dāng)前請(qǐng)求中一直傳遞。

(1 )preHandle(WebRequest request) 方法。該方法將在請(qǐng)求處理之前進(jìn)行調(diào)用,也就是說(shuō)會(huì)在Controller 方法調(diào)用之前被調(diào)用。這個(gè)方法跟HandlerInterceptor 中的preHandle 是不同的,主要區(qū)別在于該方法的返回值是void ,也就是沒(méi)有返回值,所以我們一般主要用它來(lái)進(jìn)行資源的準(zhǔn)備工作,比如我們?cè)谑褂肏ibernate 的時(shí)候可以在這個(gè)方法中準(zhǔn)備一個(gè)Hibernate 的Session 對(duì)象,然后利用WebRequest 的setAttribute(name, value, scope) 把它放到WebRequest 的屬性中。這里可以說(shuō)說(shuō)這個(gè)setAttribute 方法的第三個(gè)參數(shù)scope ,該參數(shù)是一個(gè)Integer 類(lèi)型的。在WebRequest 的父層接口RequestAttributes 中對(duì)它定義了三個(gè)常量:

SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以訪問(wèn)。

SCOPE_SESSION :它的值是1 ,如果環(huán)境允許的話它代表的是一個(gè)局部的隔離的session,否則就代表普通的session,并且在該session范圍內(nèi)可以訪問(wèn)。

SCOPE_GLOBAL_SESSION :它的值是2 ,如果環(huán)境允許的話,它代表的是一個(gè)全局共享的session,否則就代表普通的session,并且在該session 范圍內(nèi)可以訪問(wèn)。

(2 )postHandle(WebRequest request, ModelMap model) 方法。該方法將在請(qǐng)求處理之后,也就是在Controller 方法調(diào)用之后被調(diào)用,但是會(huì)在視圖返回被渲染之前被調(diào)用,所以可以在這個(gè)方法里面通過(guò)改變數(shù)據(jù)模型ModelMap 來(lái)改變數(shù)據(jù)的展示。該方法有兩個(gè)參數(shù),WebRequest 對(duì)象是用于傳遞整個(gè)請(qǐng)求數(shù)據(jù)的,比如在preHandle 中準(zhǔn)備的數(shù)據(jù)都可以通過(guò)WebRequest 來(lái)傳遞和訪問(wèn);ModelMap 就是Controller 處理之后返回的Model 對(duì)象,我們可以通過(guò)改變它的屬性來(lái)改變返回的Model 模型。

(3 )afterCompletion(WebRequest request, Exception ex) 方法。該方法會(huì)在整個(gè)請(qǐng)求處理完成,也就是在視圖返回并被渲染之后執(zhí)行。所以在該方法中可以進(jìn)行資源的釋放操作。而WebRequest 參數(shù)就可以把我們?cè)趐reHandle 中準(zhǔn)備的資源傳遞到這里進(jìn)行釋放。Exception 參數(shù)表示的是當(dāng)前請(qǐng)求的異常對(duì)象,如果在Controller 中拋出的異常已經(jīng)被Spring 的異常處理器給處理了的話,那么這個(gè)異常對(duì)象就是是null 。

下面是一個(gè)簡(jiǎn)單的代碼說(shuō)明:

import org.springframework.ui.ModelMap; 
import org.springframework.web.context.request.WebRequest; 
import org.springframework.web.context.request.WebRequestInterceptor; 
 
public class AllInterceptor implements WebRequestInterceptor { 
   
  /** 
   * 在請(qǐng)求處理之前執(zhí)行,該方法主要是用于準(zhǔn)備資源數(shù)據(jù)的,然后可以把它們當(dāng)做請(qǐng)求屬性放到WebRequest中 
   */ 
  @Override 
  public void preHandle(WebRequest request) throws Exception { 
    // TODO Auto-generated method stub 
    System.out.println("AllInterceptor..............................."); 
    request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);//這個(gè)是放到request范圍內(nèi)的,所以只能在當(dāng)前請(qǐng)求中的request中獲取到 
    request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);//這個(gè)是放到session范圍內(nèi)的,如果環(huán)境允許的話它只能在局部的隔離的會(huì)話中訪問(wèn),否則就是在普通的當(dāng)前會(huì)話中可以訪問(wèn) 
    request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);//如果環(huán)境允許的話,它能在全局共享的會(huì)話中訪問(wèn),否則就是在普通的當(dāng)前會(huì)話中訪問(wèn) 
  } 
 
  /** 
   * 該方法將在Controller執(zhí)行之后,返回視圖之前執(zhí)行,ModelMap表示請(qǐng)求Controller處理之后返回的Model對(duì)象,所以可以在 
   * 這個(gè)方法中修改ModelMap的屬性,從而達(dá)到改變返回的模型的效果。 
   */ 
  @Override 
  public void postHandle(WebRequest request, ModelMap map) throws Exception { 
    // TODO Auto-generated method stub 
    for (String key:map.keySet()) 
      System.out.println(key + "-------------------------");; 
    map.put("name3", "value3"); 
    map.put("name1", "name1"); 
  } 
 
  /** 
   * 該方法將在整個(gè)請(qǐng)求完成之后,也就是說(shuō)在視圖渲染之后進(jìn)行調(diào)用,主要用于進(jìn)行一些資源的釋放 
   */ 
  @Override 
  public void afterCompletion(WebRequest request, Exception exception) 
  throws Exception { 
    // TODO Auto-generated method stub 
    System.out.println(exception + "-=-=--=--=-=-=-=-=-=-=-=-==-=--=-=-=-="); 
  } 
   
} 
 

 二、把定義的攔截器類(lèi)加到SpringMVC的攔截體系中

1.在SpringMVC的配置文件中加上支持MVC的schema

xmlns:mvc="http://www.springframework.org/schema/mvc" 
  xsi:schemaLocation=" http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" 

下面是我的聲明示例:

<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
  xmlns:mvc="http://www.springframework.org/schema/mvc" 
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd 
   http://www.springframework.org/schema/mvc 
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

這樣在SpringMVC的配置文件中就可以使用mvc標(biāo)簽了,mvc標(biāo)簽中有一個(gè)mvc:interceptors是用于聲明SpringMVC的攔截器的。

(二)使用mvc:interceptors標(biāo)簽來(lái)聲明需要加入到SpringMVC攔截器鏈中的攔截器

<mvc:interceptors> 
  <!-- 使用bean定義一個(gè)Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請(qǐng)求 --> 
  <bean class="com.host.app.web.interceptor.AllInterceptor"/> 
  <mvc:interceptor> 
    <mvc:mapping path="/test/number.do"/> 
    <!-- 定義在mvc:interceptor下面的表示是對(duì)特定的請(qǐng)求才進(jìn)行攔截的 --> 
    <bean class="com.host.app.web.interceptor.LoginInterceptor"/> 
  </mvc:interceptor> 
</mvc:interceptors> 

由上面的示例可以看出可以利用mvc:interceptors標(biāo)簽聲明一系列的攔截器,然后它們就可以形成一個(gè)攔截器鏈,攔截器的執(zhí)行順序是按聲明的先后順序執(zhí)行的,先聲明的攔截器中的preHandle方法會(huì)先執(zhí)行,然而它的postHandle方法和afterCompletion方法卻會(huì)后執(zhí)行。

在mvc:interceptors標(biāo)簽下聲明interceptor主要有兩種方式:

(1)直接定義一個(gè)Interceptor實(shí)現(xiàn)類(lèi)的bean對(duì)象。使用這種方式聲明的Interceptor攔截器將會(huì)對(duì)所有的請(qǐng)求進(jìn)行攔截。

(2)使用mvc:interceptor標(biāo)簽進(jìn)行聲明。使用這種方式進(jìn)行聲明的Interceptor可以通過(guò)mvc:mapping子標(biāo)簽來(lái)定義需要進(jìn)行攔截的請(qǐng)求路徑。 

經(jīng)過(guò)上述兩步之后,定義的攔截器就會(huì)發(fā)生作用對(duì)特定的請(qǐng)求進(jìn)行攔截了。

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

相關(guān)文章

  • Java?NIO實(shí)現(xiàn)聊天系統(tǒng)

    Java?NIO實(shí)現(xiàn)聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java?NIO實(shí)現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 使用javaMail實(shí)現(xiàn)發(fā)送郵件

    使用javaMail實(shí)現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了使用javaMail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序詳解

    Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序詳解

    在Java項(xiàng)目中可能會(huì)遇到給出一些條件,將List元素按照給定條件進(jìn)行排序的情況,這篇文章主要給大家介紹了關(guān)于Java如何根據(jù)實(shí)體指定字段值對(duì)其List進(jìn)行排序的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié)

    Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié)

    這篇文章主要介紹了Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java Swing的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    這篇文章主要介紹了IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Jmeter對(duì)接口測(cè)試入?yún)?shí)現(xiàn)MD5加密

    Jmeter對(duì)接口測(cè)試入?yún)?shí)現(xiàn)MD5加密

    這篇文章主要介紹了Jmeter對(duì)接口測(cè)試入?yún)?shí)現(xiàn)MD5加密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java web開(kāi)發(fā)中大量數(shù)據(jù)導(dǎo)出Excel超時(shí)(504)問(wèn)題解決

    java web開(kāi)發(fā)中大量數(shù)據(jù)導(dǎo)出Excel超時(shí)(504)問(wèn)題解決

    開(kāi)發(fā)測(cè)試時(shí)候?qū)霐?shù)據(jù)遇到大數(shù)據(jù)導(dǎo)入的問(wèn)題,整理了下,需要的朋友可以參考下
    2017-04-04
  • Java中多態(tài)性的實(shí)現(xiàn)方式

    Java中多態(tài)性的實(shí)現(xiàn)方式

    這篇文章主要介紹了Java中多態(tài)性的實(shí)現(xiàn)方式,什么是多態(tài)?通過(guò)簡(jiǎn)單的一道題目幫大家理解java多態(tài)性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java中的GC收集器詳情

    java中的GC收集器詳情

    這篇文章主要介紹了java中的GC收集器,GC(Garbage collection )指的是程序內(nèi)存管理分手動(dòng)和自動(dòng),手動(dòng)內(nèi)存管理,需要我們編程的時(shí)候顯式分配和釋放空間,但如果忘記釋放,會(huì)造成嚴(yán)重的內(nèi)存泄漏問(wèn)題,下面文章內(nèi)容我們就來(lái)實(shí)例說(shuō)明情況,需要的朋友可以參考一下
    2021-10-10
  • JAVA中Collections工具類(lèi)sort()排序方法

    JAVA中Collections工具類(lèi)sort()排序方法

    這篇文章主要介紹了JAVA中Collections工具類(lèi)sort()排序方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-11-11

最新評(píng)論

南投县| 南充市| 越西县| 潮安县| 小金县| 桃园市| 钟山县| 新巴尔虎左旗| 综艺| 东莞市| 探索| 周口市| 廊坊市| 师宗县| 扎鲁特旗| 湘西| 衡东县| 香河县| SHOW| 普兰店市| 邹平县| 拉孜县| 达尔| 祁门县| 烟台市| 章丘市| 平舆县| 萨迦县| 莲花县| 安远县| 芜湖县| 诏安县| 林口县| 信丰县| 东辽县| 泸西县| 和政县| 彭州市| 吉木萨尔县| 玉屏| 宜丰县|