servlet 攔截器,如何快速在 Springboot 中集成攔截器? | 原力計劃

 2023-10-22 阅读 27 评论 0

摘要:作者 | 才疏學淺責編 | 夕顏出品 | CSDN(ID:CSDNnews)servlet 攔截器、話不多說,直接上貨!攔截器的作用攔截器提供了一種機制,在訪問action前后進行一些操作,因為攔截器的這個特性,那么我們就可以利用攔截器做一些事

作者 | 才疏學淺

責編 | 夕顏

出品 | CSDN(ID:CSDNnews)

servlet 攔截器、話不多說,直接上貨!

攔截器的作用

攔截器提供了一種機制,在訪問action前后進行一些操作,因為攔截器的這個特性,那么我們就可以利用攔截器做一些事情,比如監控訪問人數,攔截一些非法請求,記錄訪問日志,身份驗證之類的

構建攔截器

2.1 創建攔截器

全局攔截器?1.創建類實現HandlerInterceptor接口

2.HandlerInterceptor有三種攔截方式

`preHandle` :在訪問controller調用之前
`postHandle` :請求訪問controller之后,渲染視圖之前
`afterCompletion` :請求訪問controller之后,渲染視圖之后

3.返回值為boolean

  • 攔截器使用?true: 請求在經過驗證校驗以后,是OK的,是可以放行的

  • false: 請求被攔截,被駁回,驗證出現問題

代碼示例:

package?com.imooc.interceptor;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.OutputStream;import static com.imooc.controller.BaseController.REDIS_USER_TOKEN;public?class?UserTokenInterceptor?implements?HandlerInterceptor?{/*** 攔截請求,在訪問controller調用之前* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("進入攔截器");/*** false: 請求被攔截,被駁回,驗證出現問題* true: 請求在經過驗證校驗以后,是OK的,是可以放行的*/return true;}/*** 請求訪問controller之后,渲染視圖之前* @param request* @param response* @param handler* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}/*** 請求訪問controller之后,渲染視圖之后* @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

java 攔截器,2.2 注冊攔截器

1.創建類實現WebMvcConfigurer接口

2.注冊創建的攔截器

@Beanpublic UserTokenInterceptor userTokenInterceptor() {return new UserTokenInterceptor();}

3.重寫addInterceptors 添加監聽的路徑

  • addPathPatterns 添加監聽的路徑地址

  • excludePathPatterns 排除一些路徑

代碼示例:

package com.imooc.config;import com.imooc.interceptor.UserTokenInterceptor;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Beanpublic UserTokenInterceptor userTokenInterceptor() {return new UserTokenInterceptor();}/*** 注冊攔截器* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userTokenInterceptor()).addPathPatterns("/hello").addPathPatterns("/shopcart/add").addPathPatterns("/shopcart/del").addPathPatterns("/address/list").addPathPatterns("/address/add").addPathPatterns("/address/update").addPathPatterns("/address/setDefalut").addPathPatterns("/address/delete").addPathPatterns("/orders/*").addPathPatterns("/center/*").addPathPatterns("/userInfo/*").addPathPatterns("/myorders/*").addPathPatterns("/mycomments/*").excludePathPatterns("/myorders/deliver").excludePathPatterns("/orders/notifyMerchantOrderPaid");WebMvcConfigurer.super.addInterceptors(registry);}}

攔截器錯誤信息返回前端

因為攔截器返回的結果是布爾類型的,所有不能直接返回信息,那怎么辦呢,我們可以利用output輸出流來寫入response中,這樣前臺就可以獲取到了。

代碼如下:

public void returnErrorResponse(HttpServletResponse response,String result) {OutputStream out = null;try {response.setCharacterEncoding("utf-8");response.setContentType("text/json");out = response.getOutputStream();out.write(result.getBytes("utf-8"));out.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}}

原文鏈接:

https://blog.csdn.net/qq_38446413/article/details/105819433

更多精彩推薦
?我們想研發一個機器學習框架,6 個月后失敗了
?生產型機器學習已經沒那么困難了?
?視頻 | 你不知道的"開源"60年秘史
?GitHub標星10,000+,Apache項目ShardingSphere的開源之路
?阿里技術專家告訴你,如何畫出優秀的架構圖?
?加拿大API平臺如何做到30%為中國明星項目?創業老兵這樣說……
你點的每個“在看”,我都認真當成了喜歡

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/161822.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息