이 기사는 주로 SpringMVC 인터셉터를 소개합니다.
1. DispatcherServlet
SpringMVC에는 Unified Entry Dispatcherservlet이 있으며 모든 요청은 Dispatcherservlet을 통과합니다.
DispatcherServlet은 web.xml 파일에 구성된 사전 컨트롤러입니다. 일치 요청을 가로 채려면 서블릿 차단 규칙을 자체적으로 정의해야하며, 차단 된 요청은 특정 처리 규칙에 따라 대상 컨트롤러에 배포되어야합니다. 이제 Web.xml에 다음 구성을 추가합니다.
<!-DispatcherServlet을 초기화 할 때 프레임 워크는 웹 애플리케이션 Web-Inf 디렉토리에서 [servlet-name] -servlet.xml이라는 파일을 찾고 있으며 전역으로 정의 된 콩을 재정의하는 관련 콩을 정의합니다-> <servlet> springmybatis </servlet-name> <Servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> springmybatis </servlet-name> <!-모든 요청이 처리 될 것입니다-<urlattern>/</url-pattern>. </servlet-mapping>
2. 정적 자원은 가로 채지 않습니다
*.DO 형식과 유사한 URL의 가로 채기 만 구성하는 경우 정적 리소스에 액세스하는 데 아무런 문제가 없습니다. 그러나 구성이 모든 요청 (예 : 위에서 구성한 "/"등)을 가로 채면 JS 파일, CSS 파일 및 그림 파일과 같은 정적 리소스가 접근 할 수 없게됩니다.
일반적으로 인터셉터는 주로 허가 관리를 위해 구현되며, 주로 일부 URL 요청을 가로 채므로 정적 리소스가 가로 채지 않습니다. 정적 자원을 걸러내는 두 가지 방법이 있습니다.
첫 번째는 <mvc : default-servlet handler />를 사용하는 것입니다 (일반적으로 웹 애플리케이션 서버의 기본 서플릿 이름은 "기본"이므로 정적 파일을 처리하기 위해 Tomcat의 defaultservlet을 활성화하고 web.xml에서 다음 코드를 구성합니다 :)
<!- 서블릿은 Tomcat, Jetty 등과 같은 컨테이너에 제공되며 정적 자원 매핑을 / to / static / directory에서 변경합니다. 예를 들어, http : //localhost/foo.css를 방문했을 때, 이제 http : //localhost/static/foo.css-> <!-정적 파일을 가로 채지 마십시오-> <servlet-mapping> <servlet-name> default </servlet-name> <url-pattern>/js/*</url-pattern> <Url-pattern>/css/*</url-pattern> <url-pattern>/images/*</url-pattern> <url-pattern>/fonts/*</url-pattern> </servlet-mapping>
Tomcat, Jetty, Jboss 및 Glassfish 기본 서블릿의 이름-"기본값"
기본 서블릿의 이름을 수지-"수지 파일"
Weblogic Default Servlet 이름-"Fileservlet"
WebSphere 기본 서블릿 이름-"SimpleFileservlet"
모든 웹 애플리케이션 서버의 기본 서플릿 이름이 "기본값"이 아닌 경우 기본 수면 이름 속성을 통해 지정된 것을 표시해야합니다.
<MVC : Default-Servlet Handleler Default-Servlet-Name = "웹 서버에서 기본적으로 사용하는 서블릿 이름" />
두 번째 유형은 <mvc : resources />를 사용하고 SpringMVC 구성 파일에 다음 코드를 추가하는 것입니다.
<mvc : 리소스 매핑 = "/js/**"위치 = "/static_resources/javaScript/"/> <mvc : 리소스 매핑 = "/styles/**"location = "/static_resources/css/"/> <mvc : mvc : mvc : mvc : mvc : "/images/**"location = "/static_rresources/images/"/images/"
3. 사용자 정의 인터셉터
SpringMVC의 인터셉터 핸들러 interceptorAdapter는 3 개의 사전 핸들, 사후 및 절정 방법을 제공합니다. 서비스 프로세서가 요청을 처리하기 전에 사전 핸들이 호출됩니다.
Posthandle은 비즈니스 프로세서가 요청의 실행을 완료하고보기를 생성 한 후에 실행됩니다. DispatcherServlet이 요청을 완전히 처리 한 후에 Afterctionion이 호출되고 자원 등을 정리하는 데 사용될 수 있습니다. 따라서 자체 권한 관리 로직을 구현하려면 HandlerinterceptorAdapter를 상속하고 세 가지 방법을 다시 작성해야합니다.
먼저 SpringMvc.xml에 내 자신의 정의 인터셉터를 추가하십시오. 내 구현 로직 공통 인 집적 흡입기.
<!-인터셉터, 다중 인터셉터, 순차적으로 실행-> <mvc : interceptors> <mvc : interceptor> <!-URL 경로와 일치합니다. /**를 구성하지 않으면 모든 컨트롤러가 인터셉트됩니다-> <mvc : 맵핑 경로 = "/user/**"/> <mvc : 매핑 경로 = "/test/**"/> </bean> </mvc : interceptor> <!-여러 인터셉터를 설정할 때 먼저 사전 핸들 방법을 호출하고 posthondle 및 posthondle and complypertion을 호출합니다. 반전 -> </mvc : 인터셉터>
내 인터 셉션 로직은 "로그인하기 전에 모든 액세스 URL이 로그인 페이지로 이동합니다. 로그인이 성공한 후 이전 URL로 점프하면 특정 코드는 다음과 같습니다.
/ ** * */ 패키지 com.alibaba.interceptor; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.slf4j.logger; org.slf4j.loggerfactory; org.springframework.web.servlet.modelandview import; org.springframework.web.servlet.handler.handlerinterceptoradapter import; import com.alibaba.util.requestutil; / ** * @author tfj * 2014-8-1 */ public class commoninterceptor 확장 핸들러 interceptorAdapter {private final logger log = loggerfactory.getLogger (commentInterceptor.class); public static final string last_page = "com.alibaba.lastpage"; / * * 개인 문자열 매핑을 가로 채어야하는 경로에 정기적으로 매핑을 사용하십시오. public void setMappingUrl (String MappingUrl) {this.mappingUrl = mappingUrl; } * / / ** * 비즈니스 프로세서가 요청을 처리하기 전에 호출 * False가 반환 된 경우 * Current Interceptor에서 모든 인터셉터의 후손 () 실행을 실행 한 다음 인터셉터 체인을 종료 한 다음 true *를 실행할 때 다음 인터셉터를 실행 한 다음 모든 인터셉터 컨트롤러를 실행할 때까지 다음 인터셉터를 실행 한 다음 모든 Posth chain ()에 실행 될 때까지 다음 인터셉터를 실행할 때까지 다음 인터셉터를 실행합니다. 마지막 인터셉터에서 postCompletion () */ @override public boolean prehandle (httpservletrequest 요청, httpservletresponse 응답, 객체 핸들러)는 예외 {if ( "get".equalsignorecase (request.get.getMethod ()) {requestUtil.saverequest (); } log.info ( "================ 执行顺序 : 1 、 사전 핸드 ================"); 문자열 requestUri = request.getRequesturi (); 문자열 contextPath = request.getContextPath (); 문자열 URL = requestUri.SubString (ContextPath.Length ()); log.info ( "requestUri :"+requestUri); log.info ( "ContextPath :"+ContextPath); log.info ( "url :"+url); 문자열 username = (string) request.getSession (). getAttribute ( "사용자"); if (username == null) {log.info ( "인터셉터 : 로그인 페이지로 점프!"); request.getRequestDispatcher ( "/web-inf/jsp/login.jsp"). FORMPER (요청, 응답); 거짓을 반환합니다. } 그렇지 않으면 진실을 반환합니다. } / *** 비즈니스 프로세서가 요청 처리를 완료 한 후,보기가 생성되기 전에 실행 된 조치* 현재 시간* / @override public void posthandle (httpservletrequest 요청, httpservletresponse 응답, 객체 처리기, ModelAndView ModelView)과 같은 데이터를 추가 할 수 있습니다. log.info ( "========================================================================================================================= log.info ( "============================================================================================================================================ ======================================================================================================== ============================================================================================================= ======================================================================================================== 응답, 객체 핸들러, 예외) 예외는 {log.info ( "==============================="); 참고 : 위의 코드에서, 나는 주로 현재 요청, 세션 객체, 페이지 저장 및 암호화 페이지 및 꺼내는 것과 같은 기능을 구현하는 requestUtil을 작성했습니다.
이 시점에서 인터셉터가 구현되었으며 효과는 그림과 같습니다.
방문 /테스트 /안녕하세요 직접 차단됩니다
성공적으로 로그인하면 /테스트 /hello에 해당하는 페이지로 이동합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.