자바 3 대 차단기 (Interceptor) 의 실현 원리 및 코드 예시

9180 단어
과정 주소: 자바 3 대 차단기 (Interceptor) 의 실현 원리 및 코드 예시
1. 차단기 의 개념 자바 의 차단 기 는 동적 차단 Action 호출 대상 입 니 다. 개발 자 들 이 Action 이 실 행 된 전후 에 코드 를 실행 할 수 있 는 메커니즘 을 제공 하고 Action 이 실 행 될 때 까지 실행 을 막 을 수 있 으 며 Action 에서 일부 코드 를 다시 사용 할 수 있 는 방식 도 제공 합 니 다.AOP 에서 차단 기 는 어떤 방법 이나 필드 가 접근 하기 전에 차단 한 다음 에 이전 또는 그 후에 어떤 조작 을 추가 하 는 데 사 용 됩 니 다.현재 우리 가 파악 해 야 할 것 은 주로 Spring 의 차단기 이다. Struts 2 의 차단 기 는 깊이 연구 하지 않 고 알 면 된다.
2. 차단기 의 원 리 는 대부분 차단기 방법 은 대리 방식 으로 호출 된다.Struts 2 의 차단 기 는 상대 적 으로 간단 하 다.Struts 2 의 ServletDispatcher 에 도착 하 기 를 요청 할 때 Struts 2 는 설정 파일 을 찾 고 설정 에 따라 상대 적 인 차단기 대상 을 예화 한 다음 목록 (List) 으로 연결 합 니 다. 마지막 호출 목록 의 차단기 입 니 다.Struts 2 의 차단 기 는 플러그 가 가능 하고 차단 기 는 AOP 의 실현 이다.Struts 2 차단기 스 택 은 차단 기 를 일정한 순서에 따라 체인 으로 연결 하 는 것 입 니 다.차단 되 는 방법 이나 필드 에 접근 할 때 Struts 2 차단기 체인 의 차단 기 는 이전에 정 의 된 순서에 따라 호출 됩 니 다.
3. 사용자 정의 차단기 의 첫 번 째 단계: Interceptor 인 터 페 이 스 를 실현 하 는 클래스 를 사용자 정의 하거나 추상 적 인 클래스 Abstract Interceptor 를 계승 합 니 다.두 번 째 단계: 설정 파일 에 정 의 된 차단 기 를 등록 합 니 다.세 번 째 단계: Action 에서 상기 정 의 된 차단 기 를 참조 해 야 합 니 다. 편리 하도록 차단 기 를 기본 차단기 로 정의 할 수 있 습 니 다. 이렇게 특별한 설명 없 이 모든 Action 이 이 차단기 에 의 해 차단 되 었 습 니 다.
4. 필터 와 차단기 의 차이 점 필 터 는 '원 하 는 것 을 가 져 옵 니 다' 로 간단하게 이해 할 수 있 습 니 다. 필 터 는 웹 요청 에 주목 합 니 다.차단 기 는 '당신 이 원 하 는 것 을 거절 합 니 다' 라 고 간단하게 이해 할 수 있 습 니 다. 차단 기 는 민감 한 어 휘 를 차단 하 는 방법 호출 에 관심 을 가지 고 있 습 니 다.4.1 차단 기 는 자바 반사 체 제 를 바탕 으로 이 루어 진 것 이 고 필 터 는 함수 리 셋 을 바탕 으로 이 루어 진 것 이다.(어떤 사람 은 차단 기 는 동적 대 리 를 바탕 으로 이 루어 진다 고 말한다) 4.2. 차단 기 는 servlet 용기 에 의존 하지 않 고 필 터 는 servlet 용기 에 의존한다.4.3 차단 기 는 Action 에 만 작용 하고 필 터 는 모든 요청 에 작용 할 수 있다.4.4. 차단 기 는 Action 컨 텍스트 와 값 스 택 의 대상 에 접근 할 수 있 고 필 터 는 사용 할 수 없습니다.4.5. Action 의 수명 주기 에 차단 기 는 여러 번 호출 할 수 있 고 필 터 는 용기 가 초기 화 될 때 한 번 만 호출 할 수 있 습 니 다.
5. Spring 차단기 5.1, 추상 류 Handler InterceptorAdapter. 우리 가 프로젝트 에서 Spring 프레임 워 크 를 사용 하면 Handler InterceptorAdapter. java 라 는 추상 류 를 직접 계승 하여 우리 자신의 차단 기 를 실현 할 수 있 습 니 다.
Spring 프레임 워 크, 자바 의 차단기 개념 을 포장 했다 는 점 은 Struts 2 와 유사 하 다.Handler Interceptor Adapter 는 추상 적 인 인터페이스 Handler Interceptor 를 계승 했다.
1.  package org.springframework.web.servlet.handler;  
2.  import javax.servlet.http.HttpServletRequest;  
3.  import javax.servlet.http.HttpServletResponse;  
4.  import org.springframework.web.servlet.HandlerInterceptor;  
5.  import org.springframework.web.servlet.ModelAndView;  
6.  public abstract class HandlerInterceptorAdapter implements HandlerInterceptor{  
7.  //                  
8.  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{  
9.  return true;  
10.  }  
11.  //               ,          
12.  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
13.  throws Exception{  
14.  }  
15.  //  DispatcherServlet            ,         
16.  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
17.  throws Exception{  
18.  }  
19.  }  
        Spring             UserRoleAuthorizationInterceptor,UserRoleAuthorizationInterceptor   

