Rails Google Oauth2 在本地工作但不在远程工作

如何解决Rails Google Oauth2 在本地工作但不在远程工作

我已经为这个错误苦苦挣扎了一段时间,但还没有完全弄清楚我做错了什么。

我的网站可以在这里找到:https://chaynring.com

我的问题:在本地运行服务器时,我可以毫无问题地通过 Google Oauth2 进行身份验证;但是,Google Oauth2 在我的服务器(由 Heroku 托管)上失败,我不知道为什么。

这是我的路线的粘贴箱:https://pastebin.com/S8piCjcw

我在 Heroku 上得到的日志是:

2021-04-20T02:32:40.506069+00:00 heroku[router]: at=info method=GET path="/auth/google_oauth2" host=chaynring.com request_id=055519f9-9246-4966-8b7a-4b3016a7dee6 fwd="142.147.57.249" dyno=web.1 connect=1ms service=7ms status=404 bytes=1966 protocol=https
2021-04-20T02:32:40.500506+00:00 app[web.1]: I,[2021-04-20T02:32:40.500394 #4]  INFO -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] Started GET "/auth/google_oauth2" for 142.147.57.249 at 2021-04-20 02:32:40 +0000
2021-04-20T02:32:40.502460+00:00 app[web.1]: F,[2021-04-20T02:32:40.502396 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6]   
2021-04-20T02:32:40.502560+00:00 app[web.1]: F,[2021-04-20T02:32:40.502498 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] ActionController::RoutingError (No route matches [GET] "/auth/google_oauth2"):
2021-04-20T02:32:40.502652+00:00 app[web.1]: F,[2021-04-20T02:32:40.502585 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6]   
2021-04-20T02:32:40.502766+00:00 app[web.1]: F,[2021-04-20T02:32:40.502692 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/debug_exceptions.rb:65:in `call'
2021-04-20T02:32:40.502768+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
2021-04-20T02:32:40.502769+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:38:in `call_app'
2021-04-20T02:32:40.502770+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:26:in `block in call'
2021-04-20T02:32:40.502771+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:71:in `block in tagged'
2021-04-20T02:32:40.502771+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:28:in `tagged'
2021-04-20T02:32:40.502772+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:71:in `tagged'
2021-04-20T02:32:40.502772+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:26:in `call'
2021-04-20T02:32:40.502773+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
2021-04-20T02:32:40.502773+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/request_id.rb:27:in `call'
2021-04-20T02:32:40.502774+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/method_override.rb:24:in `call'
2021-04-20T02:32:40.502774+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/runtime.rb:22:in `call'
2021-04-20T02:32:40.502775+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
2021-04-20T02:32:40.502775+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/executor.rb:14:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/static.rb:127:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/sendfile.rb:110:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/ssl.rb:74:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/engine.rb:524:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/configuration.rb:227:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:706:in `handle_request'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:476:in `process_client'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:334:in `block in run'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/thread_pool.rb:135:in `block in spawn_thread'

我觉得这与我在应用程序中定义的中间件有关,因为 GET /auth/google_oauth2 路由没有在我的 routes.rb 中明确定义,但它在本地工作得很好。

有关更多上下文,这是我在本地运行时从 rails 服务器获得的输出:

Started GET "/auth/google_oauth2" for ::1 at 2021-04-19 21:40:04 -0500
I,[2021-04-19T21:40:04.244529 #40035]  INFO -- omniauth: (google_oauth2) Request phase initiated.

有人遇到过这个问题吗?

本地路线:

$ rails routes
                          Prefix Verb   URI Pattern                                                                              Controller#Action
                            root GET    /                                                                                        static_pages#index
                           login GET    /login(.:format)                                                                         sessions#new
                                 POST   /login(.:format)                                                                         sessions#create
                          logout DELETE /logout(.:format)                                                                        sessions#destroy
                          signup GET    /signup(.:format)                                                                        users#new
                           about GET    /about(.:format)                                                                         static_pages#about
                            help GET    /help(.:format)                                                                          static_pages#help
                unauthed_exports GET    /unauthed_exports/:sale_export_id(.:format)                                              static_pages#unauthed_export
                    contacts_new GET    /contacts/new(.:format)                                                                  contacts#new
                        contacts POST   /contacts(.:format)                                                                      contacts#create
                                 GET    /auth/:provider/callback(.:format)                                                       sessions#omniauth
                   settings_user GET    /users/:id/settings(.:format)                                                            users#settings
                   comments_user GET    /users/:id/comments(.:format)                                                            users#comments
                      admin_user GET    /users/:id/admin(.:format)                                                               users#admin
                    exports_user GET    /users/:id/exports(.:format)                                                             users#exports
        user_permission_requests GET    /users/:user_id/permission_requests(.:format)                                            permission_requests#index
                                 POST   /users/:user_id/permission_requests(.:format)                                            permission_requests#create
     new_user_permission_request GET    /users/:user_id/permission_requests/new(.:format)                                        permission_requests#new
    edit_user_permission_request GET    /users/:user_id/permission_requests/:id/edit(.:format)                                   permission_requests#edit
         user_permission_request GET    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#show
                                 PATCH  /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 PUT    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 DELETE /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#destroy
                           users GET    /users(.:format)                                                                         users#index
                                 POST   /users(.:format)                                                                         users#create
                        new_user GET    /users/new(.:format)                                                                     users#new
                       edit_user GET    /users/:id/edit(.:format)                                                                users#edit
                            user GET    /users/:id(.:format)                                                                     users#show
                                 PATCH  /users/:id(.:format)                                                                     users#update
                                 PUT    /users/:id(.:format)                                                                     users#update
                                 DELETE /users/:id(.:format)                                                                     users#destroy
                        new_bike GET    /bikes/new(.:format)                                                                     bikes#new
                       all_bikes GET    /bikes(.:format)                                                                         bikes#index
                            bike GET    /bikes/:make/:model/:year(.:format)                                                      bikes#show
                           bikes POST   /bikes(.:format)                                                                         bikes#create
                       edit_bike GET    /bikes/:make/:model/:year/edit(.:format)                                                 bikes#edit
                      patch_bike PATCH  /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 PUT    /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 DELETE /bikes/:make/:model/:year(.:format)                                                      bikes#destroy
                       bike_make GET    /bikes/:make(.:format)                                                                   bikes#make
                 bike_make_model GET    /bikes/:make/:model(.:format)                                                            bikes#make_model
bikes_new_populate_model_options GET    /bikes/bikes/new/populate_model_options(.:format)                                        bikes#populate_model_options
                                 POST   /bikes/:make/:model/:year/sales/pay_for_csv(.:format)                                    charges#checkout
              successful_payment GET    /bikes/:make/:model/:year/sales/successful_payment(.:format)                             bikes#successful_payment
                 new_bike_review GET    /bikes/:make/:model/:year/review(.:format)                                               bike_reviews#new
               final_bike_review GET    /bikes/:make/:model/:year/review/final(.:format)                                         bike_reviews#edit
                                 POST   /bikes/:bike_id/sale_search(.:format)                                                    bikes#sale_search
                                 POST   /bikes/:bike_id/export_search(.:format)                                                  sales#export_search
                      bike_sales GET    /bikes/:make/:model/:year/sales(.:format)                                                sales#index
                   new_bike_sale GET    /bikes/:make/:model/:year/sales/new(.:format)                                            sales#new
                            sale GET    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#show
                           sales POST   /bikes/:make/:model/:year/sales(.:format)                                                sales#create
                       edit_sale GET    /bikes/:make/:model/:year/sales/:sale_id/edit(.:format)                                  sales#edit
                      patch_sale PATCH  /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 PUT    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 DELETE /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#destroy
                    bike_reviews GET    /bikes/bike_reviews(.:format)                                                            bike_reviews#index
                                 POST   /bikes/bike_reviews(.:format)                                                            bike_reviews#create
                     bike_review GET    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#show
                                 PATCH  /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 PUT    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 DELETE /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#destroy
                all_sale_reviews GET    /sales/:sale_id/reviews(.:format)                                                        sale_reviews#index
                 new_sale_review GET    /sales/:sale_id/reviews/new(.:format)                                                    sale_reviews#new
                     sale_review GET    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#show
                    sale_reviews POST   /sales/:sale_id/reviews(.:format)                                                        sale_reviews#create
               final_sale_review GET    /sales/:sale_id/reviews/:sale_review_id/final(.:format)                                  sale_reviews#edit
                                 PATCH  /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 PUT    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 DELETE /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#destroy
              rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
       rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
              rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
       update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
            rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

Heroku 路线:

$ heroku run rails routes
Running rails routes on ⬢ chaynring... up,run.2521 (Hobby)
                          Prefix Verb   URI Pattern                                                                              Controller#Action
                            root GET    /                                                                                        static_pages#index
                           login GET    /login(.:format)                                                                         sessions#new
                                 POST   /login(.:format)                                                                         sessions#create
                          logout DELETE /logout(.:format)                                                                        sessions#destroy
                          signup GET    /signup(.:format)                                                                        users#new
                           about GET    /about(.:format)                                                                         static_pages#about
                            help GET    /help(.:format)                                                                          static_pages#help
                unauthed_exports GET    /unauthed_exports/:sale_export_id(.:format)                                              static_pages#unauthed_export
                    contacts_new GET    /contacts/new(.:format)                                                                  contacts#new
                        contacts POST   /contacts(.:format)                                                                      contacts#create
                                 GET    /auth/:provider/callback(.:format)                                                       sessions#omniauth
                   settings_user GET    /users/:id/settings(.:format)                                                            users#settings
                   comments_user GET    /users/:id/comments(.:format)                                                            users#comments
                      admin_user GET    /users/:id/admin(.:format)                                                               users#admin
                    exports_user GET    /users/:id/exports(.:format)                                                             users#exports
        user_permission_requests GET    /users/:user_id/permission_requests(.:format)                                            permission_requests#index
                                 POST   /users/:user_id/permission_requests(.:format)                                            permission_requests#create
     new_user_permission_request GET    /users/:user_id/permission_requests/new(.:format)                                        permission_requests#new
    edit_user_permission_request GET    /users/:user_id/permission_requests/:id/edit(.:format)                                   permission_requests#edit
         user_permission_request GET    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#show
                                 PATCH  /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 PUT    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 DELETE /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#destroy
                           users GET    /users(.:format)                                                                         users#index
                                 POST   /users(.:format)                                                                         users#create
                        new_user GET    /users/new(.:format)                                                                     users#new
                       edit_user GET    /users/:id/edit(.:format)                                                                users#edit
                            user GET    /users/:id(.:format)                                                                     users#show
                                 PATCH  /users/:id(.:format)                                                                     users#update
                                 PUT    /users/:id(.:format)                                                                     users#update
                                 DELETE /users/:id(.:format)                                                                     users#destroy
                        new_bike GET    /bikes/new(.:format)                                                                     bikes#new
                       all_bikes GET    /bikes(.:format)                                                                         bikes#index
                            bike GET    /bikes/:make/:model/:year(.:format)                                                      bikes#show
                           bikes POST   /bikes(.:format)                                                                         bikes#create
                       edit_bike GET    /bikes/:make/:model/:year/edit(.:format)                                                 bikes#edit
                      patch_bike PATCH  /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 PUT    /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 DELETE /bikes/:make/:model/:year(.:format)                                                      bikes#destroy
                       bike_make GET    /bikes/:make(.:format)                                                                   bikes#make
                 bike_make_model GET    /bikes/:make/:model(.:format)                                                            bikes#make_model
bikes_new_populate_model_options GET    /bikes/bikes/new/populate_model_options(.:format)                                        bikes#populate_model_options
                                 POST   /bikes/:make/:model/:year/sales/pay_for_csv(.:format)                                    charges#checkout
              successful_payment GET    /bikes/:make/:model/:year/sales/successful_payment(.:format)                             bikes#successful_payment
                 new_bike_review GET    /bikes/:make/:model/:year/review(.:format)                                               bike_reviews#new
               final_bike_review GET    /bikes/:make/:model/:year/review/final(.:format)                                         bike_reviews#edit
                                 POST   /bikes/:bike_id/sale_search(.:format)                                                    bikes#sale_search
                                 POST   /bikes/:bike_id/export_search(.:format)                                                  sales#export_search
                      bike_sales GET    /bikes/:make/:model/:year/sales(.:format)                                                sales#index
                   new_bike_sale GET    /bikes/:make/:model/:year/sales/new(.:format)                                            sales#new
                            sale GET    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#show
                           sales POST   /bikes/:make/:model/:year/sales(.:format)                                                sales#create
                       edit_sale GET    /bikes/:make/:model/:year/sales/:sale_id/edit(.:format)                                  sales#edit
                      patch_sale PATCH  /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 PUT    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 DELETE /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#destroy
                    bike_reviews GET    /bikes/bike_reviews(.:format)                                                            bike_reviews#index
                                 POST   /bikes/bike_reviews(.:format)                                                            bike_reviews#create
                     bike_review GET    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#show
                                 PATCH  /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 PUT    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 DELETE /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#destroy
                all_sale_reviews GET    /sales/:sale_id/reviews(.:format)                                                        sale_reviews#index
                 new_sale_review GET    /sales/:sale_id/reviews/new(.:format)                                                    sale_reviews#new
                     sale_review GET    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#show
                    sale_reviews POST   /sales/:sale_id/reviews(.:format)                                                        sale_reviews#create
               final_sale_review GET    /sales/:sale_id/reviews/:sale_review_id/final(.:format)                                  sale_reviews#edit
                                 PATCH  /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 PUT    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 DELETE /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#destroy
              rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
       rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
              rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
       update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
            rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

我的initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  client_id = Rails.application.secrets.GOOGLE_CLIENT_ID
  client_secret = Rails.application.secrets.GOOGLE_CLIENT_SECRET
  provider :google_oauth2,client_id,client_secret
end

5/3 更新

我对我的应用、Google Dev Console 和 Heroku 进行了大量研究,可能遗漏了一些非常明显的内容,但我今天找到了一些可能有用的信息。基本上我注意到当我在本地运行我的应用程序时,我得到:

  • GET /auth/google_oauth2 -> 302,从响应头中的 Location 重定向到 Google OAuth 屏幕

但是当我在生产中尝试这个时,我根本没有得到重定向。本地和远程的代码相同,但配置不同。我所知道的主要问题是 Heroku 和 HTTP(本地)与 HTTPS 有什么奇怪的地方?我还将我的域添加到 Google Dev 控制台,以便对其进行配置。

解决方法

看起来您的路线需要与此模式 /auth/:provider/callback 匹配,但事实并非如此。这是您应该访问的路线 /auth/google_oauth2/callback,而不是 /auth/google_oauth2

,

看起来您对 GET 端点使用了 /auth/:provider 请求。

它存在安全问题。您需要将动词更改为 POST

有关详细信息,请参阅 https://stackoverflow.com/a/65785932/2131983

,

在本地,您使用的是 IPV6 环回 ::1,而在 Heroku 上,它使用的是 ipv4 地址,您是否在本地使用 127.0.0.1 尝试过?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?