From: <mr...@us...> - 2003-01-08 05:53:40
|
Update of /cvsroot/struts/struts-resume/src/web/org/appfuse/webapp/filter In directory sc8-pr-cvs1:/tmp/cvs-serv29536 Added Files: ActionFilter.java BreadCrumbFilter.java Log Message: --- NEW FILE: ActionFilter.java --- package org.appfuse.webapp.filter; // java imports import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.Globals; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.appfuse.common.Constants; import org.appfuse.webapp.form.UserForm; import org.appfuse.webapp.service.UserManager; import org.appfuse.webapp.service.UserManagerImpl; import org.appfuse.webapp.util.SslUtil; /** * This class is used to filter all requests to the <code>Action</code> * servlet and detect if a user is authenticated. If a user is authenticated, * but no user object exists, this class populates the <code>UserForm</code> * from the user store. * * <p><a href="ActionFilter.java.html"><i>View Source</i></a></p> * * @author Matt Raible * @version $Revision: 1.1 $ $Date: 2003/01/08 05:53:37 $ * * @web.filter * display-name="Action Filter" * name="actionFilter" * * Change this value to true if you want to secure your entire application. * This can also be done in web-security.xml by setting <transport-guarantee> * to CONFIDENTIAL. * * @web.filter-init-param * name="isSecure" * value="${secure-application}" * * @web.filter-mapping * url-pattern="*.do" */ public class ActionFilter implements Filter { /** * The <code>Log</code> instance for this class */ private Log log = LogFactory.getLog(ActionFilter.class); private FilterConfig filterConfig = null; private static Boolean secure = Boolean.FALSE; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; /* This determines if the application uses SSL or not */ secure = Boolean.valueOf(filterConfig.getInitParameter("isSecure")); } /** * Destroys the filter. */ public void destroy() { filterConfig = null; } public void doFilter( ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // cast to the types I want to use HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(true); // do pre filter work here // If using https, switch to http String redirectString = SslUtil.getRedirectString( request, filterConfig.getServletContext(), secure.booleanValue()); if (redirectString != null) { if (log.isDebugEnabled()) { log.debug( "protocol switch needed, redirecting to '" + redirectString + "'"); } // Redirect the page to the desired URL response.sendRedirect(response.encodeRedirectURL(redirectString)); // ensure we don't chain to requested resource return; } UserForm userForm = (UserForm) session.getAttribute(Constants.USER_KEY); ServletContext ctx = filterConfig.getServletContext(); String username = request.getRemoteUser(); // user authenticated, empty user object if (username != null && userForm == null) { try { UserManager mgr = new UserManagerImpl( (String) ctx.getAttribute(Constants.DAO_TYPE)); UserForm user = mgr.getUser(username); session.setAttribute(Constants.USER_KEY, user); } catch (Exception e) { log.error("Error getting user's information " + e); e.printStackTrace(); ActionErrors errors = new ActionErrors(); errors.add( ActionErrors.GLOBAL_ERROR, new ActionError("errors.general")); StringBuffer sb = new StringBuffer(); if (e.getCause() == null) { sb.append(e.getMessage()); } else { while (e.getCause() != null) { sb.append(e.getMessage()); sb.append("\n"); e = (Exception) e.getCause(); } } errors.add( ActionErrors.GLOBAL_ERROR, new ActionError("errors.detail", sb.toString())); request.setAttribute(Globals.ERROR_KEY, errors); RequestDispatcher dispatcher = request.getRequestDispatcher("/error.jsp"); dispatcher.forward(request, response); return; } } // go to original destination chain.doFilter(request, response); // post filter } } --- NEW FILE: BreadCrumbFilter.java --- package org.appfuse.webapp.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.collections.ArrayStack; import org.apache.commons.lang.NumberUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Intercepts requests and places URL into breadcrumb stack. * * <p> * <a href="BreadCrumbFilter.java.html"><i>View Source</i></a> * </p> * * @author <a href="mailto:la...@br...">Lance Lavandowska</a> * @version $Revision: 1.1 $ $Date: 2003/01/08 05:53:37 $ * * @web.filter * display-name="BreadCrumb Filter" * name="breadcrumbFilter" * * @web.filter-init-param * name="maxStackSize" * value="3" * * @web.filter-mapping * url-pattern="/*" */ public final class BreadCrumbFilter implements Filter { /** * The <code>Log</code> instance for this class */ private Log log = LogFactory.getLog(BreadCrumbFilter.class); private FilterConfig filterConfig = null; private int maxStackSize = 10; private String BREADCRUMB = "move.me"; public void doFilter( ServletRequest req, ServletResponse resp, FilterChain chain ) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession ses = request.getSession(true); ArrayStack stack = (ArrayStack) ses.getAttribute(BREADCRUMB); if (stack == null) { stack = new ArrayStack(); } // This gives you a chance to look at your breadcrumb trail if (request.getQueryString() != null && request.getQueryString().equals("BreadCrumb")) { response.setContentType("text/html"); ServletOutputStream out = response.getOutputStream(); for (int i = 0; i < stack.size(); i++) { out.println(stack.peek(i).toString() + "<br />"); } out.flush(); out.close(); } else { chain.doFilter(req, resp); } //now that we've successfully returned, // add url to stack StringBuffer url = request.getRequestURL(); if (request.getQueryString() != null) { url.append("?").append(request.getQueryString()); } if (stack.size() == maxStackSize) { stack.remove(maxStackSize - 1); } stack.push(url.toString()); // make sure the user hasn't logged out and invalidated the session try { ses.setAttribute(BREADCRUMB, stack); } catch (IllegalStateException ise) { // ignore, user has logged out } } /** * Initialize controller values of filter. */ public void init(FilterConfig filterConfig) { this.filterConfig = filterConfig; // debug //System.out.println("BreadCrumbFilter is loaded"); if (!StringUtils .isEmpty(filterConfig.getInitParameter("maxStackSize"))) { String temp = filterConfig.getInitParameter("maxStackSize"); int mSS = NumberUtils.stringToInt(temp); if (mSS != 0) { maxStackSize = mSS; } } } /** destroy any instance values other than filterConfig **/ public void destroy() { maxStackSize = 10; } } |