我创建了一个过滤器,只要用户没有登陆就不能连接到主界面,但是在doFilter方法中用重定向在前端跳转页面不成功。
原因:由于我的登陆界面是基于ajax请求的,而ajax默认不支持重定向,他只能局部更新,所以我创建的过滤器跳转页面不成功
解决:
方法一
一些请求路径:
1. request.getScheme() 返回当前链接使用的协议;
2. request.getServerName() 获取网站的域名;
3. request.getServerPort() 获取的服务器的请求端口;
4. request.getContextPath()获取当前的系统路径;
第一步、以我创建的LoginFilter为例,将LoginFilter的重定向response.sendRedirect("login.jsp");注释掉,改为一个方法进行判断ajax的跳转,方法如下
private void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取当前请求的路径 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath(); //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求 if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){ //前端需要判断是否是重定向 response.setHeader("SESSIONSTATUS", "TIMEOUT"); response.setHeader("CONTEXTPATH",basePath+"/login.jsp"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); }else{ response.sendRedirect(basePath + "/login.jsp"); } }
第二步、在公共js中添加一段代码
//设置ajax请求完成后运行的函数, $.ajaxSetup( { //设置ajax请求结束后的执行动作 complete : function(XMLHttpRequest, textStatus) { // 通过XMLHttpRequest取得响应头,sessionstatus var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus"); if (sessionstatus == "TIMEOUT") { var win = window; while (win != win.top){ win = win.top; }
win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH"); } } });
最后运行成功。
以上主要参考的博客有:
https://blog.csdn.net/u013997090/article/details/77338508
https://blog.csdn.net/webCows/article/details/78711326
方法二
還有一種思路是判斷是後台判斷ajax請求,可以將它返回到前台,在前台判斷進行重定向window.location.href=xxx。
2020/02/25更新
JSF架構在開發過程中發現還有一種方法可以解決ajax請求不能重定向的問題
在過濾器聲明以下全局變量
private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<partial-response><redirect url=\"%s\"></redirect></partial-response>";
在doFilter方法中實現以下代碼
boolean isAjaxRequest = "partial/ajax".equals(hRequest.getHeader("Faces-Request")); if(isAjaxRequest){//ajax請求的重定向 hResponse.setContentType("text/xml"); hResponse.setCharacterEncoding("UTF-8"); hResponse.getWriter().printf(AJAX_REDIRECT_XML, hRequest.getContextPath() + "/login.jsf"); }else{//其他請求的重定向 hResponse.sendRedirect(hRequest.getContextPath() + "/login.jsf"); }