Что ж... Перепробовав все возможные решения/сопоставления URL-адресов, я остановился на быстром и уродливом.
Суть в том, чтобы иметь единый почтовый сервлет "улавливать все", чтобы работать в качестве диспетчера для других конкретных сервлетов. . Это как гигантский 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>
, отличного от универсального.
person
David
schedule
26.08.2010