>  기사  >  Java  >  쿠키, 세션, 자바 필터를 결합하여 로그인 프로그램 구현

쿠키, 세션, 자바 필터를 결합하여 로그인 프로그램 구현

高洛峰
高洛峰원래의
2017-01-18 14:20:051458검색

쿠키, 세션 및 필터는 일반적으로 웹 애플리케이션에서 사용됩니다. 쿠키 및 세션은 브라우저가 요청을 보낸 후 특정 요청이 백그라운드에서 실행되기 전에 발생합니다. 이 셋을 같이 묶는 이유는 일부 로그인 프로그램 등에서 함께 사용되는 경우가 많기 때문입니다.

쿠키는 브라우저 메커니즘이고 세션은 서버 메커니즘이지만 실제로 쿠키도 브라우저 자체에서 생성되지 않고 서버에서 생성된 후 브라우저로 반환됩니다. 브라우저가 요청을 보낼 때 유효한 쿠키가 있으면 이 쿠키도 함께 가져옵니다.

쿠키를 사용하는 이유는 http 프로토콜이 원래 stateless 프로토콜이기 때문입니다. 즉, http 프로토콜 자체를 통해서는 브라우저가 이전에 방문한 적이 있는지 서버에서 확인할 수 없습니다.

Filter와 servlet은 비슷하게 작성되는데, 해당 코드를 작성할 때에는 Filter 인터페이스를 구현하고 관련 메소드를 다시 작성해야 합니다. 일반적으로 doFilter 메소드가 더 많이 변경됩니다. 필터 코드를 작성한 후 적용하려면 서블릿 구성과 마찬가지로 web.xml에 구성해야 합니다.

다음은 쿠키, 세션, 서블릿 및 필터를 결합한 간단한 로그인 예제 코드입니다.

여기서는 데이터베이스 데이터 역할을 하는 사용자 엔터티 클래스를 정의하여 다음과 같은 작업만 수행하도록 합니다. 하나의 인스턴스 객체가 존재합니다:

package models; 
  
/** 
 * 用户信息实体类 
 * 
 * @author tuzongxun123 
 * 
 */
public class UserModel { 
  private String userName; 
  private String password; 
  
  // 单例模式,保证只有一个用户对象实例 
  public static UserModel getInstance() { 
    UserModel user = new UserModel("zhangsan", "123456"); 
    return user; 
  
  } 
  
  private UserModel(String userName, String pasword) { 
    this.userName = userName; 
    this.password = pasword; 
  } 
  
  public String getUserName() { 
    return userName; 
  } 
  
  public String getPassword() { 
    return password; 
  } 
  
}

사용자가 로그인하여 index.jsp 인터페이스에 들어가고 양식 작업에서 jsp 기능을 사용하여 프로젝트 경로를 얻습니다:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" 
  pageEncoding="utf-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>cookieAndFilterTest</title> 
</head> 
<body> 
   <form action="<%=request.getContextPath() %>/loginServlet" method="post"> 
    userName:<input type="text" name="userName" /></br> 
    password:<input type="password" name="password" /></br> 
    <input type="submit" value="login"/> 
   </form> 
</body> 
</html>

해당 백그라운드 서블릿:

package servletTest; 
  
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import models.UserModel; 
  
public class LoginServlet extends HttpServlet { 
  
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    this.doPost(req, resp); 
  } 
  
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    String userName = req.getParameter("userName"); 
    String password = req.getParameter("password"); 
    // 模拟数据库数据 
    UserModel user = UserModel.getInstance(); 
    String dbUserName = user.getUserName(); 
    String dbPassword = user.getPassword(); 
    if (dbUserName.equals(userName) && dbPassword.equals(password)) { 
      // 用户名和密码都匹配,证明登陆成功,设置session和cookie 
      HttpSession session = req.getSession(); 
      session.setAttribute("userName", userName); 
      session.setAttribute("password", password); 
      Cookie cookie = new Cookie("userName", userName); 
      Cookie cookie2 = new Cookie("password", password); 
      // 设置cookie的存储时长 
      cookie.setMaxAge(60); 
      cookie2.setMaxAge(60); 
      // 把cookie发送给浏览器 
      resp.addCookie(cookie); 
      resp.addCookie(cookie2); 
      // 转发请求到用户列表 
      req.getRequestDispatcher("/userList").forward(req, resp); 
    } else { 
      // 转发请求到登陆页面 
      req.getRequestDispatcher("index.jsp").forward(req, resp); 
    } 
    ; 
  
  } 
  
}

