javax.faces.application.ViewExpiredException: দেখুনটি পুনরুদ্ধার করা যায়নি


175

আমি ধারক-পরিচালিত সুরক্ষার সাথে সহজ অ্যাপ্লিকেশন লিখেছি। সমস্যাটি হ'ল যখন আমি লগইন করি এবং আমি লগ আউট করি এমন অন্য পৃষ্ঠাটি খুলি, তারপরে আমি প্রথম পৃষ্ঠায় ফিরে আসি এবং আমি কোনও লিঙ্কে ক্লিক করি বা পৃষ্ঠা রিফ্রেশ করি আমি এই ব্যতিক্রমটি পাই। আমার ধারণা এটি স্বাভাবিক (বা সম্ভবত নয় :)) কারণ আমি লগ আউট করেছি এবং সেশনটি নষ্ট হয়ে গেছে। উদাহরণস্বরূপ index.xhtml বা login.xhtml এ ব্যবহারকারীকে পুনর্নির্দেশ করতে এবং সেই ত্রুটি পৃষ্ঠা / বার্তাটি থেকে তাকে বাঁচাতে আমার কী করা উচিত?

অন্য কথায় আমি লগ আউট করার পরে কীভাবে আমি অন্যান্য পৃষ্ঠাগুলি সূচী / লগইন পৃষ্ঠায় স্বয়ংক্রিয়ভাবে পুনঃনির্দেশ করতে পারি?

এটা এখানে:

javax.faces.application.ViewExpiredException: viewId:/index.xhtml - View /index.xhtml could not be restored.
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:212)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at filter.HttpHttpsFilter.doFilter(HttpHttpsFilter.java:66)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
    at java.lang.Thread.run(Thread.java:619)

উত্তর:


353

ভূমিকা

ViewExpiredExceptionযখনই ফেলে দেওয়া হবে javax.faces.STATE_SAVING_METHODসেট করা হয় server(ডিফল্ট) এবং enduser মাধ্যমে একটি দৃশ্য উপর একটি HTTP POST রিকোয়েস্ট পাঠায় <h:form>সঙ্গে <h:commandLink>, <h:commandButton>বা <f:ajax>, যখন যুক্ত দৃশ্য রাষ্ট্র আর সেশনে পাওয়া যায় না।

