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


186

আমি কীভাবে কোনও আগত servlet অনুরোধ url পরিবর্তন করতে একটি সার্লেট ফিল্টার ব্যবহার করতে পারি

http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

প্রতি

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

?


আপডেট : নীচে বালাসকের পদক্ষেপ অনুসারে, আমি নিম্নলিখিত কোডটি নিয়ে এসেছি:

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

এর web.xmlমতো দেখতে প্রাসঙ্গিক এন্ট্রি :

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

আমি সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড উভয়ই প্রত্যাশিত ফলাফলের সাথে পুনর্নির্দেশের চেষ্টা করেছি। এটি কাজ করেছে, ধন্যবাদ বালুসকে!


সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/2723829/...
BalusC

সার্ভলেট বৈশিষ্ট্যের কোন সংস্করণ আপনি ব্যবহার করছেন? আপনি কীভাবে বিভিন্ন সংস্করণ দিয়ে অনুরোধ পরিবর্তনগুলি ফরওয়ার্ড করবেন।
রোমেন হিপ্পি

পোস্টটি দেখুন এটিতে একটি ফিল্টার রয়েছে যা আপনি যা চান
রোমান হিপ্পি

দয়া করে মনে রাখবেন যে যদি আপনার আসল ইউআরএলগুলিতে প্যারামিটার থাকে, যেমন nm-java.appspot.com/Check_License/Dir_My_app/Dir_ABC/My_Obj_123 ? ** param1 = A & param2 = B ** তবে এই পরামিতিগুলি পরবর্তী সার্লেট / jsp এও পাঠানো হবে। আসল প্যারামিটারগুলি থেকে মুক্তি বা প্রতিস্থাপনের জন্য আমি কোনও উপায় খুঁজে পাই নি (কেবলমাত্র HTTPServletRequestWrapper ব্যবহার করে)। কোন ধারণা? .. আপডেট: মনে হয় যে http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ এই সমস্যাটিকে সম্বোধন করে।
লোপোটুন

ধন্যবাদ আমি ইউআরএল পুনর্লিখন এবং এনক্রিপশনের একটি উদাহরণ অনুসন্ধান করছিলাম।
আদিত্য ইয়াদ

উত্তর:


281
  1. বাস্তবায়ন javax.servlet.Filter
  2. ইন doFilter()পদ্ধতি, ইনকামিং নিক্ষেপ ServletRequestকরতে HttpServletRequest
  3. HttpServletRequest#getRequestURI()পথ দখল করতে ব্যবহার করুন ।
  4. সহজবোধ্য ব্যবহার করুন java.lang.Stringমত পদ্ধতি substring(), split(), concat()ইত্যাদি সুদ অংশ বের করুন এবং নতুন পথ রচনা করতে।
  5. ব্যবহারের পারেন ServletRequest#getRequestDispatcher()এবং তারপর RequestDispatcher#forward()নতুন URL (সার্ভার সাইড পুনর্নির্দেশ, ব্রাউজার এড্রেস বারে প্রতিফলিত নাও) এর অনুরোধ / প্রতিক্রিয়া ফরোয়ার্ড করতে, বা নিক্ষেপ ইনকামিং ServletResponseকরার HttpServletResponseএবং তারপর HttpServletResponse#sendRedirect()প্রতিফলিত নতুন URL- এ প্রতিক্রিয়া (ক্লায়েন্ট সাইড পুনর্নির্দেশ, পুনর্নির্দেশ করতে ব্রাউজার ঠিকানা বার)।
  6. ফিল্টার নিবন্ধন web.xmlএকটি অন url-patternএর /*বা /Check_License/*, প্রসঙ্গ পথ উপর নির্ভর করে, অথবা যদি আপনি সার্ভলেট 3.0 ইতিমধ্যে করছি, ব্যবহার @WebFilterপরিবর্তে জন্য টীকা।

কোডে একটি চেক যোগ করার জন্য যদি URL ভুলবেন না চাহিদা পরিবর্তন করা এবং যদি না হয় তাহলে, শুধুমাত্র কল FilterChain#doFilter(), অন্যথায় এটা একটি অসীম লুপ নিজেই কল হবে।

বিকল্পভাবে আপনি কেবলমাত্র আপনার জন্য সমস্ত কাজ করার জন্য একটি বিদ্যমান তৃতীয় পক্ষের এপিআই ব্যবহার করতে পারেন, যেমন টুকির ইউরালাইরাইটফিল্টার যা আপনি অ্যাপাচি-র সাথে যেমন করবেন তেমনভাবে কনফিগার করা যায় mod_rewrite


1
যে কোনও ডোফিল্টার () নমুনা কোড কোথাও উপরে রয়েছে? ধন্যবাদ।
ফ্র্যাঙ্ক

20
ঠিক কোন পদক্ষেপে আপনি আটকে আছেন? আমার উত্তর প্রায় কোড নিজেই লিখে দেয়। আপনি কি লক্ষ করেছেন যে নীল বর্ণের কোড উল্লেখগুলি জাভাদোকসের লিঙ্কগুলি যা শ্রেণি / পদ্ধতি আচরণের বিস্তারিতভাবে বর্ণনা করে? যে কোনও উপায়ে, আপনি এখানে এবং এখানে ভাল জেএসপি / সার্ভলেট টিউটোরিয়ালগুলি খুঁজে পেতে পারেন , বিশেষত এটি ফিল্টার সম্পর্কে।
বালুসসি

1
আমি অনুমান করি যে এটি সঠিক, তবে ফিল্টার যদি শৃঙ্খলার মধ্যে প্রথম দিকের RequestDispatcher#forward()একটি হয় এবং কার্যকর করা হয়, তবে বাকি ফিল্টারগুলি কার্যকর করা হবে না। সুতরাং, সার্লেলেট হিসাবে এটি করার পরে আর ভাল উপায় হবে না?
lucasvc

2
@ ডাটাকে: ঠিক হয় অর্ডারটিকে নতুন করে সাজান বা <dispatcher>FORWARD</dispatcher>ফিল্টার ম্যাপিংয়ে যুক্ত করুন।
বালুসসি

1
@ জিমজিম ২000: কেবল অর্ডারটিকে পুনরায় সাজান বা <dispatcher>FORWARD</dispatcher>ফিল্টার ম্যাপিংয়ে যুক্ত করুন।
বালাসসি

21

আপনি এই জাতীয় নিয়মের সাথে url পুনর্লিখন ফিল্টার ব্যবহারের জন্য প্রস্তুত ব্যবহার করতে পারেন :

<rule>
  <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
  <to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>

পরীক্ষা করে দেখুন উদাহরণ আরও অনেক কিছু ... উদাহরণের জন্য।


7

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

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String JSF_VIEW_SUFFIX = ".xhtml";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
        //Only process the paths starting with /ui, so as other requests get unprocessed. 
        //You can register the filter itself for /ui/* only, too
        if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                && !requestURI.contains(JSF_VIEW_SUFFIX)) {
            request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                .forward(request,response);
        } else {
            chain.doFilter(httpServletRequest, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

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