2012-06-24 1 views
3

액션에 대한 요청은 인터셉터를 사용하여 유효성을 검사 할 수 있습니다. 또한 빈 동작 선언을 사용하면 JSP 페이지에 대한 직접 요청을 피할 수 있습니다. 그것은 이와 같습니다.Struts2에서 JSP 페이지에 대한 요청의 유효성을 검사하는 방법

<action name="home" > 
     <result>home.jsp</result> 
</action> 

이 호출을 JSP 페이지에 유효성을 검사하고 싶습니다. 간단한 접근법은 액션 이름을 확인하고 (세션 등을 사용하여 유효성 검사를 수행하는) Interceptor과 함께 액션 (ActionSupport)을 추가 할 수 있다고 생각합니다. 하지만 그 행동 클래스가 아무 것도하지 않고 단지 execute() (쓸모없는 작업 ...)을 실행하고 공백이 있어야하는 곳이 일 때 성능이 저하되는지 여부는 의심 스럽습니다. (하지만 : Struts2에서 몇 가지 문서를 읽었을 때 Action 메스를 추가하지 않더라도 프레임 워크 자체가 추가되고 "성공"을 반환하는 액션 클래스가 추가되었으므로 액션 클래스를 추가하거나 자신을 추가하지 않아도 영향을주지 않습니다 새로)

어떤 방법, 당신의 최선의 방법은 유효성을 검사하거나 일부 JSP 페이지에 대한 권한에 액세스 할 수 있습니다 무엇인지 알고 싶습니다. (페이지 수는 많은 수 있습니다 ..뿐만 아니라 하나의 JSP 페이지)

올린 날짜 :예 :
모든 사용자가 액세스 할 수없는 일부 제한된 페이지가 있습니다. 해당 페이지에 요청이 오면 사용자는 유효성을 검사해야합니다. 그런 다음 비어있는/익명의 액션 (위의 코드 스 니펫 - 액션 이름 - 실제 클래스 없음)을 통해 요청이 들어 오면 해당 요청의 유효성을 검사하는 방법 JSP 페이지? 이 작업 클래스를 사용해야합니까?

+0

일부 JSP 페이지 무슨 뜻? S2 동작은 값 스택을 준비하고 S2 태그 및 다른 S2 특정 기능을 포함하는 S2 특정 데이터를 사용할 준비가되도록 호출됩니다. 정확한 유효성 검사가 JSP 페이지에서 무엇을하고 싶은지 확실하지 않습니다. –

+1

인터셉터를 통해 유효성 검사를 수행 할 수 있으며 권한 부여를 위해 사용자 정의 인터셉터를 정의 할 수 있습니다. 성능 문제를 일으키는 원인은 무엇이라고 생각하십니까? –

+0

@Umesh Awasthi. 주의 해 주셔서 감사 드리며 더 자세히 설명했습니다. –

답변

1

당신의 관심에만 인증뿐만 아니라 그 부분에 액세스 할 수 있습니다 사용을 허가 있도록하는 것보다, 응용 프로그램의 일부를 확보하는 경우 두 가지 옵션

  1. 인터셉터 기반 인증
  2. 사용자 보안을 사용하여 스프링 보안과 같은 API

인터셉터 기반 인증은 매우 쉽습니다. here은이를 수행하는 방법의 예이지만 실제로는 매우 간단한 경우부터 프로덕션 기반 애플리케이션 및 실생활 애플리케이션에 대해서는 이러한 인증을 권장하지 않습니다.

완벽한 인증 시스템을 찾고 있다면, 스프링 보안을 살펴 보시기 바랍니다. 매우 쉽고 구성 가능합니다. 모든 영역과 보안 태그 및 스프링 보안이 가로 챌 기본 스프링 메커니즘을 알려주는 데 필요한 모든 것 당신의 행동이 소집되기 전에 그것들은 성공하고 행동을 승인하는 것은 봄 안전에 의해 불려질 것입니다.

+0

감사합니다. 나는 아직 봄에 익숙하지 않다. 어떤 식 으로든 당신의 링크를 보았습니다 (고마움). 나는 이미 그러한 방법을 구현했다. 그 대답은 액션 클래스를 사용하여 시연되었다. 내 질문은, 우리가 그러한 액션 클래스를 사용하고 인터셉터로 검증해야하는지, 아니면 액션 클래스없이 그것을 수행 할 수있는 방법이 있는지 여부입니다. 익명/빈 액션 이름을 사용하고 Intercepots ow를 사용하면 무엇을 할 수 있습니까? –