দৃশ্য রাষ্ট্র একটি লুকানো ইনপুট ফিল্ড মান হিসাবে চিহ্নিত করা হয় javax.faces.ViewStateএর <h:form>। রাজ্য সংরক্ষণের পদ্ধতিতে সেট করা থাকলে serverএটিতে কেবলমাত্র দর্শন রাষ্ট্র আইডি রয়েছে যা অধিবেশনটিতে সিরিয়ালযুক্ত দর্শন অবস্থার উল্লেখ করে। সুতরাং, যখন কোনও কারণে সেশনটির মেয়াদ শেষ হয়ে যায় (হয় সার্ভার বা ক্লায়েন্ট পক্ষের সময়সীমা শেষ হয়ে যায়, বা ব্রাউজারে কোনও কারণে সেশন কুকিটি আর রক্ষণ করা হয় না, বা HttpSession#invalidate()সার্ভারে কল করে অথবা সেশন কুকিজ সহ কোনও সার্ভার নির্দিষ্ট বাগের কারণে) ওয়াইল্ডফ্লাইয়ে পরিচিত ), এরপরে সিরিয়ালযুক্ত ভিউ স্টেটটি অধিবেশনটিতে আর উপলভ্য নয় এবং এন্ডুয়েসার তার ব্যতিক্রম পাবে। অধিবেশনটির কার্যকারিতা বুঝতে, সার্লেটগুলি কীভাবে কাজ করে তা দেখুন? ইনস্ট্যান্টেশন, সেশনস, ভাগ করা ভেরিয়েবল এবং মাল্টিথ্রেডিং

জেএসএফ অধিবেশনটিতে যে পরিমাণ ভিউ সঞ্চয় করবে তার একটি সীমাও রয়েছে। যখন সীমাটি আঘাত করা হবে, তখন সর্বনিম্ন ব্যবহৃত ব্যবহৃত দর্শনটির মেয়াদ শেষ হয়ে যাবে। Com.sun.faces.numberOfViewsInSession বনাম com.sun.faces.numberOfLogicalViews এও দেখুন ।

রাজ্য সংরক্ষণের পদ্ধতিতে সেট করা থাকলে client, javax.faces.ViewStateলুকানো ইনপুট ক্ষেত্রটির পরিবর্তে পুরো সিরিয়ালযুক্ত দৃশ্যের রাজ্য থাকে, সুতরাং ViewExpiredExceptionসেশনটির মেয়াদ শেষ হওয়ার সাথে সাথে শেষকর্তা কোনওটি পাবেন না । তবে এটি এখনও একটি ক্লাস্টারের পরিবেশে ঘটতে পারে ("ERROR: MAC যাচাই করেন নি" লক্ষণাত্মক) এবং / অথবা যখন ক্লায়েন্ট সাইড স্টেটে কোনও বাস্তবায়ন-নির্দিষ্ট সময়সীমা আছে এবং / অথবা সার্ভার পুনরায় আরম্ভের সময় AES কী পুনরায় উত্পন্ন করে এছাড়াও, ক্লাস্টারযুক্ত পরিবেশে ভিউ এক্সপায়ারডেক্সপশন প্রাপ্তি দেখুন রাষ্ট্রীয় সংরক্ষণের পদ্ধতিটি ক্লায়েন্টে সেট করা আছে এবং ব্যবহারকারী সেশন কীভাবে এটি সমাধান করবেন তা বৈধ

সমাধান নির্বিশেষে, আপনি ব্যবহার না করছেন তা নিশ্চিত করুন enableRestoreView11Compatibility। এটি মোটামুটি আসল দেখার স্থিতি পুনরুদ্ধার করে না। এটি স্ক্র্যাচ থেকে মূলত ভিউ এবং সমস্ত সম্পর্কিত ভিউ স্কোপ করা মটরশুটি পুনরায় তৈরি করে এবং এর ফলে সমস্ত মূল ডেটা (রাষ্ট্র) হারাতে পারে। অ্যাপ্লিকেশনটি একটি বিভ্রান্তিমূলক আচরণ করবে ("আরে, আমার ইনপুট মানগুলি কোথায় .. ??"), এটি ব্যবহারকারীর অভিজ্ঞতার পক্ষে খুব খারাপ। স্টেটলেস দর্শনগুলি বা এর <o:enableRestorableView>পরিবর্তে আরও ভাল ব্যবহার করুন যাতে আপনি এটিকে সমস্ত দৃশ্যের পরিবর্তে একটি নির্দিষ্ট দৃশ্যে পরিচালনা করতে পারেন।

হিসেবে কেন JSF এই উত্তর দেখার রাষ্ট্র, মাথা রক্ষা করতে হবে: কেন JSF সার্ভারে UI উপাদান রাজ্যের সংরক্ষণ?

পৃষ্ঠা নেভিগেশনে ভিউ এক্সপায়ারড এক্সেক্সশন এড়ানো

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

javax.faces.ViewStateক্যাশে পৃষ্ঠার গোপন ক্ষেত্র একটি দৃশ্য রাষ্ট্র আইডি মান যা বর্তমান সেশনে আর বৈধ নয় থাকতে পারে। যদি আপনি পৃষ্ঠা-থেকে-পৃষ্ঠা নেভিগেশনের জন্য জিইটি (নিয়মিত লিঙ্ক / বোতাম) এর পরিবর্তে পোষ্ট (কমান্ড লিঙ্ক / বোতাম) ব্যবহার করেন (আবদুর), এবং ক্যাশেড পৃষ্ঠায় এই জাতীয় কমান্ড লিঙ্ক / বোতামটি ক্লিক করেন, তবে এটি পরিবর্তিত হবে সাথে ব্যর্থ a ViewExpiredException

JSF 2.0 লগ আউটের পরে একটি পুনঃচালনা আগুন, হয় যোগ <redirect />করার <navigation-case>(যদি থাকে) প্রশ্ন, বা যোগ ?faces-redirect=trueকরার outcomeমান।

<h:commandButton value="Logout" action="logout?faces-redirect=true" />

অথবা

public String logout() {
    // ...
    return "index?faces-redirect=true";
}

গতিশীল জেএসএফ পৃষ্ঠাগুলি ক্যাশে না করার জন্য ব্রাউজারকে নির্দেশ দেওয়ার জন্য, Filterসার্ভলেটের নামের উপর ম্যাপ করা একটি তৈরি করুন FacesServletএবং ব্রাউজারের ক্যাশে অক্ষম করতে প্রয়োজনীয় প্রতিক্রিয়া শিরোনাম যুক্ত করুন। যেমন

@WebFilter(servletNames={"Faces Servlet"}) // Must match <servlet-name> of your FacesServlet.
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    // ...
}

