springboot攔截器

有些時候咱們的請求須要用攔截器去處理一下。

SpringBoot 攔截器也如其餘功能同樣,使用極簡的脫離xml配置文件的方式,只須要簡單幾個類便可實現攔截。

如下爲一個簡單的示例,具體攔截器還需根據具體業務需求進行處理。是一個後臺系統,驗證登陸的攔截器。以前在其餘項目中應該也有用到相似的,這裏是SpringBoot的示例。


建立一個類繼承WebMvcConfigurerAdapter,並重寫addInterceptors方法,將咱們要進行攔截的方法配置到addPathPatterns方法的參數中,excludePathPatterns方法中是配置咱們不須要攔截的方法。

package com.inongfeng.shop.admin.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter{

@Bean
public UserSecurityInterceptor userSecurityInterceptor(){
return new UserSecurityInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userSecurityInterceptor()).addPathPatterns("/**").excludePathPatterns("/Login");
super.addInterceptors(registry);
}

}

建立一個類實現HandlerInterceptor接口,並實現其中方法


preHandle:預處理回調方法,實現處理器的預處理(如登陸檢查),第三個參數爲響應的處理器 返回值: true表示繼續流程(如調用下一個攔截器或處理器); false表示流程中斷(如登陸檢查失敗),不會繼續調用其餘的攔截器或處理器,此時咱們須要經過response來產生響應;java

postHandle:後處理回調方法,實現處理器的後處理(但在渲染視圖以前),此時咱們能夠經過modelAndView(模型和視圖對象)對模型數據進行處理或對視圖進行處理,modelAndView也可能爲null。web

afterCompletion:整個請求處理完畢回調方法,即在視圖渲染完畢時回調,如性能監控中咱們能夠在此記錄結束時間並輸出消耗時間,還能夠進行一些資源清理,相似於try-catch-finally中的finally,但僅調用處理器執行鏈中preHandle返回true的攔截器的afterCompletion。spring

在這裏咱們只需實現preHandle方法便可實現簡單攔截。session


若是session中沒有用戶信息,則拋出登陸異常。

package com.inongfeng.shop.admin.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.inongfeng.shop.admin.common.dt.Constants;
import com.inongfeng.shop.admin.excepttion.LoginAuthException;

@Component
public class UserSecurityInterceptor implements HandlerInterceptor{

protected Logger logger = LoggerFactory.getLogger(getClass());

@Override
public void afterCompletion(HttpServletRequest req,HttpServletResponse resp, Object arg2, Exception arg3)throws Exception {

}

@Override
public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object arg2, ModelAndView arg3) throws Exception {

}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {

HttpSession session = request.getSession();
if(StringUtils.isEmpty(session.getAttribute(Constants.SessionUserInfo))){
throw new LoginAuthException(Constants.E_LoginError_OR_TimeOut);
}
return true;
}
}

}

上一步咱們拋出了登陸異常,可是還須要有地方去捕獲這個異常。如下代碼是一個全局捕獲並處理異常的類。 若是捕獲的是一個登陸異常,則返回讓用戶登陸。ide


package com.inongfeng.shop.admin.excepttion;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import com.inongfeng.shop.admin.common.dt.Constants;

@ControllerAdvice
public class GlobalExceptionHandler {

protected Logger logger = LoggerFactory.getLogger(getClass());

@ExceptionHandler(value = BaseException.class)
public Object baseErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if(e.getMessage().equals(Constants.E_LoginError_OR_TimeOut)){
if(logger.isDebugEnabled()){
e.printStackTrace();
logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {} ,登陸失敗或超時", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return "login";
}else{
logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return e.getMessage();
}

@ExceptionHandler(value = Exception.class)
public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if(logger.isDebugEnabled()){
logger.error("---DefaultException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return e.getMessage();
}
}
相關文章
相關標籤/搜索