Ну ... После попытки каждого возможное решение/url-mapping, я пошел с быстрым и уродливым.
Суть заключается в том, чтобы иметь один «поймать все» почтовый сервлет, работать диспетчером для других, определенных сервлетов. Это как гигант switch
, где параметр является URL-адресом запроса.
Это НЕ то, что я хотел, но он работает и, кажется, единственный, что делает.
У меня есть один сервлет IncomingMail
, который обрабатывает ВСЕ входящую почту. период.
Итак, единственное отображение URL-адресов при /_ah/mail/
является следующее:
<servlet>
<servlet-name>IncomingMail</servlet-name>
<servlet-class>IncomingMail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IncomingMail</servlet-name>
<url-pattern>/_ah/mail/*</url-pattern>
</servlet-mapping>
Кроме того, у меня есть следующие сервлет, отображается как «набившие оскомину-сервлет»:
(обратите внимание <url-pattern>
, не "ПОЧТА отображается" сервлет)
<servlet>
<servlet-name>GetUserMail</servlet-name>
<servlet-class>GetUserMail</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetUserMail</servlet-name>
<url-pattern>/serv/userMail</url-pattern>
</servlet-mapping>
улов-все сервлет (в конечном счете) выглядит как гигантский переключатель:
public class IncomingMail extends HttpServlet {
private final String USER_MAIL_PREFIX="http://appid.appspot.com/_ah/mail/user.";
private final String USER_MAIL_SERVLET="/serv/userMail";
...
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String url = req.getRequestURL().toString();
System.out.println("IncomingMail called, with URL: "+url);
String email;
String servlet;
if (url.startsWith(USER_MAIL_PREFIX)) {
email=url.replace(USER_MAIL_PREFIX, "");
servlet=USER_MAIL_SERVLET;
}//userMail
if (url.startsWith(OTHER_PREFIX)) {
//Redirect to OTHER servlet
}
...
System.out.println("forward to '"+servlet+"', with email '"+email+"'");
RequestDispatcher dispatcher=req.getRequestDispatcher(servlet);
try {
req.setAttribute("email", email);
dispatcher.forward(req, resp);
} catch (ServletException e) {
System.err.println(e);
}
}
}
Целевой сервлет (GetUserMail
в этом случае), делает getRequestParameter("email")
, чтобы увидеть конкретный выделенный почтовый ящик.
Он получит все письма, отправленные на «user.%un%@appid.appspotmail.com», где% un% является именем пользователя в прикладном пространстве.
Параметр электронной почты, полученный сервлетом, будет иметь форму «%un%@appid.appspotmail.com» без проницательного префикса.
Каждый такой «конкретный» сервлет, получивший «отрезание» от сервлета почтового диспетчера, с параметром электронной почты уже без проницательного префикса.
Одно примечание я добавлю под залог:
Если вы обеспокоены фиктивных запросов к «конкретным сервлетов», просто определить их все под общим виртуальным пространством имен говорят /servmail/
на вашем сайте, и определить новый <security-constraint>
к разрешить запросы инициироваться только внутри самого приложения.
Подобно (внутри web.xml
):
<security-constraint>
<web-resource-collection>
<web-resource-name>MailServlets</web-resource-name>
<description>policy for specific mail servlets</description>
<url-pattern>/servmail/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
еще хотелось бы услышать от кого-то испытанной и удалось при этом почтовое отображение подстановочные <url-pattern>
, кроме броской всего один.
Это сообщение рикошета на стороне клиента, и 404 на логах сервера. Как ни странно, я не получаю «Нет обработчиков, соответствующих этому URL». Кроме того, я вижу, что запрос возник изнутри механизма самодвижения сервера по его IP: 0.1.0.20. – David
*** журнальной записи *** # 1. 08-25 3:25 вечера 40,743 /_ah/mail/[email protected] 404 19cpu_ms 0kb 13 мс Подробнее 0.1.0.20 - - [25/Aug/2010: 15: 25: 40 -0700] "POST /_ah/mail/[email protected] HTTP/1.1" 404 234 - - "appid.appspot.com" ms = 13 cpu_ms = 19 api_cpu_ms = 0 cpm_usd = 0.000947 – David