পৃষ্ঠা রিফ্রেশ এ ভিউ এক্সপায়ার্ডএক্সেপশন এড়ানো

ViewExpiredExceptionরাষ্ট্রীয় সংরক্ষণটি সেট করা থাকলে বর্তমান পৃষ্ঠাটি রিফ্রেশ করার সময় এড়াতে serverআপনার কেবল জিইটি (নিয়মিত লিঙ্ক / বোতাম) দ্বারা পৃষ্ঠায় প্রতিটি পৃষ্ঠায় ন্যাভিগেশন করছেন তা নিশ্চিত করতে হবে না, তবে আপনাকে এটিও নিশ্চিত করতে হবে আপনি ফরম জমা দেওয়ার জন্য একচেটিয়াভাবে এজ্যাক্স ব্যবহার করছেন। আপনি যদি যেকোন উপায়ে সিঙ্ক্রোনালি (অজ-অজ্যাক্স) ফর্মটি জমা দিচ্ছেন, তবে আপনি অবশ্যই ভিউটি স্টেটলেস করতে (পরে বিভাগটি দেখুন), বা পোস্টের পরে পুনঃনির্দেশ প্রেরণ করতে (আগের বিভাগটি দেখুন)।

একটি হচ্ছে ViewExpiredExceptionপৃষ্ঠাতে রিফ্রেশ ডিফল্ট কনফিগারেশন একটি খুব বিরল ক্ষেত্রে দেখা যায়। এটি তখনই ঘটতে পারে যখন সেশনে জেএসএফ যে পরিমাণ ভিউ সঞ্চয় করবে তার সীমাটি আঘাত হানবে। সুতরাং, এটি তখনই ঘটবে যখন আপনি ম্যানুয়ালি সেই সীমাটি খুব নীচে সেট করেছেন বা আপনি "পটভূমিতে" অবিচ্ছিন্নভাবে নতুন মতামত তৈরি করছেন (যেমন একই পৃষ্ঠায় খারাপভাবে প্রয়োগ করা এজাক্স পোল দ্বারা বা একটি খারাপভাবে প্রয়োগ করা 404 দ্বারা) একই পৃষ্ঠার ভাঙা চিত্রগুলিতে ত্রুটি পৃষ্ঠা)। সেই সীমা সম্পর্কে বিস্তারিত জানার জন্য com.sun.faces.numberOfViewsInSession বনাম com.sun.faces.numberOfLogicalViews দেখুন । রানটাইম শ্রেণিপথের সদৃশ জেএসএফ লাইব্রেরিগুলির একে অপরের বিরোধপূর্ণ কারণের আরেকটি কারণ রয়েছে। জেএসএফ ইনস্টল করার সঠিক পদ্ধতিটি আমাদের জেএসএফ উইকি পৃষ্ঠায় বর্ণিত হয়েছে ।

