好吧......在尝试了所有可能的解决方案/url映射之后,我选择了一个又快又丑的解决方案。
要点是拥有一个“包罗万象”的邮件 servlet,作为其他特定 servlet 的调度程序。它就像一个巨人switch
,其中参数是请求 URL。
这不是我想要的,但它有效,而且似乎是唯一有效的。
我有一个IncomingMail
处理所有传入邮件的 servlet。时期。
所以现在,唯一的 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>
此外,我有以下 servlet,映射为“plain-old-servlet”:(
注意<url-pattern>
,不是“邮件映射”servlet)
<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>
包罗万象的 servlet(最终会)看起来像一个巨大的开关:
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);
}
}
}
目标 servlet(GetUserMail
在本例中)执行getRequestParameter("email")
, 以查看特定的目标邮箱。
它将接收发送到“user.%un%@appid.appspotmail.com”的所有邮件,其中 %un% 是应用程序空间中的用户名。
servlet 接收到的电子邮件参数的格式为“%un%@appid.appspotmail.com”,没有识别前缀。
每个这样的“特定” servlet 都会从邮件调度程序 servlet 中获得“其切割”,其中电子邮件参数已经没有识别前缀。
我将在安全性下添加一个注释:
如果您担心对“特定 servlet”的虚假请求,只需将它们全部定义/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>
邮件映射,而不是包罗万象的。