1. 인터셉터 소개
인터셉터의 기능은 Web.xml 파일의 필터와 유사합니다. 사용자 요청을 가로 채고 사용자 요청을 가로 채어 페이지를 제어 할 수 있습니다. 인터셉터는 Struts-Core-2.2.3.jar로 구성됩니다. 원래 인터셉터는 Struts-default.xml로 구성되어 인터셉터의 기본 사용 방법을 밀봉합니다.
Struts2 인터셉터 기능은 서블릿 필터와 유사합니다. 작업이 실행 방법을 실행하기 전에 struts2는 먼저 struts.xml에서 참조 된 인터셉터를 실행합니다. 인터셉터가 여러 개있는 경우 위아래로 순서대로 실행됩니다. 모든 인터셉터의 인터셉터 방법을 실행하면 실행 방법이 실행됩니다.
Struts2 인터셉터는 com.opensymphoy.xwork2.interceptor.interceptor 에서이 인터페이스를 구현해야합니다. 정의 된 인터셉터에서 다음 세 가지 방법을 구현해야합니다.
무효 파괴 (); void init (); 문자열 인터셉트 (ActionInvocation vociation)는 예외를 던집니다.
사용자 정의 인터셉터는 위의 세 가지 방법을 무시해야합니다. 또한 Struts2의 인터셉터 구성 파일 struts.xml은 원본 파일 Struts-default.xml 파일을 상속하여 struts-default.xml의 모든 구성 정보가 해당 <package>에 자동으로 소유되도록합니다. 특정 코드는 다음과 같습니다.
<package name = "demo"extends = "struts-default"> ... </package>
2. 인터셉터를 추가하십시오
인터셉터를 사용하려면 구성해야합니다. struts2는 매핑 방법을 사용하므로 특정 함수를 사용하려면 구성 파일에서 구성되어야하며 인터셉터도 예외는 아닙니다. 따라서 해당 인터셉터 요소를 패키지에 추가해야하며 인터셉터는 해당 클래스 파일과 연관되어 있어야하여 작업이 실행되기 전에 해당 인터셉터가 실행되도록해야합니다. 특정 사용 방법은 다음과 같습니다.
(1) 구성 파일 struts.xml을 추가하고 파일에 인터셉터를 추가합니다.
<package name = "testLogin"네임 스페이스 = "/"extends = "struts-default"> <!-인터셉터-> <인터셉터 이름 = "myinterceptor"> </interceptor> </interceptor> <action name = "demo"> <result name = "error"type = "retirect">/error.jsp </result> <result name = "/renate ="/renate = "/renate name"> 이름 = "checkerror">/checksession.jsp </result> <interceptor-ref name = "myinterceptor"> </interceptor-ref> <interceptor-ref name = "defaultstack"> </interceptor-ref> </action> </package>
위의 패키지에서 MyInterceptor라는 인터셉터가 추가되었고 Java 클래스가 Interceptor에 등록되어 Myinterceptor로 지명되어 Com.interceptor 패키지에서 차단되었습니다. 또한 패키지에 해당 조치가 추가되었습니다. 동작을 실행하기 전에 Myinterceptor 인터셉터가 먼저 실행됩니다.
(2) 등록 된 인터셉터 클래스 Myinterceptor를 작성하십시오. 이 클래스는 com.opensymphoy.xwork2.interceptor.interceptor 인터페이스를 구현하고 해당 방법을 재정의해야합니다.
패키지 com.interceptor; java.util.map import; import com.entity.user; com.opensymphony.xwork2.actionContext 가져 오기; com.opensymphony.xwork2.actionInvocation 가져 오기; com.opensymphony.xwork2.interceptor.interceptor 가져 오기; 공개 클래스 MyInterceptor는 인터셉터 {개인 사용자 사용자; 공개 사용자 getUser () {return user; } public void setUser (사용자 사용자) {this.user = user; } @override public void destroy () {// todo 자동 생성 메소드 스터브 시스템.out.println ( "---- Destroy () ----"); } @override public void init () {// todo 자동 생성 메소드 스터브 시스템.out.println ( "------ init () -------"); } @override public string intercept (ActionInvocation invocation) 예외 {// todo 자동 생성 메소드 스터브 System.out.println ( "-----------"); map <string, object> session = invocation.getInvocationContext (). getsession (); if (session.get ( "username")! = null) {System.out.println ( "성공적으로 로그인!"); //session.put ( "username", user.getusername ()); return invocation.invoke (); } else {System.out.println ( "로그인 실패!"); "checkerror"를 반환합니다. }}}(3) 처음 두 단계 후에 인터셉터가 구성되었습니다. 마지막 부분은 인터셉터를 사용하는 것입니다. 해당 태그를 디스플레이 페이지에 추가하고 태그에 위에서 만든 데모라는 동작을 지정하십시오. 그런 다음 페이지를 실행하여 콘솔에서 해당 인터셉터 컨텐츠를 인쇄하십시오.
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 transitional // en" "http://www.w3.org/tr/tml/html 4/tml/html 4/tml 4.html/html 4.tml. <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"> <title> 제목 </title> </head> <body> <form action = "demo"> username : <input type = "text"name = "userern"> <input type = "text" "inputy" "intup type ="text ""intup type = input type = "text" "intopt" type = "제출"이름 = "OK"value = "제출"> </form> </body> </html>
인쇄물 내용 :
출력 결과를 분석하십시오. 프로그램 컴파일 단계에서 구성 파일 Struts.xml은 먼저 구성 파일 struts.xml을 읽고 구성 파일 조치에서 인터셉터가 추가되었는지 여부를 검색합니다. 인터셉터가 추가되면 인터셉터 또는 인터셉터 스택이 인터셉터 이름에 따라 <인터셉터 스택>에 정의되어 있는지 확인하십시오. 인터셉터가 정의 된 것으로 밝혀지면 인터셉터를 기반으로 해당 등록 클래스를 찾아 패키지에서 등록 된 클래스를 찾아 해당 init () 메소드를 실행하십시오. 프로그램 실행 단계의 일반적인 프로세스는 컴파일 단계와 유사합니다. 사용자가 전경에 요청을 제출 한 후에는 struts.xml에서 해당 조치를 찾습니다. 발견되면 인터셉터가 발견됩니다. 발견되지 않으면 해당 오류가 발생합니다. 마지막으로, 인터셉터 등록 클래스의 인터셉트 방법이 실행됩니다.
3. 인터셉터 스택
인터셉터는 또한 스택의 개념을 가지고 있습니다. 그들은 사용 된 인터셉터를 공유 상태로 정의하여 통합 관리를 달성하여 인터셉터를 패키지에 공유하여 인터셉터 사용을 크게 촉진 할 수 있습니다. 반복 인터셉터는 종종 패키지에 사용됩니다. 매번 액션에 인터셉터 리프를 추가하면 매우 번거 롭습니다. 그런 다음이 문제를 해결하기 위해 인터셉터 스택이 생성됩니다. 특정 구성은 다음과 같습니다.
<package name = "testLogin"네임 스페이스 = "/"extends = "struts-default"> <!-인터셉터-> <인터셉터 이름 = "myinterceptor"> </interceptor> <!-공개 인터셉터 체인을 정의합니다. 액션 태그에서 인터셉터 체인 만 참조해야합니다-> <인터셉터-스택 이름 = "defaulttstack1"> <interceptor-ref name = "myinterceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-Ref> </interceptor-stack> <action name = <demo = "" "" ">" "" "" "" "" "" "" ""interceptor-stack> < type = "redirect">/error.jsp </resent> <result name = "succes">/success.jsp.jsp </result> <결과 이름 = "checkerror">/checksessess.jsp </resent> <interceptor-ref name = "defaultStack1"> </interceptor-ref> </action>
이 예에서 인터셉터-스택은 defaulttStack1이라는 인터셉터 스택을 정의하는 데 사용됩니다. 실행할 인터셉터가 스택에 추가되고, 인터셉터가 캡슐화되고, 인터셉터 스택은 작업에서 직접 호출되어 인터셉터 스택의 공유를 실현합니다.
4. 기본 인터셉터 스택
또한 기본 인터셉터 스택을 정의 할 수 있습니다. 즉, 절편으로 정의되지 않으면 기본적으로 공개 인터셉터를 실행합니다. 인터셉터 태그와 동일한 레벨에 속하며 기본 인터셉터 리프를 사용하여 정의됩니다.
<package name = "testLogin"네임 스페이스 = "/"extends = "struts-default"> <!-인터셉터-> <인터셉터 이름 = "myinterceptor"> </interceptor> <!-공개 인터셉터 체인을 정의합니다. 액션 태그에서 인터셉터 체인 만 참조해야합니다-> <interceptor-stack name = "defaultinter"> <interceptor-ref name = "myinterceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptor-stack> </interceptors> <!-Default in the extaultor in the autceptor in the intercrector in will action-> <default-interceptor-Ref name = "defaultinter"> </default-interceptor-Ref> <action name = "demo"> <result name = "error"type = "redirect">/error.jsp <jsp </result> <result name = "success">/success.jsp </result> <result name = "checkerror">
정의 된 기본 인터셉터 스택은 작업이 인터셉터를 지정하지 않는 경우 사용자 정의 기본 인터셉터 스택 만 실행합니다. 작업에서 인터셉터가 재정의 된 경우 사용자 정의 기본 인터셉터 스택을 무시합니다.
5. 인터셉터 실행이 없습니다
패키지가 기본 인터셉터를 정의하는 또 다른 상황이 있지만, 특정 조치로 작성된 인터셉터를 실행할 필요는 없습니다. 그런 다음 해당 조치에 DefaultStack이라는 인터셉터를 추가 할 수 있습니다. 시스템의 기본 인터셉터이며 작업이 없습니다.
<package name = "testLogin"네임 스페이스 = "/"extends = "struts-default"> <!-인터셉터-> <인터셉터 이름 = "myinterceptor"> </interceptor> <!-공개 인터셉터 체인을 정의합니다. 액션 태그에서 인터셉터 체인 만 참조해야합니다-> <interceptor-stack name = "defaultinter"> <interceptor-ref name = "myinterceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptor-stack> </interceptors> <!-Default in the extaultor in the autceptor in the intercrector in will action-> <default-interceptor-Ref name = "defaultinter"> </default-interceptor-ref> <action name = "demo"> <result name = "error"type = "redirect">/error.jsp </result> <결과 이름 = "success">/success.jsp </result> <result name = "checkerRor"> jsp <!-jsp <! 인터셉터가 실행되지 않습니다-> <interceptor-Ref name = "defaultStack"> </interceptor-ref> </action> </package>
6. 차단 방법
6.1 사용
위의 인터셉터는 인터셉터 차단 동작만을 구현합니다. 실제로, 인터셉터는 매우 강력한 기능을 가지며 해당 동작 방법을 가로 채울 수도 있습니다. 가로 채기 동작의 차이점은 메소드를 가로 채려면 MethodFilterinterceptor 클래스를 상속해야한다는 것입니다. 이 클래스는 Xwork-Core.jar에 동봉되어 있으며 웹 워크가 Struts2의 핵심임을 다시 한 번 증명합니다. 또한 구성 파일에 해당 속성을 추가하여 인터 셉션 방법 및 비 상호 인식 방법을 결정해야합니다. 특정 구성 방법은 다음과 같습니다.
<package name = "testLogin"네임 스페이스 = "/"extends = "struts-default"> <!-인터셉터-> <인터셉터 이름 = "myinterceptor"> </interceptor> <!-공개 인터셉터 체인을 정의합니다. 액션 태그에서 인터셉터 체인 만 참조해야합니다-> <인터셉터-스택 이름 = "defaultinter"> <interceptor-ref name = "myinterceptor"> </interceptor-ref> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptor-stack> <action name = "reals name =" "greet name"> type = "redirect">/error.jsp </result> <result name = "success">/success.jsp.jsp </result> <result name = "checkerror">/checksession.jsp </result> <result name = "CheckError">/checksession.jsp <! <!- intercepting 메소드를 추가하여 매개 변수 이름을 추가하고, 그리고, 그리고, ExcludeMethods에서 가로 채워야합니다-> <interceptor-Ref name = "defaultstack"> <param name = "IndupeMethods"> 인터셉트 할 메소드 이름을 추가 </param> <!-intercepting method-> <param name = "excludemethod"> interception> <! </패키지>
MethodFilterInterceptor 클래스의 해당 인터셉터 메소드를 상속하는 클래스의 코드 :
패키지 com.interceptor; java.util.map import; com.opensymphony.xwork2.actionContext 가져 오기; com.opensymphony.xwork2.actionInvocation 가져 오기; com.opensymphony.xwork2.interceptor.methodfilterinterceptor import; public class inter는 methodfilterinterceptor {@override public string dointercept (actionInvocation invocation) 예외 {system.out.println ( "-intercept ()-"); // 해당 세션 맵을 가져옵니다 <string, 객체> 세션 = invocation.getInvocationContext (). getsession (); 지도 요청 = (맵) actionContext.getContext (). get ( "request"); 문자열 username = (string) request.get ( "user.username"); if (session.get ( "username")! = null) {String result = invocation.invoke (); System.out.println ( "-end ()-"); 반환 결과; }}}} 6.2 데모
가로 채기 방법의 예를 살펴보고 결과를 분석하겠습니다. 다음 예제는 인터셉트 메소드의 출력 결과를 보여줍니다. 예에서는 로그 결함 클래스가 별도로 생성되어 작업에 의해 실행될 메소드를 추가합니다. 인터셉터 메소드에서 간 클래스가 재정의되며 콘솔에서 특정 방법을 가로 채는지 여부를 출력합니다. Login.jsp 파일이 추가되어 세 가지 메소드의 실행을 각각 보여줍니다.
(1) struts.xml에서 메소드 인터셉터의 정의는 패키지에있는 인터셉터를 정의하고 인터셉터에서 매개 변수를 지정합니다. 포함 모음은 방법 1을 가로 채기 위해 사용됩니다. 방법 2는 배타적 인 경우 방법 2 방법이 가로 채지 않음을 의미합니다. 특정 구성은 다음과 같습니다.
<! doctype struts public "-// apache 소프트웨어 재단 // dtd struts configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.dtd"> <struts> <constant name = "struts.action.extension"value = "> </constut> <interceptor name = "inter"> <param name = "IncludEmethods"> method1 </param> <!-intercept method1 메서드-> <param name = "excludemethods"> method2 </param> </interceptor> <인터셉터-스택 이름 = "myinterceptor"> <interceptor-Ref name = "interceptor-Ref> <Interceptor-Ref. 이름 = "defaultStack"> </interceptor-ref> </interceptor-stack> </interceptor-stack> </interceptors> <action name = "loginaction"> <result name = "success"> success.jsp </result> <결과 이름 = "error"> error.jsp </result> <error ""error.jsp> 유형 = "리디렉션"> 환영 </결과> <interceptor-Ref name = "inter"> </interceptor-ref> <interceptor-ref name = "defaultstack"> </interceptor-ref> </action> </struts>
(2) 로그인 클래스, Login.jsp에서 동작을 구성하고 각각이 클래스에 Method1-Method3을 추가하면 Method1이 가로 채고 Method2 및 Method3가 가로 채지 않고 마지막으로 출력 결과를 확인합니다.
패키지 com.action; com.opensymphony.xwork2.actionSupport 가져 오기; public class loginaction은 ActionSupport를 확장합니다 {@override public string execute ()는 예외 {if (this.username.equals ( "admin") && this.password.equals ( "admin")) {return "success"; } else if (this.username.equals ( "cancel") && this.password.equals ( "cancel")) {return "cancel"; } else {return "error"; }} public void method1 () {system.out.println ( "실행 방법 : method1"); } public void method2 () {system.out.println ( "실행 방법 : method2"); } public void method3 () {system.out.println ( "실행 방법 : method3"); } 개인 문자열 사용자 이름; 개인 문자열 비밀번호; public String getUserName () {return this.username; } public void setusername (String username) {this.username = username; } public String getPassword () {return this.Password; } public void setpassword (문자열 비밀번호) {this.password = password; }}(3) 간 클래스, MethodFilterInterceptor 클래스를 상속하고 가로 채는 방법을 구현하는 데 사용됩니다. Dointercept 메소드를 다시 작성하고 메소드를 가로 채기위한 해당 정보를 추가하십시오.
패키지 com.interceptor; import java.util.date; java.util.map import; import com.action.loginaction; com.opensymphony.xwork2.actionContext 가져 오기; com.opensymphony.xwork2.actionInvocation 가져 오기; com.opensymphony.xwork2.interceptor.methodfilterinterceptor import; Public Class Inter는 MethodFilterInterceptor {@override Protected String Dointercept (ActionInvocation vocation)를 예외 {// todo 자동 생성 메소드 스터브 시스템.out.println ( "작업 실행 전 인터셉터 인터셉트"+new 날짜 ()); 문자열 결과 = invocation.invoke (); // 작업 메소드 시스템을 실행합니다. 반환 결과; }}(4) Login.jsp, JSP 페이지에 3 개의 버튼을 추가하고 각각 세 가지 방법을 시연하고 인터셉터의 방법에 대한 차단을 판단합니다. 클릭 후 세 버튼으로 다시 게시 된 작업은 JavaScript로 동적으로 추가됩니다. 이것은 형식으로 다른 동작을 실행하는 방법을 달성합니다. 물론 다음 기사에서 논의 될 다른 방법이 있습니다.
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 transitional // en" "http://www.w3.org/tr/tml/html 4/tml/html 4/tml 4.html/html 4.tml. <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"> <title> 여기에 제목 삽입 </title> <script type = "text/javaScript"> // 메소드 메소드의 인스턴스를 정의합니다. form.action = "loginaction! method1"; form.submit (); } // 메소드 2, 버튼 2를 가로 채지 않는 메소드를 추가합니다. form.action = "loginaction! method2"; form.submit (); } // 메소드 3, 버튼 3 기능 3 () {var form = document.forms [0]; form.action = "loginaction! method3"; form.submit (); . onclick = "method2 ()"> <input type = "제출"name = "ok2"value = "button3"onclick = "method3 ()"> </form> </body> </html> 실행이 완료된 후 페이지보기 :
(5) 실행 결과를 분석하고 각각 단추 1, 2 및 3을 클릭하고 콘솔에서 결과를 출력합니다. 버튼 1은 바운드 방법 1입니다. 이 메소드는 struts.xml에서 가로 채 웁니다. 결과가 정확하면 인터셉트 결과가 표시됩니다. 해당 버튼 2와 3은 가로 채지 않기 때문에 실행 결과 만 출력합니다. 그런 다음 아래 결과 다이어그램을보십시오.
결과 다이어그램은 정확히 분석 결과입니다. 버튼 1을 가로 채고 인터 클래스의 Dointercept 방법이 실행되었습니다. 둘 중 2 개와 3 개는 가로 채지 않았습니다. 다시 말해, 방법 1은 메소드 인터셉터의 화이트리스트에 배치되며, 실행될 때 메소드를 가로 채어야합니다. 방법 2는 인터셉터의 블랙리스트에 배치되며,이 방법을 가로 채울 필요는 없다. Method3는 아무것도하지 않습니다.
7. 결론
인터셉터의 내용은 여기에 요약되어 있습니다. 인터셉터는 매우 강력한 기능을 제공하여 개발자가 런타임시 출력 결과를 제어하여 프로그래밍 유연성을 높일 수 있습니다. 또한 이론적 인 것들을 기억하려고하지 마십시오. 합리적으로 분석하고, 더 많이 연습하고, 분석 결과를 더 깊이 이해하기 위해 몇 가지 예를 만들어야합니다.
추신 : struts2 (xwork)가 제공 한 인터셉터의 기능 설명
인터셉터 | 이름 | 설명 |
별명 인터셉터 | 별명 | 요청 매개 변수는 다른 요청간에 다른 이름 파일로 변환되며 요청 내용은 변경되지 않았습니다. |
체인 인터셉터 | 체인 | 다음 조치에 의해 이전 조치의 속성에 액세스하고 이제 체인 유형의 결과와 함께 사용됩니다 (<result type = "chain">). |
체크 박스 인터셉터 | 확인란 | checkbox 자동 처리 코드가 추가되어 Uncheckbox의 내용을 False로 설정하고 HTML은 기본적으로 UnCheckbox를 제출하지 않습니다. |
쿠키 인터셉터 | 쿠키 | 구성된 이름과 값을 사용하여 쿠키를 참조하십시오. |
변환 오류 인터셉터 | ConveroterRor | ActionContext에서 Action의 속성 필드에 오류가 추가됩니다. |
세션 인터셉터를 만듭니다 | 생성 | httpsession이 필요한 인터셉터 서비스에 사용할 httpsession을 자동으로 생성합니다. |
디버깅 인터셉터 | 디버깅 | 내부 데이터 상태를 표시하기 위해 다른 디버깅 페이지를 제공합니다. |
인터셉터를 실행하고 기다립니다 | execandwait | 사용자를 중간 대기 페이지로 가져 가면서 백그라운드에서 작업을 실행하십시오. |
예외 인터셉터 | 예외 | 예외를 화면에 배치하십시오 |
파일 업로드 인터셉터 | fileUpload | 파일 업로드 기능을 제공합니다 |
I18N 인터셉터 | i18n | 사용자가 선택한 로케일을 기록하십시오 |
로거 인터셉터 | 나무꾼 | 출력 조치의 이름 |
메시지 저장소 인터셉터 | 가게 | ValidationAware 인터페이스를 구현하는 액션 클래스에 나타나는 메시지, 오류, 필드 오류 등을 저장 또는 액세스하십시오. |
모델 구동 인터셉터 | 모델 중심 | 클래스가 ModelDriven을 구현하면 getModel에 의해 얻은 결과를 값 스택에 놓습니다. |
스코프 모델 구동 | 스코프 모델 구동 | 액션이 ScopedModelDriven을 구현하면 인터셉터는 해당 범위에서 모델을 가져와 작업의 SetModel 메소드를 호출하여 작업 안에 넣습니다. |
매개 변수 인터셉터 | 매개 변수 | 요청에서 조치에 매개 변수를 설정하십시오. |
인터셉터를 준비하십시오 | 준비 준비 | Acton이 준비 할 수있는 경우 인터셉터는 액션 클래스의 준비 방법을 호출합니다. |
스코프 인터셉터 | 범위 | 액션 상태를 세션 및 응용 프로그램에 저장하는 쉬운 방법. |
서블릿 구성 인터셉터 | ServletConfig | 맵 형식으로 액세스하는 httpservletrequest 및 httpservletresponse에 액세스하는 방법을 제공합니다. |
정적 매개 변수 인터셉터 | 정적 파람 | <Param> in <caction>의 내용을 struts.xml 파일의 해당 조치로 설정하십시오. |
역할 인터셉터 | 역할 | 사용자가 JAAS 지정된 역할을하는지 여부를 결정합니다. 그렇지 않으면 실행되지 않습니다. |
타이머 인터셉터 | 시간제 노동자 | 출력 조치 실행 시간 |
토큰 인터셉터 | 토큰 | 토큰을 통해 이중 클릭을 피하십시오 |
토큰 세션 인터셉터 | 토큰 션 | 그러나 토큰 인터셉터처럼 두 번 클릭하면 요청 된 데이터가 세션에 저장됩니다. |
검증 인터셉터 | 확인 | action-validation.xml 파일에 정의 된 컨텐츠를 사용하여 제출 된 데이터를 확인하십시오. |
워크 플로 인터셉터 | 워크 플로 | Call Action의 Validate Method가 있으면 오류가 발생하면 입력 화면으로 이전됩니다. |
매개 변수 필터 인터셉터 | N/A | 매개 변수 목록에서 불필요한 매개 변수를 제거하십시오 |
프로파일 링 인터셉터 | 프로파일 링 | 매개 변수를 통해 프로파일을 활성화합니다 |