Struts2.1.8 和Servlet请求冲突

来源:互联网 发布:济南物流软件开发 编辑:程序博客网 时间:2024/05/22 04:44

   项目使用Struts2.1.8。配置Proxool数据源,在利用proxool官方的AdminServlet查看数据库连接状态的时候,始终报错:找不到相应的Action name。

Code:
  1. <filter-mapping>  
  2.   <filter-name>struts2</filter-name>  
  3.   <url-pattern>/*</url-pattern>  
  4.  </filter-mapping>  

     struts2 的拦截器过滤了所有的请求,我们为proxool配置的servlet,无法访问到。网络上找了些资料,主要有两种方法:

     1,在struts2 core包org.apache.struts2下的default.properties:修改这个键值对   struts.action.extension=action,,
 

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

Code:
  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>  

过滤器的实现(来源于网络):

Code:
  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. }   

      过滤器用多了,所有的请求都得经过他们。不知道会不会使系统的反应变得相对迟缓!

   

原创粉丝点击