ভূমিকা
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" />
আরো দেখুন