SpringBoot2.0-配置攔截器
攔截器、監聽器及過濾器的區別
-
攔截器
:Interceptor
在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。比如日誌,安全等。一般攔截器方法都是通過動態代理的方式實現。可以通過它來進行許可權驗證,或者判斷使用者是否登陸,或者是像12306 判斷當前時間是否是購票時間。 -
監聽器
:listener
是servlet規範中定義的一種特殊類。用於監聽servletContext
、HttpSession
和servletRequest
等域物件的建立和銷燬事件。監聽域物件的屬性發生修改的事件。用於在事件發生前、發生後做一些必要的處理。其主要可用於以下方面:1、統計線上人數和線上使用者2、系統啟動時載入初始化資訊3、統計網站訪問量4、記錄使用者訪問路徑。 -
過濾器
:Filter
是Servlet技術中最實用的技術,Web開發人員通過Filter技術,對web伺服器管理的所有web資源
:例如Jsp
,Servlet
, 靜態圖片檔案或靜態html
檔案等進行攔截,從而實現一些特殊的功能。例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應資訊等一些高階功能。它主要用於對使用者請求進行預處理,也可以對HttpServletResponse進行後處理。使用Filter的完整流程:Filter對使用者請求進行預處理,接著將請求交給Servlet進行處理並生成響應,最後Filter再對伺服器響應進行後處理。
三大器在springboot中使用時,首先實現相應的介面定義類,然後通過配置類將其加入到spring容器中,從而實現相應的功能。本文重點講攔截器的使用
一、 攔截器類
public class MyInterceptor implements HandlerInterceptor {
//在請求處理之前進行呼叫(Controller方法呼叫之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("preHandle被呼叫");
Map map = (Map)httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
System.out.println(map.get("name"));
System.out.println(httpServletRequest.getParameter("username"));
if(map.get("name").equals("zhangsan")) {
return true; //如果false,停止流程,api被攔截
}else {
PrintWriter printWriter = httpServletResponse.getWriter();
printWriter.write("please login again!");
return false;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle被呼叫");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion被呼叫");
}
}
二、配置類
@Configuration
public class MywebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/zxc/foo").setViewName("foo");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/asd/**");
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public FilterRegistrationBean filterRegist() {
FilterRegistrationBean frBean = new FilterRegistrationBean();
frBean.setFilter(new MyFilter());
frBean.addUrlPatterns("/*");
System.out.println("filter");
return frBean;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public ServletListenerRegistrationBean listenerRegist() {
ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
srb.setListener(new MyHttpSessionListener());
System.out.println("listener");
return srb;
}
}
三、控制層
@Controller
public class UserController {
private final Logger logger = LoggerFactory.getLogger(UserController.class);
@Value("${application.message:Hello World}")
private String message ;
@GetMapping("/asd/{name}")
public String welcome(@PathVariable String name,Map<String, Object> model) {
model.put("time", new Date());
model.put("message", this.message);
return "welcome";
}
@RequestMapping("/login")
@ResponseBody
public Object foo() {
logger.info("列印日誌----------------------");
return "login";
}
@RequestMapping("/index")
@ResponseBody
public Object index(HttpServletRequest request) {
HttpSession session = request.getSession(true);
session.setAttribute("zxc", "zxc");
return "index";
}
@RequestMapping("/online")
@ResponseBody
public Object online() {
return "當前線上人數:" + MyHttpSessionListener.online + "人";
}
}
節選自https://www.cnblogs.com/hhhshct/p/8808115.html