এইচটিটিপি সার্ভেলকুইয়েস্টে getRequestURI এবং getPathInfo পদ্ধতির মধ্যে পার্থক্য কী?


143

আমি একটি সাধারণ, খুব লাইটওয়েট ফ্রন্ট-কন্ট্রোলার তৈরি করছি। সঠিকটি চয়ন করতে আমার বিভিন্ন হ্যান্ডলারের (ক্রিয়া) সাথে অনুরোধের পাথগুলি মেলানো দরকার।

আমার স্থানীয় মেশিনে HttpServletRequest.getPathInfo()এবং HttpServletRequest.getRequestURI()একই ফলাফলগুলি ফেরত দিন। তবে আমি নিশ্চিত না যে তারা উত্পাদন পরিবেশে কী ফিরবে।

সুতরাং, এই পদ্ধতির মধ্যে পার্থক্য কী এবং আমার কী নির্বাচন করা উচিত?


1
আপনি এই উত্তরটি দরকারী হিসাবেও পেতে পারেন ।
বালাসসি

@ বালুসসি: ধন্যবাদ, আমি ইতিমধ্যে উত্তরটি থেকে কিছু টিপস ব্যবহার করছি।
রোমান

এটি একটি সুন্দর চিত্রের সাথে পার্থক্যটি ব্যাখ্যা করেছে: agiletribe.wordpress.com/2016/02/23/…
AgilePro

উত্তর:


77

getPathInfo()আপনার সার্লেলে অ্যাক্সেস করতে ব্যবহৃত ইউআরআই-এর পরে অতিরিক্ত পথের তথ্য getRequestURI()দেয় , যেখানে সম্পূর্ণ ইউআরআই দেয়।

আমি ভেবেছিলাম তারা আলাদা হবে, একটি সার্লেটকে প্রথমে তার নিজস্ব ইউআরআই প্যাটার্ন দিয়ে কনফিগার করা উচিত; আমি মনে করি না যে আমি কখনও রুট (/) থেকে কোনও সার্লেট পরিবেশন করেছি।

উদাহরণস্বরূপ, যদি সার্ভলেট 'ফু' ইউআরআই / ফুতে ম্যাপ করা থাকে তবে আমি ইউআরআই ভাবতাম:

/foo/path/to/resource

ফলাফল হবে:

RequestURI = /foo/path/to/resource

এবং

PathInfo = /path/to/resource

20
ডিকোডিং আচরণ সম্পর্কে উল্লেখযোগ্য getRequestURI () স্ট্রিংটি ডিকোড করে না। যেখানে getPathInfo () ডিকোড করে।
কাবিন্দু দোদানডুয়া

1
কিছু ক্ষেত্রে getRequestURI()আমাকে "/foo/path/to/resource"প্রত্যাশা মতো স্ট্রিং দেয় তবে getPathInfo()একই HttpServletRequestবস্তুর জন্য আমাকে দেয় null। বিশ্বে কি হচ্ছে? সম্পাদনা: এটি "30 তম" ব্যবহারকারী দ্বারা নীচে উত্তর দেওয়া হয়েছে।
অ্যান্ডেরো

460

আমি এখানে একটি ছোট তুলনা টেবিল রাখব (কেবল এটি কোথাও রাখার জন্য):

