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

Springboot中使用Filter實現(xiàn)Header認證詳解

 更新時間:2023年08月12日 10:05:38   作者:牛奮lch  
這篇文章主要介紹了Springboot中使用Filter實現(xiàn)Header認證詳解,當在?web.xml?注冊了一個?Filter?來對某個?Servlet?程序進行攔截處理時,它可以決定是否將請求繼續(xù)傳遞給?Servlet?程序,以及對請求和響應消息是否進行修改,需要的朋友可以參考下

前言

假設(shè)客戶端在http請求中,已經(jīng)加入了Header的認證信息,例如:

HttpPost post = new HttpPost("http://localhost:8990/sendMail");
				StringEntity entity = new StringEntity(json, "utf-8");
				entity.setContentType("application/json");
				post.setEntity(entity);
				// 設(shè)置驗證頭信息
				post.addHeader("token", "WEFGYHJIKLTY4RE6DF29HNBCFD13ER87");

那么服務端怎么通過Filter,來驗證客戶端的token是否有效了?請接著往下看。

一、實現(xiàn)自定義Filter

1、實現(xiàn)Filter接口

我們要自定義Filter,只需實現(xiàn)Filter接口即可

2、覆寫doFilter方法

根據(jù)業(yè)務邏輯,來覆寫doFilter方法

示例如下:

@Slf4j
@Component
@WebFilter(urlPatterns={"/sendMail/*"}, filterName="tokenAuthorFilter")
public class TokenAuthorFilter implements Filter {
	@Autowired
	private AuthorizationRepository repository;
	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		String token = req.getHeader("token");
		Response res = new Response();
		boolean isFilter = false;
		if (null == token || token.isEmpty()) {
			res.setSuccess(false);
			res.setErrorCode("403");
			res.setErrorMessage("token沒有認證通過!原因為:客戶端請求參數(shù)中無token信息");
		} else {
			Authorization auth = repository.findByToken(token);
			if (null == auth) {
				res.setSuccess(false);
				res.setErrorCode("403");
				res.setErrorMessage("token沒有認證通過!原因為:客戶端請求中認證的token信息無效,請查看申請流程中的正確token信息");
			}else if((auth.getStatus() == 0)){
				res.setSuccess(false);
				res.setErrorCode("401");
				res.setErrorMessage("該token目前已處于停用狀態(tài),請聯(lián)系郵件系統(tǒng)管理員確認!");
			}else{
				isFilter = true;
				res.setSuccess(true);
			}
		}
		if(!res.isSuccess()){
			PrintWriter writer = null;
			OutputStreamWriter osw = null;
			try {
				osw = new OutputStreamWriter(response.getOutputStream() , "UTF-8");
				writer = new PrintWriter(osw, true);
				String jsonStr = ObjectMapperInstance.getInstance().writeValueAsString(res);
				writer.write(jsonStr);
				writer.flush();
				writer.close();
				osw.close();
			} catch (UnsupportedEncodingException e) {
				log.error("過濾器返回信息失敗:" + e.getMessage(), e);
			} catch (IOException e) {
				log.error("過濾器返回信息失敗:" + e.getMessage(), e);
			} finally {
				if (null != writer) {
					writer.close();
				}
				if(null != osw){
					osw.close();
				}
			}
			return;
		}
		if(isFilter){
			log.info("token filter過濾ok!");
			chain.doFilter(request, response);
		}
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
}

通過上面的幾步,就實現(xiàn)了一個自定義的Filter。

3、注冊Filter

接下來,需要注冊這個過濾器,spring boot提供了以下兩種注冊方式。

3.1 是用注解注冊

在Filter上添加如下注解即可

@Slf4j
@Component
@WebFilter(urlPatterns={"/sendMail/*"}, filterName="tokenAuthorFilter")
public class TokenAuthorFilter implements Filter {

@WebFilter注解的作用就是用來注冊Filter,通過這種方式注冊的Filter,需要在啟動類上加上@ServletComponentScan注解才能生效,如下:

@ServletComponentScan
public class MailserviceApplication {
	public static void main(String[] args) {
		SpringApplication.run(MailserviceApplication.class, args);
	}
}

3.2 手動配置Filter

@Configuration
@Component
public class FilterConfig {
	@Autowired
	private TokenAuthorFilter filter;
	@Bean
    public FilterRegistrationBean  filterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        List<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add("/sendMail/*");// 設(shè)置匹配的url
        registrationBean.setUrlPatterns(urlPatterns);
        return registrationBean;
    }
}

上面兩種方式雖然使用上有些不一樣,但是本質(zhì)都是一樣的,都會調(diào)用FilterRegistrationBean來進行注冊。

二、spring boot內(nèi)置的Filter

為了方便我們的開發(fā),spring boot內(nèi)置了許多有用的Filter,我們可以根據(jù)業(yè)務的需求,選擇適合業(yè)務的Filter。

三、拓展

通過前面的N篇博客,我們會發(fā)現(xiàn)spring boot處理Servlet,Listener,F(xiàn)ilter的思路大致都是一樣

