DWR에 나타난 A request has been denied as a potential CSRF attack 해결 방법

4254 단어 DWR
DWR을 배울 때는 DWR2를 사용합니다.0.6 버전과 화성 브라우저는 공식적인 Hello World를 만들 때 문서에 따라 다음과 같이 설정합니다.

<servlet>		
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>    
<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

<script type="text/javascript" src="scripts/engine.js"></script>
<script type="text/javascript" src="scripts/util.js"></script>
<script type="text/javascript" src="dwr/interface/service.js"></script>
<script type="text/javascript">
    function firstDwr(){
	  service.sayHello("Tom",function(data){
	      alert(data);
	  });
    }
</script>

런타임 시 다음 오류가 발생했습니다.

2011-7-8 12:42:28 org.directwebremoting.util.CommonsLoggingOutput error
 : A request has been denied as a potential CSRF attack.

Google은 많은 사람들이 이 오류를 겪고 있음을 발견했습니다. 그 중 하나는 다음과 같습니다.
웹 수정.xml 파일, 추가
crossDomainSessionSecurity 초기화 매개 변수
false 구성은 다음과 같습니다.

<servlet>		
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>      
        <param-name>crossDomainSessionSecurity</param-name>      
        <param-value>false</param-value>      
    </init-param>
</servlet>    
<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

corss Domain Session Security 이 설정 옵션은dwr 버전 2.0에서만 사용할 수 있으며 기본값은true입니다. 즉 다른 필드에서 요청을 보내는 것을 금지합니다. corss Domain Session Security는false로 설정하여 다른 영역에서 요청을 할 수 있습니다. 이렇게 하면 안전성에 대한 모험이 있을 수 있습니다.
다시 화호 테스트를 할 때 상기 오류를 보고하지 않았습니다. 컨트롤러는 다음과 같은 정보를 보냈습니다.
2011-7-8 12:57:25 org.directwebremoting.util.CommonsLoggingOutput info
 : Exec: service.sayHello()

그러나 실행 결과가 없습니다. 브라우저에 해당하는 정보가 뜨지 않았습니다.
IE 테스트를 사용할 때 IE 브라우저에 다음과 같은 오류가 표시됩니다.
 :  
 : 980
 : 3
 : 0
URI: http://localhost:8080/DwrTest/jslib/engine.js

설마 도입된 js 파일에 문제가 있는 건 아니겠지. 테스트를 통해 최종적으로 문제가 발견됐어. dwr.jar의 org.directwebremoting 패키지에engine가 이미 존재합니다.js와util.js, 그럼 이 두 파일을 프로젝트에 다시 도입할 필요가 없지 않습니까?그래서 나는engine.js와util.js 이 두 파일과scripts 폴더를 프로젝트에서 삭제하고 jsp의 도입 방식을 다음과 같이 변경합니다.

<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/interface/service.js"></script>

동시에 웹을xml에 추가된crossDomainSessionSecurity 설정 항목 삭제xml은 다음과 같이 변경되었습니다.

<servlet>		
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>    
<servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

그리고 프로그램을 실행해서 정확하게 실행합니다.

좋은 웹페이지 즐겨찾기