자바 필터 로 사용자 자동 로그 인

머리말
안전 은 현재 인터넷 업계 에서 특히 중시 하 는 화제 이다.여러분 이 자바 웹 을 배 운 후에 한 사이트 에 안전 제한 이 있어 야 한 다 는 것 을 알 게 되 었 습 니 다.예 를 들 어 사용자 가 로그 인하 지 않 으 면 관련 CRUD 작업 을 허용 하지 않 습 니 다.만약 에 저희 가 배경 에 있 는 모든 Servlet 에서 판단 하면 시스템 효율 을 낮 추고 대량의 코드 가 불필요 합 니 다.그래서 필터 필터 가 생 겼 다.
1.필터 란 무엇 인가
Filter,필 터 는 클 라 이언 트 와 서버 자원 파일 사이 에 있 는 필터 망 입 니 다.자원 파일 에 접근 하기 전에 일련의 필 터 를 통 해 요청 을 수정 하고 판단 하 는 등 규칙 에 맞지 않 는 요청 을 중간 에 차단 하거나 수정 합 니 다.응답 을 필터 하거나 차단 하거나 수정 할 수도 있 습 니 다.

2,필터 구현 차단 과정
  • 클 라 이언 트 가 서버 에 요청 을 보 낸 후 HttpServletRequest 가 Servlet 에 도착 하기 전에 필 터 는 HTTPServletRequest 를
  • 으로 차단 합 니 다.
  • 웹.xml 의 설정 에 따라 차단 검 사 를 요청 할 수도 있 고 요청 헤더 와 데 이 터 를 수정 할 수도 있 습 니 다.
  • 필터 에서 doFilter()방법 을 호출 하고 요청 실행(==주의===:doFilter 방법 을 호출 해 야 합 니 다.그렇지 않 으 면 아래로 실행 하지 않 습 니 다).
  • 요청 이 Servlet 에 도착 한 후 요청 을 처리 하고 HttpServletResponse 를 만들어 클 라 이언 트 에 보 냅 니 다.
  • HttpServletResponse 가 클 라 이언 트 에 도착 하기 전에 필터 도 응답 을 차단 할 수 있 습 니 다.
  • 필요 에 따라 HttpServletResponse 를 검사 하고 수정 할 수 있 습 니 다.
  • 마지막 으로 HttpServletResponse 가 클 라 이언 트 에 도 착 했 습 니 다.
  • 3.필터 와 차단기 의 차이 점
    1.필터:
    servlet 용기 에 의존 합 니 다.구현 에 있어 서 함수 리 셋 을 기반 으로 거의 모든 요청 을 걸 러 낼 수 있 지만 필터 인 스 턴 스 는 용기 초기 화 시 한 번 만 호출 할 수 있 는 것 이 단점 입 니 다.필 터 를 사용 하 는 목적 은 필터 작업 을 해서 우리 가 얻 고 싶 은 데 이 터 를 얻 는 것 입 니 다.예 를 들 어 필터 에서 문자 인 코딩 을 수정 하 는 것 입 니 다.필터 에서 HttpServletRequest 의 일부 인 자 를 수정 합 니 다.예 를 들 어 저속한 문자,위험 문자 등 을 걸 러 냅 니 다.
    2.차단기:
    웹 프레임 워 크 에 의존 하 는 것 은 SpringMVC 에서 SpringMVC 프레임 워 크 에 의존 하 는 것 이다.실현 에 있어 자바 의 반사 체 제 를 바탕 으로 절단면 프로 그래 밍(AOP)을 위 한 운용 에 속한다.차단 기 는 웹 프레임 워 크 를 기반 으로 호출 되 기 때문에 Spring 의 의존 주입(DI)을 사용 하여 일부 업무 작업 을 할 수 있 으 며,동시에 하나의 차단기 인 스 턴 스 는 하나의 contrller 수명 주기 내 에 여러 번 호출 할 수 있 습 니 다.그러나 단점 은 controller 요청 만 차단 할 수 있 고 정적 자원 에 직접 접근 하 라 는 요청 은 차단 할 수 없다 는 것 이다.
    3.둘 의 차이 점:
    ① 차단 기 는 자바 의 반사 체 제 를 바탕 으로 하고 필 터 는 함수 리 셋 을 바탕 으로 한다.
    ② 차단 기 는 servlet 용기 에 의존 하지 않 고 필 터 는 servlet 용기 에 의존 합 니 다.
    ③ 차단 기 는 action 요청 에 만 작용 할 수 있 고 필 터 는 거의 모든 요청 에 작용 할 수 있다.
    ④ 차단 기 는 action 컨 텍스트,값 스 택 의 대상 에 접근 할 수 있 으 며 필 터 는 접근 할 수 없습니다.
    ⑤ action 의 수명 주기 에 차단 기 는 여러 번 호출 될 수 있 으 며 필 터 는 용기 가 초기 화 될 때 한 번 만 호출 될 수 있 습 니 다.
    ⑥ 차단 기 는 IOC 용기 의 각 bean 을 가 져 올 수 있 고 필 터 는 안 된다 는 점 이 중요 합 니 다.차단기 에 service 를 주입 하면 업무 논 리 를 호출 할 수 있 습 니 다.
    4.Filter 를 사용 하여 사용자 자동 로그 인
    자동 로그 인,첫 번 째 Servlet 1 방문 시 서버 는 사용자 정 보 를 포함 하 는 Cookie 를 보 내 고,이후 클 라 이언 트 가 다시 서버 를 방문 하면 서버 에 Cookie 를 전송 하 며,서버 는 Cookie 에서 사용자 정 보 를 얻어 자동 으로 로그 인 할 수 있다.
    문제:모든 Servlet 에서 사용 할 Cookie 정 보 를 검사 해 야 하기 때문에 Serlvet 2\\Servlet 3 등에 대량의 불필요 한 코드 가 발생 합 니 다.
    해결:Filter 로 쿠키 로 사용자 정 보 를 검증 합 니 다.
    로그 인 폼<%@ page contentType="text/html;charset=UTF-8" language="java" %>로그 인 폼

    로그 인 컨트롤 러
    
    package com.gxuwz.servlet;
    import com.gxuwz.po.User;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet("/LoginServlet3")
    public class LoginServlet3 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            if ("admin".equals(username)&&"123456".equals(password)) {
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);
                req.getSession().setAttribute("USER_SESSION",user);
                String autoLogin = req.getParameter("autoLogin");
                if (autoLogin!=null&&!" ".equals(autoLogin)) {
                    //            !
                    Cookie cookie = new Cookie("autoLogin", username + "-"+password);
                    cookie.setMaxAge(Integer.parseInt(autoLogin));
                    cookie.setPath(req.getContextPath());
                    resp.addCookie(cookie);
                }
                resp.sendRedirect(req.getContextPath()+"/index.jsp");
            }else{
                req.setAttribute("errorMsg","         !");
                req.getRequestDispatcher("/login.jsp").forward(req,resp);
            }
        }
    }
    
    필터 자동 로그 인
    
    package com.gxuwz.filter;
    import com.gxuwz.po.User;
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebFilter("/*")
    public class AutoFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            String autoLogin = "";
            Cookie[] cookies = req.getCookies();
            for (Cookie cookie : cookies) {
                if ("autoLogin".equals(cookie.getName())){
                    autoLogin=cookie.getValue();
                    break;
                }
            }
            if (autoLogin!=null) {
                String[] parts = autoLogin.split("-");
                String username = parts[0];
                String password = parts[1];
                if ("admin".equals(username)&&"123456".equals(password)) {
                    User user = new User();
                    user.setUsername(username);
                    user.setPassword(password);
                    req.getSession().setAttribute("USER_SESSION",user);
                }
            }
            chain.doFilter(req, resp);
        }
        @Override
        public void destroy() {
        }
    }
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="java.util.*"
    %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <head>
    <title>         </title>
    </head>
    <body>
        <br />
        <center>
            <h3>    </h3>
        </center>
        <br />
        <br />
        <c:choose>
            <c:when test="${sessionScope.user==null }">
               <a href="${pageContext.request.contextPath }/login.jsp" rel="external nofollow" >    </a>
            </c:when>
            <c:otherwise>
             ,${sessionScope.user.username }
               <a href="${pageContext.request.contextPath }/LogoutServlet" rel="external nofollow" >  </a>
            </c:otherwise>
        </c:choose>
        <hr />
    </body>
    </html>
    
    <?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" 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>Project01</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <description></description>
        <display-name>LogoutServlet</display-name>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.Servlet.LogoutServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/LogoutServlet</url-pattern>
      </servlet-mapping>
      <servlet>
        <description></description>
        <display-name>LoginServlet</display-name>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.Servlet.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
      </servlet-mapping>
      <filter>
        <display-name>AutoLoginFilter</display-name>
        <filter-name>AutoLoginFilter</filter-name>
        <filter-class>com.Filter.AutoLoginFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>AutoLoginFilter</filter-name>
        <!--          -->
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>
    
    5.테스트
    입력http://localhost/Project01/login.jsp

    브 라 우 저 를 닫 은 후 브 라 우 저 입력 을 다시 엽 니 다.http://localhost/Project01/index.jsp

    이상 은 자바 가 Filter 를 사용 하여 사용자 의 자동 로그 인 을 실현 하 는 상세 한 내용 입 니 다.자바 가 Filter 로 자동 로그 인 을 실현 하 는 것 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기