প্রসঙ্গের পথ ছাড়াই কীভাবে অনুরোধ ইউআরআই পাবেন?


127

মেথড রিকোয়েস্ট.জিটআরকেস্টুরি () প্রসঙ্গ পাথের সাথে ইউআরআই ফেরত দেয়।

উদাহরণস্বরূপ, যদি একটি অ্যাপ্লিকেশন বেস URL হল http://localhost:8080/myapp/(অর্থাত প্রসঙ্গ পথ myapp ), এবং আমি ফোন request.getRequestURI()জন্য http://localhost:8080/myapp/secure/users, এটা ফিরে আসবে /myapp/secure/users

আমরা কি কেবলমাত্র এই অংশটি পেতে পারি /secure/users, অর্থাৎ প্রসঙ্গের পথ ছাড়াই ইউআরআই পাব ?


উত্তর:


158

যদি আপনি কোনও প্রিফিক্স প্যাটার্নে ম্যাপযুক্ত কোনও সম্মুখ কনটোলার সার্লেটের ভিতরে থাকেন তবে আপনি কেবল এটি ব্যবহার করতে পারেন HttpServletRequest#getPathInfo()

String pathInfo = request.getPathInfo();
// ...

ধরে নিই যে আপনার উদাহরণের মধ্যে থাকা সার্লেটটি ম্যাপ করা আছে /secure, তবে এটি ফিরে আসবে /usersযা একটি সাধারণ ফ্রন্ট কন্ট্রোলার সার্লেটের অভ্যন্তরে একক আগ্রহের তথ্য হবে।

সার্ভলেটটি যদিও প্রত্যয় প্যাটার্নে ম্যাপ করা থাকে (আপনার ইউআরএল উদাহরণগুলি অবশ্য এটি ক্ষেত্রে এটি নির্দেশ করে না), অথবা আপনি যখন আসলে কোনও ফিল্টারের অভ্যন্তরে থাকবেন (যখন ডাকা-করা-চাওয়া সার্ভলেট এখনও প্রয়োজনীয়ভাবে নির্ধারিত হয়নি, তাই getPathInfo()ফিরে আসতে পারে null), তবে আপনার সেরা বেটটি প্রথাগত পাথের দৈর্ঘ্যের উপর ভিত্তি করে সাধারণ Stringপদ্ধতিটি ব্যবহার করে অনুরোধটি ইউআরআই নিজেই বাদ দেওয়া হয় :

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...

এর পরিবর্তে এটি ব্যবহার করার কোনও কারণ আছে getServletPath()? আমি একটি ফিল্টার লিখছি এবং আমি লক্ষ্য করেছি যে getPathInfo()ফিরে আসে null, তবে getServletPath()পথটি মাইনাস প্রসঙ্গে ফিরে আসে (অনুরোধ প্রেরণকারীর কাছে যাওয়ার জন্য উপযুক্ত)।
জেসন সি

@ জেসনসি: জবাব অনুসারে, getPathInfo()ফ্রন্ট কন্ট্রোলার সার্লেটটি যদি একটি উপসর্গের ধরণে ম্যাপ না করা হয় তবে তা বাতিল করে দেয়।
বালুস সি

হ্যাঁ। আমি বলতে চাইছিলাম: গেট সার্ভেলপথের চেয়ে আপনি পেটইনফো পছন্দ করেন এমন কোনও কারণ আছে? অন্যান্য উচ্চতর স্কোর উত্তরগুলি এখানে getServletPath ব্যবহার করে না, যা এটি আমাকে সন্দেহজনক করে তোলে এবং কেন আমি ভাবছি। আমি একটি সার্লেট প্রকল্প পেয়েছি যার মধ্যে আমি কাজ করছি এবং আমি আমার দক্ষতা কিছুটা পালিশ করার চেষ্টা করছি।
জেসন সি

1
@ জেসনসি: আপনার যখন জেএসএফ বা স্প্রিং এমভিসির মতো সার্ভলেট ভিত্তিক এমভিসি ফ্রেমওয়ার্ক ইনস্টল করা থাকে তখন সার্লেলেট পাথ পরিবর্তিত হতে পারে। এটি তখন এমভিসি ফ্রেমওয়ার্কের অভ্যন্তরীণ পথের প্রতিনিধিত্ব করবে (উদাহরণস্বরূপ /foo.xhtmlপরিবর্তে /foo.jsf) এবং আসল অনুরোধ ইউআরআই নয় (এন্ডুয়েসার হিসাবে ব্রাউজারের ঠিকানা বারে দেখতে পাবে)। মূল সার্লেট পথটি এমন ক্ষেত্রে কী সহ অনুরোধের বৈশিষ্ট্য হিসাবে সমাধানযোগ্য RequestDispatcher.FORWARD_SERVLET_PATH। কোনওভাবেই, প্রশ্নটি স্পষ্টভাবে অনুরোধের জন্য ইউআরআই (ব্রাউজারের ঠিকানা বারের মতো) জন্য অনুরোধ করে, সুতরাং উত্তরটি এর উপর ভিত্তি করে।
বালুস সি

