/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/LoginFilter.java |
---|
0,0 → 1,193 |
package ak.hostadmiral.core.servlet; |
import java.util.List; |
import java.util.ArrayList; |
import java.util.StringTokenizer; |
import java.io.IOException; |
import java.net.URLEncoder; |
import java.security.Principal; |
import java.security.AccessControlException; |
import javax.servlet.Filter; |
import javax.servlet.FilterChain; |
import javax.servlet.FilterConfig; |
import javax.servlet.ServletException; |
import javax.servlet.ServletRequest; |
import javax.servlet.ServletResponse; |
import javax.servlet.http.HttpSession; |
import javax.servlet.http.HttpServletRequest; |
import javax.servlet.http.HttpServletResponse; |
import org.apache.log4j.Logger; |
import ak.backpath.BackPath; |
import ak.hostadmiral.util.ModelException; |
import ak.hostadmiral.core.servlet.LoginInfo; |
import ak.hostadmiral.core.model.User; |
import ak.hostadmiral.core.model.UserManager; |
/** |
* Ensures that user is logged in to the system to process its request. |
*/ |
public class LoginFilter |
implements Filter |
{ |
private static final Logger logger = Logger.getLogger(LoginFilter.class); |
private FilterConfig filterConfig; |
private String loginUrl; |
private String loginServlet; |
private List passUrls = new ArrayList(); |
private List passMasks = new ArrayList(); |
public void init(FilterConfig filterConfig) |
throws ServletException |
{ |
// get config |
this.filterConfig = filterConfig; |
if(filterConfig == null) |
throw new ServletException("No configuration for the filter"); |
// get login url |
loginUrl = filterConfig.getInitParameter("loginUrl"); |
if(loginUrl == null) |
throw new ServletException("No login URL specified"); |
// ensure it's absolute path |
if(!loginUrl.startsWith("/")) |
loginUrl = "/" + loginUrl; |
// get servlet part ot the url |
int qPos = loginUrl.indexOf("?"); |
if(qPos < 0) |
loginServlet = loginUrl; |
else |
loginServlet = loginUrl.substring(0, qPos); |
// get pass through URLs |
String passUrlsStr = filterConfig.getInitParameter("passUrls"); |
if(passUrlsStr != null) { |
String[] urls = passUrlsStr.split("\\s*;\\s*"); |
for(int i = 0; i < urls.length; i++) { |
if(urls[i].endsWith("*")) { |
passMasks.add(urls[i].substring(0, urls[i].length()-1)); |
} |
else { |
passUrls.add(urls[i]); |
} |
} |
} |
// avoid loop |
if(!isPassThrough(loginServlet)) { |
passUrls.add(loginServlet); |
} |
} |
private boolean isPassThrough(String url) |
{ |
for(int i = 0; i < passUrls.size(); i++) { |
if(url.equals((String)passUrls.get(i))) return true; |
} |
for(int i = 0; i < passMasks.size(); i++) { |
if(url.startsWith((String)passMasks.get(i))) return true; |
} |
return false; |
} |
public void doFilter(ServletRequest request, ServletResponse response, |
FilterChain chain) |
throws IOException, ServletException |
{ |
boolean processNext; |
if(!(request instanceof HttpServletRequest)) |
throw new ServletException("Do not know how to handle non-HTTP requests"); |
if(!(response instanceof HttpServletResponse)) |
throw new ServletException("Do not know how to handle non-HTTP responses"); |
HttpServletRequest httpRequest = (HttpServletRequest)request; |
HttpServletResponse httpResponse = (HttpServletResponse)response; |
logger.debug("Requested " + httpRequest.getServletPath()); |
if(isPassThrough(httpRequest.getServletPath())) { |
processNext = true; |
logger.debug("pass through"); |
} |
else { |
try { |
HttpSession session = httpRequest.getSession(false); |
if(session == null) |
throw new AccessControlException("No session"); |
Object userObj = session.getAttribute(SessionKeys.USER); |
if(userObj == null) { |
// try to relogin |
Object loginInfoObj = session.getAttribute(SessionKeys.LOGIN_INFO); |
if(loginInfoObj == null) |
throw new AccessControlException("No user"); |
if(!(loginInfoObj instanceof LoginInfo)) |
throw new ServletException( |
"Wrong type of login info information: " |
+ loginInfoObj.getClass().getName()); |
try { |
userObj = UserManager.getInstance().get(((LoginInfo)loginInfoObj).getId()); |
} |
catch(ModelException ex) { |
throw new AccessControlException("No user"); |
} |
if(userObj == null) |
throw new AccessControlException("No user"); |
session.setAttribute(SessionKeys.USER, userObj); |
logger.debug("User re-logined: " + userObj); |
} |
else { |
if(!(userObj instanceof User)) |
throw new ServletException( |
"Wrong type of user information: " + userObj.getClass().getName()); |
logger.debug("User found - OK"); |
} |
processNext = true; |
} |
catch(AccessControlException ex) { |
String redirectUrl; |
try { |
redirectUrl = httpRequest.getContextPath() + loginUrl |
+ BackPath.findBackPath(httpRequest).getForwardParams(); |
} |
catch(Exception ex2) { |
logger.error("Cannot get forward redirect", ex2); |
redirectUrl = httpRequest.getContextPath() + loginUrl; |
} |
logger.info("Redirect because of '" + ex.getMessage() + "' to " + redirectUrl); |
httpResponse.sendRedirect(httpResponse.encodeRedirectURL(redirectUrl)); |
processNext = false; |
} |
} |
if(processNext) { // no problems found |
chain.doFilter(request, response); |
} |
} |
public void destroy() |
{ |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/HibernateFilter.java |
---|
0,0 → 1,91 |
package ak.hostadmiral.core.servlet; |
import java.util.List; |
import java.util.ArrayList; |
import java.util.StringTokenizer; |
import java.io.IOException; |
import java.net.URLEncoder; |
import java.security.Principal; |
import java.security.AccessControlException; |
import javax.servlet.Filter; |
import javax.servlet.FilterChain; |
import javax.servlet.FilterConfig; |
import javax.servlet.ServletException; |
import javax.servlet.ServletRequest; |
import javax.servlet.ServletResponse; |
import javax.servlet.http.HttpSession; |
import javax.servlet.http.HttpServletRequest; |
import javax.servlet.http.HttpServletResponse; |
import org.apache.log4j.Logger; |
import org.hibernate.HibernateException; |
import ak.hostadmiral.util.ModelException; |
import ak.hostadmiral.util.hibernate.HibernateUtil; |
public class HibernateFilter |
implements Filter |
{ |
private static final Logger logger = Logger.getLogger(HibernateFilter.class); |
private FilterConfig filterConfig; |
public void init(FilterConfig filterConfig) |
throws ServletException |
{ |
this.filterConfig = filterConfig; |
} |
public void doFilter(ServletRequest request, ServletResponse response, |
FilterChain chain) |
throws IOException, ServletException |
{ |
try { |
logger.info("begin transaction"); |
HibernateUtil.beginTransaction(); |
chain.doFilter(request, response); |
if(HibernateUtil.isTransactionOpen()) { |
if(Boolean.TRUE.equals(request.getAttribute("TRANSACTION_FAILED"))) { |
logger.info("rollback transaction because it is marked as failed"); |
HibernateUtil.rollbackTransaction(); |
} |
else { |
logger.info("commit transaction"); |
HibernateUtil.commitTransaction(); |
} |
} |
} |
catch(Exception ex) { |
logger.error("exception by program execution", ex); |
try { |
if(HibernateUtil.isTransactionOpen()) { |
logger.info("rollback transaction because of exception"); |
HibernateUtil.rollbackTransaction(); |
} |
} |
catch(Exception ex2) { |
logger.error("cannot rollback transaction", ex2); |
} |
if(ex instanceof ServletException) |
throw (ServletException)ex; |
else |
throw new ServletException("Internal server error"); |
} |
try { |
HibernateUtil.closeSession(); |
} |
catch(Exception ex) { |
logger.error("cannot close session", ex); |
} |
} |
public void destroy() |
{ |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/SessionKeys.java |
---|
0,0 → 1,7 |
package ak.hostadmiral.core.servlet; |
public abstract class SessionKeys |
{ |
public static final String USER = "user"; |
public static final String LOGIN_INFO = LoginInfo.class.getName(); |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/LoginInfo.java |
---|
0,0 → 1,19 |
package ak.hostadmiral.core.servlet; |
import java.io.Serializable; |
public class LoginInfo |
implements Serializable |
{ |
private Long id; |
public LoginInfo(Long id) |
{ |
this.id = id; |
} |
public Long getId() |
{ |
return id; |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/ConfigServlet.java |
---|
0,0 → 1,39 |
package ak.hostadmiral.core.servlet; |
import java.io.IOException; |
import javax.servlet.ServletRequest; |
import javax.servlet.ServletResponse; |
import javax.servlet.GenericServlet; |
import javax.servlet.ServletException; |
import org.apache.log4j.Logger; |
import ak.hostadmiral.util.ModelException; |
import ak.hostadmiral.core.config.Configurator; |
public class ConfigServlet |
extends GenericServlet |
{ |
private static final Logger logger = Logger.getLogger(ConfigServlet.class); |
public void init() |
throws ServletException |
{ |
try { |
Configurator.getInstance().setDefaultStream(getServletContext().getResourceAsStream( |
"/WEB-INF/conf/hostadmiral_config.xml.default")); |
Configurator.getInstance().setUserStream(getServletContext().getResourceAsStream( |
"/WEB-INF/conf/hostadmiral_config.xml")); |
Configurator.getInstance().configure(); |
} |
catch(ModelException ex) { |
throw new ServletException(ex); |
} |
} |
public void service(ServletRequest req, ServletResponse res) |
throws ServletException, IOException |
{ |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/ProfilerFilter.java |
---|
0,0 → 1,47 |
package ak.hostadmiral.core.servlet; |
import java.io.IOException; |
import java.net.URLEncoder; |
import javax.servlet.Filter; |
import javax.servlet.FilterChain; |
import javax.servlet.FilterConfig; |
import javax.servlet.ServletException; |
import javax.servlet.ServletRequest; |
import javax.servlet.ServletResponse; |
import javax.servlet.http.HttpSession; |
import javax.servlet.http.HttpServletRequest; |
import javax.servlet.http.HttpServletResponse; |
import org.apache.log4j.Logger; |
/** |
* Prints out time of request execution. |
*/ |
public class ProfilerFilter |
implements Filter |
{ |
private static final Logger logger = Logger.getLogger(ProfilerFilter.class); |
public void init(FilterConfig filterConfig) |
throws ServletException |
{ |
} |
public void doFilter(ServletRequest request, ServletResponse response, |
FilterChain chain) |
throws IOException, ServletException |
{ |
logger.debug("begin"); |
long t1 = System.currentTimeMillis(); |
chain.doFilter(request, response); |
long t2 = System.currentTimeMillis(); |
logger.info((t2 - t1) + " ms"); |
} |
public void destroy() |
{ |
} |
} |
/hostadmiral/branches/hibernate3/src/ak/hostadmiral/core/servlet/EncodingFilter.java |
---|
0,0 → 1,37 |
package ak.hostadmiral.core.servlet; |
import java.io.IOException; |
import javax.servlet.Filter; |
import javax.servlet.FilterChain; |
import javax.servlet.FilterConfig; |
import javax.servlet.ServletException; |
import javax.servlet.ServletRequest; |
import javax.servlet.ServletResponse; |
public class EncodingFilter |
implements Filter |
{ |
public static final String ENCODING = "UTF-8"; |
private FilterConfig filterConfig; |
public void init(FilterConfig filterConfig) |
throws ServletException |
{ |
this.filterConfig = filterConfig; |
} |
public void doFilter(ServletRequest request, ServletResponse response, |
FilterChain chain) |
throws IOException, ServletException |
{ |
if(request.getCharacterEncoding() == null) |
request.setCharacterEncoding(ENCODING); |
chain.doFilter(request, response); |
} |
public void destroy() |
{ |
} |
} |