servlet forward action 문제 및 struts2 차단 servlet 문제
이 문제의 원인은 Filter가 기본적으로 리퀘스트를 차단하고 forwardfilter는 차단하지 않기 때문에 struts2가 forward를 차단하려면 다음과 같은 설정이 필요합니다.
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
</filter-mapping>
또 다른 문제는 struts2의 핵심 Filter가 설정한 것이'/*'이기 때문에 그는 모든 요청을 차단할 것이다. 만약에 servlet을 설치하면 당신의 요청은 먼저 Filter에 의해 차단된다. 즉, struts2의 절차에 들어가는 것이지 servlet이 아니다. 그러나 때때로 당신이 사용해야 하는 servlet(당신이 DWR을 통합하려는 것처럼)은 이런 상황을 해결하기 위해 두 가지 해결 방안이 있다.
1, struts2 core 패키지 org.apache.struts2 아래의default.properties: 이 키 값을 struts에 맞게 수정합니다.action.extension=action, 물론 이 파일에서 직접 바꾸기를 원하지 않습니다.struts.xml에서 상수를 증가하는 방식으로 설정
2, 웹에서.xml에 차단기를 추가해서 서브렛을 필터합니다.web.xml 파일 내용:
<!-- , servlet 。 struts servlet -->
<filter>
<filter-name>ServletFilter</filter-name>
<filter-class>org.bts.base.filter.ServletFilters</filter-class>
<init-param>
<param-name>includeServlets</param-name>
<param-value>proxool_admin</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Struts2 FilterDispathcer Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- FilterDispatcher struts2 WEB -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring Listener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- proxool -->
<servlet>
<servlet-name>proxool_admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>proxool_admin</servlet-name>
<url-pattern>/proxool_admin</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>proxool</web-resource-name>
<url-pattern>/proxool_admin</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name> proxool manager Application</realm-name>
</login-config>
<security-role>
<description>
The role that is required to log in to the Manager Application
</description>
<role-name>manager</role-name>
</security-role>
<error-page>
<error-code>401</error-code>
<location>/jsp/error/401.jsp</location>
</error-page>
필터의 실현
package org.bts.base.filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class ServletFilters implements Filter {
private List<String> initParameters = new ArrayList<String>();
@Override
public void destroy() {
System.out.println("ServletFilters destroied!");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String target = request.getRequestURI();
System.out.println("1: "+target);
target = target.lastIndexOf("?") > 0 ? target.substring(target
.lastIndexOf("/") + 1, target.lastIndexOf("?")
- target.lastIndexOf("/")) : target.substring(target
.lastIndexOf("/") + 1);
System.out.println("2:"+target);
if (this.initParameters.contains(target)) {
RequestDispatcher rdsp = request.getRequestDispatcher(target);
rdsp.forward(req, resp);// , FilterChain
} else
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
String parameters = config.getInitParameter("includeServlets");
System.out.println("************"+config.getFilterName()+" initing with value "+parameters+"********************");
this.initParameters.addAll(Arrays.asList(parameters.split(",")));
}
}
저는 개인적으로 첫 번째 방법을 선호합니다. 두 번째 방안은 제가 직접 테스트하지 않았습니다. 출처와 다른 사람의 글에서 나온 것입니다. 첫 번째 방안은 액션을 사용할 때마다 url 뒤에'.액션'을 추가해야 합니다. 물론 당신이 struts2의 라벨을 사용한다면 그는 자동으로 추가할 것입니다. 그리고 저는 있다고 생각합니다.액션은 다른 처리 요청과struts의 처리 요청을 구분하는 데 필요합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fortinet FortiWeb Web Application Firewall Policy BypassFrom: Geffrey Velasquez Date: Wed, 2 May 2012 20:33:23 -0500...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.