整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java web過濾器實現賬號單一登錄,防止同一賬號重復登錄,踢人效果

          實現了Java web開發賬號單一登錄的功能,防止同一賬號重復登錄,后面登錄的踢掉前面登錄的,使用過濾器Filter實現的。可以先下載項目下來測試下效果。

          有博客寫的是沒個一段時間(比如500ms)讀取后臺的session進行驗證,這種方法除了會占用資源,還會出現訪問session(請求1)的返回值和自己提交請求(請求2)的返回值發生沖突。比如請求1先提交,此時請求1的返回值還未返回到前端,請求2提交,實際上我們想要的是請求1的返回值先返回,然后再返回請求2的返回值,但是這不是肯定會發生的,ajax的機制所導致的,具體什么原因沒查到。總之出現了請求2先返回了返回值,這時候請求1接收到了請求2的返回值,妥妥的前端出現錯誤,但是后臺卻是成功的。

          還有寫的使用seesion監聽器來實現,但是session過濾器只能用來監聽session的改變(創建、修改、銷毀等),如果有重復用戶登錄,只能保證清除掉前面用戶的session,是無法通過監聽器來控制前端進行頁面跳轉等操作的。

          下面進入主題

          工程下載鏈接: 鏈接

          提取碼:zngv

          其中:jquery-1.11.3.js是網上的工具

          在這里插入圖片描述

          建立兩個簡單的界面

          登錄界面:為了簡單沒有設置密碼,直接輸入賬號點擊登錄就行

          在這里插入圖片描述

          // index.jsp
          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
              <base href="<%=basePath%>">
              
              <title>My JSP 'index.jsp' starting page</title>
          	<meta http-equiv="pragma" content="no-cache">
          	<meta http-equiv="cache-control" content="no-cache">
          	<meta http-equiv="expires" content="0">    
          	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          	<meta http-equiv="description" content="This is my page">
          	<!--
          	<link rel="stylesheet" type="text/css" href="styles.css">
          	-->
            </head>
            
            <body>
              <input id="username" name="username" type="text">
              <!-- <a href="singlecount.jsp" target="_self"> -->
              	<button id="btnlogin" name="btnlogin">登錄</button><!-- </a> -->
              	
              <!-- 引入jQuery -->
              <script type="text/javascript" src="js/jquery-1.11.3.js"></script>
              <script type="text/javascript" src="js/jsSubmit.js"></script>
            </body>
          </html>
          

          主頁面:簡單的一個提交按鈕

          在這里插入圖片描述

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
              <base href="<%=basePath%>">
              
              <title>My JSP 'SingleCount.jsp' starting page</title>
              
          	<meta http-equiv="pragma" content="no-cache">
          	<meta http-equiv="cache-control" content="no-cache">
          	<meta http-equiv="expires" content="0">    
          	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          	<meta http-equiv="description" content="This is my page">
          	<!--
          	<link rel="stylesheet" type="text/css" href="styles.css">
          	-->
            </head>
            
            <body>
                已登錄. <br>
              <button id="btnsubmit" name="submit">提交</button>
              
              <!-- 引入jQuery -->
              <script type="text/javascript" src="js/jquery-1.11.3.js"></script>
              <script type="text/javascript" src="js/jsSubmit.js"></script>
            </body>
          </html>
          

          寫ajax,向后臺提交請求

          // jsSubmit.js
          $(document).ready(function() {
          	// 登錄按鈕
          	$("#btnlogin").click(function() {
          		//data,dataType,type,url
          		$.ajax({
          			url: 'LoginServlet?method=login',
          			type: 'post',
          			data: {username: $("input[name='username']").val()},  // 將用戶名傳給servlet
          			//dataType:'json',
          			success: function(msg) {  // msg為從servlet接收到的返回值
          				if (msg == 1) {  // 接收到后臺數據為1,正常登錄
          					window.location.href = "singlecount.jsp";
          				}		
          			},
          			error:function(){
          				window.alert("錯誤!");
          			}
          		});
          	});
          	// 提交按鈕
          	$("#btnsubmit").click(function() {
          		//data,dataType,type,url
          		$.ajax({
          			url: 'SubmitServlet?method=submit',
          			type: 'post',
          			//dataType:'json',
          			success: function(msg) {  // msg為從servlet接收到的返回值
          				if (msg >= 1) {  // 正常
          					window.alert("提交總數" + msg);
          				}		
          			},
          			error:function(jqXHR){
          				if(jqXHR.status == 900){  // 900狀態碼
          					window.alert("登錄狀態失效,請重新登錄!");
          					window.location.href = "/OneLogin";
          				}
          			}
          		});
          	});
          });
          

          servlet

          這部分有點長,其實主要內容直接看doPost方法就可以了。

          過濾器登錄狀態才能操作_java 過濾器實現登錄_登錄過濾器怎么寫

          // LoginServlet
          package servlet;
          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.HashMap;
          import java.util.Map;
          import javax.servlet.ServletConfig;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpSession;
          @SuppressWarnings("serial")
          //注解表明什么樣的情況下可以訪問該內容
          @WebServlet(urlPatterns={"/LoginServlet"})
          public class LoginServlet extends HttpServlet {
          	private PrintWriter out; // 輸出流
          	private String user;
          	private String method;
          	private HttpSession session;
          	// 建立一個Map存儲session信息,key-用戶名,value-session
          	public static Map<String, HttpSession> user_Session = new HashMap<String, HttpSession>();
          	
          	@Override
          	public void init(ServletConfig config) throws ServletException {
          		// TODO Auto-generated method stub
          		super.init(config);
          	}
          	@Override
          	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		// TODO Auto-generated method stub
          		super.doDelete(req, resp);
          	}
          	@Override
          	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		// TODO Auto-generated method stub
          		doPost(req, resp);
          	}
          	@Override
          	// 在這里實現方法
          	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		// TODO Auto-generated method stub
          		resp.setContentType("text/html");
          		//語言編碼
          		req.setCharacterEncoding("utf-8");
          		resp.setCharacterEncoding("utf-8");
          		out = resp.getWriter();
          		
          		user = req.getParameter("username");  // 獲取index界面username的內容
          		method = req.getParameter("method");  // 獲取方法名
          		session = req.getSession();  // 獲取session
          		switch (method) {
          		case "login":
          			mLogin();
          			break;
          		default:
          			break;
          		}
          		out.flush();
          		out.close();
          		
          	}
          	private void mLogin() {  // 按登錄按鈕調用的方法
          		// TODO Auto-generated method stub
          		removeUser(user);
          		session.setAttribute("name", user);
          		user_Session.put(user, session);  // 新增或覆蓋session
          		System.out.println(user_Session);
          		out.println(1); // 返回值1,隨意選個值,和前端對應就可以
          	}
          	
          	/**
          	 *  判斷是否有重復用戶,
          	 *  若出現重復用戶,踢掉前面登錄的用戶,即刪除其session
          	 */
          	private void removeUser(String user) {
          		if(user_Session.containsKey(user))
          			user_Session.get(user).invalidate();
          	}
          }
          

          // SubmitServlet
          package servlet;
          import java.io.IOException;
          import java.io.PrintWriter;
          import javax.servlet.ServletConfig;
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          @SuppressWarnings("serial")
          //注解表明什么樣的情況下可以訪問該內容  會在js和web.xml中使用
          @WebServlet(urlPatterns={"/SubmitServlet"})
          public class SubmitServlet extends HttpServlet {
          	
          	private PrintWriter out; // 輸出流
          	private String method;
          	private int number = 0;  // 計數
          	@Override
          	public void init(ServletConfig config) throws ServletException {
          		// TODO Auto-generated method stub
          		super.init(config);
          	}
          	@Override
          	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          		// TODO Auto-generated method stub
          		super.doDelete(req, resp);
          	}
          	@Override
          	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          

          java 過濾器實現登錄_登錄過濾器怎么寫_過濾器登錄狀態才能操作

          // TODO Auto-generated method stub doPost(req, resp); } @Override // 在這里實現方法 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub resp.setContentType("text/html"); //語言編碼 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); out = resp.getWriter(); method = req.getParameter("method"); // 獲取方法名 switch (method) { case "submit": mSubmit(); break; default: break; } out.flush(); out.close(); } private void mSubmit() { // 按提交按鈕調用的方法 // TODO Auto-generated method stub number++; out.println(number); } }

          過濾器

          過濾器的原理這里就不說了,簡單來說就是請求要先經過過濾器才能到達servlet,也就是說如果請求不滿足要求就無法通過過濾器,這里的要求是要有session。

          package filter;
          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.annotation.WebFilter;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          @WebFilter("/SessionFilter")
          public class SessionFilter implements Filter {
          	@Override
          	public void destroy() {
          		// TODO Auto-generated method stub
          		
          	}
          	@Override
          	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
          			throws IOException, ServletException {
          		// TODO Auto-generated method stub
          		HttpServletRequest request = (HttpServletRequest) arg0;
                  HttpServletResponse response = (HttpServletResponse) arg1;
                  String strURL = request.getRequestURL().toString();  // 獲取請求路徑
                  // System.out.println(strURL);
                  // 只過濾來自SubmitServlet請求和singlecount.jsp的加載,可以設置成自己想過濾的
                  // 需要在web.xml中添加
                  if(strURL.indexOf("SubmitServlet") != -1 || strURL.indexOf("singlecount.jsp") != -1){  
                  	if(request.getSession().getAttribute("name") == null){
              			request.getSession().invalidate();
              			response.sendError(900, "登錄失效,請重新登錄!");  // 自定義狀態碼,session失效
              			// 900 到ajax的error中處理
              			return;
                  	}
                  	else {
                  		arg2.doFilter(arg0, arg1);
                  	}
                  }
                  else {
                  	arg2.doFilter(arg0, arg1);
                  }
              }
          	@Override
          	public void init(FilterConfig arg0) throws ServletException {
          		// TODO Auto-generated method stub
          		
          	}
          }
          

          配置web.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
            <display-name>OneLogin</display-name>
            <welcome-file-list>
              <welcome-file>index.html</welcome-file>
              <welcome-file>index.htm</welcome-file>
              <welcome-file>index.jsp</welcome-file>
              <welcome-file>default.html</welcome-file>
              <welcome-file>default.htm</welcome-file>
              <welcome-file>default.jsp</welcome-file>
            </welcome-file-list>
            <filter>
              <filter-name>filter.SessionFilter</filter-name>
              <filter-class>filter.SessionFilter</filter-class>
            </filter>
            <filter-mapping>
              <filter-name>filter.SessionFilter</filter-name>  
              <url-pattern>/singlecount.jsp</url-pattern>  <!-- 給界面添加過濾器 -->
            </filter-mapping>
            <filter-mapping>
              <filter-name>filter.SessionFilter</filter-name>
              <url-pattern>/SubmitServlet</url-pattern>  <!-- 給servlet添加過濾器 -->
            </filter-mapping>
          </web-app>
          

          實現效果

          可以使用兩個不同的瀏覽器當兩個客戶端,或者電腦多就用多臺電腦。

          相同賬號登錄時,前面賬號再點提交請求就會給出提示,跳轉到登錄界面

          在這里插入圖片描述

          未登錄直接進入::8080//.jsp

          在這里插入圖片描述

          如果也想實現跳轉效果,在.js的$().ready(() {…}); 前面加入是否有session的判斷,沒有就給出提示,跳轉到登錄界面。

          以上,歡迎大佬們批評指正。


          主站蜘蛛池模板: 亚洲国产精品一区二区第一页| 亚洲福利电影一区二区?| 亚洲日本乱码一区二区在线二产线 | 午夜精品一区二区三区在线观看| 少妇人妻精品一区二区| 国产精品亚洲综合一区在线观看| 国产麻豆精品一区二区三区 | 国产在线观看一区二区三区 | 国产在线精品一区二区在线观看| 久久国产精品亚洲一区二区| 日本无卡码一区二区三区| 亚洲一区二区三区国产精华液| 日本福利一区二区| 久久亚洲综合色一区二区三区| 在线播放一区二区| 国产精品成人一区二区三区| 高清国产精品人妻一区二区| 亚洲av成人一区二区三区| 国产成人精品视频一区| 亚洲国产精品一区二区第一页| 国模吧一区二区三区精品视频 | 国产无套精品一区二区| 韩国美女vip福利一区| 波霸影院一区二区| 精品人妻系列无码一区二区三区 | 无码精品一区二区三区在线| 国产精品99精品一区二区三区| 精品国产一区二区三区在线观看 | 精品国产日韩亚洲一区| 无码乱码av天堂一区二区| 国产精品成人国产乱一区| 亚洲一区二区三区在线网站| 亚洲国产成人久久一区久久 | 国产三级一区二区三区| 美女啪啪一区二区三区| 日韩一区二区三区精品| 中文字幕AV无码一区二区三区| 中文字幕一区在线| 国产一区二区三区小向美奈子| 亚洲一区二区三区播放在线| 波多野结衣一区二区三区aV高清|