2014-10-24 2 views
1

Я внедрил сайт, основанный на Stripes. Я хочу избежать использования приложения .action для его URL-адресов. В каждом из моих Action Beans я добавил привязки URL типа: @URLBinding("/home").Почему прямая косая черта в URL-адресе вызывает бесконечный цикл вызовов моего Action Action Bean?

Затем в моем web.xml я настроил DynamicMappingFilter, как описано в http://stripes.sourceforge.net/docs/current/javadoc/net/sourceforge/stripes/controller/DynamicMappingFilter.html.

Сайт в прямом эфире и работает отлично ... Кроме того, когда кто-то пытается использовать URL-адрес http://example.com/home/anything. Это вызывает бесконечный цикл вызова моего HomeActionBean, пока, наконец, я не получу StackOverflowError!

Кто-нибудь испытывал то же самое, и знаете ли вы, как это предотвратить?

Большое спасибо. Eduardo

P.S. Вот некоторые подробности о реализации. Я создал демоверсию с простым тестовым компонентом и JSP.

TestActionBean 
    @UrlBinding("/test") 
public class TestActionBean extends BaseActionBean implements ActionBean { 

@DefaultHandler 
public Resolution test() { 
    return new ForwardResolution("test.jsp"); 
} 
} 

test.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Test infinite loop</title> 
</head> 
<body> 
blabla 
</body> 
</html>` 

web.xml

<filter> 
    <display-name>Stripes Filter</display-name> 
    <filter-name>StripesFilter</filter-name> 
    <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class> 
    <init-param> 
     <param-name>ActionResolver.Packages</param-name> 
      <param-value>pt.company.commons.stripes.action</param-value> 
    </init-param> 
    <init-param> 
     <param-name>ActionBeanContext.Class</param-name> 
     <param-value>pt.company.commons.stripes.action.CustomActionBeanContext</param-value> 
    </init-param> 

    <!-- The parameter tells Stripes to use the Spring interceptor --> 
    <init-param> 
     <param-name>Interceptor.Classes</param-name> 
      <param-value>net.sourceforge.stripes.integration.spring.SpringInterceptor</param-value> 
    </init-param> 
... 

<filter-mapping> 
    <filter-name>StripesFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>StripesFilter</filter-name> 
    <servlet-name>StripesDispatcher</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

<filter> 
    <description>Dynamically maps URLs to ActionBeans.</description> 
    <display-name>Stripes Dynamic Mapping Filter</display-name> 
    <filter-name>DynamicMappingFilter</filter-name> 
    <filter-class> 
     net.sourceforge.stripes.controller.DynamicMappingFilter 
    </filter-class> 
    <init-param> 
     <param-name>ActionResolver.Packages</param-name> 
     <param-value>pt.company.common.stripes.action</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>DynamicMappingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

<servlet> 
    <servlet-name>StripesDispatcher</servlet-name> 
    <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

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

ответ

0

не может дать объяснение такого поведения, но я заметил это сразу на actionBean, который показал страницу, содержащую фреймы имеющий относительный путь в качестве атрибута src. Атрибуты src сами указывают на другие действия.

 <iframe src="imagelist"></iframe> 
     <iframe src="mastertable/collections"></iframe> 

Как только я перешел на абсолютные пути, перекрестные циклы исчезли.

 <iframe src="${pageContext.request.contextPath}/imagelist"></iframe> 
     <iframe src="${pageContext.request.contextPath}/mastertable/collections"></iframe> 
+0

Hey Richard - Спасибо. Но на самом деле я только что создал компонент демо-действий, с простым переходом на пустой test.jsp, и я получаю точно такое же поведение - бесконечные циклы, если я использую URL-адрес http://example.com/test/smth. –

+0

Я только что добавил тестовый код в качестве редактирования моего оригинального сообщения. Спасибо за любую помощь! –

+0

Я думаю, проблема в ForwardResolution. Когда test.jsp находится в ROOT, он должен прочитать 'return new ForwardResolution ("/test.jsp ");' Обратите внимание на косую черту. – acdhirr