추상 클래스 Handler InterceptorAdapter 는 사용자 로그 인 인증 차단 기능 을 실 현 했 으 며, 현재 사용자 가 인증 을 통과 하지 못 하면 403 오 류 를 보고 합 니 다.
1.  package org.springframework.web.servlet.handler;  
2.  import java.io.IOException;  
3.  import javax.servlet.ServletException;  
4.  import javax.servlet.http.HttpServletRequest;  
5.  import javax.servlet.http.HttpServletResponse;  
6.  public class UserRoleAuthorizationInterceptor extends HandlerInterceptorAdapter{  
7.  //      ,            
8.  private String[] authorizedRoles;  
9.  public final void setAuthorizedRoles(String[] authorizedRoles){  
10.  this.authorizedRoles = authorizedRoles;  
11.  }  
12.  public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
13.  throws ServletException, IOException{  
14.  if (this.authorizedRoles != null) {  
15.  for (int i = 0; i < this.authorizedRoles.length; ++i) {  
16.  if (request.isUserInRole(this.authorizedRoles[i])) {  
17.  return true;  
18.  }  
19.  }  
20.  }  
21.  handleNotAuthorized(request, response, handler);  
22.  return false;  
23.  }  
24.  protected void handleNotAuthorized(HttpServletRequest request, HttpServletResponse response, Object handler)  
25.  throws ServletException, IOException{  
26.  // 403       。          ,       ,            
27.  response.sendError(403);  
28.  }  
29.  }  
  ,    Spring     HandlerInterceptorAdapter   ,            。         

UserLogin InterceptorBySpring, 로그 인 차단 제어.작업 절 차 는 다음 과 같 습 니 다. 현재 사용자 가 로그 인 하지 않 으 면 로그 인 페이지 로 이동 합 니 다.로그 인 에 성공 하면 이전에 방문 한 URL 페이지 로 이동 합 니 다.
1.  import java.util.HashMap;  
2.  import java.util.Map;  
3.  import javax.servlet.http.HttpServletRequest;  
4.  import javax.servlet.http.HttpServletResponse;  
5.  import org.springframework.web.servlet.ModelAndView;  
6.  import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
7.  /** 
8.  * @description   spring     HandlerInterceptorAdapter,         
9.  */  
10.  public class UserLoginInterceptorBySpring extends HandlerInterceptorAdapter{  
11.  //                  
12.  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{  
13.  // equalsIgnoreCase   equals   ?  
14.  if("GET".equalsIgnoreCase(request.getMethod())){  
15.  //RequestUtil.saveRequest();  
16.  }  
17.  System.out.println("preHandle...");  
18.  String requestUri = request.getRequestURI();  
19.  String contextPath = request.getContextPath();  
20.  String url = requestUri.substring(contextPath.length());  
21.  System.out.println("requestUri" + requestUri);  
22.  System.out.println("contextPath" + contextPath);  
23.  System.out.println("url" + url);  
24.  String username = (String) request.getSession().getAttribute("username");  
25.  if(null == username){  
26.  //          
27.  request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);  
28.  return false;  
29.  }  
30.  else{  
31.  return true;  
32.  }  
33.  }  
34.  //               ,          
35.  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{  
36.  System.out.println("postHandle...");  
37.  if(modelAndView != null){  
38.  Map map = new HashMap();  
39.  modelAndView.addAllObjects(map);  
40.  }  
41.  }  
42.  //  DispatcherServlet            ,         
43.  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception{  
44.  System.out.println("afterCompletion...");  
45.  }  
46.  }  
      Java        。      ,    JDK       ,     ,JDK       ,      。   

