자바 웹 계 정 단일 로그 인,동일 계 정 중복 로그 인 방지(발차 기 효과)

자바 웹 개발 계 정 단일 로그 인 기능 을 구현 하여 같은 계 정의 중복 로그 인 을 방지 하고,뒤에 로그 인 한 사람 은 앞에서 로그 인 한 사람 을 차 버 리 고,필 터 를 사용 하여 이 루어 집 니 다.먼저 항목 을 다운로드 하여 효 과 를 테스트 할 수 있 습 니 다.
블 로그 에 서 는 배경 세 션 을 읽 고 검증 하 는 데 시간 이 얼마 걸 리 지 않 는 다 고 쓰 여 있 습 니 다.이 방법 은 자원 을 차지 하 는 것 외 에 세 션(요청 1)에 접근 하 는 반환 값 과 자신 이 제출 한 요청(요청 2)의 반환 값 이 충돌 할 수도 있 습 니 다.예 를 들 어 요청 1 이 먼저 제출 되 었 습 니 다.이때 요청 1 의 반환 값 은 아직 전단 으로 돌아 가지 않 았 습 니 다.2 제출 을 요청 합 니 다.실제로 우리 가 원 하 는 것 은 요청 1 의 반환 값 을 먼저 반환 한 다음 에 요청 2 의 반환 값 을 되 돌려 주 는 것 입 니 다.그러나 이것 은 반드시 발생 할 것 이 아 닙 니 다.ajax 의 체제 로 인해 발생 한 것 입 니 다.구체 적 인 원인 은 찾 지 못 했 습 니 다.한 마디 로 요청 2 가 먼저 반환 값 을 되 돌려 주 었 습 니 다.이때 요청 1 은 요청 2 의 반환 값 을 받 았 습 니 다.타당 한 전단 에 오류 가 발생 했 지만 백 엔 드 는 성공 적 이 었 습 니 다.
다음은 주제 로 들 어 갑 니 다.
프로젝트 다운로드 링크:링크:https://pan.baidu.com/s/1Rp09wv7hTJLqx9DiQ_KSeA추출 코드:xyym
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%>" rel="external nofollow" rel="external nofollow" >
 <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" rel="external nofollow" rel="external nofollow" >
 -->
 </head>
 
 <body>
 <input id="username" name="username" type="text">
 <!-- <a href="singlecount.jsp" rel="external nofollow" 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%>" rel="external nofollow" rel="external nofollow" >
 <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" rel="external nofollow" rel="external nofollow" >
 -->

 </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 방법 을 직접 보면 돼 요.

// 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 {
 // 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   <filter>
 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
 
 }
}
웹.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>
실현 효과
두 개의 서로 다른 브 라 우 저 를 두 개의 클 라 이언 트 로 사용 하거나 컴퓨터 가 많 으 면 여러 대의 컴퓨터 를 사용 할 수 있다.
같은 계 정 로그 인 시,앞 계 정 에서 제출 요청 을 누 르 면 알림 을 주 고 로그 인 화면 으로 이동 합 니 다.
在这里插入图片描述
로그 인하 지 않 고 바로 입장:http://localhost:8080/OneLogin/singlecount.jsp
在这里插入图片描述
점프 효 과 를 실현 하고 싶다 면jsSubmit.js $(document).ready(function() {…}); 앞 에 세 션 이 있 는 지 에 대한 판단 을 넣 고 없 으 면 힌트 를 주 고 로그 인 인터페이스 로 이동한다.
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 자바 웹 은 계 정 단일 로그 인 을 실현 하고 같은 계 정의 중복 로그 인 을 방지 하 며 여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기