Pengalihan Keizinan pada Tamat Tempoh Sesi dalam Penyerahan Borang JSF
Masalah:
Dalam JSF aplikasi, FacesServlet tersuai telah dilaksanakan untuk melakukan semakan kebenaran dan mengubah hala pengguna ke halaman log masuk jika tidak dilog masuk. Ini berfungsi seperti yang dijangkakan semasa navigasi halaman, tetapi apabila borang JSF diserahkan, ubah hala gagal dan pengguna kekal pada halaman yang sama.
Punca:
Isu timbul kerana pautan/butang arahan JSF mencetuskan permintaan Ajax, yang menjangkakan respons XML. Walau bagaimanapun, kaedah sendRedirect() menghantar halaman HTML biasa yang tidak dapat ditafsirkan oleh enjin Ajax. Akibatnya, ubah hala tidak dilakukan dan halaman kekal tidak berubah.
Penyelesaian:
1. Gunakan Penapis Servlet:
Daripada menggunakan servlet tersuai, penapis servlet harus digunakan untuk semakan kebenaran. Ini adalah pendekatan yang disyorkan kerana ia lebih disesuaikan dengan tugas.
2. Kendalikan Permintaan Ajax Secara Berbeza:
Dalam penapis, kendalikan permintaan Ajax secara berasingan. Daripada menghantar ubah hala, hantar respons XML khas yang mengarahkan enjin JSF Ajax untuk melakukan ubah hala.
Contoh Penapis:
<code class="java">import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class AuthorizationFilter implements Filter { private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<partial-response><redirect url=\"%s\"></redirect></partial-response>"; @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String loginURL = request.getContextPath() + "/login.xhtml"; boolean loggedIn = (session != null) && (session.getAttribute("user") != null); boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request")); if (loggedIn || ajaxRequest) { chain.doFilter(request, response); } else if (ajaxRequest) { response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); } else { response.sendRedirect(loginURL); } } }</code>
Dengan mengikuti langkah ini , fungsi ubah hala keizinan boleh dilaksanakan dengan betul untuk navigasi halaman dan penyerahan borang JSF.
Atas ialah kandungan terperinci Mengapa Pengalihan Keizinan Gagal pada Penyerahan Borang JSF Apabila Menggunakan FacesServlet Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!