ভিউ এক্সপায়ার্ডএক্সসেপশন হ্যান্ডলিং

আপনি একটি অনিবার্য হ্যান্ডেল চান, তখন ViewExpiredExceptionএকটি অবাধ পৃষ্ঠা যা ইতিমধ্যে কিছু ব্রাউজার ট্যাব / উইন্ডো খোলা ছিল যখন আপনি অন্য ট্যাব / উইন্ডো মধ্যে লগ আউট করছি একটি পোস্টে কর্ম পর, তাহলে আপনি একটি নির্দিষ্ট করতে চাই error-pageজন্য যে web.xmlযা যায় "আপনার সেশনটির সময়সীমা শেষ" পৃষ্ঠাতে। যেমন

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/WEB-INF/errorpages/expired.xhtml</location>
</error-page>

আপনি যদি হোম বা লগইন পৃষ্ঠায় প্রকৃতপক্ষে পুনর্নির্দেশ করতে চান তবে ত্রুটি পৃষ্ঠায় একটি মেটা রিফ্রেশ শিরোনাম প্রয়োজন হলে ব্যবহার করুন ।

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Session expired</title>
        <meta http-equiv="refresh" content="0;url=#{request.contextPath}/login.xhtml" />
    </head>
    <body>
        <h1>Session expired</h1>
        <h3>You will be redirected to login page</h3>
        <p><a href="#{request.contextPath}/login.xhtml">Click here if redirect didn't work or when you're impatient</a>.</p>
    </body>
</html>

( 0ইন- এ contentপুনঃনির্দেশের আগে সেকেন্ডের পরিমাণ উপস্থাপন করে, এর 0অর্থ "তাত্ক্ষণিকত পুনর্নির্দেশ", আপনি 3ব্রাউজারটিকে পুনঃনির্দেশের সাথে 3 সেকেন্ড অপেক্ষা করতে দিতে ব্যবহার করতে পারেন )

নোট করুন যে এজাক্স অনুরোধের সময় ব্যতিক্রমগুলি পরিচালনা করার জন্য একটি বিশেষ প্রয়োজন ExceptionHandler। আরও দেখুন সেশন সময়সীমার এবং JSF / PrimeFaces Ajax অনুরোধ ViewExpiredException হ্যান্ডলিং । আপনি ওমনিফ্রেস FullAjaxExceptionHandlerশোকেস পৃষ্ঠায় একটি সরাসরি উদাহরণ খুঁজে পেতে পারেন (এটি অ-এজাক্স অনুরোধগুলিও অন্তর্ভুক্ত করে)।

এছাড়াও মনে রাখবেন যে আপনার "সাধারণ" ত্রুটি পৃষ্ঠাতে ম্যাপ দিতে হবে <error-code>এর 500একটি পরিবর্তে <exception-type>যেমন এর java.lang.Exceptionবা java.lang.Throwable, অন্যথায় সব ব্যতিক্রম আবৃত ServletExceptionযেমন ViewExpiredExceptionএখনও সাধারণ ত্রুটি পৃষ্ঠা থেকে আপ শেষ হয়ে যাবে। আরও দেখুন ViewExpiredException web.xml মধ্যে java.lang.Throwable ত্রুটি পৃষ্ঠার দেখানো

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/errorpages/general.xhtml</location>
</error-page>

রাষ্ট্রহীন দর্শন

একটি সম্পূর্ণ ভিন্ন বিকল্প হল স্টেটলেস মোডে জেএসএফ ভিউগুলি চালানো। এইভাবে জেএসএফ রাষ্ট্রের কিছুই সংরক্ষণ করা হবে না এবং দর্শনগুলি কখনই শেষ হবে না, তবে প্রতিটি অনুরোধে স্ক্র্যাচ থেকে পুনরায় তৈরি করা হবে। আপনি সেট করে আড়ম্বরহীন মতামত চালু করতে পারেন transientএর অ্যাট্রিবিউট <f:view>করতে true:

