0

Dojo アップローダーを使用しています。HTML5プラグインに関しては問題なく動作します。しかし、強制的に Flash プラグインを使用すると、次のメッセージで失敗します。

「サーバーが応答しませんでした」

サーバー側のSpringセキュリティはこれをスローしています:

    Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
22:33:06,375 DEBUG ty.web.access.ExceptionTranslationFilter - Access is denied (user is anonymous); redirecting to authentication entry point
org.springframework.security.access.AccessDeniedException: Access is denied
    at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:83)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:205)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:114)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.traceNextValve(HttpRequestOperationCollectionValve.java:116)
    at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:98)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Flash プラグインにセッション ID がありませんか?

ここに私のjsコードがあります:

forma = new Form({
            method: 'post',
            enctype: 'multipart/form-data',
            'class': 'Uploader',
            action: dojo.config.app.urlBase + 'upload/cargaArchivos'
        }, 'cargaForm');

        btnCargar = new Button({
            type: 'submit',
            label: 'Cargar'
        }, 'submitCarga');  

        btnReset = new Button({
            type: 'reset',
            label: 'Limpiar',
            onClick: function(){
                // limpiamos el array de archivos agregados
                uploader.reset();
                console.log(uploader.getFileList());
            }
        }, 'resetForm');

        uploader = new dojox.form.Uploader({
            id: 'uploader',
            name: 'uploadedfile',
            showInput: 'before',
            isDebug: true,
            url: dojo.config.app.urlBase + 'upload/cargaArchivos',
            multiple: true,
            force: 'flash',
            onComplete: function(respuesta){
                // Aqui se puede hacer algo con el objeto de respuesta que se devuelve.
                console.log(respuesta);
            },
            onChange: function(archivos){
                // Aquí se podrían listar los archivos en alguna tabla. 
                console.log(archivos);
            }
        }, 'uploader');
        uploader.startup();     
    }

注: 'new dojox.form.Uploader' のようなアップローダを作成しています。既知のバグを回避しているためです。次を参照してください:プログラムによる Dojox アップローダ - ajax アップロードが機能しない

更新、廃止されたと言われている FileUploader coz を使用していませんが、 Uploader.upload() メソッドも formData オブジェクトを受け取ります。

まず、クッキーを読み取ろうとしています。他のリクエストのヘッダーを確認する:

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language es-mx,en-us;q=0.7,en;q=0.3
Connection  keep-alive
Content-Type    application/x-www-form-urlencoded
**Cookie    undefined=root; undefined=6%2C6%2F4; JSESSIONID=9F0E7745730639A3D0989C5D379A74FB**
Host    localhost:8080
Referer http://localhost:8080/sep-sajja-web/
User-Agent  Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1
X-Requested-With    XMLHttpRequest

したがって、Cookie 名は JSESSIONID です。でもやってみると

dojo.cookie('JSESSIONID');

未定義を返します...私は試し続けます。

プレーンな JavaScript:

document.cookie.split(";")

1 つの Cookie を返すだけです: ["undefined=6%2C6%2F4"]

おそらく許可の問題ですか?

更新...はい、そのように見えます-> JavaScriptでJSESSIONIDを読み取るにはどうすればよいですか?

4

1 に答える 1

2

これは、Flash プラグインを介してデータがサーバーに送信される方法のサンプルです。

http://livedocs.dojotoolkit.org/dojox/form/FileUploader#server-side

投稿で Cookie が送信される (呼び出しウィンドウから継承される) かどうかに関する情報を見つけることができませんでした。

new dojox.form.Uploader( {
    // ... your configurations
    postData: {
      sessionid: dojo.cookie('JSPCOOKIENAME_UNKNOWN_TO_ME')
});

お気づきかもしれませんが、springframework は私には馴染みがありませんが、トークンに基づいて認証を作成する方法を簡単に検索すると、次の類似点を探していると思います。少なくとも、検索するクラスの流行語がいくつかあります

    Authentication authentication = this.authenticationProvider.authenticate(token);
    SecurityContextHolder.getContext().setAuthentication(authentication);

ログインを有効にしている場合、トークンは次の方法で取得できると思います

UsernamePasswordAuthenticationToken token = 
  new UsernamePasswordAuthenticationToken(username, password);
User details = new User(username);
token.setDetails(details);

サーブレットでどの認証プロバイダが使用されているかを知る必要があります。情報は webapp の web.xml にあります。<filters>

于 2012-07-26T15:04:10.130 に答える