日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

springboot + shiro 權限注解、統一異常處理、請求亂碼解決

前篇

后臺權限管理系統

20200808新版本更新

版本升級及內容優化版本,改動內容:

版本更新,springboot從1.5+升級到2.1+;

權限緩存使用redis;

驗證碼使用redis;

權限驗證完善。

相關:

基于前篇,新增功能:

新增shiro權限注解;

請求亂碼問題解決;

統一異常處理。

源碼已集成到項目中:

shiro注解的使用

shiro權限注解

Shiro 提供了相應的注解用于權限控制,如果使用這些注解就需要使用AOP 的功能來進行判斷,如Spring AOP;Shiro 提供了Spring AOP 集成用于權限注解的解析和驗證。

@RequiresAuthentication

表示當前Subject已經通過login 進行了身份驗證;即Subject.isAuthenticated()返回true。

@RequiresUser

表示當前Subject已經身份驗證或者通過記住我登錄的。

@RequiresGuest

表示當前Subject沒有身份驗證或通過記住我登錄過,即是游客身份。

@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)

@RequiresRoles(value={“admin”})

@RequiresRoles({“admin“})

表示當前Subject需要角色admin 和user。

@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR)

表示當前Subject需要權限user:a或user:b。

Shiro的認證注解處理是有內定的處理順序的,如果有多個注解的話,前面的通過了會繼續檢查后面的,若不通過則直接返回,處理順序依次為(與實際聲明順序無關):

RequiresRoles

RequiresPermissions

RequiresAuthentication

RequiresUser

RequiresGuest

以上注解既可以用在controller中,也可以用在service中使用;

建議將shiro注解放在controller中,因為如果service層使用了spring的事物注解,那么shiro注解將無效。

shiro權限注解springAOP配置

shiro權限注解要生效,必須配置springAOP通過設置shiro的SecurityManager進行權限驗證。

/**

*

* @描述:開啟Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP掃描使用Shiro注解的類,并在必要時進行安全邏輯驗證

* 配置以下兩個bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可實現此功能

* Enable Shiro Annotations for Spring-configured beans. Only run after the lifecycleBeanProcessor(保證實現了Shiro內部lifecycle函數的bean執行) has run

* 不使用注解的話,可以注釋掉這兩個配置

* @創建人:wyait

* @創建時間:2018年5月21日 下午6:07:56

* @return

*/

@Bean

public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {

DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();

advisorAutoProxyCreator.setProxyTargetClass(true);

return advisorAutoProxyCreator;

}

@Bean

public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {

AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();

authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());

return authorizationAttributeSourceAdvisor;

}

springboot異常處理原理

場景:當用戶正常訪問網站時,因為某種原因后端出現exception的時候,直接暴露異常信息或頁面顯示給用戶;

這種操作體驗不是我們想要的。所以要對異常進行統一管理,能提高用戶體驗的同時,后臺能詳細定位到異常的問題點。

springboot異常概況

Spring Boot提供了默認的統一錯誤頁面,這是Spring MVC沒有提供的。在理解了Spring Boot提供的錯誤處理相關內容之后,我們可以方便的定義自己的錯誤返回的格式和內容。

編寫by zero異常

在home頁面,手動創建兩個異常:普通異常和異步異常!

前端頁面:

普通請求異常:

點擊

ajax異步請求異常:

點擊

...

//js代碼

function ajaxError(){

$.get("/error/ajaxError",function(data){

layer.alert(data);

});

}

后端代碼:

/**

*

* @描述:普通請求異常

* @創建人:wyait

* @創建時間:2018年5月24日 下午5:30:50

*/

@RequestMapping("getError")

public void toError(){

System.out.println(1/0);

}

/**

*

* @描述:異步異常

* @創建人:wyait

* @創建時間:2018年5月24日 下午5:30:39

*/

@RequestMapping("ajaxError")

@ResponseBody

public String ajaxError(){

System.out.println(1/0);

return "異步請求成功!";

}

異常效果

普通異常:

console錯誤信息:

[2018-05-25 09:30:04.669][http-nio-8077-exec-8][ERROR][org.apache.juli.logging.DirectJDKLog][181]:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ArithmeticException: / by zero] with root cause

java.lang.ArithmeticException: / by zero

at com.wyait.manage.web.error.IndexErrorController.toError(IndexErrorController.java:18) ~[classes/:?]

...

at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

...

[2018-05-25 09:30:04.676][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.handler.AbstractHandlerMethodMapping][317]:Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]

[2018-05-25 09:30:04.676][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.handler.AbstractHandlerMethodMapping][317]:Returning handler method [public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]

[2018-05-25 09:30:04.676][http-nio-8077-exec-8][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'basicErrorController'

[2018-05-25 09:30:04.676][http-nio-8077-exec-8][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'basicErrorController'

...

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.view.ContentNegotiatingViewResolver][263]:Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html])

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.view.ContentNegotiatingViewResolver][263]:Requested media types are [text/html, text/html;q=0.8] based on Accept header types and producible media types [text/html])

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'error'

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'error'

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.view.ContentNegotiatingViewResolver][338]:Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@6ffd99fb] based on requested media type 'text/html'

[2018-05-25 09:30:04.686][http-nio-8077-exec-8][DEBUG][org.springframework.web.servlet.view.ContentNegotiatingViewResolver][338]:Returning [org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$SpelView@6ffd99fb] based on requested media type 'text/html'

...

通過日志可知,springboot返回的錯誤頁面,是通過:org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml處理返回ModelAndView。

異步異常:

console日志信息:

[2018-05-25 09:31:19.958][http-nio-8077-exec-6][ERROR][org.apache.juli.logging.DirectJDKLog][181]:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ArithmeticException: / by zero] with root cause

java.lang.ArithmeticException: / by zero

at com.wyait.manage.web.error.IndexErrorController.ajaxError(IndexErrorController.java:29) ~[classes/:?]

...

at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

...

[2018-05-25 09:31:19.960][http-nio-8077-exec-6][DEBUG][org.springframework.web.servlet.handler.AbstractHandlerMethodMapping][317]:Returning handler method [public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)]

[2018-05-25 09:31:19.960][http-nio-8077-exec-6][DEBUG][org.springframework.web.servlet.handler.AbstractHandlerMethodMapping][317]:Returning handler method [public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)]

[2018-05-25 09:31:19.960][http-nio-8077-exec-6][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'basicErrorController'

[2018-05-25 09:31:19.960][http-nio-8077-exec-6][DEBUG][org.springframework.beans.factory.support.AbstractBeanFactory][251]:Returning cached instance of singleton bean 'basicErrorController'

...

[2018-05-25 09:31:19.961][http-nio-8077-exec-6][DEBUG][org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor][234]:Written [{timestamp=Fri May 25 09:31:19 CST 2018, status=500, error=Internal Server Error, exception=java.lang.ArithmeticException, message=/ by zero, path=/error/ajaxError}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2729eae5]

[2018-05-25 09:31:19.961][http-nio-8077-exec-6][DEBUG][org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor][234]:Written [{timestamp=Fri May 25 09:31:19 CST 2018, status=500, error=Internal Server Error, exception=java.lang.ArithmeticException, message=/ by zero, path=/error/ajaxError}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2729eae5]

[2018-05-25 09:31:19.961][http-nio-8077-exec-6][DEBUG][org.springframework.web.servlet.DispatcherServlet][1048]:Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling

...

通過日志可知,springboot返回的錯誤信息,是通過:org.springframework.boot.autoconfigure.web.BasicErrorController.error處理返回ResponseEntity。

異常都是通過org.springframework.boot.autoconfigure.web.BasicErrorController控制處理的。

springboot異常處理解析

查看org.springframework.boot.autoconfigure.web包下面的類,跟蹤springboot對error異常處理機制。自動配置通過一個MVC error控制器處理錯誤

通過spring-boot-autoconfigure引入

查看springboot 處理error的類

springboot的自動配置,在web中處理error相關的自動配置類:ErrorMvcAutoConfiguration。查看與處理error相關的類:

ErrorMvcAutoConfiguration.class

ErrorAttibutes.class

ErrorController.class

ErrorProperties.class

ErrorViewResolver.class

...

ErrorAutoConfiguration類源碼//TODO

ErrorAutoConfiguration注冊的bean

//4個BEAN

@Bean

@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)

