springboot整合拦截器

    技术2022-07-10  151

    这里说第一种方法 创建类然后实现HandlerInterceptor 先上代码

    package cn.com.doone.sc.tx.cloud.dyb.system.handle;

    import cn.com.doone.sc.tx.cloud.dyb.system.bean.po.member.MemberPo; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;

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

    /**

    @Auther: liufei

    @Date: 2020/7/1 09:28

    @Description: */ @Component public class AuthInterceptor implements HandlerInterceptor {

    @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(“开始拦截…”); String requestURI = request.getRequestURI(); if(requestURI.startsWith("/static")||requestURI.startsWith("/error")){ return true; } HttpSession session = request.getSession(true); MemberPo memberPo = (MemberPo)session.getAttribute(""); if(memberPo!=null){ UserContext.setUser(memberPo); } //业务代码 return true; }

    /**

    后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub

    } /**

    整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub UserContext.remove(); } }

    然后讲解

    然后创建一个类 将刚刚的拦截器注入 package cn.com.doone.sc.tx.cloud.dyb.system.handle;

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

    /**

    @Auther: liufei

    @Date: 2020/7/1 09:54

    @Description: */ @Configuration public class MvcInterceptorConfig extends WebMvcConfigurationSupport {

    @Autowired private AuthInterceptor authInterceptor;

    @Override protected void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则,/表示拦截所有请求 // excludePathPatterns 用户排除拦截 registry.addInterceptor(authInterceptor).addPathPatterns("/") .excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); super.addInterceptors(registry); }

    }

    这里讲解下上面

    二 如果我们这边要弄多个拦截器 比如说我这里在加一个拦截器 package cn.com.doone.sc.tx.cloud.dyb.system.handle;

    import cn.com.doone.sc.tx.cloud.dyb.system.bean.po.member.MemberPo; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder;

    /**

    @Auther: liufei

    @Date: 2020/7/1 10:55

    @Description: */ @Component public class AuthActionInterceptor implements HandlerInterceptor {

    @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(“开始拦截1…1”); MemberPo memberPo = UserContext.getUser(); if(memberPo==null){ String mString = URLEncoder.encode(“请先登录”, “utf-8”); /* String target = URLEncoder.encode(request.getRequestURL().toString(), “uft-8”);*/ returnJson(response,"{“code”:400,“msg”:“请登录!”}"); return false; }else{ return true; } }

    /**

    后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub

    } /**

    整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub }

    /返回客户端数据/ private void returnJson(HttpServletResponse response, String json) throws Exception{ PrintWriter writer = null; response.setCharacterEncoding(“UTF-8”); response.setContentType(“text/html; charset=utf-8”); try { writer = response.getWriter(); writer.print(json);

    } catch (IOException e) { } finally { if (writer != null){ writer.close();} }

    }

    }

    我这里需要第一个拦截器在第二个拦截器之前拦截

    这里就需要这样设置 package cn.com.doone.sc.tx.cloud.dyb.system.handle;

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

    /**

    @Auther: liufei

    @Date: 2020/7/1 09:54

    @Description: */ @Configuration public class MvcInterceptorConfig extends WebMvcConfigurationSupport {

    @Autowired private AuthInterceptor authInterceptor; @Autowired private AuthActionInterceptor authActionInterceptor;

    @Override protected void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则,/表示拦截所有请求 // excludePathPatterns 用户排除拦截 registry.addInterceptor(authInterceptor).addPathPatterns("/") .excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); registry.addInterceptor(authActionInterceptor).addPathPatterns("/**") .excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); super.addInterceptors(registry); }

    }

    这里稍微讲解下

    Processed: 0.011, SQL: 9