2012-03-17 2 views

답변

0

일반적으로 특정 조건에 따라 요청을 필터링 및/또는 수정하려는 경우 필터를 사용합니다. S2가 작동하려면 요청을 성공적으로 수행하기 위해 특정 재 처리 및 수정 작업을 수행해야하며 다른 손에서는 요청을 제어, 전처리 및/또는 사후 처리하려는 경우 Servlet을 사용합니다.

요청을 제어하려면 S2를 사용하지만 전반적인 응용 프로그램 구조를 더 깨끗하고 쉽게 사용할 수 있도록 감추어 두십시오.

이 필터는 Java EE 6 Tutorial에 있습니다.

필터는 요청이나 응답의 헤더와 내용 (또는 둘 다)을 변환 할 수있는 개체입니다. 필터는 일반적으로 필터 자체가 응답을 작성하지 않는다는 점에서 웹 구성 요소와 다릅니다. 대신 필터는 모든 종류의 웹 리소스에 "첨부"할 수있는 기능을 제공합니다. 따라서 필터는 필터 역할을하는 웹 리소스에 대한 종속성을 가져서는 안됩니다. 이 방법은 하나 이상의 웹 리소스 유형으로 구성 될 수 있습니다.

5

Struts2 Budi Karnival struts2 서적과 같이 서블릿을 컨트롤러로 사용하는 데에는 장점이 하나 있습니다. 필터를 사용하면 애플리케이션의 모든 리소스 (정적 리소스 포함)를 편리하게 제공하도록 선택할 수 있습니다.

서블릿을 사용하면 컨트롤러가 응용 프로그램의 동적 부분에 대한 액세스 만 처리합니다. 이전 응용 프로그램의 web.xml 파일의 URL 패턴 요소는 정적 자원에 대한 요청이 서블릿 컨트롤러에 의해 처리되지 않는 등의 설정으로

<servlet> 
    <servlet-name>Controller</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Controller</servlet-name> 
    <url-pattern>*.action</url-pattern> 
</servlet-mapping> 

하지만 컨테이너에 의해합니다. 서블릿 컨트롤러에서 정적 리소스를 처리하고 싶지 않을 것이므로 추가 작업이 필요합니다.

필터가 다릅니다. 필터는 정적 내용에 대한 요청을 처리하도록 선택할 수 있습니다. 요청을 전달하려면 필터의 doFilter 메서드에서 filterChain.doFilter 메서드를 호출합니다.

따라서 필터를 컨트롤러로 사용하면 정적 내용 요청을 포함하여 응용 프로그램에 대한 모든 요청을 차단할 수 있습니다. 그런 다음 배포 설명자에 다음 설정을해야합니다 :이 필터의

<filter> 
    <filter-name>filterDispatcher</filter-name> 
    <filter-class>...</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>filterDispatcher</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

장점 : 한 가지를 확실히, 당신은 쉽게 호기심 눈에서 정적 파일을 보호 할 수 있습니다.

다음 코드는 사용자가 자바 스크립트 파일을 볼하려고하면 오류 메시지가 보내드립니다 : 그것은 가장 결정 사람들로부터 코드를 보호하지 않습니다

public void doFilter(ServletRequest request, ServletResponse response,FilterChain  filterChain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
HttpServletResponse res = (HttpServletResponse) response; 
String uri = req.getRequestURI(); 
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null) { 
    res.sendError(HttpServletResponse.SC_FORBIDDEN); 
} else { 
    // handle this request 
} 
} 

을하지만, URL의 사용자 수는 더 이상 유형 귀하의 정적 파일을 볼 수 있습니다. 같은 방법으로 이미지를 보호 할 수 있으므로 아무도 비용 부담없이 연결할 수 없습니다.

또 다른 장점 :

이 Struts2 framework.It에서 인터셉터의 도입은 우리의 코딩 노력을 줄일 수 있지만, 우리가 코딩과 웹에서 필요한 변화에 대한 필터를 사용했을 어떤 코드를 작성하는 데 도움이되지. XML을 Struts1과 반대로 사용할 수있게되었습니다. 이제는 필터에서 더 잘 맞는 모든 코드가 이제는 인터셉터 (필터보다 제어 가능)로 이동할 수 있습니다. 모든 구성은 struts.xml 파일에서 제어 할 수 있으므로 web.xml 파일

+0

@Punit_Patel Struts 1에 대한'ActionServlet'의'servlet-mapping'이'* .action' 대신에'/'로 설정 되었다면, Struts 1은 Strut 2의 'FilterDispatcher'와 같은 방식으로 정적 컨텐츠를 처리하고 작동합니까? – 8bitjunkie

+0

@ 7SpecialGems /를 ActionServlet에 대한 URL 매핑으로 사용하는 경우 추가 코드를 작성해야합니다. 예를 들어, CSS 파일의 경우에는 CSS 파일을 읽도록 코드를 작성하고 응답 객체에 작성해야합니다. Filter의 경우에는 필터의 doFilter 메서드에서 filterChain.doFilter 메서드를 호출 할 수 있습니다. –