需求描述:
        在网站中有一些网页是受保护的,即只有规定的用户才能访问,而有一些网页任何人都可以访问。所以用户在IE中输入URL提交后,服务器必须对用户输入的URL进行分析过虑。
分析:
       需要考虑的问题:
1、 怎么拦截用户输入的URL?
2、 怎么判断输入的URL是否是受保护的?
3、 在用户量很大的情况下,每一个URL都要进行判断,怎样提高判断的性能?
方法:
1、 在web.xml中可以定义filter,服务器会更据filter的定义进行拦截,以及相应的处理。例如下面的配置:
<filter>  
           <filter-name>webfilter</filter-name>
           <filter-class>com.cyberway.web.filter.WebFilter</filter-class>
       </filter>
       <filter-mapping>
           <filter-name>webfilter</filter-name>
           <url-pattern>/*</url-pattern>
   </filter-mapping>
 
filter-name:定义过滤器的名称
filter-class:定义过滤器处理的类
url-pattern:定义拦截url
/*:表示所有的都拦截
*.jsp:只拦截jsp文件
2、利用数据库把需要保护的URL保存起来,每请求一次,检测一次。
3、如果每请求一次,都去数据库访问检测一次,这样性能一定会非常差的。网站稳定以后受保护的页面一般更新较少,我们可以第一次请求时,从数据库中获取所有的受保护页面,保存在hashtble中,然后每次从hashtable中进行检测。如果更新了受保护页面,则需更新hashtable。其实就是一种catch模式。事例代码如下:
public class URLHelper{
private static URLHelper me;
private HashTable  urlTable;
private Boolean hasInit=false;
 
static{
      me=new URLHelper();
private URLHelper(){
}
public URLHelper getInstance(){
      return me;
}
public Boolean isHasInit{
      return hasInit;
}
public void init(){
      urlTable=new HashTable();
      Collection datas=getAllURLs();
      Iterator it=datas.iterator();
      while(it.hasNext()){
             URLVO vo=(URLVO)it.next();  //URLVO:一个记录URL信息的实体类
             urlTable.put(vo.URL,vo);
}
}
//根据URL判断是否上受保护的
public boolean isProtected(String url) {
    return urlTable.containsKey(url);
}
private Collection getAllURLs(){
      //从数据库中获取所受保护网页
}
WebFilter类如下:
public class WebFilter extends HttpServlet implements Filter {
 
    public void doFilter(ServletRequest request, ServletResponse response,
                 FilterChain filterChain) throws ServletException {
        try {
            request.setCharacterEncoding("GBK");
           HttpServletRequest hreq = (HttpServletRequest) request;
            HttpServletResponse hres = (HttpServletResponse) response;
            HttpSession session = hreq.getSession();
            ServletContext context = session.getServletContext();
            String currentURL = hreq.getRequestURI();//返回不带参数URL
            /String preURL = hreq.getHeader("referer");//返回上一页URL
            String urlParam = hreq.getQueryString();//返回当前URL的参数
            String currentURLpara = null;
            // check if is requesting a protect resource
            if (currentURL != null) {
                 //String contextPath = hreq.getContextPath();//返回 "/webroot"
URLHelper helper=URLHelper.getInstance();
if(helper. isProtected(currentURL)){
    setForward(currentURL)
}else{
    setForward(”error.jsp”);    
}                  
                }
                filterChain.doFilter(request, response);
        }catch (ServletException sx) {
            filterConfig.getServletContext().log(sx.getMessage());
        }catch (IOException iox) {
            filterConfig.getServletContext().log(iox.getMessage());
        }catch (Exception ex) {
            filterConfig.getServletContext().log(ex.getMessage());
        }
//forward一个页面
private void setForward(String url, ServletRequest request,
                    ServletResponse response) throws Exception {
             HttpServletRequest hreq = (HttpServletRequest) request;
             RequestDispatcher dispatcher =            hreq.getSession().getServletContext()
                          .getRequestDispatcher(url);
             dispatcher.forward(request, response);
      }