Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Фильтр на адресную строку (аналог .htaccess)


Автор: IDVsbruck 16.9.2007, 23:32
На PHP-серверах есть всегда такой файлик - .htaccess, в котором можно переопределить строку, которая представляется в поле ввода адреса навигатора (возможно, терминология страдает - я со слов ...)
Есть ли возможность на java-сервере (tomcat) аналогично переопределить адресную строку?

Пример: когда идет переадресация с одной страницы на другую, но с некоторым количеством атрибутов, хочется, чтобы была адресная строка определенного вида (хотя бы без атрибутов).

Знаю, что вопрос решаемый, но решения найти не могу smile
Спасибо.

Автор: shimopus 16.9.2007, 23:51
Если я вас правильно понял, то конечно есть. Смотрите описание web.xml.

Автор: Tony 17.9.2007, 13:05
Цитата(shimopus @ 16.9.2007,  23:51)
Если я вас правильно понял, то конечно есть. Смотрите описание web.xml.

Как я помню htaccess закрывал доступ к ресурсам и про4ее. Ва j2ee etogo netu. Тебе надо будет написать фильтр каторый будет 4то тебе надо. Всё в ру4ную.

Автор: IDVsbruck 17.9.2007, 14:26
<servlet-mapping> - Определяет URL, которые будут выдаваться через соответствующий <servlet>, указанный в <servlet-name>, который должен соответствовать <servlet-name>, указанному в разделе <servlet>

А мне надо наоборот: чтобы не ловить маппинг, а его устанавливать.
Опять же ... по аналогии с .htaccess

Автор: Maksym 17.9.2007, 14:35
IDVsbruck
Менять мэпинг налету в ходе выполнения приложения?
Ты можешь создать сервлет-контроллер, который будет перехватывать все (/) запросы и дальше уже переадресовывать их на другие сервлеты или страницы. Естественно, он сможет менять правила переадресации рантайм.

Автор: IDVsbruck 17.9.2007, 17:04
Ок, это немного проясняет ...
Но все же ... можно чуть-чуть больше конкретики? - Я вокруг этой темы столько хожу, что запутал все идеи, даже самые светлые.

Автор: Maksym 17.9.2007, 17:12
Примерно так:
ServletController.java
Код

package example.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletController extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        String url = request.getPathInfo();

        // analize and modify url 

            response.sendRedirect(url);
    }

}

web.xml
Код

...
    <servlet>
        <servlet-name>ServletController</servlet-name>
        <servlet-class>example.web.ServletController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletController</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
...

В строке где написано analize and modify url  проводишь всю необходимую обработку.

Автор: IDVsbruck 18.9.2007, 01:04
Ну ... не то ...

Например, вводим www.mysite.com.
- маппинг перехватывает адрес и происходит выполнение service в ServletController.
- getPathInfo() возвращает "/"
- меняем на что хотим, например, "/main" или "/welcome.jsp"
- выполняем request.sendRedirect(url)
А маппинг снова перехватывает запрос! и возвращает опять в ServletController ... и так бесконечно.

Кроме этого, вопрос остается нерешенным ... видимо, остался непонятым. Я хочу добиться следующего:
- вводим адрес (www.mysite.com)
- выполняется некий "главный" сервлет
- находясь на какой-то странице, нам надо вызвать другую страницу и запрос ставится следующим образом: www.mysite.com?action=someAction&sender=lastPage&randomStr=01234567
при этом надо, чтобы выполнились соответсвующие действия, а адресная строка осталась "www.mysite.com", ни или хотя бы "www.mysite.com/"

(Кстати, избавиться от слеша в конце можно?)

Пока единственным решением я вижу посылку параметров методом POST, то есть отсылку формы. В этом случае строка не будет меняться (если в параметре FORM action=""). Но как-то это слишком притянуто за уши ...
Да и не всегда можно отправить форму ...

Автор: jsa 18.9.2007, 04:09
http://tuckey.org/urlrewrite/

Автор: Maksym 18.9.2007, 12:10
IDVsbruck
Цитата(IDVsbruck @  18.9.2007,  01:04 Найти цитируемый пост)
А маппинг снова перехватывает запрос! и возвращает опять в ServletController ... и так бесконечно.

Этого не происходит smile попробуй
jsa
Готовое решение +1. IDVsbruck, обрати внимание.

Автор: Vasay 18.9.2007, 14:12
Цитата(Tony @ 17.9.2007,  13:05)
Цитата(shimopus @ 16.9.2007,  23:51)
Если я вас правильно понял, то конечно есть. Смотрите описание web.xml.

Как я помню htaccess закрывал доступ к ресурсам и про4ее. Ва j2ee etogo netu. Тебе надо будет написать фильтр каторый будет 4то тебе надо. Всё в ру4ную.

.htaccess не только закрывает доступ к ресурсам, но и позволяет делать многое другое, например, активно применяется деректива modRewrite, позволяющая создавать виртуальные адреса. Например, можно сделать так - при обращении в браузере http://site.com/X/Y/ реально будет запрошен скрипт  http://site.com/SomeScript.php?x=X&y=Y - что очень полезно с точки зрения SEO. 

Кстати, закрыть доступ к определенным ресурсам в j2ee приложении можно с помощью web.xml и настройки сервера. Как это сделать с SJAS, я знаю, а вот про то существует ли нечто подобное  modRewrite для JAS я не знаю, и очень хотел бы узнать...


Добавил:
Похоже узнал, можно с помощбю UrlRewriteFilter . Спасибо jsa! 

Автор: IDVsbruck 18.9.2007, 17:02
Супер. Вопрос решен. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)