public DefaultErrorAttributes errorAttributes() {

return new DefaultErrorAttributes();

}

@Bean

@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)

public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {

return new BasicErrorController(errorAttributes, this.serverProperties.getError(),

this.errorViewResolvers);

}

@Bean

public ErrorPageCustomizer errorPageCustomizer() {

return new ErrorPageCustomizer(this.serverProperties);

}

@Bean

public static PreserveErrorControllerTargetClassPostProcessor preserveErrorControllerTargetClassPostProcessor() {

return new PreserveErrorControllerTargetClassPostProcessor();

}

DefaultErrorAttributes類

@Order(Ordered.HIGHEST_PRECEDENCE)

public class DefaultErrorAttributes

implements ErrorAttributes, HandlerExceptionResolver, Ordered {

...

}

ErrorAttributes:

public interface ErrorAttributes {

Map getErrorAttributes(RequestAttributes requestAttributes,

boolean includeStackTrace);

Throwable getError(RequestAttributes requestAttributes);

}

HandlerExceptionResolver:

public interface HandlerExceptionResolver {

/**

* Try to resolve the given exception that got thrown during handler execution,

* returning a {@link ModelAndView} that represents a specific error page if appropriate.

*/

ModelAndView resolveException(

HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

}

DefaultErrorAttributes類:

實現了ErrorAttributes接口,當處理/error錯誤頁面時,可以在該bean中讀取錯誤信息響應返回;

實現了HandlerExceptionResolver接口。

debug跟蹤源碼:即DispatcherServlet在doDispatch過程中有異常拋出時:

一. 先由HandlerExceptionResolver.resolveException解析異常并保存在request中;

二. 再DefaultErrorAttributes.getErrorAttributes處理;DefaultErrorAttributes在處理過程中,從request中獲取錯誤信息,將錯誤信息保存到RequestAttributes中;

三. 最后在獲取錯誤信息getError(RequestAttributes)時,從RequestAttributes中取到錯誤信息。

BasicErrorController類

@Controller

@RequestMapping("${server.error.path:${error.path:/error}}")

public class BasicErrorController extends AbstractErrorController {

private final ErrorProperties errorProperties;

...

@RequestMapping(produces = "text/html")

public ModelAndView errorHtml(HttpServletRequest request,

HttpServletResponse response) {

HttpStatus status = getStatus(request);

Map model = Collections.unmodifiableMap(getErrorAttributes(

request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));

response.setStatus(status.value());

ModelAndView modelAndView = resolveErrorView(request, response, status, model);

return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);

}

@RequestMapping

@ResponseBody

public ResponseEntity> error(HttpServletRequest request) {

Map body = getErrorAttributes(request,

isIncludeStackTrace(request, MediaType.ALL));

HttpStatus status = getStatus(request);

return new ResponseEntity>(body, status);

}

...

}

resolveErrorView方法(查找=error/“錯誤狀態碼”;的資源):

如果不是異常請求,會執行resolveErrorView方法;該方法會先在默認或配置的靜態資源路徑下查找error/HttpStatus(錯誤狀態碼)的資源文件,如果沒有;使用默認的error頁面。

public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {

...

@Override

public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,

Map model) {

//status:異常錯誤狀態碼

ModelAndView modelAndView = resolve(String.valueOf(status), model);

if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {

modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);

}

return modelAndView;

}

private ModelAndView resolve(String viewName, Map model) {

//視圖名稱,默認是error/+“status”錯誤狀態碼;比如:error/500、error/404

String errorViewName = "error/" + viewName;

TemplateAvailabilityProvider provider = this.templateAvailabilityProviders

.getProvider(errorViewName, this.applicationContext);

if (provider != null) {

return new ModelAndView(errorViewName, model);

}

return resolveResource(errorViewName, model);

}

//在資源文件中查找error/500或error/404等頁面

private ModelAndView resolveResource(String viewName, Map model) {

for (String location : this.resourceProperties.getStaticLocations()) {

try {

Resource resource = this.applicationContext.getResource(location);

resource = resource.createRelative(viewName + ".html");

if (resource.exists()) {

return new ModelAndView(new HtmlResourceView(resource), model);

}

}

catch (Exception ex) {

}

}

return null;

}

...

}

BasicErrorController根據Accept頭的內容,輸出不同格式的錯誤響應。比如針對瀏覽器的請求生成html頁面,針對其它請求生成json格式的返回。

可以通過配置error/HttpStatus頁面實現自定義錯誤頁面。

ErrorPageCustomizer類

/**

* {@link EmbeddedServletContainerCustomizer} that configures the container's error

* pages.

*/

private static class ErrorPageCustomizer implements ErrorPageRegistrar, Ordered {

private final ServerProperties properties;

protected ErrorPageCustomizer(ServerProperties properties) {

this.properties = properties;

}

@Override

public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {

ErrorPage errorPage = new ErrorPage(this.properties.getServletPrefix()

+ this.properties.getError().getPath());

errorPageRegistry.addErrorPages(errorPage);

}

@Override

public int getOrder() {

return 0;

}

}

將錯誤頁面注冊到內嵌的tomcat的servlet容器中。

PreserveErrorControllerTargetClassPostProcessor實現BeanFactoryPostProcessor接口,可以修改BEAN的配置信息

ErrorAutoConfiguration內的兩個配置

//2個config配置

@Configuration

static class DefaultErrorViewResolverConfiguration {

private final ApplicationContext applicationContext;

private final ResourceProperties resourceProperties;

DefaultErrorViewResolverConfiguration(ApplicationContext applicationContext,

ResourceProperties resourceProperties) {

this.applicationContext = applicationContext;

this.resourceProperties = resourceProperties;

}

@Bean

@ConditionalOnBean(DispatcherServlet.class)

@ConditionalOnMissingBean

public DefaultErrorViewResolver conventionErrorViewResolver() {

return new DefaultErrorViewResolver(this.applicationContext,

this.resourceProperties);

}

}

@Configuration

@ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true)

@Conditional(ErrorTemplateMissingCondition.class)

