2014-06-11 3 views
0

지난 2 일 이래로 아래 시나리오에서 작업 중입니다. 요청이 멀티 파트 유형인지 확인하는 Java 필터를 개발했습니다. 맞다면 .php를 제한하고 싶습니다. 파일 업로드 중. 서블릿 필터에서 파일 형식을 성공적으로 검색했습니다. 유효한 경우 해당 요청을 전달하여 처리합니다. 이제 필터없이 정확하게 작동하는 비즈니스 로직을 업로드하지 못했습니다. 내 프로젝트에서 Spring 프레임 워크를 사용 중입니다. 비즈니스 논리에서 캐스팅 할 때 MultipartRequest (스프링 클래스)를 사용 중입니다. filter가 관련된 후 아무 것도 반환하지 않는 request.getFileNames() 호출.업로드하는 특정 파일 확장자 제한 (서버 측)

필터에서 다음과 같이 파일 확장명의 유효성을 검사 한 후 요청을 래핑했습니다. 모든 양식 필드가 요청과 함께 전달 될 매개 변수 맵에 설정됩니다. 및 파일 형식 필드가 요청 개체의 특성으로 설정됩니다.

도와 주시겠습니까?

감사합니다, Namrata 샤

doFilter()에서
+0

.php 파일을 차단하기 위해 필터에 작성한 코드 만 입력하십시오. 또한 – Dinal

+0

안녕 Dinal을받는다면 오류 스택 추적을 제공하십시오. 도움을 주셔서 감사합니다. – user3730151

+0

문제가 해결 되었습니까? 가장 간단한 해결책은 필터를 제거하고 업로드 기능에서 유효성 검사를 수행하는 것입니다 (예 : uploadFile() 메서드). 파일 유형이 PHP인지 여부를 검사하고 오류를 던집니다. – Dinal

답변

0

,

내가받은 요청 HttpServletRequest의 인스턴스인지 여부를 확인했다. processFormField()에 대한

parseRequest(): 

{ 

List<FileItem> multipartItems = null; 
     try 
     { multipartItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
     } 
     catch (FileUploadException e) 
     { 
      throw new ServletException("Cannot parse multipart request: " + e.getMessage()); 
     } 

     Map<String, String[]> parameterMap = new HashMap<String, String[]>(); 
     for (FileItem multipartItem : multipartItems) 
     { 
      if (multipartItem.isFormField()) 
      processFormField(multipartItem, parameterMap); 
      else 
      processFileField(multipartItem, request); 
     } 
      return wrapRequest(request, parameterMap); 
} 
0

코드 :

String name = formField.getFieldName(),value = formField.getString(); 
String[] values = parameterMap.get(name); 

if (values == null) 
{ 
    parameterMap.put(name, new String[]{value}); 
} 
else 
{ 
    int length = values.length; 
    String[] newValues = new String[length + 1]; 
    System.arraycopy(values, 0, newValues, 0, length); 
    newValues[length] = value; 
    parameterMap.put(name, newValues); 
} 
0

코드 processFileField()에 대한 :이 코드 아래 사용하여 여러 부분 REQ의 경우 예, 다음 구문 분석 할 수 있습니다 경우

request.setAttribute(fileField.getFieldName(), fileField); 

, I 랩 요청은 다음과 같습니다 :

private static HttpServletRequest wrapRequest(
      HttpServletRequest request, final Map<String, String[]> parameterMap) 
    { 

     return new HttpServletRequestWrapper(request) 
     { 
      @Override 
      public Map<String, String[]> getParameterMap() 
      { 
       return parameterMap; 
      } 

      public String[] getParameterValues(String name) 
      { 
       return parameterMap.get(name); 
      } 

      public String getParameter(String name) 
      { 
       String[] params = getParameterValues(name); 
       return params != null && params.length > 0 ? params[0] : null; 
      } 

      public Enumeration<String> getParameterNames() 
      { 
       return Collections.enumeration(parameterMap.keySet()); 
      } 
     }; 
    }