1. 程式人生 > >SpringBoot2.0-配置攔截器

SpringBoot2.0-配置攔截器

攔截器、監聽器及過濾器的區別

  • 攔截器Interceptor 在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。比如日誌,安全等。一般攔截器方法都是通過動態代理的方式實現。可以通過它來進行許可權驗證,或者判斷使用者是否登陸,或者是像12306 判斷當前時間是否是購票時間。

  • 監聽器listener是servlet規範中定義的一種特殊類。用於監聽servletContextHttpSessionservletRequest等域物件的建立和銷燬事件。監聽域物件的屬性發生修改的事件。用於在事件發生前、發生後做一些必要的處理。其主要可用於以下方面: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