ajax 發送請求無法重定向問題


原因:
ajax請求默認就是不支持重定向的,因為它是局部刷新,不重新加載頁面。

解決方案:

開發中需要多處使用重定向的情況下,大多都是在Spring mvc 的攔截器中,或過濾器中使用,此方法是在spring mvc攔截器中實現。
在攔截器中通過獲取session(我的用戶信息是存在session中)判斷用戶的登陸狀態,沒有登陸重定向到登陸頁面。

請求路徑獲取:

1. request.getScheme() 返回當前鏈接使用的協議;
2. request.getServerName() 獲取網站的域名;
3. request.getServerPort() 獲取的服務器的請求端口;

4. request.getContextPath()獲取當前的系統路徑;

后端代碼:


     
     
    
    
            
  1. import java.io.IOException;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.servlet.http.HttpSession;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8. public class LoginInterceptor implements HandlerInterceptor{
  9. private static Logger logger = Logger.getLogger(LoginInterceptor.class);
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  12. throws Exception {
  13. response.setHeader( "Access-Control-Allow-Origin", "http://localhost"); // 允許跨域請求
  14. response.setHeader( "Access-Control-Allow-Credentials", "true");
  15. HttpSession session = request.getSession();
  16. Object userId = session.getAttribute( "userId");
  17. if(userId == null){
  18. logger.info( "用戶未登錄");
  19. requestDirect(request, response);
  20. return false;
  21. } else{
  22. return true;
  23. }
  24. }
  25. @Override
  26. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  27. ModelAndView modelAndView) throws Exception {
  28. }
  29. @Override
  30. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  31. throws Exception {
  32. }
  33. public void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
  34. //獲取當前請求的路徑
  35. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();
  36. //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"說明就是ajax請求
  37. if( "XMLHttpRequest".equals(request.getHeader( "X-Requested-With"))){
  38. //前端需要判斷是否是重定向
  39. response.setHeader( "REDIRECT", "REDIRECT");
  40. //需要重定向的路徑
  41. response.setHeader( "CONTENTPATH", basePath+ "/login.html");
  42. response.setStatus(HttpServletResponse.SC_FORBIDDEN);
  43. } else{
  44. response.sendRedirect(basePath + "/login.html");
  45. }
  46. }
  47. }

前端代碼:

下面的代碼請放在全局的js中 (用於初始化ajax請求,讓它結束之后運行completer后面的函數)


     
     
    
    
            
  1. var jqxhr;
  2. //設置ajax請求完成后運行的函數,
  3. $.ajaxSetup({
  4. complete: function(){
  5. if( "REDIRECT" == jqxhr.getResponseHeader( "REDIRECT")){ //若HEADER中含有REDIRECT說明后端想重定向,
  6. var win = window;
  7. while(win != win.top){
  8. win = win.top;
  9. }
  10. win.location.href = jqxhr.getResponseHeader( "CONTENTPATH"); //將后端重定向的地址取出來,使用win.location.href去實現重定向的要求
  11. }
  12. }
  13. });

$.ajaxSetup()方法的詳解鏈接




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM