关于filter拦截请求及chain.doFilter(request, response)的理解

来源:互联网 发布:windows刻录光盘 编辑:程序博客网 时间:2024/06/07 23:26

在一个jsp文件中写了一段jQuery的ajax,struts2框架下的action无论如何接收不到请求

 

++============================++

.jsp

$(function(){
  $.ajax({
   type: 'post',
   url: 'customer/test.action',
   data: 'p=shgsfgdsfg',
   dataType:'text',
   success: function(mes){
    alert(mes);
   },
   error:function(){
    alert(arguments[2]);
   }
  });
 });

++=============================++

web.xml

  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.wanguo.filter.SessionFilter</filter-class>
  </filter>
  <filter-mapping> 
    <filter-name>SessionFilter</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>

 

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>

 

++=============================++

struts.xml

<action name="test" class="com.wanguo.customer.action.CopyOfCustomerAction" method="test"></action>

.action

略……

 

struts2框架没能拦截住ajax请求,是因为自定义的SessionFilter拦截器将其拦截了。

SessionFilter部分源码:

HttpSession session = httpServletRequest.getSession();
         User user = (User) session.getAttribute("user");
         // 当前会话用户为空而且不是请求登录,退出登录,欢迎页面和根目录则退回到应用的根目录
         if (user == null
                // && !requesturi.endsWith("/processLogin.do")
                 && !requesturi.endsWith("/checkLogin.action")
                 && !requesturi.endsWith("/checkCode.action")
                 && !requesturi.endsWith(httpServletRequest.getContextPath()
                         + "/")) {
             httpServletResponse.sendRedirect(httpServletRequest
                     .getContextPath()
                     + "/");
             return;
         }
         chain.doFilter(request, response);

 

由代码注释可见,struts的filter当然不能拦截此ajax的请求。若session中已经有了登陆用户的相关信息或其他条件,那么       chain.doFilter(request, response);就会执行,他会去web.xml中依次寻找下一个filter,此例中便是struts2的filter。

故:chain.doFilter(request, response)目的是要filter链持续下去,第一个filter中的实现代码不能满足条件,就会通过chain.doFilter(request, response)找到下一个filter的实现,直到找到满足条件的。

0 0
原创粉丝点击