<f:view transient="true">

</f:view>

এইভাবে javax.faces.ViewStateলুকানো ক্ষেত্রটি "stateless"মোজারায়ার একটি স্থির মান পাবে (এই মুহুর্তে মাইফিসগুলি পরীক্ষা করে দেখেনি)। নোট করুন যে এই বৈশিষ্ট্যটি মোজারা ২.১.১৯ এবং ২.২.০ এ প্রবর্তিত হয়েছিল এবং এটি পুরানো সংস্করণগুলিতে উপলভ্য নয়।

ফলাফলটি হ'ল আপনি আর স্কোপ করা মটরশুটি দেখতে পারবেন না। তারা এখন অনুরোধ বিছানো শিমের মতো আচরণ করবে। এর অসুবিধাগুলির মধ্যে একটি হ'ল লুকানো ইনপুট এবং / অথবা আলগা অনুরোধের পরামিতিগুলির সাহায্যে আপনাকে নিজেরাই রাষ্ট্রটি ট্র্যাক করতে হবে। প্রধানত সঙ্গে ইনপুট ক্ষেত্রে যাদের ফর্ম rendered, readonlyবা disabledবৈশিষ্ট্যাবলী যা Ajax ঘটনা দ্বারা নিয়ন্ত্রিত হয় প্রভাবিত হবে।

নোট করুন যে <f:view>অগত্যা দেখার জন্য এবং / অথবা কেবলমাত্র মাস্টার টেম্পলেটে থাকা অনন্য হওয়ার দরকার নেই। এটি কোনও টেমপ্লেট ক্লায়েন্টে পুনরায় ঘোষনা ও বাসা বেঁধে ফেলার জন্য সম্পূর্ণ বৈধ legit এটি মূলত <f:view>তখন পিতামাতাকে "প্রসারিত" করে । মাস্টার টেমপ্লেটে যেমন:

<f:view contentType="text/html">
    <ui:insert name="content" />
</f:view>

এবং টেমপ্লেট ক্লায়েন্টে:

<ui:define name="content">
    <f:view transient="true">
        <h:form>...</h:form>
    </f:view>
</f:view>

এমনকি আপনি মোড়ানো পারেন <f:view>একটি <c:if>এটা শর্তসাপেক্ষ করা। মনে রাখবেন যে এটি কেবলমাত্র নেস্টেড বিষয়বস্তুগুলিতেই নয়, যেমন উপরের উদাহরণের মতো পুরো ভিউতে প্রযোজ্য <h:form>

আরো দেখুন


অসম্পর্কিত কংক্রিট সমস্যা, বিশুদ্ধ পৃষ্ঠা টু পৃষ্ঠা নেভিগেশনের জন্য HTTP- র পোষ্ট ব্যবহার করে খুব ব্যবহারকারী / এসই উপযোগী নয়। জেএসএফ ২.০-তে আপনার প্লেইন ভ্যানিলা পৃষ্ঠা-থেকে-পৃষ্ঠা নেভিগেশনের জন্য সত্যিই পছন্দ <h:link>বা <h:button>বেশী পছন্দ করা উচিত <h:commandXxx>

সুতরাং পরিবর্তে যেমন

<h:form id="menu">
    <h:commandLink value="Foo" action="foo?faces-redirect=true" />
    <h:commandLink value="Bar" action="bar?faces-redirect=true" />
    <h:commandLink value="Baz" action="baz?faces-redirect=true" />
</h:form>

ভাল কর

<h:link value="Foo" outcome="foo" />
<h:link value="Bar" outcome="bar" />
<h:link value="Baz" outcome="baz" />

আরো দেখুন


