servlet forward action问题以及struts2拦截servlet问题

来源:互联网 发布:国网网络大学网址 编辑:程序博客网 时间:2024/06/05 11:50
 

其实这个问题自己以前就遇到过了但当时没有深入解决就下了定论:Servlet是不能转发到Action的。今天看到他人也有这个问题,所以特意的深入了一下也看了他人的资料。

           这个问题的原因是filter默认拦截的是request,而forwardfilter是不会拦截的,所以想要想struts2拦截forward就需要配置:

Java代码 复制代码 收藏代码
  1. <filter>   
  2.         <filter-name>struts2</filter-name>   
  3.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
  4.     </filter>   
  5.   
  6.     <filter-mapping>   
  7.         <filter-name>struts2</filter-name>   
  8.         <url-pattern>/*</url-pattern>   
  9.         <dispatcher>request</dispatcher>   
  10.         <dispatcher>forward</dispatcher>   
  11.     </filter-mapping>  

 

另一个问题就是struts2的核心filter配置的是"/*"所以他会拦截所有的请求,如果你配有servlet,你的请求是会先被filter拦截的也就是会进入struts2的流程而不是servlet的,但有时你又真的需要使用的servlet(就像你要整合DWR),为了解决这种情况也有两种解决方案:

              1,在struts2 core包org.apache.struts2下的default.properties:修改这个键值对struts.action.extension=action,当然我们不希望直接在这个文件里改,可以通过在struts.xml中增加常量的方式来配置

                2,在web.xml里添加一个拦截器,过滤我们的Servlet。web.xml文件内容:

Java代码 复制代码 收藏代码
  1. <!-- 自定义过滤器,过滤servlet请求。解决struts和servlet冲突问题 -->      
  2.     <filter>      
  3.       <filter-name>ServletFilter</filter-name>      
  4.       <filter-class>org.bts.base.filter.ServletFilters</filter-class>      
  5.       <init-param>      
  6.         <param-name>includeServlets</param-name>      
  7.         <param-value>proxool_admin</param-value>      
  8.       </init-param>      
  9.     </filter>      
  10.     <filter-mapping>      
  11.       <filter-name>ServletFilter</filter-name>      
  12.       <url-pattern>/*</url-pattern>      
  13.     </filter-mapping>      
  14.            
  15.     <!-- 定义Struts2的FilterDispathcer的Filter -->      
  16.  <filter>      
  17.         <filter-name>struts2</filter-name>      
  18.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>      
  19.  </filter>      
  20.  <!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求 -->      
  21.  <filter-mapping>      
  22.   <filter-name>struts2</filter-name>      
  23.   <url-pattern>/*</url-pattern>      
  24.  </filter-mapping>      
  25.       
  26.   <!-- 用于初始化Spring容器的Listener -->      
  27.  <context-param>      
  28.   <param-name>contextConfigLocation</param-name>      
  29.    <param-value>WEB-INF/classes/applicationContext.xml</param-value>      
  30.  </context-param>      
  31.  <listener>      
  32.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      
  33.  </listener>      
  34.       
  35.     <!-- 配置proxool管理工具 -->      
  36.  <servlet>      
  37.    <servlet-name>proxool_admin</servlet-name>      
  38.    <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>      
  39.  </servlet>      
  40.  <servlet-mapping>      
  41.    <servlet-name>proxool_admin</servlet-name>      
  42.    <url-pattern>/proxool_admin</url-pattern>      
  43.  </servlet-mapping>      
  44.  <security-constraint>      
  45.    <web-resource-collection>      
  46.      <web-resource-name>proxool</web-resource-name>      
  47.      <url-pattern>/proxool_admin</url-pattern>      
  48.    </web-resource-collection>      
  49.    <auth-constraint>      
  50.      <role-name>manager</role-name>      
  51.    </auth-constraint>      
  52.  </security-constraint>      
  53.  <login-config>      
  54.    <auth-method>BASIC</auth-method>      
  55.    <realm-name> proxool manager Application</realm-name>      
  56.  </login-config>      
  57.  <security-role>      
  58.    <description>      
  59.      The role that is required to log in to the Manager Application       
  60.    </description>      
  61.    <role-name>manager</role-name>      
  62.  </security-role>      
  63.  <error-page>      
  64.    <error-code>401</error-code>      
  65.    <location>/jsp/error/401.jsp</location>      
  66.  </error-page>     

 过滤器的实现

Java代码 复制代码 收藏代码
  1. package org.bts.base.filter;       
  2.       
  3. import java.io.IOException;       
  4. import java.util.ArrayList;       
  5. import java.util.Arrays;       
  6. import java.util.List;       
  7.       
  8. import javax.servlet.Filter;       
  9. import javax.servlet.FilterChain;       
  10. import javax.servlet.FilterConfig;       
  11. import javax.servlet.RequestDispatcher;       
  12. import javax.servlet.ServletException;       
  13. import javax.servlet.ServletRequest;       
  14. import javax.servlet.ServletResponse;       
  15. import javax.servlet.http.HttpServletRequest;       
  16.       
  17. public class ServletFilters implements Filter {       
  18.       
  19.     private List<String> initParameters = new ArrayList<String>();       
  20.     @Override      
  21.     public void destroy() {       
  22.        System.out.println("ServletFilters destroied!");       
  23.     }       
  24.       
  25.     @Override      
  26.     public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {       
  27.                
  28.         HttpServletRequest request = (HttpServletRequest) req;       
  29.         String target = request.getRequestURI();       
  30.         System.out.println("1: "+target);       
  31.         target = target.lastIndexOf("?") > 0 ? target.substring(target       
  32.                 .lastIndexOf("/") + 1, target.lastIndexOf("?")       
  33.                 - target.lastIndexOf("/")) : target.substring(target       
  34.                 .lastIndexOf("/") + 1);       
  35.           System.out.println("2:"+target);       
  36.         if (this.initParameters.contains(target)) {       
  37.             RequestDispatcher rdsp = request.getRequestDispatcher(target);       
  38.             rdsp.forward(req, resp);//转发我们的请求,跳出FilterChain      
  39.         } else      
  40.             chain.doFilter(req, resp);       
  41.       
  42.     }       
  43.       
  44.     @Override      
  45.     public void init(FilterConfig config) throws ServletException {       
  46.         String parameters = config.getInitParameter("includeServlets");       
  47.         System.out.println("************"+config.getFilterName()+" initing with value "+parameters+"********************");       
  48.         this.initParameters.addAll(Arrays.asList(parameters.split(",")));       
  49.     }       
  50.       
  51. }      

 

我个人比较倾向于第一种方法,第二种方案我没有自己测试,来源与他人的文章,使用第一种就是每次要用到action时要在请求url后面加“.action”,当然你如果使用的是struts2的标签那么他会自动加的,而且我认为有.action用来区分其他处理请求和struts的处理请求是需要的。

原创粉丝点击