74
request.getRequestURI().substring(request.getContextPath().length())

অসাধারণ! এই আমি ঠিক খুঁজছিলাম ছিল।
কারিগর

4
+1 আমি মনে করি যে getPathInfo নাল এবং অন্যান্য বিজোড় হতে পারে এই কারণে এটি getPathInfo এর চেয়ে ভাল উত্তর। বিভিন্ন স্প্রিং কোড getContextPath করে এবং এটি ইউআরআই থেকে সরিয়ে দেয় যেমন আপনি getPathInfo এর পরিবর্তে করেছেন।
অ্যাডাম জেন্ট

32

বসন্তের সাথে আপনি এটি করতে পারেন:

String path = new UrlPathHelper().getPathWithinApplication(request);

1
অবশ্যই এটি urlPathHelper এর উদাহরণ যেমন ক্লাস সদস্যের পরিবর্তনশীল হিসাবে রাখা ...
জেমস

আমরা কীভাবে বাস্তব অনুরোধ ম্যাপিং ইউআরএল পেতে পারি? : এখান গাইড দয়া করে stackoverflow.com/questions/60446807/...
Pra_A

14

getPathInfo () কখনও কখনও নাল ফেরায়। ডকুমেন্টেশনে HttpServletRequest

কোনও অতিরিক্ত পথের তথ্য না থাকলে এই পদ্ধতিটি শূন্য হয়।

ফিল্টারে প্রসঙ্গের পথ ছাড়াই ফাইলের জন্য আমার পাথ দরকার এবং getPathInfo () আমাকে শূন্য করুন return সুতরাং আমি অন্য পদ্ধতিটি ব্যবহার করি: httpRequest.getServletPath ()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    String newPath = parsePathToFile(httpRequest.getServletPath());
    ...

}

8

আপনি যদি কোনও ফিল্টারটির ভিতরে অনুরোধ.গেটপথআইনফো () ব্যবহার করেন তবে আপনি সর্বদা শূন্য (কমপক্ষে জেটি দিয়ে) পেয়ে যাবেন বলে মনে হয়।

এই ক্ষতিকারক অবৈধ বাগ + প্রতিক্রিয়াটি আমি মনে করি যে ইস্যুটিতে ইঙ্গিত দেয়:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

আমার সন্দেহ হয় এটি সার্ভারলেট অনুরোধটি পাওয়ার আগেই ফিল্টারগুলি চলার সাথে সম্পর্কিত suspect এটি একটি ধারক বাগ বা প্রত্যাশিত আচরণ হতে পারে যা আমি সনাক্ত করতে সক্ষম হইনি।

কনটেক্সটপথটি উপলভ্য, সুতরাং fforws সমাধান ফিল্টারগুলিতেও কাজ করে। আমি এটি হাতে হাতে করা পছন্দ করি না তবে বাস্তবায়নটি ভেঙে গেছে বা


5

এটি করার একটি উপায় হ'ল অনুরোধ ইউআরআই থেকে সার্লেলেট প্রসঙ্গের পথটিকে বিশ্রাম দেওয়া।

String p = request.getRequestURI();
String cp = getServletContext().getContextPath();

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}

এখানে পড়ুন ।


-1

আপনি কেবল '/ মাইএপ' অপসারণের জন্য বিভক্ত পদ্ধতিটি ব্যবহার করতে পারেন:

string[] uris=request.getRequestURI().split("/");
string uri="/"+uri[1]+"/"+uris[2];

3
যদি আমি আমার অ্যাপ্লিকেশনটিকে মূল হিসাবে স্থাপন করি এবং এর বেস ইউআরএল লোকালহোস্ট: 8080 হয়ে যায় তবে এটি সমস্যার সৃষ্টি করবে । এই ক্ষেত্রে অনুরোধ .getRequestURI () "/ নিরাপদ / ব্যবহারকারী" ফিরবে এবং আপনার বিভক্ত পদ্ধতিটি এখানে সমস্যা তৈরি করবে। কোড মোতায়েনের উপর নির্ভর করে না।
কারিগর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.