URL টি সম্পূর্ণ করার জন্য HttpServletRequest


247

আমার একটা HttpServletRequestজিনিস আছে

আমি কীভাবে সম্পূর্ণ এবং সঠিক URL পেতে পারি যার ফলে এই কলটি আমার সার্লেলে পৌঁছেছে?

বা কমপক্ষে যথাযথভাবে যথাসম্ভব যথাযথভাবে, কারণ সম্ভবত এমন কিছু জিনিস রয়েছে যা পুনঃজাত করা যায় (প্যারামিটারগুলির ক্রম, সম্ভবত)।



কেন আমরা এটির জন্য
কোনও ব্যবহারের

উত্তর:


392

HttpServletRequestনিম্নলিখিত পদ্ধতিগুলির আছে:

  • getRequestURL() - ক্যোয়ারিং স্ট্রিং বিভাজক চরিত্রের আগে সম্পূর্ণ URL- এর অংশটি প্রদান করে ?
  • getQueryString() - ক্যোয়ারিং স্ট্রিং বিভাজক চরিত্রের পরে পুরো URL- এর অংশটি প্রদান করে ?

সুতরাং, সম্পূর্ণ ইউআরএল পেতে, কেবল এটি করুন:

public static String getFullURL(HttpServletRequest request) {
    StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString());
    String queryString = request.getQueryString();

    if (queryString == null) {
        return requestURL.toString();
    } else {
        return requestURL.append('?').append(queryString).toString();
    }
}

3
আপনি getRequestURI (ভুল) থেকে বিবরণটি অনুলিপি করেছেন তবে কোডটিতে (ডানদিকে) getRequestURL ব্যবহার করুন।
ভিঙ্কো ভার্সালভিক

21
আপনার শর্ত অনুসারে জিজ্ঞাসা করা উচিত যে ক্যোয়ারীর স্ট্রিংটি খালি রয়েছে।
অ্যাডাম জেন্ট

8
আপনি অনুরোধ ইউআরএলকে সমর্থন করে স্ট্রিংবাফারকেও পরিবর্তন করছেন। যদি অনুরোধ বাস্তবায়ন কোনও ডিফেন্সিভ অনুলিপি তৈরি না করে যা এটির অন্যরকম কোডগুলিতে অদ্ভুত আচরণ এবং বাগগুলি এটির মূল রূপে প্রত্যাশা করার খুব ভাল উপায়।
কেন ব্লেয়ার

5
স্ট্রিংবুফারের পরিবর্তে স্ট্রিংবিল্ডার ব্যবহার করুন
গ্ল্যাডউইন বুর্বুজ

17
@ কেনব্লেয়ার: একটি স্ট্রিংবফার উদ্দেশ্য অনুসারে ফিরে আসবে, যাতে আপনি সহজেই আরও স্ট্যাশ যুক্ত করতে পারেন। যেহেতু এটি জাভাডকে নির্দিষ্ট করা হয়েছে, প্রত্যাশা করা স্ট্রিংবাফার কলার দ্বারা পরিবর্তিত হবে না এমন প্রত্যাশা করা বাস্তবায়নটি চূড়ান্তভাবে অযৌক্তিক হবে - সুতরাং, এটি দুর্দান্ত।
স্টলভিক

145

আমি এই পদ্ধতিটি ব্যবহার করি:

public static String getURL(HttpServletRequest req) {

    String scheme = req.getScheme();             // http
    String serverName = req.getServerName();     // hostname.com
    int serverPort = req.getServerPort();        // 80
    String contextPath = req.getContextPath();   // /mywebapp
    String servletPath = req.getServletPath();   // /servlet/MyServlet
    String pathInfo = req.getPathInfo();         // /a/b;c=123
    String queryString = req.getQueryString();          // d=789

    // Reconstruct original requesting URL
    StringBuilder url = new StringBuilder();
    url.append(scheme).append("://").append(serverName);

    if (serverPort != 80 && serverPort != 443) {
        url.append(":").append(serverPort);
    }

    url.append(contextPath).append(servletPath);

    if (pathInfo != null) {
        url.append(pathInfo);
    }
    if (queryString != null) {
        url.append("?").append(queryString);
    }
    return url.toString();
}