জাভা j এ অন্তর্ভুক্ত নেভিগেশন সহ আমি এটি কীভাবে করতে পারি? আমি ফেস-কনফিগার ব্যবহার করি না।
l245c4l

1
ওহ, আপনি জেএসএফ 2.0 ব্যবহার করছেন? আপনার প্রশ্নে এটি উল্লেখ করা উচিত ছিল! যোগ ?faces-redirect=trueকরুন outcome। আমি সেই অনুযায়ী উত্তর আপডেট করেছি।
BalusC

হ্যাঁ আমি কেবল জাভা ই :) দিয়ে শুরু করেছি এবং আমি আমার সমস্ত নেভিগেশনে মুখের পুনঃনির্দেশ = সত্য ব্যবহার করছি। আমি h: কমান্ডলিঙ্কটি কেবল তখনই ব্যবহার করি যখন আমি এর সাথে ক্রিয়া করি। উদাহরণস্বরূপ লগআউট লিঙ্ক ... আমার অ্যাকশন স্ট্রিং লগআউট রয়েছে () যেখানে আমি সেশনটি বাতিল করে এবং লগইনকে পুনর্নির্দেশ করি, তবে যেখানে আমি লগইন করেছি এবং এই মুহুর্তে লগ আউট হয়েছি এবং সেই ব্যতিক্রমটি ছুঁড়েছে তা এটি কার্যকর করে না :(
l245c4l

1
আবারও ধন্যবাদ এবং এর জন্য দুঃখিত :) তবে কমপক্ষে আমি কম সময়েই দ্রুত এবং পেশাদার উত্তর পেয়েছি: p
l245c4l

1
@ এলএস: ফিল্টারটি এখনও মামলার জন্য বাধ্যতামূলক, যখনই কেউ মেয়াদোত্তীর্ণ পোষ্টের পরে পিছনের বোতামটি টিপায় এবং এটিতে অন্য একটি পোষ্ট অনুরোধ করার জন্য চেষ্টা করে। এটি অন্যথায় অনিচ্ছাকৃতভাবে এই ব্যতিক্রম ঘটায়।
বালাসসি

56

আপনি কি নীচে লাইন যুক্ত করার চেষ্টা করেছেন web.xml?

<context-param>
   <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
   <param-value>true</param-value>
</context-param>

আমি যখন এই সমস্যার মুখোমুখি হয়েছি তখন এটি অত্যন্ত কার্যকর বলে মনে হয়েছিল।


1
এটা খুবই আমার জন্য কাজ করেন. উত্তর করার জন্য ধন্যবাদ. এটার উদ্দেশ্য কি?
মার্টকে

2
ঠিক মনে পড়বেন না, তবে আমি এই সমাধানটি আইসিইএফেরিক্স ওয়েবসাইটে পেয়েছি।
মাইক জিএইচ

আমি পার্টিতে কিছুটা দেরি করতে পারি, তবে এটি আমার পক্ষেও কাজ করে। ধন্যবাদ!
স্টেলারোসা

4
এটি কি কেবল জেএসএফ 1.2 বা জেএসএফ 2 এর জন্যও সংজ্ঞায়িত করা হয়েছে?
SRY

17
দৃশ্যটির মেয়াদ শেষ হয়ে গেলে এটি ব্যতিক্রম ছুঁড়ে দেওয়া বন্ধ করে দেবে এবং অনুরোধটি কেবল চালিয়ে যাবে, তবে জেএসএফ এখনও দেখার স্থিতি পুনরুদ্ধার করতে পারবে না বা কোনও সম্পর্কিত ভিউ স্কোপড শিমের সন্ধান করতে পারবে না। এই লেনদেনটি স্টেটলেস জেএসএফের মতো আচরণ করবে এবং "ডাব্লুটিএফএফ" এড়াতে আপনাকে পোষ্ট অনুরোধের প্যারামিটারের ভিত্তিতে নিজেকে ভিউ স্টেটটি পুনরুদ্ধার করতে হবে? ফর্মটি প্রক্রিয়াকরণ করার সময় অন্তরীক্ষক দ্বারা অভিজ্ঞতা অপ্রত্যাশিতভাবে প্রতিক্রিয়া জানায়। আপনি যদি কেবল নির্দিষ্ট জেএসএফ পৃষ্ঠাগুলিতে এটি প্রয়োগ করতে চান তবে <o:enableRestorableView>অ্যাপ্লিকেশন প্রশস্ত প্রসঙ্গের প্যারামিটারের পরিবর্তে ওমনিফিস ব্যবহার করুন ।
বালুসসি