protected static class WhitelabelErrorViewConfiguration {

private final SpelView defaultErrorView = new SpelView(

"

Whitelabel Error Page

"

+ "

This application has no explicit mapping for /error, so you are seeing this as a fallback.

"

+ "

${timestamp}"

+ "

There was an unexpected error (type=${error}, status=${status})."

+ "

${message}");

@Bean(name = "error")

@ConditionalOnMissingBean(name = "error")

public View defaultErrorView() {

return this.defaultErrorView;

}

// If the user adds @EnableWebMvc then the bean name view resolver from

// WebMvcAutoConfiguration disappears, so add it back in to avoid disappointment.

@Bean

@ConditionalOnMissingBean(BeanNameViewResolver.class)

public BeanNameViewResolver beanNameViewResolver() {

BeanNameViewResolver resolver = new BeanNameViewResolver();

resolver.setOrder(Ordered.LOWEST_PRECEDENCE - 10);

return resolver;

}

}

DefaultErrorViewResolverConfiguration:默認的error視圖解析配置;

WhitelabelErrorViewConfiguration:默認設置了/error的頁面,和Whitelabel Error Page頁面響應內容。

如果Spring MVC在處理業務的過程中拋出異常,會被 Servlet 容器捕捉到,Servlet 容器再將請求轉發給注冊好的異常處理映射 /error 做響應處理。

springboot配置文件默認error相關配置

springboot配置文件application.properties中關于error默認配置:

server.error.include-stacktrace=never # When to include a "stacktrace" attribute.

server.error.path=/error # Path of the error controller.

server.error.whitelabel.enabled=true # Enable the default error page displayed in browsers in case of a server error.

springboot 自定義異常處理

通過跟蹤springboot對異常處理得源碼跟蹤,根據業務需要,可以細分前端響應的錯誤頁面,也可以統一使用/error頁面+錯誤提示信息進行處理。

根據自己的需求自定義異常處理機制;具體可實施的操作如下:

可以通過配置error/HttpStatus(錯誤狀態碼)頁面實現自定義錯誤頁面【底層實現,詳見:BasicErrorController源碼】;

可以實現BasicErrorController,自定義普通請求的異常頁面響應信息和異步請求的響應信息,統一使用/error頁面進行錯誤響應提示;

自定義實現ErrorAttributes接口,覆蓋DefaultErrorAttributes實現,或是繼承DefaultErrorAttributes類,重寫里面的方法【TODO,不推薦】。

1和2的方法可單獨使用,也可以結合使用。

自定義異常頁面

可以根據不同的錯誤狀態碼,在前端細分不同的響應界面給用戶進行提示;資源路徑必須是:靜態資源路徑下/error/HttpStats(比如:/error/404等)

自定義異常頁面

404友情提示

訪問的資源未找到(404)

404.html

500.html等,這里只演示404。

統一異常處理

普通請求,前端使用error頁面+自定義錯誤響應信息;

其他請求(異步),統一自定義錯誤響應信息,規范處理異步響應的錯誤判斷和處理。

使用springMVC注解ControllerAdvice

/**

*

* @項目名稱:wyait-manage

* @類名稱:GlobalExceptionHandler

* @類描述:統一異常處理,包括【普通調用和ajax調用】

* ControllerAdvice來做controller內部的全局異常處理,但對于未進入controller前的異常,該處理方法是無法進行捕獲處理的,SpringBoot提供了ErrorController的處理類來處理所有的異常(TODO)。

* 1.當普通調用時,跳轉到自定義的錯誤頁面;2.當ajax調用時,可返回約定的json數據對象,方便頁面統一處理。

* @創建人:wyait

* @創建時間:2018年5月22日 上午11:44:55

* @version:

*/

@ControllerAdvice

public class GlobalExceptionHandler {

private static final Logger logger = LoggerFactory

.getLogger(GlobalExceptionHandler.class);

public static final String DEFAULT_ERROR_VIEW = "error";

/**

*

* @描述:針對普通請求和ajax異步請求的異常進行處理

* @創建人:wyait

* @創建時間:2018年5月22日 下午4:48:58

* @param req

* @param e

* @return

* @throws Exception

*/

@ExceptionHandler(value = Exception.class)

@ResponseBody

public ModelAndView errorHandler(HttpServletRequest request,

HttpServletResponse response, Exception e) {

logger.debug(getClass().getName() + ".errorHandler】統一異常處理:request="+request);

ModelAndView mv=new ModelAndView();

logger.info(getClass().getName() + ".errorHandler】統一異常處理:"+e.getMessage());

//1 獲取錯誤狀態碼

HttpStatus httpStatus=getStatus(request);

logger.info(getClass().getName() + ".errorHandler】統一異常處理!錯誤狀態碼httpStatus:"+httpStatus);

//2 返回錯誤提示

ExceptionEnum ee=getMessage(httpStatus);

//3 將錯誤信息放入mv中

mv.addObject("type", ee.getType());

mv.addObject("code", ee.getCode());

mv.addObject("msg", ee.getMsg());

if(!ShiroFilterUtils.isAjax(request)){

//不是異步請求

mv.setViewName(DEFAULT_ERROR_VIEW);

logger.debug(getClass().getName() + ".errorHandler】統一異常處理:普通請求。");

}

logger.debug(getClass().getName() + ".errorHandler】統一異常處理響應結果:MV="+mv);

return mv;

}

...

}

運行測試:先走GlobalExceptionHandler(使用注解@ControllerAdvice)類里面的方法,而后又執行了BasicErrorController方法;被springboot自帶的BasicErrorController覆蓋。

實現springboot的AbstractErrorController

自定義實現AbstractErrorController,添加響應的錯誤提示信息。

@RequestMapping(produces = "text/html")

public ModelAndView errorHtml(HttpServletRequest request,

HttpServletResponse response) {

ModelAndView mv = new ModelAndView(ERROR_PATH);

/** model對象包含了異常信息 */

Map model = getErrorAttributes(request,

isIncludeStackTrace(request, MediaType.TEXT_HTML));

// 1 獲取錯誤狀態碼(也可以根據異常對象返回對應的錯誤信息)

HttpStatus httpStatus = getStatus(request);

// 2 返回錯誤提示

ExceptionEnum ee = getMessage(httpStatus);

Result result = new Result(

String.valueOf(ee.getType()), ee.getCode(), ee.getMsg());

// 3 將錯誤信息放入mv中

mv.addObject("result", result);

logger.info("統一異常處理【" + getClass().getName()

+ ".errorHtml】統一異常處理!錯誤信息mv:" + mv);

return mv;

}

@RequestMapping

@ResponseBody

//設置響應狀態碼為:200,結合前端約定的規范處理。也可不設置狀態碼,前端ajax調用使用error函數進行控制處理

@ResponseStatus(value=HttpStatus.OK)

public Result error(HttpServletRequest request, Exception e) {

/** model對象包含了異常信息 */

Map model = getErrorAttributes(request,

isIncludeStackTrace(request, MediaType.TEXT_HTML));

// 1 獲取錯誤狀態碼(也可以根據異常對象返回對應的錯誤信息)

HttpStatus httpStatus = getStatus(request);

// 2 返回錯誤提示

ExceptionEnum ee = getMessage(httpStatus);

Result result = new Result(

String.valueOf(ee.getType()), ee.getCode(), ee.getMsg());

// 3 將錯誤信息返回

// ResponseEntity

logger.info("統一異常處理【" + getClass().getName()

+ ".error】統一異常處理!錯誤信息result:" + result);

return result;

}

針對異步請求,統一指定響應狀態碼:200;也可以不指定,前端在處理異步請求的時候,可以通過ajax的error函數進行控制。

這里是繼承的AbstractErrorController類,自定義實現統一異常處理,也可以直接實現ErrorController接口。

前端ajax異步統一處理:

通過約定,前端ajax異步請求,進行統一的錯誤處理。

/**

* 針對不同的錯誤可結合業務自定義處理方式

* @param result

* @returns {Boolean}

*/

function isError(result){

var flag=true;

if(result && result.status){

flag=false;

if(result.status == '-1' || result.status=='-101' || result.status=='400' || result.status=='404' || result.status=='500'){

layer.alert(result.data);

}else if(result.status=='403'){

layer.alert(result.data,function(){

//跳轉到未授權界面

window.location.href="/403";

});

}

}

return flag;//返回true

}

使用方式:

...

success:function(data){

//異常過濾處理

if(isError(data)){

alert(data);

}

},

...

error.html頁面:

出錯了

()

測試效果

普通請求:

異步請求:

線上get請求亂碼

問題描述

前臺通過html頁面,發送請求到后臺查詢數據,在日志中打印的sql語句顯示傳入的參數亂碼:

SELECT ...

[2018-05-11 09:15:00.582][http-bio-8280-exec-2][DEBUG][org.apache.ibatis.logging.jdbc.BaseJdbcLogger][159]:==> Parameters: 1(Integer), ?è′o(String)

[2018-05-11 09:15:00.585][http-bio-8280-exec-2][DEBUG][org.apache.ibatis.logging.jdbc.BaseJdbcLogger][159]:<== Total: 1

...

本地windows開發環境測試沒有亂碼問題;

請求信息

前端頁面發送get請求,瀏覽器默認對get請求路徑進行URL編碼處理。

后臺Controller打印的日志

分頁查詢用戶列表!搜索條件:userSearch:UserSearchDTO{page=1, limit=10, uname='??', umobile='', insertTimeStart='', insertTimeEnd=''},page:1,每頁記錄數量limit:10,請求編碼:UTF-8

Controller層在接收到這個uname參數時,已經是亂碼,ISO-8859-1解碼后的結果。

請求參數編碼流程

前端頁面發送get請求,瀏覽器默認在中文的UTF-8后加上上%得到URL編碼,比如:%e8%b4%b9%e7...;

get請求到tomcat應用服務器后,會以默認的ISO-8859-1進行解碼;

在controller中,接收到的是經過URL編碼和iso-8859-1解碼后的參數值。

具體編碼細節:TODO

解決方案

項目編碼配置【可以不配置】

開發前,默認必須統一編碼環境;正常都是設置為utf-8。

spring boot 與spring mvc不同,在web應用中,spring boot默認的編碼格式為UTF-8,而spring mvc的默認編碼格式為iso-8859-1。

spring boot項目中如果沒有特殊需求,該編碼不需要修改。如果要強制其他編碼格式,spring boot提供了設置方式:

通過application.properties配置文件設置:

# 默認utf-8配置

spring.http.encoding.force=true

spring.http.encoding.charset=UTF-8

spring.http.encoding.enabled=true

server.tomcat.uri-encoding=UTF-8

此時攔截器中返回的中文已經不亂碼了,但是controller中返回的數據可能會依舊亂碼。

參考spring MVC的方式,自定義實現WebMvcConfigurerAdapter類,處理響應數據亂碼問題:

@Bean

public HttpMessageConverter responseBodyConverter() {

StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));

