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

緣由:
ajax請求默認就是不支持重定向的,由於它是局部刷新,不從新加載頁面。

解決方案:

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

請求路徑獲取:

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

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

後端代碼:

    
    
    
    
  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()方法的詳解連接
相關文章
相關標籤/搜索