+0

당신은 이것을 위해 어떤 종류의 클래스가 필요하다. 원하는 방식을 내포해야한다면, 스프링 - 보안이나 아파치 시로를 사용하여 좀 더 단순하게 만들 것을 제안한다 .IMO는 인터셉터로 인증하는 것을 권장하지 않는다. 이 모든 예제는 모든 인터셉터를 어디에서 어떻게 사용할 수 있는지 보여주는 유스 케이스 일 뿐이지 만 결코 생산을 위해 권장되지는 않습니다. –

+0

정말 고마워요. –

1

는 //이 권한 부여

package com.kogent.action; 

import java.io.IOException; 
import java.util.List; 
import java.util.regex.Pattern; 

import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.dispatcher.Dispatcher; 
import org.apache.struts2.dispatcher.mapper.ActionMapping; 
import org.apache.struts2.dispatcher.ng.ExecuteOperations; 
import org.apache.struts2.dispatcher.ng.InitOperations; 
import org.apache.struts2.dispatcher.ng.PrepareOperations; 
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig; 
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter; 

public class SessionController extends StrutsPrepareAndExecuteFilter { 
    protected PrepareOperations prepare; 
    protected ExecuteOperations execute; 
    protected List<Pattern> excludedPatterns = null; 

public void init(FilterConfig filterConfig) throws ServletException { 
    InitOperations init = new InitOperations(); 
    try { 
     FilterHostConfig config = new FilterHostConfig(filterConfig); 
     init.initLogging(config); 
     Dispatcher dispatcher = init.initDispatcher(config); 
     init.initStaticContentLoader(config, dispatcher); 

     prepare = new PrepareOperations(filterConfig.getServletContext(), 
       dispatcher); 
     execute = new ExecuteOperations(filterConfig.getServletContext(), 
       dispatcher); 
     this.excludedPatterns = init.buildExcludedPatternsList(dispatcher); 

     postInit(dispatcher, filterConfig); 
    } finally { 
     init.cleanup(); 
    } 

} 

/** 
* Callback for post initialization 
*/ 
protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) { 
} 

public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 

    try { 
     prepare.setEncodingAndLocale(request, response); 
     prepare.createActionContext(request, response); 
     prepare.assignDispatcherToThread(); 
     if (excludedPatterns != null 
       && prepare.isUrlExcluded(request, excludedPatterns)) { 
      chain.doFilter(request, response); 
     } else { 
      request = prepare.wrapRequest(request); 
      ActionMapping mapping = prepare.findActionMapping(request, 
        response, true); 
      if (mapping == null) { 
       boolean handled = execute.executeStaticResourceRequest(
         request, response); 
       if (!handled) { 
        chain.doFilter(request, response); 
       } 
      } else { 
       //here you have to identify the whether the user have access to requested resource or not 
       //allow him if he was access. 
       //if(someCondition) 
       execute.executeAction(request, response, mapping); 
       //else{ 
       //redirect the user how do you want it to be. 
       ActionMapping modfiedActionMapping = new ActionMapping(); 
       modfiedActionMapping.setName("someActionName"); 
       modfiedActionMapping.setNamespace("someNameSpace"); 
       execute.executeAction(request, response, modfiedActionMapping); 

      //} 

      } 
     } 
    } finally { 
     prepare.cleanupRequest(request); 
    } 
} 

public void destroy() { 
    prepare.cleanupDispatcher(); 
} 

}입니다

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>Point to your customized filter</filter-class> 
</filter> 
+0

답변 해 주셔서 감사합니다. 한 가지 : 인터셉터를 사용하고 액션 클래스를 사용하면 어떻게됩니까? 차이점은? 인터셉터가 어떤 필터도 할 수 있기 때문에 .. 나는 S2 초보자입니다. –

+0

StrtusPrepareAndExecuteFilter는 모든 요청이이 필터를 통과하고 요청자가 인터셉터에서 처리 할 수 ​​있지만 프레임 워크 사이에서 요청을 처리 (gc())하기 위해 더 많은 개체를 생성하므로 요청 더 나은 성능을 위해 필터에서 처리되었거나 필터되지 않았습니다. –