import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // For Date class
/** Simple filter that prints a report on the standard output * each time an associated servlet or JSP page is accessed. */
public class ReportFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest)request; System.out.println(req.getRemoteHost() + " tried to access " + req.getRequestURL() + " on " + new Date() + "."); chain.doFilter(request,response); }
public void init(FilterConfig config) throws ServletException { }
public void destroy() {} }
程序清单9-3 web.xml(针对报告过滤器的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- Register the name "Reporter" for ReportFilter. --> <filter> <filter-name>Reporter</filter-name> <filter-class> moreservlets.filters.ReportFilter </filter-class> </filter> <!-- ... --> <!-- Apply the Reporter filter to home page. --> <filter-mapping> <filter-name>Reporter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping> <!-- Also apply the Reporter filter to the servlet named "TodaysSpecial". --> <filter-mapping> <filter-name>Reporter</filter-name> <servlet-name>TodaysSpecial</servlet-name> </filter-mapping> <!-- ... -->
<!-- Give a name to the Today''s Special servlet so that filters can be applied to it. --> <servlet> <servlet-name>TodaysSpecial</servlet-name> <servlet-class> moreservlets.TodaysSpecialServlet </servlet-class> </servlet> <!-- ... -->
<!-- Make /TodaysSpecial invoke the servlet named TodaysSpecial (i.e., moreservlets.TodaysSpecial). --> <servlet-mapping> <servlet-name>TodaysSpecial</servlet-name> <url-pattern>/TodaysSpecial</url-pattern> </servlet-mapping>
<!-- Turn off invoker. Send requests to index.jsp. --> <servlet-mapping> <servlet-name>Redirector</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> <!-- ... --> </web-app>
posted on 2004-07-02 17:07 khan 阅读(287) 评论(1) 编辑 收藏
/** Servlet that simply redirects users to the * Web application home page. Registered with the * default servlet URL to prevent clients from * using http://host/webAppPrefix/servlet/ServletName * to bypass filters or security settings that * are associated with custom URLs. */
public class RedirectorServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect(request.getContextPath()); }
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // For Date class
/** Simple filter that prints a report in the log file * whenever the associated servlets or JSP pages * are accessed. */
public class LogFilter implements Filter { protected FilterConfig config; private ServletContext context; private String filterName; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest)request; context.log(req.getRemoteHost() + " tried to access " + req.getRequestURL() + " on " + new Date() + ". " + "(Reported by " + filterName + ".)"); chain.doFilter(request,response); }
public void init(FilterConfig config) throws ServletException { this.config = config; // In case it is needed by subclass. context = config.getServletContext(); filterName = config.getFilterName(); }
public void destroy() {}
}
程序清单9-8 web.xml(针对日志记录过滤器的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... -->
<!-- Register the name "Logger" for LogFilter. --> <filter> <filter-name>Logger</filter-name> <filter-class> moreservlets.filters.LogFilter </filter-class> </filter> <!-- ... -->
<!-- Apply the Logger filter to all servlets and JSP pages. --> <filter-mapping> <filter-name>Logger</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
/** Filter that keeps track of accesses that occur * at unusual hours. */ public class LateAccessFilter implements Filter { private FilterConfig config; private ServletContext context; private int startTime, endTime; private DateFormat formatter; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest)request; GregorianCalendar calendar = new GregorianCalendar(); int currentTime = calendar.get(calendar.HOUR_OF_DAY); if (isUnusualTime(currentTime, startTime, endTime)) { context.log("WARNING: " + req.getRemoteHost() + " accessed " + req.getRequestURL() + " on " + formatter.format(calendar.getTime())); } chain.doFilter(request,response); }
public void init(FilterConfig config) throws ServletException { this.config = config; context = config.getServletContext(); formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); try { startTime = Integer.parseInt(config.getInitParameter("startTime")); endTime = Integer.parseInt(config.getInitParameter("endTime")); } catch(NumberFormatException nfe) { // Malformed or null // Default: access at or after 10 p.m. but before
6 a
.m. // is considered unusual. startTime = 22; // 10:00 p.m. endTime = 6; // 6:
00 a
.m. } }
public void destroy() {}
// Is the current time between the start and end // times that are marked as abnormal access times?
private boolean isUnusualTime(int currentTime, int startTime, int endTime) { // If the start time is less than the end time (i.e., // they are two times on the same day), then the // current time is considered unusual if it is // between the start and end times. if (startTime < endTime) { return((currentTime >= startTime) && (currentTime < endTime)); } // If the start time is greater than or equal to the // end time (i.e., the start time is on one day and // the end time is on the next day), then the current // time is considered unusual if it is NOT between // the end and start times. else { return(!isUnusualTime(currentTime, endTime, startTime)); } } }
程序清单9-10 web.xml(针对访问时过滤器的摘录) <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- ... -->
<!-- Register the name "LateAccessFilter" for moreservlets.filter.LateAccessFilter. Supply two initialization parameters: startTime and endTime. --> <filter> <filter-name>LateAccessFilter</filter-name> <filter-class> moreservlets.filters.LateAccessFilter </filter-class> <init-param> <param-name>startTime</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>endTime</param-name> <param-value>10</param-value> </init-param> </filter> <!-- ... -->
<!-- Apply LateAccessFilter to the home page. --> <filter-mapping> <filter-name>LateAccessFilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping>