【Java】JavaWeb 登錄檢查及界面跳轉


場景

  一般javaweb網站都有用戶登錄,而有一些操作必須用戶登錄才能進行,常見流程:用戶請求--》后台判斷是否登錄--》沒登錄跳轉到登錄界面,登錄用戶正常操作

解決思路

  在用過濾器過濾請求,判斷是否登錄,如果未登錄,返回參數跳轉的登錄界面,登錄了的請求放行

具體實現

  •   新建一個web工,參考:【Maven】Eclipse 使用Maven創建Java Web項目
  •   新建一個LoginFilter過濾器類,繼承Filter類
     1 package com.test.login;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 import javax.servlet.Filter;
     9 import javax.servlet.FilterChain;
    10 import javax.servlet.FilterConfig;
    11 import javax.servlet.ServletException;
    12 import javax.servlet.ServletRequest;
    13 import javax.servlet.ServletResponse;
    14 import javax.servlet.http.HttpServletRequest;
    15 import javax.servlet.http.HttpServletResponse;
    16 import javax.servlet.http.HttpSession;
    17 
    18 public class LoginFilter implements Filter {
    19 
    20     public static List<String> pattenURL = new ArrayList<String>();
    21 
    22     @Override
    23     public void destroy() {
    24         // TODO Auto-generated method stub
    25 
    26     }
    27 
    28     @Override
    29     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    30             throws IOException, ServletException {
    31 
    32         HttpServletRequest httpRequest = (HttpServletRequest) request;
    33         HttpServletResponse httpResponse = (HttpServletResponse) response;
    34         HttpSession session = httpRequest.getSession();
    35         // 登陸url
    36         String loginUrl = httpRequest.getContextPath() + "/login.jsp";
    37         String url = httpRequest.getRequestURI().toString();
    38 
    39         // 注:在pattenURL中的全部不攔截 url.indexOf(urlStr) > -1 表示urlStr在url中出現過,出現就不攔截
    40         for (String urlStr : pattenURL) {
    41             if (url.indexOf(urlStr) > -1) {
    42                 chain.doFilter(request, response);
    43                 return;
    44             }
    45         }
    46 
    47         //超時處理,ajax請求超時設置超時狀態,頁面請求超時則返回提示並重定向,session.getAttribute("")是獲取到登錄人的session信息
    48         if (session.getAttribute("") == null) {
    49             // 判斷是否為ajax請求
    50             if (httpRequest.getHeader("x-requested-with") != null
    51                     && httpRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
    52                 httpResponse.addHeader("sessionstatus", "timeOut"); // 返回超時標識
    53                 httpResponse.addHeader("loginPath", loginUrl);// 返回url
    54                 chain.doFilter(request, response);// 不可少,否則請求會出錯
    55             } else {
    56                 // alert('會話過期,請重新登錄');
    57                 String str = "<script language='javascript'>" + "window.top.location.href='" + loginUrl + "';</script>";
    58                 response.setContentType("text/html;charset=UTF-8");// 解決中文亂碼
    59                 try {
    60                     PrintWriter writer = response.getWriter();
    61                     writer.write(str);
    62                     writer.flush();
    63                     writer.close();
    64                 } catch (Exception e) {
    65                     e.printStackTrace();
    66                 }
    67             }
    68         } else {
    69             chain.doFilter(request, response);
    70         }
    71     }
    72 
    73     /**
    74      * 過濾器初始化調用方法 在pattenURL中的全部不攔截,所以上面會使用:path.indexOf(urlStr) > -1
    75      */
    76     @Override
    77     public void init(FilterConfig config) throws ServletException {
    78         pattenURL.add("login.jsp");// 登錄jsp
    79         pattenURL.add("login.do");// 登錄方法
    80         pattenURL.add("css");// css
    81         pattenURL.add("image");// image
    82         pattenURL.add("js");// js
    83         pattenURL.add("fonts");// fonts
    84 
    85     }
    86 
    87 }

     

  •   在web.xml中注冊過濾器
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     5 
     6     <display-name>test-login</display-name>
     7 
     8     <!-- 登錄過濾器  -->
     9     <filter>
    10         <description>登錄過濾器</description>
    11         <filter-name>loginFilter</filter-name>
    12         <filter-class>com.test.login.LoginFilter</filter-class>
    13     </filter>
    14     <filter-mapping>
    15         <filter-name>loginFilter</filter-name>
    16         <url-pattern>/*</url-pattern>
    17     </filter-mapping>
    18       
    19     <welcome-file-list>
    20         <welcome-file>index.jsp</welcome-file>
    21     </welcome-file-list>
    22     
    23 </web-app>

     

  •   引入一個全局的js。用戶控制ajax請求,如果是ajax請求的話,跳轉到登錄界面。js代碼主要是真對所有ajax請求進行跳轉的,所以如果有的ajax不想被過濾攔截,則只需要寫上:global:false即可不被攔截到
     1 /* 
     2  * 說明:此處是調用ajax方法時,判斷session是否過期 
     3  *  
     4  * 注:如果不想讓ajax方法受這個影響,可以在ajax方法中寫: global:false 
     5  * 如下: 
     6  * $.ajax({ 
     7  *    url:"test.html", 
     8  *    global:false    //不觸發全局ajax事件 
     9  * }) 
    10  *  
    11  * **/  
    12   
    13 $(document).ajaxComplete(function(event, xhr, settings) {   
    14     if(xhr.getResponseHeader("sessionstatus")=="timeOut"){   
    15         if(xhr.getResponseHeader("loginPath")){  
    16             alert("登錄過期,請重新登錄...");  
    17             window.location.replace(xhr.getResponseHeader("loginPath"));
    18         }else{   
    19             //alert("請求超時請重新登陸 !");   
    20         }   
    21     }   
    22 }); 

     

 


免責聲明!

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



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