前言 由於業務需要,需要在攔截器中操作Redis緩存,按照 controller,service層配置發現無法註入,一直報空指針異常。 解決方案 攔截器: 查詢原因 攔截器執行在Bean初始化之前導致這個問題的。在web.xml中各個元素的執行順序是這樣的,context param listene ...
前言
由於業務需要,需要在攔截器中操作Redis緩存,按照 controller,service層配置發現無法註入,一直報空指針異常。
解決方案
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
/**
* 將自定義攔截器作為Bean寫入配置
* @return
*/
@Bean
public SysInterceptor sysInterceptor() {
return new SysInterceptor();
}
/**
* 對攔截器註冊
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] patterns = new String[] {"/swagger-resources/**"};
registry.addInterceptor(sysInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(patterns);
super.addInterceptors(registry);
}
}
攔截器:
public class SysInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(SysInterceptor.class);
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//業務邏輯
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
查詢原因
攔截器執行在Bean初始化之前導致這個問題的。在web.xml中各個元素的執行順序是這樣的,context-param-->listener-->filter-->servlet; 而攔截器是在Spring MVC中配置的,如果從整個項目中看,一個servlet請求的執行過程就變成了這樣context-param-->listener-->filter-->servlet-->interceptor,為什麼攔截器是在servlet執行之後,因為攔截器本身就是在servlet內部的。
概念
servlet:servlet是一種運行伺服器端的java應用程式,具有獨立於平臺和協議的特性,並且可以動態的生成web頁面,它工作在客戶端請求與伺服器響應的中間層。
filter:filter是一個可以復用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
listener:監聽器,從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web伺服器中某一個執行動作,並根據 其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執 行代碼的功能組件。
interceptor:攔截器是對過濾器更加細化的應用,他不僅可以應用在service方法前後還可以應用到其他方法的前後攔截器。