Java는 사용자가 반복 로그인할 수 없는 기능을 구현합니다.
엊그저께 무심결에 이 문제를 생각하니 실용적이어서 정리할 필요가 있다.간단한 모드를 썼는데 어렵지 않은 것 같아요.생각이 순조롭다는 것은 사실 매우 간단하다.
사용자가 동시에 로그인할 수 없도록 현실에서 시나닷컴, 바이두 등을 생각하면 한 군데만 로그인하면 다른 한 군데를 밀어내면 실현 결과가 왜 그런지 알 수 있다.그리고 다시 역추하면 비교적 뚜렷한 사고방식을 형성할 수 있다.우리 함께 토론해 봅시다.
우선, 우리는 사용자가 로그인해서 어떤 로그인을 사용하는지, 즉 사용자가 온라인에 접속하는 원리를 알아야 한다.이것은 사용자의 대상을 세션에 저장한 다음에 프레임에서 호출하고 다른 특정 페이지도 직접 인용하면 됩니다.그렇다면'밀어내기'를 실현하는 기능은 새로 생성된session을 유효하게 하고 원래 사용자를 저장한session을 실효시키면 된다.여기까지, 대체적인 사고방식은 이미 있다.그럼 어떻게 이루어질까요?
어떻게 실현하는지 알고 싶다면session이 사용자 대상을 저장하는 과정을 알아야 한다.사용자가 로그인한 후에 우리는 사용자의 대상user를 얻을 수 있으며,session에 저장할 때 실행해야 합니다
session.setAttribute(key,value);
우리는 사용자의 userId 또는 다른 유일한 표지를 키로 저장하고 사용자 대상을 값으로 저장합니다.이렇게 하면 언제 어디서나 유일한 사용자를 호출할 수 있다.user에 저장된 문제가 해결되었습니다. 그러면 같은 로그인할 때session이 폐지되는 문제는요?이것도 어렵지 않다. 우리는 세션의 특성과 같이 맵으로 저장하고 사용자의 표지를 키로 저장하며 그에 대응하는 세션을value로 저장할 수 있다. 그러면 중복 사용자가 로그인할 때 대응하는 세션을 꺼내서 invalidate로 저장하면 된다.
이로써 실현된 사고방식은 이미 명백해졌고, 이렇게 오랫동안 시끄러웠으니, 모두들 부호를 보고 싶어 하지 않겠는가?다음은 코드입니다.
선행 준비, jsp인터페이스
인터페이스는 매우 간단하다. 단지 간단한 로그인 인터페이스일 뿐이다
<form action ="<%=request.getContextPath()%>/UserWXPServlet" method = "post">
<input type = "text" name = "username"/><br/>
<input type = "text" name = "password"/><br/>
<input type = "submit" value =" "/>
</form>
성공 후 페이지 건너뛰기환영:
${sessionScope.user.username} !<br/>
나 는 실패 페이지 를 쓰지 않았으니, 여러분 은 스스로 쓸 수 있고, 실패 페이지 도 할 말 이 없다
entity와 로그인의 실현
user의javabean
private String username;
private String password;
public User() {
}
public User(String user, String password) {
super();
this.username = user;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
user의 서비스 구현 방법에 로그인하면 Dao와 인터페이스를 쓰지 않습니다. 모든 것은 간단합니다.
public boolean dologin(User user){
Properties pro = new Properties();
InputStream is = UserWXPServlet.class.getClassLoader().getResourceAsStream("user_wxp.properties");
String password = null;
System.out.println(is+"--------->"+pro);
if(user==null){
return false;
}
try {
pro.load(is);
password = pro.getProperty(user.getUsername());
if(user.getPassword()!=null&&user.getPassword().equals(password)){
System.out.println(" ");
return true;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
로그인이 성공하면true를 되돌려주고, 실패하면false를 되돌려줍니다.Servlet 및 해당 논리 도구 클래스
다음 코드는 사용자의 코드를 진정으로 조작하는 것이다
본인은 여기서 두 가지 클래스, 하나의 도구 클래스, 하나의 핵심 servlet 처리 클래스를 정의하였습니다
다음 코드와 같은 공통 요소가 도구 클래스에 추가되었습니다.
/**
* session。 !!!
*/
public static Map<String, HttpSession> mapSession = new HashMap<String,HttpSession>();
( session remove ):
[java] view plain copy
public static void userLogout(String username){
if(mapSession.get(username)!=null){
// session
HttpSession session = mapSession.get(username);
// map<username,session> , , session remove user
mapSession.remove(username);
// session
Enumeration e = session.getAttributeNames();
//
while(e.hasMoreElements()){
String sessionName = (String) e.nextElement();
session.removeAttribute(sessionName);
}
// session
session.invalidate();
}
}
서브렛의 코드는 다음과 같습니다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = new User(username, password);
UserService userService = new UserService();
HttpSession session = request.getSession();
if(userService.dologin(user)){
// session
session.setAttribute("user", user);
if(cheackSession(username)){
// session ,
DbUtil.userLogout(username);
}
// session map<username,session>
DbUtil.mapSession.put(username, session);
// , , ,
request.getRequestDispatcher("login").forward(request, response);
return ;
}
// , ,
}
cheackSession(username) 코드는 다음과 같습니다.
/**
* session
* @param username
* @return true: , ! false:
*/
private boolean cheackSession(String username){
HttpSession session = DbUtil.mapSession.get(username);
if(session!=null){
return true;
}
return false;
}
마지막으로 Servlet의 xml 구성을 첨부합니다.
<servlet>
<description>
,
</description>
<display-name>UserWXPServlet</display-name>
<servlet-name>UserWXPServlet</servlet-name>
<servlet-class>com.fingard.rabbit.wxp_test.Servlet.UserWXPServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserWXPServlet</servlet-name>
<url-pattern>/UserWXPServlet</url-pattern>
</servlet-mapping>
위에서 말한 것은 여러분이 소개한 자바는 사용자가 중복 로그인할 수 없는 기능을 실현하는 것입니다. 여러분께 도움이 되기를 바랍니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.