স্প্রিং এমভিসিতে বর্তমান ইউআরএল পাওয়ার সর্বোত্তম উপায় কী?


98

সক্রিয় অনুরোধের জন্য ক্লায়েন্টের ব্যবহৃত URL এর ভিত্তিতে আমি URL তৈরি করতে চাই। বর্তমান HttpServletRequestঅবজেক্টটি গ্রহণের চেয়ে স্মার্ট কিছু আছে এবং এটি getParameter...()সম্পূর্ণরূপে ইউআরএলটি পুনর্নির্মাণের পদ্ধতিগুলি (এবং কেবল) এটি জিইটি প্যারামিটার সহ রয়েছে।

স্পষ্টতা: সম্ভব হলে আমি কোনও HttpServletRequestবস্তু ব্যবহার থেকে পদত্যাগ করতে চাই ।

উত্তর:


112

ওয়েল এই ডেটা সহজেই অ্যাক্সেস করার জন্য দুটি পদ্ধতি রয়েছে তবে ইন্টারফেসটি একটি কল দিয়ে পুরো ইউআরএল পাওয়ার সম্ভাবনা দেয় না। আপনাকে এটি ম্যানুয়ালি বানাতে হবে:

public static String makeUrl(HttpServletRequest request)
{
    return request.getRequestURL().toString() + "?" + request.getQueryString();
}

আমি কোনও স্প্রিং এমভিসি সুবিধা দিয়ে এটি করার উপায় সম্পর্কে জানি না।

আপনি যদি সর্বত্র এই অনুরোধটি সর্বত্র পাস না করে অ্যাক্সেস করতে চান তবে আপনাকে ওয়েব.এক্সএমএলএ একটি শ্রোতা যুক্ত করতে হবে:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

এবং তারপরে অনুরোধটিকে বর্তমান থ্রেডের সাথে আবদ্ধ করতে এটি ব্যবহার করুন:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()

ঠিক আছে, আমি এখন পর্যন্ত যা করেছি এটির অনুরূপ পন্থা। তবে আমি HttpServletRequestবস্তুটি আসলে ব্যবহার না করে এটি করার একটি উপায় অনুসন্ধান করছি । এটি কারণ আমি বেশ কয়েকটি সহায়ক ক্লাস / পদ্ধতি ব্যবহার করছি এবং আমি প্রতিবার অনুরোধের বস্তুটি পাস করতে চাই না।
Koraktor

ঠিক আছে, আপনি কী বলতে চাইছেন তা আমি জানি এবং বর্তমান অনুরোধটি প্রায় অতিক্রম না করে আপনার প্রয়োজনীয় তথ্য যুক্ত করেছেন।
ড্যাফ

শ্রোতা সম্পর্কে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ। আমি এখনও বসন্তে নতুন (এবং সাধারণভাবে জাভা ওয়েব বিকাশ)। আমি এখন আপনার কোডটি স্প্রিং সিকিউরিটির সাথে সম্মিলিতভাবে ব্যবহার করছি UrlUtils। একটি যাদুমন্ত্র মত কাজ করে.
Koraktor

আমার ক্ষেত্রে এটি ব্রাউজ url এর পরিবর্তে সম্পর্কিত দৃশ্যের পথ দেয়। এ সম্পর্কে কোন ধারণা?
মোঃ শওগত হোসেন

এইচটিটিপি সার্ভেলকুইয়েস্ট ব্যবহার না করে ... উদাহরণস্বরূপ স্প্রিং বুট কন্ট্রোলার পদ্ধতিগুলিতে আমরা এটি প্যারামিটার হিসাবে পাই না ... তারপরে স্থির কলটির অন্য উত্তরটি দেখতে ভাল সার্ভলেটউরি কম্পোনেন্টস বিল্ডার.ফ্রোম কর্নারআরকুয়েস্ট () টুউরিস্ট্রিং ()
এমএসঞ্জয়

78

RequestContextHolderসরাসরি ব্যবহারের পরিবর্তে , আপনি ServletUriComponentsBuilderএবং এর স্থির পদ্ধতিগুলিও ব্যবহার করতে পারেন :

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

এগুলি RequestContextHolderহুডের নীচে ব্যবহার করে তবে এর সক্ষমতা ব্যবহার করে নতুন ইউআরএল তৈরি করতে অতিরিক্ত নমনীয়তা সরবরাহ করে UriComponentsBuilder

উদাহরণ:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();

@ m4rtin আমি আমার নিজের প্রশ্নের উত্তর দিয়েছি এবং যিনি প্রাথমিকভাবে আমাকে আমার সমস্যা সমাধানে সহায়তা করেছিলেন তার কৃতিত্ব নিতে চাইনি।
Koraktor

4
এছাড়াও ভাল স্প্রিং 5. আমি একটি ভিতরে URL টি পেতে পরিচালিত থাকেন ConstraintValidatorসঙ্গে ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
গুইটারের

17

জাভা এর ইউআরআই ক্লাস এ থেকে আপনাকে সহায়তা করতে পারে:

public static String getCurrentUrl(HttpServletRequest request){
    URL url = new URL(request.getRequestURL().toString());
    String host  = url.getHost();
    String userInfo = url.getUserInfo();
    String scheme = url.getProtocol();
    String port = url.getPort();
    String path = request.getAttribute("javax.servlet.forward.request_uri");
    String query = request.getAttribute("javax.servlet.forward.query_string");

    URI uri = new URI(scheme,userInfo,host,port,path,query,null)
    return uri.toString();
}

এটির দেওয়া হোস্টনামটি কেবল
ভিভেক্স


3

আপনি UriComponentsBuilderনিজের নিয়ন্ত্রক পদ্ধতির পদ্ধতির স্বাক্ষরে একটি যুক্ত করতে পারেন । স্প্রিং বর্তমান অনুরোধ থেকে তৈরি বিল্ডারের একটি উদাহরণ ইনজেক্ট করবে।

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

বিল্ডারটি ব্যবহার করে আপনি বর্তমান অনুরোধের ভিত্তিতে সরাসরি ইউআরআই তৈরি শুরু করতে পারেন যেমন পাথ বিভাগগুলি সংশোধন করুন।

এছাড়াও ইউরি কমপোয়েন্টস বিল্ডারমেথডআর্গমেন্ট রিসোলভার দেখুন


নোট করুন যে ইনজেকশনে UriComponentsBuilderঅনুরোধের পথ এবং ক্যোয়ারী প্যারামিটারগুলি অন্তর্ভুক্ত নয়। আপনার যদি সেগুলির অ্যাক্সেসের প্রয়োজন হয় তবে যে কোনও ServletUriComponentsBuilder.fromCurrentRequest()উদাহরণ ব্যবহার এবং ইনজেক্ট করুন HttpServletRequestএবং ব্যবহার করুনServletUriComponentsBuilder.fromRequest(request)
মার্টিন ডেভিলার্স

-1

আপনার যদি হোস্টনাম না হওয়া পর্যন্ত ইউআরএল প্রয়োজন হয় এবং পাথটি অ্যাপাচি এর কমন লিব ব্যবহার করে না StringUtil, এবং ইউআরএল থেকে তৃতীয় সূচকঅফ পর্যন্ত স্ট্রিংগুলি বের করুন /

public static String getURL(HttpServletRequest request){
   String fullURL = request.getRequestURL().toString();
   return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); 
}

উদাহরণ: যদি পুরো URL থাকে https://example.com/path/after/url/তবে আউটপুট হবে https://example.com

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