절단면 프로 그래 밍 에 사용 되 는 것 은 서비스 나 한 방법 전에 방법 을 호출 하거나 방법 후에 방법 을 호출 하 는 것 입 니 다.차단 기 는 웹. xml 이 아 닙 니 다. 예 를 들 어 struts 는 struts. xml 에서 설정 합 니 다.
1.  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    
2.  Object result = null;    
3.  System.out.println("     ,        " + method.getName());    
4.  result = method.invoke(this.targetObj, args);    
5.  System.out.println("     ,         " + method.getName());    
6.  return result;    
7.  }    

요약: 1. 필터 (Filter): 필 터 는 말 그대로 필터 에 사 용 됩 니 다. 자바 필 터 는 시스템 등급 의 필 터 를 제공 할 수 있 습 니 다. 즉, 모든 웹 요청 을 걸 러 낼 수 있다 는 점 은 차단기 가 할 수 없습니다.자바 웹 에서 들 어 오 는 request, response 는 미리 정 보 를 걸 러 내 거나 인 자 를 미리 설정 한 다음 에 servlet 또는 struts 의 action 에 들 어가 업무 논 리 를 합 니 다. 예 를 들 어 불법 url (login. do 의 주소 요청 이 아니 라 사용자 가 착륙 하지 않 으 면 걸 러 냅 니 다) 을 걸 러 내 거나 servlet 또는 struts 의 action 에 들 어가 기 전에 문자 집합 을 통일 적 으로 설정 합 니 다.혹은 불법 문 자 를 제거 합 니 다.filter 프로 세 스 는 선형 입 니 다. url 이 전 달 된 후에 검 사 를 한 후에 원래 의 프로 세 스 를 계속 아래로 실행 하고 다음 filter, servlet 에 의 해 받 아들 일 수 있 습 니 다.2. 모니터 (Listener): 자바 의 모니터 이자 시스템 수준의 감청 입 니 다.모니터 는 웹 응용 프로그램의 시작 에 따라 시 작 됩 니 다.자바 의 감청 기 는 c / s 모드 에서 자주 사용 되 며 특정한 사건 에 대해 처리 합 니 다.감청 은 여러 가지 모델 에서 사용 된다. 예 를 들 어 관찰자 모델 은 바로 감청 기 를 사용 하여 이 루어 진 것 이다. 예 를 들 어 사이트 의 온라인 인원 을 통계 하 는 것 이다.예 를 들 어 struts 2 는 감청 으로 작 동 할 수 있다.Servlet 감청 기 는 일부 중요 한 사건 의 발생 을 감청 하 는 데 사용 되 며, 감청 기 대상 은 일이 발생 하기 전, 발생 한 후에 필요 한 처 리 를 할 수 있다.3. 차단기 (Interceptor): 자바 의 차단 기 는 비 시스템 적 인 차단 을 제공 합 니 다. 즉, 커버 면 에 서 는 필터 보다 강하 지 않 지만 목적 성 이 있 습 니 다.자바 의 차단 기 는 자바 반사 체 제 를 바탕 으로 이 루어 진 것 이 고 더욱 정확 한 구분 은 JDK 를 바탕 으로 이 루어 진 동적 에이전트 여야 합 니 다.그것 은 구체 적 인 인터페이스 에 의존 하여 운행 하 는 동안 동적 으로 바이트 코드 를 생 성 한다.차단 기 는 동적 차단 Action 호출 대상 으로 개발 자가 Action 이 실 행 된 전후 에 코드 를 실행 할 수 있 는 메커니즘 을 제공 하고 Action 이 실행 되 기 전에 실행 을 막 을 수 있 으 며 Action 에서 일부 코드 를 다시 사용 할 수 있 는 방식 도 제공 합 니 다.AOP 에서 차단 기 는 어떤 방법 이나 필드 가 접근 하기 전에 차단 한 다음 에 이전 또는 그 후에 어떤 조작 을 추가 하 는 데 사 용 됩 니 다.자바 의 차단 기 는 주로 플러그 인 에 사 용 됩 니 다. 확장 자 는 Hibernate Spring Struts 2 등 과 같 습 니 다. 슬라이스 를 위 한 기술 과 비슷 합 니 다. 사용 하기 전에 설정 파일 인 xml, 파일 에 한 단락 을 설명 하 는 것 을 사용 해 야 합 니 다.

좋은 웹페이지 즐겨찾기