8
এইচটিটিপিএস সার্লেটআরকোয়েস্টে উপলভ্য সমস্ত বিটগুলির দ্রুত রেফারেন্সের জন্য এটি একটি সহায়ক উত্তর। তবে, আমি মনে করি যে আপনি পোর্ট টুকরোটি যোগ করতে হবে কিনা তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে আপনি এই স্কিমটি পরীক্ষা করতে চান। উদাহরণস্বরূপ, "https" 443 হবে।
পিটার কার্ডোনা

2
একটি ছোট্ট অপ্টিমাইজেশন হ'ল স্ট্রিংবুফারের পরিবর্তে একটি স্ট্রিংবিল্ডার ব্যবহার করা, কেবল একটি ইঙ্গিত
ক্রিস

11
কেবলমাত্র একটি মন্তব্য: থ্রেড সুরক্ষা এই নির্দিষ্ট উদাহরণে কোনও সমস্যা নয় কারণ urlএটি ঘোষিত, তাত্ক্ষণিকভাবে এবং কেবলমাত্র পদ্ধতির অভ্যন্তরে ব্যবহৃত হয়, সুতরাং এটি পদ্ধতির নাম বাদে থ্রেড থেকে অ্যাক্সেস করা যায় না।
ডায়োগো কলোরাস

1
উল্লিখিত হিসাবে, থ্রেড সুরক্ষা এখানে কোনও সমস্যা নয় কারণ আপনি StringBufferপ্রতিটি কলের জন্য নিজের উদাহরণ তৈরি করছেন এবং এটি অন্য কোনও থ্রেডের সাথে ভাগ করছেন না। এটি একটি হতে হবে StringBuilder
ধুসর

1
কোন কারণ ব্যবহার না করা getRequestURI?
ক্রিস্টোফ রাউসি

27
// http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789

public static String getUrl(HttpServletRequest req) {
    String reqUrl = req.getRequestURL().toString();
    String queryString = req.getQueryString();   // d=789
    if (queryString != null) {
        reqUrl += "?"+queryString;
    }
    return reqUrl;
}

5
আপনি এর সুবিধা উপেক্ষা করছেন StringBuffer
বালাসসি

হ্যাঁ. আমি এটি গ্রহণ করি তবে এটি অনুমান করে কেবল দুটি অতিরিক্ত জিনিস।
তেজা কান্তমনেেনি

9
এটি একটি অতিরিক্ত অবজেক্ট (একটি স্ট্রিংবিল্ডার) এবং ফিরে আসা অন্তর্নিহিত স্ট্রিংবফারকে রূপান্তরিত করে না। আমি আসলে এটি "গৃহীত" উত্তরের চেয়ে পছন্দ করব, জেভিএম নির্বিশেষে পার্থক্যটিকে অনুকূল করে তুলবে এবং এতে বাগগুলি প্রবর্তনের ঝুঁকি নেই।
কেন ব্লেয়ার

(অনুরোধ.getRequestURL ()। toString () + ((অনুরোধ.getQueryString ()! নাল))? ("?" + অনুরোধ.getQueryString ()): ""))
অ্যালেক্স


6

HttpUtil অবচিত করা হচ্ছে, এটি সঠিক পদ্ধতি

StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
    url.append('?');
    url.append(queryString);
}
String requestURL = url.toString();

5

এর ফলাফলগুলির সমন্বয় getRequestURL()এবং getQueryString()আপনার পছন্দসই ফলাফলটি পাওয়া উচিত।


পোস্ট সম্পর্কিত প্যারামগুলি কীভাবে পরিচালনা করবেন?
ফ্ল্যাশ

2
@ ফ্ল্যাশ কঠোরভাবে বলতে গেলে, পোস্ট-প্যারামিটারগুলি ইউআরএল এর অংশ নয়, এগুলি অনুরোধের অঙ্গ
জিয়ার্ট

1

আপনি ফিল্টার ব্যবহার করতে পারেন।

@Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest test1=    (HttpServletRequest) arg0;

         test1.getRequestURL()); it gives  http://localhost:8081/applicationName/menu/index.action
         test1.getRequestURI()); it gives applicationName/menu/index.action
         String pathname = test1.getServletPath()); it gives //menu/index.action


        if(pathname.equals("//menu/index.action")){ 
            arg2.doFilter(arg0, arg1); // call to urs servlet or frameowrk managed controller method


            // in resposne 
           HttpServletResponse httpResp = (HttpServletResponse) arg1;
           RequestDispatcher rd = arg0.getRequestDispatcher("another.jsp");     
           rd.forward(arg0, arg1);





    }

donot ভুলবেন লাগাতে <dispatcher>FORWARD</dispatcher>web.xml ফিল্টার ম্যাপিং


রেকর্ডের জন্য ... পরীক্ষা 1.getRequestURI ()); এটি দেয় / অ্যাপ্লিকেশন নাম / মেনু / ইনডেক্স.অ্যাকশন (যেমন এটি শীর্ষস্থানীয় স্ল্যাশ ধারণ করে)
স্টেভকো

1

HttpServletRequest অবজেক্টে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করুন

java.lang.String getRequestURI () -এইচটিপি অনুরোধের প্রথম লাইনে কোয়েরি স্ট্রিং পর্যন্ত প্রোটোকল নাম থেকে এই অনুরোধটির ইউআরএলটির অংশটি পুনরায় তৈরি করে।

java.lang.StringBuffer getRequestURL () -র অনুরোধটি করার জন্য ক্লায়েন্টের ব্যবহৃত ইউআরএলটি পুনরায় সাজায়।

java.lang.String getQueryString () -পথের পরে অনুরোধ URL এ থাকা ক্যোয়ারী স্ট্রিংটি পুনরায় চালু করে।


0

পার্টিতে কিছুটা দেরী, কিন্তু আমি আমার এই অন্তর্ভুক্ত MarkUtils-ওয়েব গ্রন্থাগার মধ্যে WebUtils - Checkstyle-অনুমোদিত এবং JUnit পরীক্ষিত:

import javax.servlet.http.HttpServletRequest;

public class GetRequestUrl{
    /**
     * <p>A faster replacement for {@link HttpServletRequest#getRequestURL()}
     *  (returns a {@link String} instead of a {@link StringBuffer} - and internally uses a {@link StringBuilder})
     *  that also includes the {@linkplain HttpServletRequest#getQueryString() query string}.</p>
     * <p><a href="https://gist.github.com/ziesemer/700376d8da8c60585438"
     *  >https://gist.github.com/ziesemer/700376d8da8c60585438</a></p>
     * @author Mark A. Ziesemer
     *  <a href="http://www.ziesemer.com.">&lt;www.ziesemer.com&gt;</a>
     */
    public String getRequestUrl(final HttpServletRequest req){
        final String scheme = req.getScheme();
        final int port = req.getServerPort();
        final StringBuilder url = new StringBuilder(256);
        url.append(scheme);
        url.append("://");
        url.append(req.getServerName());
        if(!(("http".equals(scheme) && (port == 0 || port == 80))
                || ("https".equals(scheme) && port == 443))){
            url.append(':');
            url.append(port);
        }
        url.append(req.getRequestURI());
        final String qs = req.getQueryString();
        if(qs != null){
            url.append('?');
            url.append(qs);
        }
        final String result = url.toString();
        return result;
    }
}

সম্ভবত এখানে মাদুর বণিকের পেছনে সবচেয়ে দ্রুত এবং সবচেয়ে দৃ .় উত্তর - তবে তার এইচটিটিপি / এইচটিটিপিএস সহ সম্ভাব্য অ-মানক বন্দর কনফিগারেশনের জন্যও অ্যাকাউন্ট নেই।

আরো দেখুন:


0

আপনি একটি টার্নারি সহ একটি সাধারণ একটি লাইনার লিখতে পারেন এবং আপনি যদি স্ট্রিংবুফারের বিল্ডার প্যাটার্নটি থেকে ব্যবহার করেন .getRequestURL():

private String getUrlWithQueryParms(final HttpServletRequest request) { 
    return request.getQueryString() == null ? request.getRequestURL().toString() :
        request.getRequestURL().append("?").append(request.getQueryString()).toString();
}

তবে তা কেবল সিনট্যাকটিক চিনি।

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