5

ওয়েব.এক্সএমএল পরিবর্তন করার আগে আপনাকে যা করতে হবে তা হ'ল আপনার ম্যানেজডবিয়ানটি নিশ্চিত করা implements Serializable:

@ManagedBean
@ViewScoped
public class Login implements Serializable {
}

বিশেষত যদি আপনি মাইফিস ব্যবহার করেন


3

রিচফেসে মাল্টিপার্ট ফর্মগুলি এড়িয়ে চলুন:

<h:form enctype="multipart/form-data">
    <a4j:poll id="poll" interval="10000"/>
</h:form>

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

কীভাবে ডিবাগ করবেন:

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


জরিপগুলির সাথে খেলার সময় সাবধানতা অবলম্বন করুন, এটি আপনার ব্যবহারকারীদের সেশনগুলির মেয়াদ শেষ হতে বাধা দিতে পারে ..
জনাথন সিমাস

0

আপনি নিজের কাস্টম অ্যাজাক্স এক্সসেপশনহ্যান্ডলার বা প্রাইমফেস-এক্সটেনশনগুলি ব্যবহার করতে চেয়েছিলেন

আপনার ফেস-কনফিগার.এক্সএমএল আপডেট করুন

...
<factory>
  <exception-handler-factory>org.primefaces.extensions.component.ajaxerrorhandler.AjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
...

আপনার জেএসএফ পৃষ্ঠায় নিম্নলিখিত কোড যুক্ত করুন

...
<pe:ajaxErrorHandler />
...

0

আমি এই ত্রুটিটি পেয়ে যাচ্ছিলাম: javax.faces.application.ViewE ExpiredException.When আমি বিভিন্ন অনুরোধগুলি ব্যবহার করার পরে, সার্ভারটি পুনরায় চালু করার পরেও আমি তাদের একই জেসিওনআইডিযুক্ত পেয়েছি। সুতরাং এটি ব্রাউজারের ক্যাশের কারণে। কেবল ব্রাউজারটি বন্ধ করুন এবং চেষ্টা করুন, এটি কার্যকর হবে।


0

যখন আমাদের পৃষ্ঠাটি এক্স পরিমাণের জন্য নিষ্ক্রিয় থাকে তখন দৃশ্যটি মেয়াদ শেষ হয়ে যায় এবং জাভ্যাক্স.ফেসগুলি প্রয়োগ করে lic মাতা

import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

public class CustomViewHandler extends ViewHandler {
    private ViewHandler parent;

    public CustomViewHandler(ViewHandler parent) {
        //System.out.println("CustomViewHandler.CustomViewHandler():Parent View Handler:"+parent.getClass());
        this.parent = parent;
    }

    @Override 
    public UIViewRoot restoreView(FacesContext facesContext, String viewId) {
    /**
     * {@link javax.faces.application.ViewExpiredException}. This happens only  when we try to logout from timed out pages.
     */
        UIViewRoot root = null;
        root = parent.restoreView(facesContext, viewId);
        if(root == null) {
            root = createView(facesContext, viewId);
        }
        return root;
    }

    @Override
    public Locale calculateLocale(FacesContext facesContext) {
        return parent.calculateLocale(facesContext);
    }

