• SpringBoot自定义拦截器实现


    1、编写拦截器实现类,此类必须实现接口   HandlerInterceptor,然后重写里面需要的三个比较常用的方法,实现自己的业务逻辑代码

    如:OneInterceptor

     1 package com.leecx.interceptors.interceptor;
     2 
     3 
     4 import com.leecx.pojo.LeeJSONResult;
     5 import com.leecx.utils.JsonUtils;
     6 import org.springframework.web.servlet.HandlerInterceptor;
     7 import org.springframework.web.servlet.ModelAndView;
     8 
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 import java.io.IOException;
    12 import java.io.OutputStream;
    13 import java.io.UnsupportedEncodingException;
    14 
    15 public class OneInterceptor implements HandlerInterceptor{
    16 
    17     /**
    18      * 在请求处理之前进行调用(Controller方法调用之前)
    19      */
    20     @Override
    21     public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
    22 
    23         System.out.println("=====================");
    24         if (true) {
    25             returnErrorResponse(httpServletResponse, LeeJSONResult.errorMsg("被one拦截..."));
    26         }
    27 
    28         System.out.println("被one拦截...");
    29 
    30         return false;
    31     }
    32 
    33     /**
    34      * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    35      */
    36     @Override
    37     public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    38 
    39     }
    40 
    41     /**
    42      * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    43      */
    44     @Override
    45     public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    46 
    47     }
    48 
    49     public void returnErrorResponse(HttpServletResponse response, LeeJSONResult result) throws IOException, UnsupportedEncodingException {
    50         OutputStream out = null;
    51         try{
    52             response.setCharacterEncoding("utf-8");
    53             response.setContentType("text/json");
    54             out = response.getOutputStream();
    55             out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
    56             out.flush();
    57         } finally{
    58             if(out!=null){
    59                 out.close();
    60             }
    61         }
    62     }
    63 }

    说明:

    1、preHandle  方法会在请求处理之前进行调用(Controller方法调用之前)

    2、postHandle  请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

    3、afterCompletion  在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

    2、编写拦截器配置文件主类 WebMvcConfigurer  此类必须继承  WebMvcConfigurerAdapter 类,并重写其中的方法  addInterceptors   并且在主类上加上注解  @Configuration    

    如:WebMvcConfigurer

     1 package com.leecx.interceptors.config;
     2 
     3 import com.leecx.interceptors.interceptor.OneInterceptor;
     4 import com.leecx.interceptors.interceptor.TwoInterceptor;
     5 import org.springframework.context.annotation.Configuration;
     6 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
     7 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
     8 
     9 @Configuration
    10 public class WebMvcConfigurer extends WebMvcConfigurerAdapter{
    11 
    12     /**
    13      * <p>Title:</p>
    14      * <p>Description:重写增加自定义拦截器的注册,某一个拦截器需要先注册进来,才能工作</p>
    15      * param[1]: null
    16      * return:
    17      * exception:
    18      * date:2018/4/18 0018 下午 17:29
    19      * author:段美林[duanml@neusoft.com]
    20      */
    21     @Override
    22     public void addInterceptors(InterceptorRegistry registry) {
    23 
    24         registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");
    25 
    26         registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/one/**")
    27                                                      .addPathPatterns("/two/**");
    28 
    29         super.addInterceptors(registry);
    30     }
    31 }

    说明:

       拦截器的执行是会根据 registry 注入的先后顺序执行,比如:/one/**   同时被  OneInterceptor、TwoInterceptor 拦截,但会先执行 OneInterceptor拦截的业务请求,因为它先注入进来的

    3、在controller业务层,只要请求的地址为  拦截器 申明的需要拦截地址即可进入相应的业务处理。

    如:OneInterceptorController    这个controller 类的所有实现方法都会被 拦截器  OneInterceptor   所拦截到。

     1 package com.leecx.controller;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Date;
     5 import java.util.List;
     6 
     7 import org.springframework.stereotype.Controller;
     8 import org.springframework.ui.ModelMap;
     9 import org.springframework.web.bind.annotation.PostMapping;
    10 import org.springframework.web.bind.annotation.RequestMapping;
    11 
    12 import com.leecx.pojo.User;
    13 
    14 @Controller
    15 @RequestMapping("/one")
    16 public class OneInterceptorController {
    17 
    18     @RequestMapping("/index")
    19     public String index(ModelMap map) {
    20         System.out.println("=========one is  index");
    21         map.addAttribute("name", "itzixi22");
    22         return "thymeleaf/index";
    23     }
    24     
    25     @RequestMapping("center")
    26     public String center() {
    27         return "thymeleaf/center/center";
    28     }
    29 
    30     @RequestMapping("test")
    31     public String test(ModelMap map) {
    32         
    33         User user = new User();
    34         user.setAge(18);
    35         user.setName("manager");
    36         user.setPassword("123456");
    37         user.setBirthday(new Date());
    38         
    39         map.addAttribute("user", user);
    40         
    41         
    42         User u1 = new User();
    43         u1.setAge(19);
    44         u1.setName("itzixi");
    45         u1.setPassword("123456");
    46         u1.setBirthday(new Date());
    47         
    48         User u2 = new User();
    49         u2.setAge(17);
    50         u2.setName("LeeCX");
    51         u2.setPassword("123456");
    52         u2.setBirthday(new Date());
    53         
    54         List<User> userList = new ArrayList<>();
    55         userList.add(user);
    56         userList.add(u1);
    57         userList.add(u2);
    58         
    59         map.addAttribute("userList", userList);
    60         
    61         return "thymeleaf/test";
    62     }
    63     
    64     @PostMapping("postform")
    65     public String postform(User user) {
    66         System.out.println(user.getName());
    67         return "redirect:/th/test";
    68     }
    69 }
  • 相关阅读:
    servlet中getWriter和getOutputStream的区别
    一个页面访问错误的问题
    sendRedirect实现原理分析
    servlet开发细节
    tomcat 目录分析
    servlet杂谈
    SQL 查询中的like子句的另一种实现方法,速度比like快
    让复合控件的子控件获得设计时支持
    bug管理工具——Gemini
    HtmlAgilityPack获取#开头节点的XPath
  • 原文地址:https://www.cnblogs.com/yinfengjiujian/p/8876781.html
Copyright © 2020-2023  润新知