Как иметь URL-адреса без суффикса (например, .action) в Struts 2?

Вот в чем дело, мне нужно не только обслуживать java, но и некоторые файлы javascript с моим .war. Так, например. если кто-то переходит по URL:

example.com/js/foo.jar

Затем мне нужно, чтобы это правильно обслуживалось как файл javascript. В то же время, если кто-то идет на:

example.com/bar

Мне нужно, чтобы Struts2 обслуживал его в качестве возможного контроллера.

Методы, которые я нашел в Интернете для удаления суффикса из URL-адреса, приведут к тому, что оба URL-адреса будут обслуживаться struts 2 (и, следовательно, выдадут ошибку для первого файла foo.js, даже если он существует). Есть ли способ (например, перехватчик), который сначала проверит, существует ли данный файл .js, прежде чем выдавать ошибку?


person Ali    schedule 28.09.2013    source источник
comment
Можете ли вы изменить свои действия? Вы можете установить собственное расширение для действий struts2...   -  person Boris the Spider    schedule 28.09.2013
comment
@BoristheSpider Да, я не хочу никаких расширений или суффиксов для действий struts2.   -  person Ali    schedule 28.09.2013


Ответы (2)


Ответ DarkHorse не совсем точен. Есть два значения, которые очень похожи, но работают по-разному:

<constant name="struts.action.extension" value=","/>
<constant name="struts.action.extension" value=""/>

Вам почти наверняка нужен первый вариант, который включает запятую. Это сообщает Struts, что расширение действия пусто. Это также означает, что Struts не будет пытаться сопоставить любые запросы, которые есть с расширением, например *.css, *.js и т. д.

Второй вариант сообщает Struts, что не должно быть расширения действия, но также говорит, что вы хотите, чтобы Struts соответствовал каждому запросу. Единственное возможное преимущество, которое я могу придумать, - это если вы хотите включить расширения файлов в свое сопоставление действий, например следующее:

<action name="robots.txt" class="...">
    ...
</action>

Кроме того, чтобы исключить запросы из фильтра Struts, нужно использовать свойство struts.action.excludePattern, как описано здесь. Не полагайтесь на перехватчик для этого, так как перехватчики запускаются только после того, как фреймворк находит подходящее действие для сопоставления.

person Steven Benitez    schedule 30.09.2013
comment
Спасибо, использование , в расширении заставляет действия работать без расширения, а также позволяет обрабатывать другие активы, например файлы *.js, как обычно. - person Ali; 01.10.2013

Чтобы иметь URL-адреса без суффикса... все, что вам нужно сделать, это... установить это в файле struts.xml

  <constant name="struts.action.extension" value=""/> 

Если вы хотите, чтобы некоторые URL-адреса не обслуживались действием struts... напишите перехватчик, в котором вы проверяете суффикс URL-адреса.. если он перенаправляет их в другое место, таким образом, полностью избегая ваших действий struts..

EX:

public class RestrictUrl extends AbstractInterceptor implements SessionAware {
    Map<String, Object> session;

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
        HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
        String url = request.getHeader("referer"); // Your url
        if(check something in url) {
            response.sendRedirect(where you want to go);
        }
        return invocation.invoke();
    }

}
person DarkHorse    schedule 29.09.2013
comment
Это <constant name="struts.action.extension" value=""/> неправильно. Прочтите документы или воспользуйтесь поиском на SO. - person Aleksandr M; 29.09.2013