使用过滤器防止非法访问WEB网页

问题:一般情况下,我们需要先登录,然后进入到下一个页面,但如果有人知道文件名等方式,绕过登录,可直接去访问后续页面,针对这样的问题,可以使用过滤器Filter去操作,具体方案如下:

文章转载http://www.51testing.com/html/06/183306-124904.html

附Filter学习资料:http://www.cnblogs.com/xdp-gacl/p/3948353.html

(本文档内容为个人笔记作用,如有侵权之处,联系本人,我会删除!)

我们首先定义了一些可以通过URL直接访问的页面,如登陆页面,重登陆页面等。当用户没有登陆而尝试访问受保护的URL时,Filter将拦截该请求,并把访问的URL重定向到登陆页面。

web.xml中的配置如下:

  <filter>
    
<filter-name>filterservletfilter-name>
    
<filter-class>com.comtop.app.common.FilterServletfilter-class>
    
<init-param>
  
<param-name>freePagesparam-name>
  
<param-value>

/Login.jsp;/LoginAction.do;/index.jsp;/ReLogin.jsp;/SSOLoginAction.do;
     
param-value>
    
init-param>
    
<init-param>
      
<param-name>toPageparam-name>
      
<param-value>/ReLogin.jspparam-value>
    
init-param>
  
filter>
  
<filter-mapping>
    
<filter-name>filterservletfilter-name>
    
<url-pattern>*.dourl-pattern>
  
filter-mapping>

  
<filter-mapping>
    
<filter-name>filterservletfilter-name>
    
<url-pattern>*.jspurl-pattern>
  
filter-mapping>

中定义一些基本信息,比如filter的名称,filter的类以及相关初始参数。这里我们把能直接访问的页面定义为freePages,并定义了它的值。还定义了默认的重定向页面,Relogin.jsp

接着定义了filter-mapping,让后缀名为.do.jspURL都被Filter所保护。

 

FilterServlet具体代码(import部分省略):


publicclassFilterServletextendsHttpServletimplementsFilter{
 privateFilterConfig filterConfig;
 privateString[]freePages;
 privateStringtoPage=null;
 privatestaticLoggerlogger;

 /**
  * 初始化filter(这里重写父类的方法)
  * @param filterConfig FilterConfig filter配置对象
  * @throws ServletException
  */
 publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  logger=Toolkit.getInstance().getLogger(this.getClass().getName());
  inti=0;
  Stringpages=null;
  StringTokenizerstrTokenizer=null;

  if(logger.isDebugEnabled()){
   logger.debug("initvalidate session filter ");
  }

  this.filterConfig=filterConfig;
  //以下从配置文件获取配置信息

  this.toPage=filterConfig.getInitParameter("toPage");
  pages=filterConfig.getInitParameter("freePages")
  if(toPage==null||pages==null||toPage.trim().length()==0||
   pages.trim().length()==0){
logger.error("web.xmlfilterServlet没有配置初始化参数\"toPage\"\"freePage\".");
   thrownewServletException("web.xmlfilterServlet没有配置初始化参数
\"toPage\"\"freePage\".");
  }
  if(logger.isDebugEnabled()){
   logger.debug("toPage"+toPage);
   logger.debug("freePages:"+pages);
  }

  strTokenizer=newStringTokenizer(pages,";");
  this.freePages=newString[strTokenizer.countTokens()];
  while(strTokenizer.hasMoreTokens()){
   freePages[i++]=strTokenizer.nextToken();
  }

  if(!isFreePage(toPage)){

logger.error("web.xmlfilter初始化参数\"toPage\"的值必须是\"freePage\"中的某个页面.");
   thrownewServletException("web.xmlfilter初始化参数\"toPage\"的值

必须是\"freePage\"中的某个页面.");
  }
 }

 /**
  * 判断一个请求URI是否是不过滤的页面
  * @param requestURI String 请求URI
  * @return boolean 返回true为不过滤页面
  */

 privatebooleanisFreePage(StringrequestURI){
  booleanisFree=false;
  for(inti=0;i<freePages.length;i++){
   if(requestURI.endsWith(freePages[i])){
    returntrue;
   }
  }
  returnisFree;
 }

 /**
  * 判断请求是否为有效Session
  * @param request ServletRequest 请求对象
  * @return boolean 返回true为有效Session
  */
 privatebooleanisValidSession(ServletRequestrequest){
  HttpServletRequest httpRequest=(HttpServletRequest)request;
  if(httpRequest.getSession().getAttribute(GlobalConstants.SECURITY_LOGIN_KEY)

==
   GlobalConstants.SECURITY_IS_LOGIN){
   returntrue;
  }
  if(logger.isDebugEnabled()){
   logger.debug("Session无效,请求:"+httpRequest.getRequestURI());
  }
  returnfalse;
 }

 /**
  * 过滤动作
  * @param request ServletRequest 请求对象
  * @param response ServletResponse 响应对象
  * @param filterChain FilterChain 过滤器链对象
  */
 publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChain

filterChain){
  StringrequestURI=null;
  ActionErrors errors=newActionErrors();
  ActionError errorSession=null;
  HttpServletRequest httpRequest=(HttpServletRequest)request;
  HttpServletResponse httpResponse=(HttpServletResponse)response;
  requestURI=httpRequest.getRequestURI();

        if(logger.isDebugEnabled()){
   logger.debug("Sessionfilter RequestURI:"+requestURI);
  }
  if(!isFreePage(requestURI)){ //如果是保护页面

   if(!isValidSession(request)){ //如果Session无效

    StringtoPageURL=null;
    try{
     toPageURL=httpRequest.getContextPath()+toPage;
     httpResponse.encodeRedirectURL(toPageURL);
     httpResponse.sendRedirect(toPageURL);//转发响应

    }catch(IOExceptionex){
     logger.error("Sessionfilter过滤时发生IO异常",ex);
    }
   }
  }

  if(!httpResponse.isCommitted()){ //如果响应未提交,交给过滤器链

   try{
    filterChain.doFilter(request,response);
   }catch(ServletExceptionsx){
    filterConfig.getServletContext().log(sx.getMessage());
   }catch(IOExceptioniox){
    filterConfig.getServletContext().log(iox.getMessage());
   }
  }

 }
 //父类的方法

 publicvoiddestroy(){
 }
 
 publicFilterConfiggetFilterConfig(){
  returnthis.filterConfig;
 }

 publicvoidsetFilterConfig(FilterConfigfilterConfig){
  this.filterConfig=filterConfig;
 }

}


这里isFreePage方法判断用户访问的URL是否是受保护的,从配置文件中将freePages的值得到后,以分号为隔离符将它们取出放到一个数组中,这个数组存放的每个String都是一个freePage。另外,isValidSession方法判断在session中是否存在用户的登陆信息,如果用户未登陆,则返回false。每一个filterdoFilter()方法
中得到当前的requestresponse,在doFilter()方法中,以下代码完成核心判断:

  if(!isFreePage(requestURI)){ //如果是保护页面

   if(!isValidSession(request)){ //如果Session无效

    StringtoPageURL=null;
    try{
     toPageURL=httpRequest.getContextPath()+toPage;
     httpResponse.encodeRedirectURL(toPageURL);
     httpResponse.sendRedirect(toPageURL);//转发响应

    }catch(IOExceptionex){
     logger.error("Sessionfilter过滤时发生IO异常",ex);
    }
   }
  }

只有是通过isFreePage(requestURI)isValidSession(request)两层验证的页面才能被访问到,基本实现了防止用户非法访问页面的情况。


你可能感兴趣的:(WEB)