সার্লেলেট হিসাবে ম্যাপ করা হয় /test%3F/*এবং অ্যাপ্লিকেশন এর অধীনে স্থাপন করা হয় /app

http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a

Method              URL-Decoded Result           
----------------------------------------------------
getContextPath()        no      /app
getLocalAddr()                  127.0.0.1
getLocalName()                  30thh.loc
getLocalPort()                  8480
getMethod()                     GET
getPathInfo()           yes     /a?+b
getProtocol()                   HTTP/1.1
getQueryString()        no      p+1=c+d&p+2=e+f
getRequestedSessionId() no      S%3F+ID
getRequestURI()         no      /app/test%3F/a%3F+b;jsessionid=S+ID
getRequestURL()         no      http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID
getScheme()                     http
getServerName()                 30thh.loc
getServerPort()                 8480
getServletPath()        yes     /test?
getParameterNames()     yes     [p 2, p 1]
getParameter("p 1")     yes     c d

উপরের উদাহরণে সার্ভারটি চলছে localhost:8480এবং নামটি 30thh.locওএস hostsফাইলে রাখা হয়েছে।

মন্তব্য

  • "+" কেবল ক্যোরি স্ট্রিংয়ে স্থান হিসাবে পরিচালনা করা হয়

  • অ্যাঙ্কর "# এ" সার্ভারে স্থানান্তরিত হয় না। এটি কেবলমাত্র ব্রাউজারই কাজ করতে পারে।

  • তাহলে url-patternসার্ভলেট ম্যাপিং দিয়ে শেষ হয় না *(উদাহরণস্বরূপ /testবা *.jsp), getPathInfo()আয় null

যদি স্প্রিং এমভিসি ব্যবহার করা হয়

  • পদ্ধতি getPathInfo()ফিরে আসে null

  • পদ্ধতিটি getServletPath()প্রসঙ্গের পথ এবং সেশন আইডির মধ্যবর্তী অংশটি দেয়। উপরের উদাহরণে মানটি হবে/test?/a?+b

  • স্প্রিং এর @RequestMappingএবং ইউআরএল এনকোড করা অংশগুলির সাথে সতর্ক থাকুন @RequestParam। এটি বগি (বর্তমান সংস্করণ 3.2.4) এবং সাধারণত প্রত্যাশার মতো কাজ করে না


20
আমি আপনার উত্তরটি মুদ্রণ করছি এবং এটি আমাদের অফিসে পোস্টার হিসাবে রাখছি। এটি কতটা কার্যকর!
ইব্রাহিম সংক্ষিপ্ত

2
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.উজ্জ্বল।
বরিস ট্রুখভ

1
আমি উভয়কেই বিশ্বাস করি getRequestURI()এবং getRequestURL()এক্ষেত্রে নন-ডিকোডড জেসিওনিডকে ফিরিয়ে আনতে হবে S%3F+ID। কমপক্ষে এটি টমকেট / 8.5.6 এ করে।
গেদিমিনাস রিমসা

29

আসুন পুরো ইউআরএলটি ভেঙে দিন যা কোনও ক্লায়েন্ট তাদের সার্ভিলে পৌঁছানোর জন্য তাদের ঠিকানা বারে টাইপ করবে:

http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo

অংশগুলি হ'ল:

  1. পরিকল্পনা: http
  2. আয়োজক নাম: www.example.com
  3. পোর্ট: 80
  4. প্রসঙ্গের পথ: awesome-application
  5. সার্লেলেট পাথ: path/to/servlet
  6. পথের তথ্য: path/info
  7. প্রশ্ন: a=1&b=2
  8. টুকরা: boo

অনুরোধটি ইউআরআই ( getRequestURI দ্বারা ফিরে এসেছে) ) অংশ 4, 5 এবং 6 এর সাথে সম্পর্কিত।

(ঘটনাক্রমে, আপনি এর জন্য জিজ্ঞাসা না করলেও, পদ্ধতিটি রিক্যুয়েস্টআরএল আপনাকে অংশ 1, 2, 3, 4, 5 এবং 6 সরবরাহ করবে)।

এখন:

  • অংশ 4 (প্রসঙ্গের পথ) সার্ভারে চলমান অন্যান্য অনেক অ্যাপ্লিকেশনগুলির মধ্যে আপনার নির্দিষ্ট অ্যাপ্লিকেশনটি নির্বাচন করতে ব্যবহৃত হয়
  • পার্ট 5 (সার্লেট পাথ) আপনার অ্যাপ্লিকেশনটির ওয়ারে বান্ডিল করা হতে পারে এমন আরও অনেক সার্লেটগুলির মধ্যে একটি নির্দিষ্ট সার্লেট নির্বাচন করতে ব্যবহৃত হয়
  • অংশ 6 (পথের তথ্য) আপনার সার্লেটের যুক্তি দ্বারা ব্যাখ্যা করা হয়েছে (উদাঃ এটি আপনার সার্লেট দ্বারা নিয়ন্ত্রিত কিছু সংস্থানকে নির্দেশ করতে পারে)।
  • অংশ 7 (ক্যোয়ারী) আপনার সার্লেটলে getQueryString ব্যবহার করে উপলব্ধ করা হয়েছে
  • অংশ 8 (টুকরা) এমনকি সার্ভারে প্রেরণ করা হয়নি এবং এটি কেবল ক্লায়েন্টের কাছে প্রাসঙ্গিক এবং পরিচিত

নিম্নলিখিতগুলি সর্বদা ধারণ করে (ইউআরএল এনকোডিং পার্থক্য বাদে):

requestURI = contextPath + servletPath + pathInfo

সার্ভলেট 3.0 নির্দিষ্টকরণের নিম্নলিখিত উদাহরণটি খুব সহায়ক:


দ্রষ্টব্য: চিত্রটি অনুসরণ করে, আমার এইচটিএমএলটিতে পুনরায় তৈরি করার সময় নেই:

এখানে চিত্র বর্ণনা লিখুন


16

নিম্নলিখিত servlet কনফটি বিবেচনা করুন:

   <servlet>
        <servlet-name>NewServlet</servlet-name>
        <servlet-class>NewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewServlet</servlet-name>
        <url-pattern>/NewServlet/*</url-pattern>
    </servlet-mapping>

এখন, আমি যখন ইউআরএল হিট করব তখন http://localhost:8084/JSPTemp1/NewServlet/jhiএটি NewServletউপরে বর্ণিত প্যাটার্নটির সাথে ম্যাপ করার সাথে সাথে অনুরোধ করবে।

এখানে:

getRequestURI() =  /JSPTemp1/NewServlet/jhi
getPathInfo() = /jhi

আমাদের সেইগুলি রয়েছে:

  • getPathInfo()

    ফেরৎ
    একটি স্ট্রিং,, ওয়েব ধারক দ্বারা সঙ্কেতমুক্ত অতিরিক্ত পথ যে তথ্য সার্ভলেট পথ পরে কিন্তু অনুরোধ URL- এ কোয়েরি স্ট্রিং সামনে আসে উল্লেখ; বা ইউআরএলটির কোনও অতিরিক্ত পথের তথ্য না থাকলে শূন্য

  • getRequestURI()


    প্রোটোকলের নাম থেকে ক্যোরি স্ট্রিং পর্যন্ত URL এর অংশযুক্ত একটি স্ট্রিং প্রদান করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.