위 로그인 후 점프 요청:

package servletTest; 
  
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import models.UserModel; 
  
public class UserListServlet extends HttpServlet { 
  
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    this.doPost(req, resp); 
  } 
  
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    UserModel user = UserModel.getInstance(); 
    //在浏览器中打印出用户列表书数据 
    resp.getWriter().write( 
        "userName:" + user.getUserName() + "," + "password:"
            + user.getPassword()); 
  
  } 
  
}

프로젝트 web.xml 구성:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">   
  
 <!-- 访问时的项目名称 -->
 <display-name>cookieAndFilterTest</display-name> 
 <!-- servlet配置 -->
 <servlet> 
   <servlet-name>login</servlet-name> 
   <servlet-class>servletTest.LoginServlet</servlet-class> 
 </servlet> 
 <servlet-mapping> 
   <servlet-name>login</servlet-name> 
   <url-pattern>/loginServlet</url-pattern> 
 </servlet-mapping> 
  
 <servlet> 
   <servlet-name>userList</servlet-name> 
   <servlet-class>servletTest.UserListServlet</servlet-class> 
 </servlet> 
 <servlet-mapping> 
   <servlet-name>userList</servlet-name> 
   <url-pattern>/userList</url-pattern> 
 </servlet-mapping> 
  
 <!-- 过滤器设置,浏览其发送请求后首先会走这里 -->
 <filter> 
   <filter-name>loginFilter</filter-name> 
   <filter-class>filterTest.FilterTest</filter-class> 
 </filter> 
 <filter-mapping> 
   <filter-name>loginFilter</filter-name> 
   <url-pattern>/*</url-pattern> 
 </filter-mapping> 
  
 <!-- 输入项目名访问的默认页面 -->
 <welcome-file-list> 
  <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
</web-app>

java 필터 코드:

package filterTest; 
  
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.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import models.UserModel; 
  
public class FilterTest implements Filter { 
  
  @Override
  public void destroy() { 
  
  } 
  
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
    // 登陆请求、初始请求直接放行 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse resp = (HttpServletResponse) response; 
    String uri = req.getRequestURI(); 
    if ("/cookieAndFilterTest/loginServlet".equals(uri) 
        || "/cookieAndFilterTest/".equals(uri)) { 
      // 放行 
      chain.doFilter(request, response); 
      return; 
    } 
  
    // 不是登陆请求的话,判断是否有cookie 
    Cookie[] cookies = req.getCookies(); 
    if (cookies != null && cookies.length > 0) { 
      String userName = null; 
      String password = null; 
      // 判断cookie中的用户名和密码是否和数据库中的一致,如果一致则放行,否则转发请求到登陆页面 
      for (Cookie cookie : cookies) { 
        if ("userName".equals(cookie.getName())) { 
          userName = cookie.getValue(); 
        } 
        if ("password".equals(cookie.getName())) { 
          password = cookie.getValue(); 
        } 
      } 
      UserModel user = UserModel.getInstance(); 
      if (user.getUserName().equals(userName) 
          && user.getPassword().equals(password)) { 
        chain.doFilter(request, response); 
        return; 
      } else { 
        // 重定向到登陆界面 
        req.getRequestDispatcher("/index.jsp").forward(req, resp); 
        return; 
      } 
    } else { 
      req.getRequestDispatcher("/index.jsp").forward(req, resp); 
      return; 
    } 
  } 
  
  @Override
  public void init(FilterConfig arg0) throws ServletException { 
  
  } 
  
}

위 내용은 전체 내용입니다. 이 기사가 모든 사람이 Java 프로그래밍을 배우는 데 도움이 되기를 바랍니다.

로그인 프로그램 구현을 위한 쿠키, 세션, 자바 필터의 조합에 대한 더 많은 글은 PHP 중국어 홈페이지를 참고해주세요!



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.