    @Override
    public String calculateRenderKitId(FacesContext facesContext) {
        String renderKitId = parent.calculateRenderKitId(facesContext);
        //System.out.println("CustomViewHandler.calculateRenderKitId():RenderKitId: "+renderKitId);
        return renderKitId;
    }

    @Override
    public UIViewRoot createView(FacesContext facesContext, String viewId) {
        return parent.createView(facesContext, viewId);
    }

    @Override
    public String getActionURL(FacesContext facesContext, String actionId) {
        return parent.getActionURL(facesContext, actionId);
    }

    @Override
    public String getResourceURL(FacesContext facesContext, String resId) {
        return parent.getResourceURL(facesContext, resId);
    }

    @Override
    public void renderView(FacesContext facesContext, UIViewRoot viewId) throws IOException, FacesException {
        parent.renderView(facesContext, viewId);
    }

    @Override
    public void writeState(FacesContext facesContext) throws IOException {
        parent.writeState(facesContext);
    }

    public ViewHandler getParent() {
        return parent;
    }

}   

তারপরে আপনাকে এটি আপনার ফেস-কনফিগ.এক্সএমএলে যুক্ত করতে হবে

<application>
    <view-handler>com.demo.CustomViewHandler</view-handler>
</application>

নীচের লিঙ্কটিতে মূল উত্তরের জন্য ধন্যবাদ: http://www.gregbugaj.com/?p=164


এই পদ্ধতিটি স্কোপ করা মটরশুটিটি পুনরুদ্ধার করে না।
বালাসসি

-2

আপনার ওয়েব.এক্সএমএল এই লাইন যোগ করুন এটি আমার জন্য কাজ করে

<context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name> 
        <param-value>true</param-value>     
    </context-param>

4
আপনার উত্তরটি আরও কার্যকর হবে যদি আপনি কোডটি কী করছে সে সম্পর্কে ব্যাখ্যা এবং প্রসঙ্গ অন্তর্ভুক্ত করে।
পালপাতিম

1
এটি সঠিক উত্তর হলেও স্ট্যাকওভারফ্লো কোনও ব্যাখ্যা ছাড়াই উত্তরগুলিকে হতাশ করে। সম্প্রদায়টি কেন এটি কাজ করে তা সম্পর্কে আরও তথ্য যুক্ত করতে সহায়ক হবে।
রেসারনার্ড

-2

আমি নিজেই এই সমস্যার মধ্যে পড়েছিলাম এবং বুঝতে পেরেছিলাম যে এটি আমার তৈরি ফিল্টারের পার্শ্ব-প্রতিক্রিয়ার কারণে যা প্রশংসার সমস্ত অনুরোধগুলি ফিল্টার করে। কেবলমাত্র কিছু নির্দিষ্ট অনুরোধ বাছাই করার জন্য আমি ফিল্টারটি পরিবর্তন করার সাথে সাথে এই সমস্যাটি ঘটেনি। আপনার অ্যাপ্লিকেশনটিতে এই ধরনের ফিল্টারগুলি পরীক্ষা করা এবং তারা কীভাবে আচরণ করে তা দেখতে ভালই হবে।


-3

আমি ওয়েব.এক্সএমএলে নিম্নলিখিত কনফিগারেশন যুক্ত করেছি এবং এটি সমাধান হয়ে গেছে।

<context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>500</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.numberOfLogicalViews</param-name>
    <param-value>500</param-value>
</context-param>

6
ভয়ানক পরামর্শ। আপনার যখন প্রচুর পরিমাণে মেমরি থাকে এবং আপনার ব্যবহারকারীদের কাছে নিয়মিতভাবে প্রায় 500 টি ব্রাউজার ট্যাব থাকে এবং পূর্ববর্তী সিঙ্ক্রোনাস পোস্টব্যাকগুলিতে 500 বার পর্যন্ত ব্রাউজারের পিছনের বোতামটি টিপুন তবেই এটি করুন।
বালাসসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.