最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring boot中interceptor攔截器未生效的解決

 更新時(shí)間:2021年09月17日 11:11:56   作者:sorrow_yc  
這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

interceptor攔截器未生效

搭建項(xiàng)目時(shí)發(fā)現(xiàn)攔截器未生效

開始用的spring boot版本為1.5.6

代碼如下:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{ 
 @Autowired
 private TimeInterceptor timeInterceptor; 
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(this.timeInterceptor);
  super.addInterceptors(registry);
 }
}
@Component
public class RequestParamInfoIntorceptor extends HandlerInterceptorAdapter { 
   private Logger logger = LoggerFactory.getLogger(RequestParamInfoIntorceptor.class); 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
             throws Exception {
         try {
             if (handler instanceof HandlerMethod) {
                 HandlerMethod handlerMethod = (HandlerMethod) handler;
                 String beanName = handlerMethod.getBean().getClass().toString();//類
                 String methodName = handlerMethod.getMethod().getName();//方法名稱
                 if(methodName.equals("error") || methodName.equals("success")) {
                     return super.preHandle(request, response, handler);
                 }
                 String uri = request.getRequestURI();//請(qǐng)求路徑
                 String remoteAddr = getIpAddr(request);//ip
                 String method = request.getMethod(); //請(qǐng)求方式
                 Map<String,String[]> pramMap = request.getParameterMap();
                 StringBuffer sbf = new StringBuffer();
                 int count = 0;
                 String forCunt = "";
                 for(Map.Entry<String, String[]> entry:pramMap.entrySet()){  
                     forCunt = "[" + count + "]" + " : " ;
                     sbf.append( "paramName" + forCunt + entry.getKey() + " - "+ "paramValue" + 
                             forCunt + request.getParameter(entry.getKey()) + "\n");
                     count ++;
                 } 
                 logger.info(" { beanName : " + beanName + " | " + "methodName : " + methodName + " | " + "uri : "
                         + uri + " | " + "remoteAddr : " + remoteAddr + " | " + "requestMethod : " +
                         method + "\n" + "param : " + sbf + "}");
             } 
         } catch (Exception e) {
             //出錯(cuò)
             logger.error(e.toString());
         }
         return super.preHandle(request, response, handler);
     } 
     //獲取客戶端IP
     private String getIpAddr(HttpServletRequest request) {
         String ip = request.getHeader("x-forwarded-for");
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("Proxy-Client-IP");
         }
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
             ip = request.getRemoteAddr();
         }
         return ip;
     } 
}

開始以為是版本問題,后升級(jí)為2.1.1,WebConfig改為實(shí)現(xiàn)WebMvcConfigurer,代碼如下

@Configuration
@Component
public class WebConfig implements WebMvcConfigurer{ 
 @Autowired
 private RequestParamInfoIntorceptor requestParamInfoIntorceptor;
 
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(this.requestParamInfoIntorceptor).addPathPatterns("/**");
 } 
}

驗(yàn)證后還是不行,繼續(xù)排查后發(fā)現(xiàn),在添加版本控制時(shí),有配置類繼承了WebMvcConfigurationSupport,查詢WebMvcConfigurationSupport源碼發(fā)現(xiàn)其中有攔截器注冊(cè)方法addInterceptors(InterceptorRegistry registry),所以在版本控制配置類中重寫此方法添加攔截器,攔截器生效,問題解決。

解決方案

代碼如下:

@Configuration
public class ApiConfig extends WebMvcConfigurationSupport { 
 @Autowired
 private RequestParamInfoIntorceptor requestParamInfoIntorceptor;
 
 @Override
 protected void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(this.requestParamInfoIntorceptor).addPathPatterns("/**");
  super.addInterceptors(registry);
 } 
}

HandlerInterceptor實(shí)現(xiàn)登錄失效攔截等

首先寫一個(gè)實(shí)現(xiàn)HandlerInterceptor的類

代碼如下:

