Springboot中使用Filter實現(xiàn)Header認證詳解
前言
假設客戶端在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);
// 設置驗證頭信息
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/*");// 設置匹配的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ā)
到此這篇關于Springboot中使用Filter實現(xiàn)Header認證詳解的文章就介紹到這了,更多相關Filter實現(xiàn)Header認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java文件復制代碼片斷(java實現(xiàn)文件拷貝)
本文介紹java實現(xiàn)文件拷貝的代碼片斷,大家可以直接放到程序里運行2014-01-01
SpringBoot項目中jar發(fā)布獲取jar包所在目錄路徑的最佳方法
在開發(fā)過程中,我們經(jīng)常要遇到上傳圖片、word、pdf等功能,但是當我們把項目打包發(fā)布到服務器上時,對應的很多存儲路徑的方法就會失效,下面這篇文章主要給大家介紹了關于SpringBoot項目中jar發(fā)布獲取jar包所在目錄路徑的相關資料2022-07-07
SpringBoot中實現(xiàn)定時任務的4種方式詳解
這篇文章主要介紹了SpringBoot中實現(xiàn)定時任務的4種方式詳解,在Springboot中定時任務是一項經(jīng)常能用到的功能,實現(xiàn)定時任務的方式有很多,今天來介紹常用的幾種,需要的朋友可以參考下2023-11-11
MyBatis基礎支持DataSource實現(xiàn)源碼解析
這篇文章主要為大家介紹了MyBatis基礎支持DataSource實現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

