servlet forward action 문제 및 struts2 차단 servlet 문제

7224 단어 Webservletstruts
사실 이 문제는 자신이 이전에 겪은 적이 있지만 당시에는 깊이 있게 해결하지 못하고 결론을 내렸다. 서브렛은 Action으로 전송할 수 없다.오늘 다른 사람에게도 이런 문제가 있는 것을 보고 특별히 깊이 들어가서 다른 사람의 자료도 보았다.
이 문제의 원인은 Filter가 기본적으로 리퀘스트를 차단하고 forwardfilter는 차단하지 않기 때문에 struts2가 forward를 차단하려면 다음과 같은 설정이 필요합니다.
<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>/*</url-pattern>
        <dispatcher>request</dispatcher>
        <dispatcher>forward</dispatcher>
    </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, 웹에서.xml에 차단기를 추가해서 서브렛을 필터합니다.web.xml 파일 내용:
<!--       ,  servlet  。  struts servlet     -->   
    <filter>   
      <filter-name>ServletFilter</filter-name>   
      <filter-class>org.bts.base.filter.ServletFilters</filter-class>   
      <init-param>   
        <param-name>includeServlets</param-name>   
        <param-value>proxool_admin</param-value>   
      </init-param>   
    </filter>   
    <filter-mapping>   
      <filter-name>ServletFilter</filter-name>   
      <url-pattern>/*</url-pattern>   
    </filter-mapping>   
        
    <!--   Struts2 FilterDispathcer Filter -->   
 <filter>   
        <filter-name>struts2</filter-name>   
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
 </filter>   
 <!-- FilterDispatcher     struts2       WEB   -->   
 <filter-mapping>   
  <filter-name>struts2</filter-name>   
  <url-pattern>/*</url-pattern>   
 </filter-mapping>   
   
  <!--      Spring   Listener -->   
 <context-param>   
  <param-name>contextConfigLocation</param-name>   
   <param-value>WEB-INF/classes/applicationContext.xml</param-value>   
 </context-param>   
 <listener>   
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
 </listener>   
   
    <!--   proxool     -->   
 <servlet>   
   <servlet-name>proxool_admin</servlet-name>   
   <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>   
 </servlet>   
 <servlet-mapping>   
   <servlet-name>proxool_admin</servlet-name>   
   <url-pattern>/proxool_admin</url-pattern>   
 </servlet-mapping>   
 <security-constraint>   
   <web-resource-collection>   
     <web-resource-name>proxool</web-resource-name>   
     <url-pattern>/proxool_admin</url-pattern>   
   </web-resource-collection>   
   <auth-constraint>   
     <role-name>manager</role-name>   
   </auth-constraint>   
 </security-constraint>   
 <login-config>   
   <auth-method>BASIC</auth-method>   
   <realm-name> proxool manager Application</realm-name>   
 </login-config>   
 <security-role>   
   <description>   
     The role that is required to log in to the Manager Application    
   </description>   
   <role-name>manager</role-name>   
 </security-role>   
 <error-page>   
   <error-code>401</error-code>   
   <location>/jsp/error/401.jsp</location>   
 </error-page>   

필터의 실현
package org.bts.base.filter;    
   
import java.io.IOException;    
import java.util.ArrayList;    
import java.util.Arrays;    
import java.util.List;    
   
import javax.servlet.Filter;    
import javax.servlet.FilterChain;    
import javax.servlet.FilterConfig;    
import javax.servlet.RequestDispatcher;    
import javax.servlet.ServletException;    
import javax.servlet.ServletRequest;    
import javax.servlet.ServletResponse;    
import javax.servlet.http.HttpServletRequest;    
   
public class ServletFilters implements Filter {    
   
    private List<String> initParameters = new ArrayList<String>();    
    @Override   
    public void destroy() {    
       System.out.println("ServletFilters destroied!");    
    }    
   
    @Override   
    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {    
            
        HttpServletRequest request = (HttpServletRequest) req;    
        String target = request.getRequestURI();    
        System.out.println("1: "+target);    
        target = target.lastIndexOf("?") > 0 ? target.substring(target    
                .lastIndexOf("/") + 1, target.lastIndexOf("?")    
                - target.lastIndexOf("/")) : target.substring(target    
                .lastIndexOf("/") + 1);    
          System.out.println("2:"+target);    
        if (this.initParameters.contains(target)) {    
            RequestDispatcher rdsp = request.getRequestDispatcher(target);    
            rdsp.forward(req, resp);//       ,  FilterChain    
        } else   
            chain.doFilter(req, resp);    
   
    }    
   
    @Override   
    public void init(FilterConfig config) throws ServletException {    
        String parameters = config.getInitParameter("includeServlets");    
        System.out.println("************"+config.getFilterName()+" initing with value "+parameters+"********************");    
        this.initParameters.addAll(Arrays.asList(parameters.split(",")));    
    }    
   
}    

 
저는 개인적으로 첫 번째 방법을 선호합니다. 두 번째 방안은 제가 직접 테스트하지 않았습니다. 출처와 다른 사람의 글에서 나온 것입니다. 첫 번째 방안은 액션을 사용할 때마다 url 뒤에'.액션'을 추가해야 합니다. 물론 당신이 struts2의 라벨을 사용한다면 그는 자동으로 추가할 것입니다. 그리고 저는 있다고 생각합니다.액션은 다른 처리 요청과struts의 처리 요청을 구분하는 데 필요합니다.

좋은 웹페이지 즐겨찾기