JSF 表單提交中會話過期的授權重定向
問題:
在J🎜>問題: 原因: 出現此問題的原因是JSF 命令連結/按鈕觸發了Ajax 請求,該請求需要XML 回應。但是,sendRedirect() 方法會傳送 Ajax 引擎無法解釋的常規 HTML 頁面。因此,不會執行重定向,頁面保持不變。 解決方案: 1.使用Servlet 過濾器: 不應使用自訂Servlet,而應使用Servlet 過濾器進行授權檢查。這是推薦的方法,因為它更適合任務。 2.以不同方式處理 Ajax 請求: 在過濾器中,單獨處理 Ajax 請求。不要發送重定向,而是發送一個特殊的 XML 回應來指示 JSF Ajax 引擎執行重定向。 範例篩選器: 依照下列步驟操作,頁面導覽和 JSF 表單提交都可以正確實現授權重定向功能。 <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>
以上是使用自訂 FacesServlet 時,為什麼 JSF 表單提交的授權重定向失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!