📄 webmailservlet.java
字号:
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
if(total > 0) {
http_header.setEncodedContent(str.toString(),req.getContentType());
}
}
try {
String url=http_header.getPath();
try {
/* Find out about the session id */
sess=req.getSession(false)==null?null:(HTTPSession)req.getSession(false).getValue("webmail.session");
/* If the user was logging on, he doesn't have a session id, so generate one.
If he already had one, all the better, we will take the old one */
if(sess == null && url.startsWith("/login")) {
sess=newSession(req,http_header);
} else if(sess == null && url.startsWith("/admin/login")) {
http_header.setHeader("LOGIN","Administrator");
sess=newAdminSession(req,http_header);
}
/* Ensure that the session state is up-to-date */
if(sess != null) sess.setEnv();
/* Let the URLHandler determine the result of the query */
content=getURLHandler().handleURL(url,sess,http_header);
} catch(InvalidPasswordException e) {
getStorage().log(Storage.LOG_ERR,"Connection to "+addr.toString()+
": Authentication failed!");
if(url.startsWith("/admin/login")) {
content=getURLHandler().handleURL("/admin",null,http_header);
} else if(url.startsWith("/login")) {
content=getURLHandler().handleURL("/",null,http_header);
} else {
content=new HTMLErrorMessage(getStorage(),e.getMessage());
}
} catch(Exception ex) {
ex.printStackTrace();
content=getURLHandler().handleException(ex,sess,http_header);
debugOut("Some strange error while handling request",ex);
}
/* Set some HTTP headers: Date is now, the document should expire in 5 minutes,
proxies and clients shouldn't cache it and all WebMail documents must be revalidated
when they think they don't have to follow the "no-cache". */
res.setDateHeader("Date:",System.currentTimeMillis());
res.setDateHeader("Expires",System.currentTimeMillis()+300000);
res.setHeader("Pragma","no-cache");
res.setHeader("Cache-Control","must-revalidate");
synchronized(out) {
res.setStatus(content.getReturnCode());
if(content.hasHTTPHeader()) {
Enumeration enum=content.getHTTPHeaderKeys();
while(enum.hasMoreElements()) {
String s=(String)enum.nextElement();
res.setHeader(s,content.getHTTPHeader(s));
}
}
/* What we will send is an image or some other sort of binary */
if(content instanceof HTMLImage) {
HTMLImage img=(HTMLImage)content;
/* the HTMLImage class provides us with most of the necessary information
that we want to send */
res.setHeader("Content-Type",img.getContentType());
res.setHeader("Content-Transfer-Encoding",img.getContentEncoding());
res.setHeader("Content-Length",""+img.size());
res.setHeader("Connection","Keep-Alive");
/* Send 8k junks */
int offset=0;
while(offset + chunk_size < img.size()) {
out.write(img.toBinary(),offset,chunk_size);
offset+=chunk_size;
}
out.write(img.toBinary(),offset,img.size()-offset);
out.flush();
out.close();
} else {
byte[] encoded_content=content.toString().getBytes("UTF-8");
/* We are sending HTML text. Set the encoding to UTF-8 for Unicode messages */
res.setHeader("Content-Length",""+(encoded_content.length+2));
res.setHeader("Connection","Keep-Alive");
res.setHeader("Content-Type","text/html; charset=\"UTF-8\"");
out.write(encoded_content);
out.write("\r\n".getBytes());
out.flush();
out.close();
}
}
} catch(DocumentNotFoundException e) {
getStorage().log(Storage.LOG_INFO,"Connection to "+addr.toString()+
": Could not handle request ("+err_code+") (Reason: "+e.getMessage()+")");
res.setStatus(err_code);
res.setHeader("Content-type","text/html");
res.setHeader("Connection","close");
content=new HTMLErrorMessage(getStorage(),e.getMessage());
out.write((content+"\r\n").getBytes("UTF-8"));
out.write("</HTML>\r\n".getBytes());
out.flush();
out.close();
}
} catch(Exception e) {
e.printStackTrace();
getStorage().log(Storage.LOG_INFO,"Connection to "+addr.toString()+" closed");
throw new ServletException("Error: "+e.getMessage(),e);
}
}
/**
* Init possible servers of this main class
*/
protected void initServers() {
}
protected void shutdownServers() {
}
public String getBasePath() {
return basepath;
}
public String getImageBasePath() {
return imgbase;
}
public WebMailSession newSession(HttpServletRequest req,HTTPRequestHeader h)
throws UserDataException, InvalidPasswordException {
HttpSession sess=req.getSession(true);
if(sess.getValue("webmail.session") == null) {
WebMailSession n=new WebMailSession(this,req,h);
timer.addTimeableConnection(n);
n.login();
sess.putValue("webmail.session",n);
sessions.put(sess.getId(),n);
debugOut("Created new Session: "+sess.getId());
return n;
} else {
Object tmp=sess.getValue("webmail.session");
if(tmp instanceof WebMailSession) {
WebMailSession n=(WebMailSession)tmp;
n.login();
debugOut("Using old Session: "+sess.getId());
return n;
} else {
/* If we have an admin session, get rid of it and create a new session */
sess.putValue("webmail.session",null);
debugOut("Reusing old AdminSession: "+sess.getId());
return newSession(req,h);
}
}
}
public AdminSession newAdminSession(HttpServletRequest req, HTTPRequestHeader h) throws InvalidPasswordException {
HttpSession sess=req.getSession(true);
if(sess.getValue("webmail.session") == null) {
AdminSession n=new AdminSession(this,req,h);
timer.addTimeableConnection(n);
n.login(h);
sess.putValue("webmail.session",n);
sessions.put(sess.getId(),n);
debugOut("Created new Session: "+sess.getId());
return n;
} else {
Object tmp=sess.getValue("webmail.session");
if(tmp instanceof AdminSession) {
AdminSession n=(AdminSession)tmp;
n.login(h);
debugOut("Using old Session: "+sess.getId());
return n;
} else {
sess.putValue("webmail.session",null);
debugOut("Reusing old UserSession: "+sess.getId());
return newAdminSession(req,h);
}
}
}
/** Overwrite the old session handling methods */
public WebMailSession newSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
System.err.println("newSession invalid call");
return null;
}
public AdminSession newAdminSession(InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
System.err.println("newAdminSession invalid call");
return null;
}
public HTTPSession getSession(String sessionid, InetAddress a,HTTPRequestHeader h) throws InvalidPasswordException {
System.err.println("getSession invalid call");
return null;
}
public Enumeration getServers() {
return new Enumeration() {
public boolean hasMoreElements() {
return false;
}
public Object nextElement() {
return null;
}
};
}
public String toString() {
String s="";
s+="Server: "+srvlt_config.getServletContext().getServerInfo()+"\n";
s+="Mount Point: "+getBasePath()+"\n";
s+=getServletInfo();
return s;
}
public Object getServer(String ID) {
return null;
}
public void reinitServer(String ID) {
}
public static String getVersion() {
return "WebMail/Java Servlet v"+VERSION;
}
} // WebMailServer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -