ssm項目中使用攔截器加上不生效解決方案


  在很多時候,需要攔截器來幫助我們完成一些特定的工作,比如獲取請求的參數,本身在request這種獲取數據就是一次磁盤的io,

如果在filter中獲取了參數,那么在controller中就不能獲取相關參數,,所以一般有時候需要從interceptor來進行相關功能的完成,本來可以在springboot中輕松使用interceptor,那么

可以在ssm中使用呢,是不是有點難度呢,主要一直使用那個后來一直沒有使用ssm,所以今天進行測試下,

首先,寫一個類HttpInterceptor  繼承HandlerInterceptorAdapter,或者 實現HandlerInterceptor

 

public class HttpInterceptor /*extends HandlerInterceptorAdapter*/ implements HandlerInterceptor{

然后看具體的代碼:

package com.yd.ydpdm.common.aspect;

import java.util.Map;

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

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Component
public class HttpInterceptor /*extends HandlerInterceptorAdapter*/ implements HandlerInterceptor{


    private static final String START_TIME = "requestStartTime";
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
          String url = request.getRequestURI().toString();
            long start = (Long) request.getAttribute(START_TIME);
            long end = System.currentTimeMillis();
            System.err.println("request completed. url:{}, cost:{}"+ url+(end - start));
            System.out.println("11111");
        
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        String url = request.getRequestURI().toString();
        long start = (Long) request.getAttribute(START_TIME);
        long end = System.currentTimeMillis();
        System.out.println(start);
        System.out.println(end);
        System.err.println("request finished. url:{}, cost:{}"+ url+"-------------------------"+(end - start));
        System.out.println("3");
        
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI().toString();
       
        Map parameterMap = request.getParameterMap();
        System.err.println("request start. url:{}, params:{}"+url+parameterMap);
        long start = System.currentTimeMillis();
        System.out.println("2");
        request.setAttribute(START_TIME, start);
        return true;
    }

}

在前置攔截器中,return true 代表放行的意思,如果return false就不放行的意思.

如上攔截器就是進行測試的,記錄接口執行時間

在攔截器寫完之后還需要進行其他配置,

在springmvc中配置:

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**" />            
            <bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

1. 如果不生效,可以配置:

 <mvc:interceptors>
        <bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
        <mvc:interceptor>
            <mvc:mapping path="/**" />            
            <bean class="com.yd.ydpdm.common.aspect.HttpInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

配置一個獨立的bean,是由於在<mvc:annotation-driven />這個里面有個攔截器的級別高,導致不生效,

2 然后我在測試過程出現了問題,就是配置了,然后所有的都寫了,就是不生效這個攔截器,所以找來很久原因,但是一直沒找出來\

最后具體原因就是寫的代碼不生效,,

最終原因是,在這個過程中代碼在編譯工具中沒有進行編譯,.再進行一次編譯之后就生效了

 

3 如果在前置攔截器中,retrun false

 4 並不需要配置@component注解因為在項目初始化的時候就進行了初始化,因為在web.xml中文件是入口文件,配置了之后就會進行加載,,並不需要springbean進行初始化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM