struts2
에서 필터가 ActionServlet
대신 컨트롤러로 사용되는 이유는 무엇입니까?Struts2에서 필터가 컨트롤러로 사용됩니다.
ActionServlet
이상의 필터를 사용할 때의 이점은 무엇입니까?
struts2
에서 필터가 ActionServlet
대신 컨트롤러로 사용되는 이유는 무엇입니까?Struts2에서 필터가 컨트롤러로 사용됩니다.
ActionServlet
이상의 필터를 사용할 때의 이점은 무엇입니까?
일반적으로 특정 조건에 따라 요청을 필터링 및/또는 수정하려는 경우 필터를 사용합니다. S2가 작동하려면 요청을 성공적으로 수행하기 위해 특정 재 처리 및 수정 작업을 수행해야하며 다른 손에서는 요청을 제어, 전처리 및/또는 사후 처리하려는 경우 Servlet을 사용합니다.
요청을 제어하려면 S2를 사용하지만 전반적인 응용 프로그램 구조를 더 깨끗하고 쉽게 사용할 수 있도록 감추어 두십시오.
이 필터는 Java EE 6 Tutorial에 있습니다.
필터는 요청이나 응답의 헤더와 내용 (또는 둘 다)을 변환 할 수있는 개체입니다. 필터는 일반적으로 필터 자체가 응답을 작성하지 않는다는 점에서 웹 구성 요소와 다릅니다. 대신 필터는 모든 종류의 웹 리소스에 "첨부"할 수있는 기능을 제공합니다. 따라서 필터는 필터 역할을하는 웹 리소스에 대한 종속성을 가져서는 안됩니다. 이 방법은 하나 이상의 웹 리소스 유형으로 구성 될 수 있습니다.
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 파일
@Punit_Patel Struts 1에 대한'ActionServlet'의'servlet-mapping'이'* .action' 대신에'/'로 설정 되었다면, Struts 1은 Strut 2의 'FilterDispatcher'와 같은 방식으로 정적 컨텐츠를 처리하고 작동합니까? – 8bitjunkie
@ 7SpecialGems /를 ActionServlet에 대한 URL 매핑으로 사용하는 경우 추가 코드를 작성해야합니다. 예를 들어, CSS 파일의 경우에는 CSS 파일을 읽도록 코드를 작성하고 응답 객체에 작성해야합니다. Filter의 경우에는 필터의 doFilter 메서드에서 filterChain.doFilter 메서드를 호출 할 수 있습니다. –