자바 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, 파일 에 한 단락 을 설명 하 는 것 을 사용 해 야 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.