return converter;

}

@Override

public void configureMessageConverters(List> converters) {

super.configureMessageConverters(converters);

converters.add(responseBodyConverter());

}

也可以在controller方法@RequestMapping上添加:

produces="text/plain;charset=UTF-8"

這種方法的弊端是限定了數據類型。

亂碼解決方案

表單采用get方式提交,中文亂碼解決方案:

改為post請求;

手動編解碼:

param = new String(param.getBytes("iso8859-1"), "utf-8");

修改tomcat配置server.xml文件:

找到如下代碼:

在這里添加一個屬性:URIEncoding,將該屬性值設置為UTF-8,即可讓Tomcat(默認ISO-8859-1編碼)以UTF-8的編碼處理get請求。

修改完成后:

發送get請求前,瀏覽器中兩次URL編碼:

兩次編碼兩次解碼的過程為:

==UTF-8編碼->UTF-8(iso-8859-1)編碼->iso-8859-1解碼->UTF-8解碼,編碼和解碼的過程是對稱的,所以不會出現亂碼。==

//js代碼

param = encodeURI(param);

// alert("第一次URL編碼:" + param);

param = encodeURI(param);

// alert("第二次URL編碼:" + param);

后臺代碼:

//兩次解碼

URLDecoder.decode(URLDecoder.decode(param,"utf-8"),"utf-8");

總結

以上四種解決方案,可結合具體情況進行使用。

no session異常

異常日志1:

[2018-05-21 18:00:51.574][http-nio-8280-exec-6][DEBUG][org.apache.shiro.web.servlet.SimpleCookie][389]:Found 'SHRIOSESSIONID' cookie value [fc6b7b64-6c59-4f82-853b-e2ca20135b99]

[2018-05-21 18:00:51.575][http-nio-8280-exec-6][DEBUG][org.apache.shiro.mgt.DefaultSecurityManager][447]:Resolved SubjectContext context session is invalid. Ignoring and creating an anonymous (session-less) Subject instance.

org.apache.shiro.session.UnknownSessionException: There is no session with id [fc6b7b64-6c59-4f82-853b-e2ca20135b99]

at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170) ~[shiro-all-1.3.1.jar:1.3.1]

異常日志2【偶爾出現】:

Caused by: javax.crypto.BadPaddingException: Given final block not properly padded

at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811) ~[sunjce_provider.jar:1.7.0_85]

UnknownSessionException

UnknownSessionException: There is no session with id [...]

原因

結合項目配置,分析問題原因:

1,用戶退出后,瀏覽器中的SHIROSESSIONID依然存在;

2,再次發送請求時,攜帶SHIROSESSIONID,會在shiro的DefaultWebSecurityManager.getSessionKey(context)中,逐層跟蹤對應在sessionManager中session值,沒有的話,最終在AbstractSessionDAO.readSession(sessionID)中拋出異常。

解決方案

在程序中退出的地方,清除cookie:

//刪除cookie

Cookie co = new Cookie("username", "");

co.setMaxAge(0);// 設置立即過期

co.setPath("/");// 根目錄,整個網站有效

servletResponse.addCookie(co);

設置SimpleCookie的過期時間,和session、ehcache緩存時間保持一致;

@Bean

public SimpleCookie sessionIdCookie() {

//DefaultSecurityManager

SimpleCookie simpleCookie = new SimpleCookie();

//如果在Cookie中設置了"HttpOnly"屬性,那么通過程序(JS腳本、Applet等)將無法讀取到Cookie信息,這樣能防止XSS×××。

simpleCookie.setHttpOnly(true);

simpleCookie.setName("SHRIOSESSIONID");

simpleCookie.setMaxAge(86400000*3);

return simpleCookie;

}

手動實現shiro的logout方法,清除瀏覽器cookie;

重寫AbstractSessionDAO.readSession方法,如果session為null,清空瀏覽器cookie;

不做處理;實際項目運行中,不影響功能執行。

源碼

源碼已集成到項目中:

前篇

20200808新版本更新

版本升級及內容優化版本,改動內容:

版本更新,springboot從1.5+升級到2.1+;

權限緩存使用redis;

驗證碼使用redis;

權限驗證完善。

總結