public class SessionInterceptor implements HandlerInterceptor {
    @Autowired
    RedisTemplate<String, String> redisTemplate;
    //private static String LOGIN_CODE = "/user/no_loginPage?Landingcode=" + UserResourcesHelper.LANDINGCODE_106;// 登錄地址及code信息
    //private static String LOGIN_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd11f95277f85e24b&redirect_uri=&response_type=code&scope=snsapi_userinfo&state=1234#wechat_redirect";
    protected List<String> patterns = new ArrayList<String>(Arrays.asList(".*?/.*/no_.*?", "/", "/error"));
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 一些不需要過濾的方法
        String url = request.getRequestURI();
        if (isInclude(url) == true)
            return true;
        // 權(quán)限校驗(yàn)
        Cookie cookie = getCookieByName(request, UserResourcesHelper.COOKIE_TOKEN_NAME);
        String user = null;
        if (cookie != null && !cookie.getValue().equals("")) {
            user = redisTemplate.opsForValue().get(RedisKeyConstant.USER_WEB_TOKEN + cookie.getValue());
        }
        if (cookie == null || user == null) {// 判斷用戶是否經(jīng)過了授權(quán)
            // 判斷是否是AJAX訪問
            if (request.getHeader("x-requested-with") != null
                    && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                response.setHeader("sessionstatus", "timeout");
                response.setStatus(403);
                return false;
            } else {
                response.sendRedirect(request.getContextPath()+"/home/no_index_toLoginSkip");
                //response.sendRedirect(request.getContextPath() +UserResourcesHelper.LOGIN_URL); // 非AJAX訪問,頁面跳轉(zhuǎn)
                //response.sendRedirect(request.getContextPath() +"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd11f95277f85e24b&redirect_uri="+URLEncoder.encode("http://m.hobay.cn/user/no_loginPage", "utf-8")+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"); // 非AJAX訪問,頁面跳轉(zhuǎn)
                return false;
            }
        }
        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 {
    }
    private boolean isInclude(String url) {
        for (String pattern : patterns) {
            if (Pattern.matches(pattern, url)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 根據(jù)名字獲取cookie
     * 
     * @param request
     * @param name
     *            cookie名字
     * @return
     */
    private static Cookie getCookieByName(HttpServletRequest request, String name) {
        Map<String, Cookie> cookieMap = ReadCookieMap(request);
        if (cookieMap.containsKey(name)) {
            Cookie cookie = (Cookie) cookieMap.get(name);
            return cookie;
        } else {
            return null;
        }
    }
    /**
     * 將cookie封裝到Map里面
     * 
     * @param request
     * @return
     */
    private static Map<String, Cookie> ReadCookieMap(HttpServletRequest request) {
        Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (Cookie cookie : cookies) {
                cookieMap.put(cookie.getName(), cookie);
            }
        }
        return cookieMap;
    }

然后把這個(gè)攔截器注冊(cè)到spring中

代碼如下:

@EnableWebMvc
@Configuration
public class WebConfig  extends WebMvcConfigurerAdapter{
     @Bean
     SessionInterceptor sessioninterceptor() {
         return new SessionInterceptor();
    }
    /**
     * 配置攔截器
     * @author yuqingquan
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sessioninterceptor());
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章帶你了解Java之關(guān)鍵字和保留字

    一篇文章帶你了解Java之關(guān)鍵字和保留字

    Java 保留字列表 (依字母排序 共14組) : Java保留字是指現(xiàn)有Java版本尚未使用 但以后版本可能會(huì)作為關(guān)鍵字使用,希望本篇文章能給您帶來幫助
    2021-08-08
  • Spring面向切面編程AOP詳情

    Spring面向切面編程AOP詳情

    這篇文章主要介紹了Spring面向切面編程AOP詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    微服務(wù)架構(gòu)中多數(shù)據(jù)源切換是個(gè)常見的需求,Spring Boot 提供了強(qiáng)大的支持來簡化這一過程.本文給大家介紹了SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法,需要的朋友可以參考下
    2024-11-11
  • Java自動(dòng)生成編號(hào)的方法步驟

    Java自動(dòng)生成編號(hào)的方法步驟

    在新增數(shù)據(jù)時(shí),往往需要自動(dòng)生成編號(hào),本文主要介紹了Java自動(dòng)生成編號(hào)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java GUI編程之貪吃蛇游戲簡單實(shí)現(xiàn)方法【附demo源碼下載】

    Java GUI編程之貪吃蛇游戲簡單實(shí)現(xiàn)方法【附demo源碼下載】

    這篇文章主要介紹了Java GUI編程之貪吃蛇游戲簡單實(shí)現(xiàn)方法,詳細(xì)分析了貪吃蛇游戲的具體實(shí)現(xiàn)步驟與相關(guān)注意事項(xiàng),并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2017-09-09
  • 2021年最新Redis面試題匯總(4)

    2021年最新Redis面試題匯總(4)

    在程序員面試過程中redis相關(guān)的知識(shí)是常被問到的話題。這篇文章主要介紹了幾道Redis面試題,整理一下分享給大家,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    本文主要介紹了HiveJDBC和ImpalaJDBC的使用方法,包括版本對(duì)應(yīng)、Maven安裝、主機(jī)名配置、端口開通、JDBC連接和Kerberos認(rèn)證等
    2025-02-02
  • Java ThreadLocal的使用詳解

    Java ThreadLocal的使用詳解

    ThreadLocal是線程私有的局部變量存儲(chǔ)容器,可以理解成每個(gè)線程都有自己專屬的存儲(chǔ)容器,用來存儲(chǔ)線程私有變量。ThreadLocal 在日常開發(fā)框架中應(yīng)用廣泛,但用不好也會(huì)出現(xiàn)各種問題,本文就此講解一下。
    2021-05-05
  • Java 生成隨機(jī)字符串?dāng)?shù)組的實(shí)例詳解

    Java 生成隨機(jī)字符串?dāng)?shù)組的實(shí)例詳解

    這篇文章主要介紹了Java 生成隨機(jī)字符串?dāng)?shù)組的實(shí)例詳解的相關(guān)資料,主要是利用Collections.sort()方法對(duì)泛型為String的List 進(jìn)行排序,需要的朋友可以參考下
    2017-08-08
  • Java8中新判空方法之Optional類的使用詳解

    Java8中新判空方法之Optional類的使用詳解

    Opitonal類就是Java提供的為了解決大家平時(shí)判斷對(duì)象是否為空用的。本文將通過示例為大家講解一下Optional類的使用,感興趣的可以收藏一下
    2022-12-12

最新評(píng)論

吴桥县| 华坪县| 应用必备| 彭山县| 东乡县| 突泉县| 婺源县| 洛南县| 页游| 桐柏县| 耒阳市| 阳曲县| 景谷| 石城县| 平南县| 东方市| 江川县| 开平市| 阿荣旗| 抚州市| 古交市| 东乌珠穆沁旗| 偏关县| 海门市| 定兴县| 临颍县| 伊宁市| 抚宁县| 阳曲县| 晋中市| 景洪市| 鄂伦春自治旗| 共和县| 四子王旗| 怀来县| 香港 | 潮州市| 疏附县| 卓尼县| 百色市| 大理市|