對應的注解分別為@WebServlet 、@WebListener、@WebFilter

對應的注冊Bean分別為ServletRegistrationBean,ServletListenerRegistrationBean,FilterRegistrationBean

無論哪種方式,都大大的簡化了我們的開發(fā)

到此這篇關(guān)于Springboot中使用Filter實現(xiàn)Header認證詳解的文章就介紹到這了,更多相關(guān)Filter實現(xiàn)Header認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC存取Session的兩種方法

    SpringMVC存取Session的兩種方法

    Spring MVC是個非常優(yōu)秀的框架,本篇文章主要介紹了SpringMVC存取Session的兩種方法,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • spring boot搭建文件服務器解決同時上傳多個圖片和下載的問題

    spring boot搭建文件服務器解決同時上傳多個圖片和下載的問題

    這篇文章主要介紹了spring boot搭建文件服務器解決同時上傳多個圖片和下載的問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot動態(tài)定時任務實現(xiàn)與應用詳解

    SpringBoot動態(tài)定時任務實現(xiàn)與應用詳解

    定時任務在許多應用場景中是必不可少的,特別是在自動化任務執(zhí)行、定期數(shù)據(jù)處理等方面,定時任務能極大地提高系統(tǒng)的效率,然而,隨著業(yè)務需求的變化,定時任務的執(zhí)行頻率或時間點可能需要動態(tài)調(diào)整,所以本文給大家介紹了SpringBoot動態(tài)定時任務實現(xiàn)與應用
    2024-08-08
  • SpringBoot3.2.2整合MyBatis-Plus3.5.5依賴不兼容的問題解決

    SpringBoot3.2.2整合MyBatis-Plus3.5.5依賴不兼容的問題解決

    這篇文章給大家介紹了Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依賴不兼容問題,文中通過代碼示例和圖文介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 解決springboot的findOne方法沒有合適的參數(shù)使用問題

    解決springboot的findOne方法沒有合適的參數(shù)使用問題

    這篇文章主要介紹了解決springboot的findOne方法沒有合適的參數(shù)使用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot整合Aop全過程

    SpringBoot整合Aop全過程

    AOP(面向切面編程)技術(shù)可以高效地解決日志記錄、事務管理、權(quán)限控制等問題,日志記錄通過自定義注解和切面類,自動記錄方法調(diào)用詳情,減少重復代碼,事務管理方面,通過AOP可以在不改變業(yè)務代碼的情況下,實現(xiàn)事務的自動開啟、提交和回滾,保證數(shù)據(jù)一致性
    2024-10-10
  • Mybatis?Web中的數(shù)據(jù)庫操作方法舉例詳解

    Mybatis?Web中的數(shù)據(jù)庫操作方法舉例詳解

    Mybatis是一款優(yōu)秀的持久化框架,用于簡化JDBC的開發(fā),下面這篇文章主要給大家介紹了關(guān)于Mybatis?Web中數(shù)據(jù)庫操作方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • Spring細數(shù)兩種代理模式之靜態(tài)代理和動態(tài)代理概念及使用

    Spring細數(shù)兩種代理模式之靜態(tài)代理和動態(tài)代理概念及使用

    代理是一種設(shè)計模式,提供了對目標對象另外的訪問方式,即通過代理對象訪問目標對象??梢圆恍薷哪繕藢ο?,對目標對象功能進行拓展。在我們學習Spring的時候就會發(fā)現(xiàn),AOP(面向切面編程)的底層就是代理
    2023-02-02
  • springboot項目配置logback-spring.xml實現(xiàn)按日期歸檔日志的方法

    springboot項目配置logback-spring.xml實現(xiàn)按日期歸檔日志的方法

    本文主要介紹了springboot項目配置logback-spring.xml實現(xiàn)按日期歸檔日志的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • springBoot發(fā)布https服務及調(diào)用的過程詳解

    springBoot發(fā)布https服務及調(diào)用的過程詳解

    文章介紹了如何在Spring Boot中配置HTTPS服務,包括生成自簽名證書和配置SSL證書的位置和密碼,此外,還討論了如何在Docker容器中啟動HTTPS服務,以及如何通過HTTP請求調(diào)用HTTPS服務并跳過證書校驗,感興趣的朋友跟隨小編一起看看吧
    2025-11-11

最新評論

安阳市| 项城市| 阜南县| 呈贡县| 固阳县| 辛集市| 克拉玛依市| 邵阳县| 泸溪县| 许昌县| 南丹县| 沂源县| 晋中市| 习水县| 德安县| 阿勒泰市| 常德市| 娄烦县| 东莞市| 永济市| 克拉玛依市| 南华县| 湖口县| 勐海县| 望奎县| 安康市| 东乡县| 绥棱县| 安丘市| 高台县| 安化县| 和平区| 齐齐哈尔市| 三穗县| 延庆县| 新沂市| 获嘉县| 象州县| 宜宾市| 庄浪县| 宽甸|