以上是生活随笔為你收集整理的log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品欧美乱码久久久久久 | www.香蕉视频在线观看 | 国产美女网站在线观看 | 亚洲免费观看视频 | 欧美日韩国产一区 | 五月激情姐姐 | 人人看人人爱 | 国偷自产中文字幕亚洲手机在线 | 五月天亚洲综合小说网 | 81精品国产乱码久久久久久 | 99视频精品免费观看, | 综合天堂av久久久久久久 | 日韩簧片在线观看 | 国产一卡久久电影永久 | 99操视频 | 国产一区二区三区免费视频 | av一级网站 | 亚洲精品国偷拍自产在线观看蜜桃 | 中国一级片在线观看 | 天天干,天天射,天天操,天天摸 | 亚洲成人xxx| 中文字幕色播 | 91大神一区二区三区 | 免费视频黄色 | 成人av资源网| 超碰在线网 | 99 色 | 国产亚洲久一区二区 | 在线91精品| 亚洲高清视频在线观看 | 欧美成人精品三级在线观看播放 | 亚洲国产精品第一区二区 | 日韩网站一区二区 | 久久精品国产一区二区三区 | 人人爽人人爽人人 | 手机在线中文字幕 | 午夜精品久久久久久久99无限制 | 免费亚洲视频在线观看 | 99麻豆久久久国产精品免费 | 中文字幕有码在线观看 | 国产高清不卡在线 | 成人h动漫精品一区二 | 国产成人精品亚洲日本在线观看 | 久久国产精品区 | 欧美老女人xx | 久久精品中文 | 精品一区二区三区久久久 | 国产精品嫩草影视久久久 | 国产网站在线免费观看 | 日韩有码中文字幕在线 | 97在线免费视频 | 色婷婷在线视频 | 51久久成人国产精品麻豆 | 99视频在线免费看 | 在线日本v二区不卡 | 91av小视频 | 九色精品免费永久在线 | 婷婷久久网站 | 精品国产伦一区二区三区 | 九九九热精品 | 成 人 黄 色 视频免费播放 | 91丨九色丨国产丨porny精品 | 五月婷在线观看 | 久久久久国产一区二区 | 国产欧美中文字幕 | 国产精品高潮呻吟久久av无 | 91在线www | 欧美一级性生活片 | 青青啪 | 亚洲精品美女 | 九九99 | 一区二区丝袜 | 91九色porn在线资源 | 一区二区三区免费在线观看视频 | 狠狠干天天 | 日韩视频一区二区在线 | 国产伦精品一区二区三区照片91 | 亚洲精品一区二区三区高潮 | 福利在线看片 | 国产成人精品不卡 | 一区二区三区在线不卡 | 国产亚洲精品美女久久 | 亚洲精品成人av在线 | 福利视频网址 | 成人看片 | 91在线视频一区 | www.国产视频| 色国产精品一区在线观看 | 国产手机在线精品 | 韩日精品在线 | 国内精品久久久久影院一蜜桃 | 日韩乱码在线 | 国内精品久久久久久久影视麻豆 | 美女精品 | 91精品一区二区在线观看 | 国产精品永久久久久久久www | 99精品欧美一区二区三区黑人哦 | 玖玖爱国产在线 | ,午夜性刺激免费看视频 | 91久久精品一区二区三区 | 特级黄色一级 | 91黄色在线看 | 日韩精品一区二区三区三炮视频 | 欧美日韩一级在线 | 国产免费一区二区三区最新6 | 99久久久久久久久久 | 在线黄色av电影 | 黄视频网站大全 | 成人h在线播放 | 五月婷婷综合在线 | sm免费xx网站 | 午夜精品久久久久久久久久 | 国产黄影院色大全免费 | 久久久亚洲国产精品麻豆综合天堂 | 色香网| 中文字幕在线色 | 久久九九九九 | 人人看人人草 | 97超碰在线资源 | 在线亚洲观看 | 国产无限资源在线观看 | 国产精品成人久久久久 | 久久久久久97三级 | 日韩三区在线观看 | 欧美精彩视频在线观看 | 色资源二区在线视频 | 国产精品观看视频 | 麻豆国产精品一区二区三区 | 81国产精品久久久久久久久久 | 午夜在线资源 | 国产成人区 | 激情av五月婷婷 | 波多野结衣亚洲一区二区 | 丁香综合激情 | 国产乱对白刺激视频不卡 | 91在线公开视频 | 91一区二区三区久久久久国产乱 | 福利区在线观看 | 婷婷5月色 | 一区二区三区精品在线视频 | 日韩中文字幕视频在线 | 久久免费视频8 | 伊人官网 | 国产一区二区久久精品 | 久久不射影院 | 国产精品久久久久久久久费观看 | 在线观看视频日韩 | 在线看中文字幕 | 五月婷婷丁香激情 | 四虎欧美 | 伊人天天狠天天添日日拍 | 中文字幕av在线免费 | 五月天婷婷免费视频 | 午夜美女网站 | 精品国产视频在线 | 午夜色影院| 日韩性色 | 久久久久久久影院 | 欧美日韩国产区 | 国产黄色片免费 | 少妇自拍av| 日本黄色大片免费看 | 欧美一级特黄aaaaaa大片在线观看 | 亚洲视频一区二区三区在线观看 | 玖玖在线免费视频 | 国产色啪 | 91黄色免费网站 | 中文字幕亚洲五码 | 久久99亚洲精品久久久久 | 黄色软件视频大全免费下载 | 亚洲国产999| 九九三级毛片 | 国产中文字幕国产 | 探花视频在线观看+在线播放 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 一级黄视频 | 天天艹天天 | 在线观影网站 | 欧美a性| 中文字幕精 | 中文字幕免费久久 | 精品字幕 | 欧美日韩一级久久久久久免费看 | 中文字幕在线日 | 久久国产精品免费观看 | 日韩亚洲精品电影 | 美女久久久久久久 | 最近免费中文视频 | 国内精品毛片 | av大全在线观看 | 99精品免费在线观看 | 国产成人a亚洲精品 | 91精品国产91p65| 国产精品欧美久久久久久 | 午夜精品久久久久久久99 | 亚洲国产精品99久久久久久久久 | 黄色91免费观看 | 人人干人人超 | 久久精品4 | av理论电影 | 日韩电影一区二区三区 | 波多野结衣电影久久 | 亚洲成人av一区二区 | 9999免费视频 | 一级黄色av | 国产成人一区二区三区久久精品 | 91成人精品视频 | 国产91亚洲| 亚洲免费观看视频 | 久草在线资源视频 | 97超碰在线久草超碰在线观看 | 又黄又爽的视频在线观看网站 | 在线观看免费视频 | 亚洲h在线播放在线观看h | 69国产盗摄一区二区三区五区 | 国产一区二区影院 | 国产色黄网站 | 久久久久久视频 | 国产一区二区三区免费观看视频 | 又黄又刺激视频 | 在线成人欧美 | av黄在线播放 | 免费观看www视频 | 夜色资源站国产www在线视频 | www.av中文字幕.com| 国产精品福利在线 | 91亚洲欧美激情 | 麻花豆传媒一二三产区 | 日韩av高清 | 国偷自产中文字幕亚洲手机在线 | 人人干人人超 | 精品99久久 | 最近中文字幕在线中文高清版 | 欧美日韩精品在线 | 亚洲精品一区中文字幕乱码 | 米奇影视7777 | 国产成人免费观看久久久 | 国产精品96久久久久久吹潮 | 午夜av在线免费 | 波多野结衣视频一区二区 | 久久精品中文字幕免费mv | 国产精品手机视频 | 婷婷伊人综合亚洲综合网 | 99精品视频网站 | 91亚洲视频在线观看 | 国产精品久久久久久久电影 | 日韩在观看线 | 亚洲高清av| 精品亚洲在线 | 日韩电影在线视频 | 久久综合狠狠综合久久激情 | 在线观看一区 | 国内精品久久久久影院一蜜桃 | 久久在线电影 | 国产午夜麻豆影院在线观看 | 开心激情五月网 | 成年人免费看片网站 | 色综合网 | 五月婷在线播放 | 欧美久久久久久 | 日韩激情视频在线观看 | 99精品在线看 | 亚洲欧美成人 | 国产精品一区二区免费视频 | 欧美日韩高清不卡 | www免费网站在线观看 | 婷婷综合av | 国产精品免费一区二区 | 色先锋av资源中文字幕 | 一区电影 | 国产小视频在线免费观看视频 | 精品视频国产一区 | 精品日韩中文字幕 | 亚洲人人爱 | 久久国产精品99久久久久久丝袜 | 伊人五月综合 | 久久专区 | 91精品国产自产91精品 | 99在线免费视频 | 国产精品色在线 | 伊人在线视频 | 四虎8848免费高清在线观看 | 亚洲高清在线视频 | 日本精品一 | 国产成人黄色 | 丁香九月婷婷 | 国产精品美女久久久久久久 | 最近更新好看的中文字幕 | 91九色精品 | 国产做aⅴ在线视频播放 | 婷婷激情网站 | 欧美成年人在线观看 | 久久久成人精品 | 免费在线精品视频 | 欧美日本在线观看视频 | 日韩视频免费观看高清完整版在线 | 日韩 在线| 国产高清视频免费观看 | 在线观看免费黄色 | 波多野结衣久久资源 | 中文字幕一区二区三区四区视频 | 国产精选在线观看 | 免费在线91 | 国产亚洲精品久久久久久网站 | 久久久国产影视 | 99热这里只有精品久久 | 福利网址在线观看 | 18网站在线观看 | 日韩精品资源 | 视频在线精品 | 国产精品久久二区 | 国产亚州av | 日韩视频三区 | 国产精品男女视频 | 国产不卡在线视频 | 亚洲精品白浆高清久久久久久 | 毛片网在线观看 | 国产伦精品一区二区三区在线 | 国产精品女教师 | 久久综合婷婷国产二区高清 | 黄色一级动作片 | av在线一二三区 | 久久国产香蕉视频 | 深夜免费福利视频 | 日韩一级片大全 | 在线色亚洲 | 精品一二| 91人人澡人人爽人人精品 | 99久久免费看 | 亚洲精品女| 久久精品亚洲精品国产欧美 | 久久成年人 | 色综合久久久久久久久五月 | 欧美激情精品久久久久久免费 | 欧美日韩中文另类 | 夜色资源站国产www在线视频 | 又爽又黄在线观看 | 国产精品久久久av | 欧美日韩视频免费看 | 久久电影日韩 | 日韩激情片在线观看 | 日韩高清毛片 | 黄av免费 | 2022国产精品视频 | 国产中文字幕视频在线 | 久久久久久草 | 精品久久国产 | 在线观看免费版高清版 | 成人免费精品 | 亚洲精品乱码久久久久久9色 | 黄色在线观看免费网站 | 五月婷影院 | 成人va天堂| 天天干天天操天天干 | 日本韩国欧美在线观看 | 精品国产欧美一区二区三区不卡 | 一区二区三区在线视频观看58 | 久草在线99 | 久久超碰97| 免费看片网站91 | jizz18欧美18| 91激情视频在线 | 成人 国产 在线 | 2019中文字幕第一页 | 99热官网| 天天色棕合合合合合合 | 99re国产| 国产精品久久久久久久久久久久午 | 激情欧美日韩一区二区 | 天天操天天操天天操天天操天天操天天操 | 国产精品尤物视频 | 日韩综合一区二区 | 欧美一二三视频 | 91在线播放视频 | 99999精品视频 | 国产日韩中文在线 | 日韩成人中文字幕 | 国产在线观看国语版免费 | www.午夜视频 | 天天插综合| 免费在线黄网 | 成人黄色电影在线观看 | 成人三级网站在线观看 | 夜夜爽88888免费视频4848 | 在线www色| 欧美色操| 亚洲精品成人 | 热久精品| 国产麻豆剧果冻传媒视频播放量 | 精品国产1区2区3区 国产欧美精品在线观看 | 探花视频在线观看免费版 | 成人永久免费 | 午夜久久福利影院 | 在线观看免费av片 | 97超碰人 | 久久久国产日韩 | 精品极品在线 | 992tv又爽又黄的免费视频 | 欧美色久 | 国产精品v欧美精品 | 精品无人国产偷自产在线 | 91九色蝌蚪视频 | 五月激情姐姐 | 亚洲午夜精品一区二区三区电影院 | 国产麻豆精品一区二区 | av综合站 | 99亚洲国产| 99精品视频在线免费观看 | 国产3p视频 | 色在线网| 中文字幕中文 | 91人人干 | 国内精品久久久久影院男同志 | 麻豆果冻剧传媒在线播放 | 午夜精品久久久久久久99 | 欧美日韩国产精品久久 | 人人干人人添 | 国产精品video爽爽爽爽 | 欧美性猛片 | 欧美日本国产在线观看 | 日韩精品一区二区三区第95 | 久久曰视频 | 欧美日韩不卡一区二区三区 | 天天综合色天天综合 | 麻豆视频免费在线 | 精品极品在线 | 久久免费视频7 | 国产免费又黄又爽 | 狠狠插天天干 | 国产精品成人自产拍在线观看 | 国产91精品在线观看 | www.国产在线观看 | 国产专区第一页 | 日韩久久一区二区 | 精品美女国产在线 | 岛国av在线不卡 | 色婷婷成人网 | 日韩91av | 国产一区二区综合 | 精品999在线 | 一级黄色av | 成人黄色免费观看 | 在线观看成人国产 | 一区二区久久久久 | 亚洲精品中文在线 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 成人国产电影在线观看 | 国产福利91精品 | 国产在线精品一区二区 | 在线观看麻豆av | 91精品国产综合久久婷婷香蕉 | 江苏妇搡bbbb搡bbbb | 69久久99精品久久久久婷婷 | 亚洲一级片在线观看 | 亚洲一区二区三区miaa149 | 91在线视频免费观看 | 日韩色在线观看 | 中国一级特黄毛片大片久久 | 91视频 - v11av| 日韩精品欧美精品 | 欧美成年网站 | 国产精品www | 在线国产视频观看 | 成人在线免费观看网站 | 国产亚州精品视频 | 久久dvd | av解说在线观看 | 激情综合五月天 | 欧美男男激情videos | 国产免费激情久久 | 天天操比 | 亚洲精品66 | 久香蕉 | 婷婷丁香在线 | 久草视频观看 | 色综合久久中文综合久久牛 | 亚洲一区久久久 | 最新91在线视频 | 91av在线不卡 | 黄色片网站 | 亚洲国产精品va在线 | 精品国产_亚洲人成在线 | 国产一卡在线 | 久久99精品一区二区三区三区 | 日韩在线色| 99爱在线| 中文av在线播放 | 九九久久精品 | 亚洲精品88欧美一区二区 | 91人人视频在线观看 | 久久综合天天 | 中文字字幕在线 | 韩日三级av| 国产精品网红直播 | 国产精品a久久 | 国产精品欧美一区二区三区不卡 | 免费成人黄色av | 狠狠88综合久久久久综合网 | 日本久久视频 | 日韩精品在线播放 | 久久人人精品 | 亚洲一区 av | 中文av在线免费观看 | 日日操日日| 国产免费一区二区三区最新 | 国内免费久久久久久久久久久 | 久久国产精品第一页 | 成人动态视频 | 国产三级久久久 | 精品在线观看一区二区三区 | 欧美日韩精品影院 | 欧洲亚洲女同hd | 午夜影院一级片 | 色a4yy| 色吊丝av中文字幕 | 国产精品97| 一级免费观看 | 日本久久中文字幕 | 国产又黄又爽又猛视频日本 | 高清色免费 | 激情视频一区二区 | 在线播放91 | 1024手机看片国产 | 久久精品综合网 | 国产精品国产亚洲精品看不卡15 | 丁香六月婷婷 | 精品国产一区二区三区久久影院 | 92国产精品久久久久首页 | 99re视频在线观看 | 欧美成人在线网站 | 九九激情视频 | 久久大视频 | 开心色插 | 国产片网站 | 开心婷婷色 | 97色免费视频| 国产精品久久久久久久久婷婷 | 中文av在线免费观看 | 国产99精品 | 丁香六月av | 久久精品久久精品久久 | 久久国产精品久久w女人spa | 亚洲亚洲精品在线观看 | 精品久久久久久综合日本 | 久久久久免费网 | 91爱爱免费观看 | 欧美国产视频在线 | 久久精品久久综合 | 中文字幕日韩一区二区三区不卡 | 中文字幕一区av | 天天曰天天| 国产91全国探花系列在线播放 | 欧美日韩高清在线一区 | 国产精品九色 | 999男人的天堂 | 亚洲激情视频在线观看 | 国产精品v欧美精品 | 欧美午夜a | 国产福利小视频在线 | 中文一区二区三区在线观看 | 国产一级精品在线观看 | 久久99国产综合精品免费 | 成人性生交大片免费观看网站 | 四虎成人精品永久免费av | 三上悠亚一区二区在线观看 | 亚洲精品在线电影 | www.成人精品 | 日日夜夜国产 | 日本成人a| 激情导航 | 久草视频中文在线 | 免费高清影视 | 免费试看一区 | 国产不卡免费 | 在线观看完整版 | www.91成人 | 狠狠操天天干 | 一级片免费观看 | 狠狠狠狠狠狠 | 日本精品在线视频 | 久久精品欧美一 | 怡春院av | 色婷婷av一区 | www黄色com| 日韩一区二区三区观看 | www.少妇| 国产高清视频在线观看 | 欧美日本不卡 | 99草视频在线观看 | 91大神精品视频 | 成人毛片一区二区三区 | 97超碰国产在线 | 在线观看黄污 | 午夜在线看片 | 欧美在线free | 在线免费中文字幕 | av片子在线观看 | 欧美成年性 | 成年在线观看 | 国产在线小视频 | 美女免费视频网站 | 日韩精品免费一区二区在线观看 | 国产天天爽 | 少妇性aaaaaaaaa视频 | a级片网站 | 国产精品一区免费看8c0m | 中文字幕在线观看免费高清电影 | 国产精品入口a级 | 久久一本综合 | 国产精品18久久久久白浆 | 国产视| 中文字幕一区二区三区四区 | 一级国产视频 | 午夜99| 91精品第一页 | 久久欧洲视频 | 国产一区二区高清视频 | 天天色.com| www.av免费 | 98精品国产自产在线观看 | 不卡视频国产 | 97热视频| 香蕉日日 | 亚洲精品88欧美一区二区 | 91久久奴性调教 | 久久久久国产精品午夜一区 | 亚洲成人黄 | 一区二区三区免费播放 | 麻豆视频在线观看免费 | 久久超级碰 | 综合国产在线观看 | 国产五月天婷婷 | 久久久免费在线观看 | 日韩免费视频在线观看 | 最近高清中文在线字幕在线观看 | 欧洲一区精品 | 欧美性性网 | 激情欧美丁香 | 国产在线美女 | 国产在线观看不卡 | 狠狠干成人综合网 | 日韩在线中文字幕 | 探花视频在线观看免费版 | 深夜国产在线 | av免费成人 | 香蕉久草| a级国产乱理论片在线观看 伊人宗合网 | 成人黄色国产 | 亚洲精品字幕在线观看 | 91av在线看| 97视频在线观看成人 | 国产精品午夜免费福利视频 | 天天弄天天操 | 色老板在线 | 人人看人人草 | 国产1区在线 | 国产一在线精品一区在线观看 | av导航福利 | 91精品秘密在线观看 | 69国产盗摄一区二区三区五区 | 亚洲精品午夜久久久久久久久久久 | 日韩二区三区在线 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产精品6 | 中文字幕在线观看1 | 国产va精品免费观看 | 啪啪免费视频网站 | 天天操天天操天天操天天 | 91香蕉视频黄 | 久久久久久久久久久免费视频 | 91成人亚洲 | 亚洲成av人电影 | 色婷婷综合成人av | 国产精品一区二区久久久 | 一区二区三区免费网站 | 中文字幕一区二区三区四区久久 | 91资源在线播放 | 亚洲日本黄色 | 天天婷婷| 久久精品99国产精品酒店日本 | 偷拍精品一区二区三区 | 欧美在线99 | 插久久| 国产91小视频 | 国产精品黄 | 九九久久成人 | 一本一本久久a久久精品牛牛影视 | 国产高清视频免费 | 日韩成人精品在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 91字幕| 久久久精品网站 | 久久久免费观看视频 | 午夜10000 | 国产免费久久精品 | 九九热免费在线观看 | 99精品久久久久 | 五月天婷婷在线视频 | 亚洲伊人网在线观看 | 人人射| 97超碰中文| 国产精品久久99综合免费观看尤物 | 久久在线一区 | 在线观看中文字幕亚洲 | 日本中文字幕在线一区 | 国产精品99久久久久久人免费 | 91秒拍国产福利一区 | 麻豆精品在线视频 | 一区二区三区在线观看中文字幕 | 国产又粗又长又硬免费视频 | 人人澡视频 | 国产精品久久久久久久婷婷 | a电影在线观看 | 香蕉视频久久久 | 美女免费视频黄 | 国产精品美女久久久久久网站 | 在线视频a | 久久久伊人网 | 亚洲另类视频在线 | 国产精品婷婷 | 亚州精品成人 | 91香蕉视频在线 | 免费看成人a | 国产精品wwwwww | 精品福利视频在线观看 | 欧美特一级片 | 人人插超碰 | 国产精品毛片 | 国产在线久久久 | 日韩1页 | 久久精品香蕉视频 | 日韩在线电影观看 | 色夜影院 | 亚洲高清av | 欧美一级乱黄 | 国产精品久久电影网 | 亚洲精品大片www | 九九精品久久 | 亚洲无吗av| 激情综合网色播五月 | 亚洲综合在线五月 | 日韩欧美视频在线观看免费 | 最新日韩中文字幕 | 深夜福利视频在线观看 | 国产丝袜美腿在线 | 成人免费观看视频大全 | 久草在线中文888 | 丁香六月久久综合狠狠色 | 国产日韩欧美综合在线 | 国产中文字幕视频 | 美女视频黄的免费的 | 免费网址在线播放 | 成人亚洲精品国产www | 一区二区亚洲精品 | 国产视频精品久久 | 黄视频网站大全 | 日本一区二区不卡高清 | 91在线网站 | a在线观看免费视频 | 91av福利视频 | 午夜91在线 | 亚洲午夜久久久久久久久电影网 | 免费看国产黄色 | 黄色软件视频大全免费下载 | 国产麻豆视频免费观看 | 亚洲色图av | 91av蜜桃| 久久黄色片 | 成人国产精品久久久久久亚洲 | av观看免费在线 | 天堂在线一区二区 | 中文国产在线观看 | 亚州av免费 | 在线成人性视频 | 欧美性视频网站 | 国产精品视频免费在线观看 | 天堂av一区二区 | 久久a国产| 中文字幕高清免费日韩视频在线 | 91丨九色丨蝌蚪丨对白 | 亚洲高清在线视频 | 亚洲一区二区三区miaa149 | 成人a免费视频 | 色综合久久久 | 日韩r级在线| 国产真实精品久久二三区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 色噜噜在线观看视频 | 九九九九九精品 | 在线观看v片 | 美女网站视频色 | 午夜精品视频福利 | 中文字幕日韩精品有码视频 | 国产精品理论视频 | 国产亚洲婷婷免费 | 亚洲成色777777在线观看影院 | 五月激情片 | 麻豆免费视频观看 | av天天在线观看 | 人人搞人人干 | 91麻豆精品国产午夜天堂 | 99精品在线 | 国产欧美日韩精品一区二区免费 | 九色自拍视频 | 日日日干 | 男女免费视频观看 | 97超碰人人澡人人 | 国内外成人在线视频 | 亚洲精品美女在线观看 | 国产精品久久久久久久久免费 | 日韩精品一区二区三区水蜜桃 | 在线观看成人国产 | 国产免费观看视频 | 久久涩涩网站 | 国内揄拍国内精品 | 日韩三区在线 | 中文字幕二区三区 | 日本三级中文字幕在线观看 | 在线视频观看成人 | 久久亚洲精品电影 | 欧美a级片网站 | 久久综合色一综合色88 | 中文字幕色在线 | 免费观看91视频大全 | 99免费国产 | 一区二区av| se视频网址 | 日韩激情免费视频 | 97操操操| 色午夜| 成人黄色毛片 | 国产精品成人免费精品自在线观看 | 91久久精品一区二区三区 | av三级av| 久久夜色电影 | 国产精品成人aaaaa网站 | 黄色免费大全 | 日韩一区二区免费播放 | 91麻豆精品国产91久久久久 | 色综合久久88 | 久久成人亚洲欧美电影 | 欧美在线观看视频一区二区 | 在线观看视频黄 | 韩日电影在线观看 | 5月丁香婷婷综合 | 丝袜美腿一区 | 精品中文字幕在线播放 | 日日夜夜精品免费 | 国产成人一区二区精品非洲 | 日韩在线观看免费 | 欧美日韩三级 | 免费看的黄色小视频 | 91九色蝌蚪视频 | 婷婷综合激情 | 夜夜澡人模人人添人人看 | 九九九九热精品免费视频点播观看 | 免费看日韩片 | 国产精品系列在线播放 | 国产精品久久久久久久妇 | 欧美性另类 | 视频在线国产 | www·22com天天操 | 色射色| 欧美xxxx性xxxxx高清 | 一区二区欧美激情 | 伊人官网| 免费色网 | 人人精品久久 | 国产精品2020 | 91免费高清视频 | 午夜三级在线 | 看片黄网站 | 亚洲精品在线资源 | 久久久久国产一区二区三区四区 | 国产一区二区三区四区大秀 | 国产污视频在线观看 | 三级黄色免费 | 国产精品原创在线 | 成人91在线观看 | 涩涩网站在线播放 | 日韩99热| 精品一区三区 | 国产1区2区| 亚洲三级黄色 | 91精品一区二区三区久久久久久 | 精品国产乱码久久久久久久 | 91资源在线观看 | 国产精品人成电影在线观看 | 国产三级av在线 | 99国产在线 | 久久综合亚洲鲁鲁五月久久 | 九九久久婷婷 | 91黄色在线视频 | 六月婷婷久香在线视频 | 在线观看黄av | 日韩中文字幕免费在线观看 | 久久免费视频网 | av黄色在线观看 | 欧美日韩免费观看一区二区三区 | 热久久这里只有精品 | 国产va精品免费观看 | 久久婷婷一区二区三区 | 婷婷久久精品 | 久久久一本精品99久久精品 | 久草在线手机观看 | 六月色丁 | 亚洲天堂自拍视频 | 91热爆在线观看 | 免费看一级 | 天天干亚洲 | 久久8精品 | 天天爱天天操 | 国产麻豆果冻传媒在线观看 | www成人精品| 国产精品乱码在线 | av手机版 | 欧美va电影| 国产在线毛片 | 中文区中文字幕免费看 | 国产午夜一级毛片 | 国产在线91精品 | av中文字幕在线看 | 精品视频在线播放 | a视频免费看 | 肉色欧美久久久久久久免费看 | 黄色在线免费观看网站 | 97免费在线观看视频 | 麻豆成人网 | 亚洲欧美成人综合 | 国产成人一区二区精品非洲 | 日av免费 | 一区二区 不卡 | 国产精品久久久久久久久费观看 | 蜜臀一区二区三区精品免费视频 | 欧美一二三区在线播放 | 中文字幕av在线不卡 | 亚洲在线视频网站 | 国产一级免费在线 | 丁香婷婷激情五月 | 成人免费观看网址 | 狠狠色噜噜狠狠狠合久 | 欧美激情精品久久久久久 | 国产精品99在线播放 | 国产精品久久久久av免费 | 欧美一级视频免费 | 欧美analxxxx| 在线国产精品视频 | 久久综合久久伊人 | 最新中文在线视频 | 91视频一8mav| a电影免费看 | 久久噜噜少妇网站 | 日韩激情视频在线观看 | 国产亚洲综合性久久久影院 | 国产高清av免费在线观看 | 九九热只有这里有精品 | 国产精品久久久久久久久免费看 | 粉嫩av一区二区三区四区 | 久草在 | 亚洲激情p | 亚洲第一中文字幕 | 日本精品视频免费观看 | 97超碰香蕉| 中文字幕一区在线 | 一级黄色网址 | 黄视频色网站 | 日本xxxxav| 一级黄色大片在线观看 | 成年人三级网站 | 日本h在线播放 | 国产精品精品久久久 | 999电影免费在线观看 | 91久久久久久国产精品 | 久久精品美女视频网站 | 2021久久| 草久视频在线观看 | 欧美另类成人 | 麻豆传媒在线免费看 | 久久久久久久久久久免费视频 | 911精品视频| 丁香网婷婷 | 热久久精品在线 | 韩国av在线播放 | 一区二区激情 | 500部大龄熟乱视频使用方法 | se婷婷 | 日韩av中文在线观看 | 久久久一本精品99久久精品 | 一区二区三区视频 | 国产高清一区二区 | 久久a热6 | 最新国产福利 | 精品一区二区久久久久久久网站 | 97视频免费播放 | 亚色视频在线观看 | 久草在线费播放视频 | 成人在线黄色 | 国产成人免费高清 |