国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java 使用Filter實(shí)現用戶(hù)自動(dòng)登陸

發(fā)布時(shí)間:2021-07-06 11:12 來(lái)源:腳本之家 閱讀:0 作者:知了堂 欄目: 開(kāi)發(fā)技術(shù)

目錄

      前言

      安全,是如今互聯(lián)網(wǎng)行業(yè)特別注重的一個(gè)話(huà)題。在大家學(xué)習了JavaWeb之后呢,發(fā)現一個(gè)網(wǎng)站應該有安全限制,例如:如果用戶(hù)未登錄,則不允許相關(guān)CRUD操作,而如果我們在后臺的每一個(gè)Servlet都進(jìn)行判斷,將降低系統效率,也會(huì )出現大量代碼冗余。因此,就有了Filter過(guò)濾器。

      1、什么是Filter

      Filter,過(guò)濾器,是處于客戶(hù)端與服務(wù)器資源文件之間的一道過(guò)濾網(wǎng),在訪(fǎng)問(wèn)資源文件之前,通過(guò)一系列的過(guò)濾器對請求進(jìn)行修改、判斷等,把不符合規則的請求在中途攔截或修改。也可以對響應進(jìn)行過(guò)濾,攔截或修改響應。

      2、過(guò)濾器實(shí)現攔截過(guò)程

      1. 當客戶(hù)端向服務(wù)器發(fā)送請求后,在HttpServletRequest到達Servlet之前,過(guò)濾器對HTTPServletRequest進(jìn)行攔截
      2. 根據web.xml里的配置對請求攔截檢查,也可以修改請求頭和數據;
      3. 在過(guò)濾器中調用doFilter()方法,對請求放行(==注意==:必須調用doFilter方法,否則不往下執行)。
      4. 請求到達Servlet后,對請求進(jìn)行處理并產(chǎn)生HttpServletResponse發(fā)送給客戶(hù)端。
      5. 在HttpServletResponse到達客戶(hù)端之前,過(guò)濾器也可以攔截響應;
      6. 根據需要檢查HttpServletResponse,同樣可以修改;
      7. 最后,HttpServletResponse到達客戶(hù)端。

      3、過(guò)濾器與攔截器的不同之處

      1.過(guò)濾器:

      依賴(lài)于servlet容器。在實(shí)現上基于函數回調,可以對幾乎所有請求進(jìn)行過(guò)濾,但是缺點(diǎn)是一個(gè)過(guò)濾器實(shí)例只能在容器初始化時(shí)調用一次。使用過(guò)濾器的目的是用來(lái)做一些過(guò)濾操作,獲取我們想要獲取的數據,比如:在過(guò)濾器中修改字符編碼;在過(guò)濾器中修改HttpServletRequest的一些參數,包括:過(guò)濾低俗文字、危險字符等

      2.攔截器:

      依賴(lài)于web框架,在SpringMVC中就是依賴(lài)于SpringMVC框架。在實(shí)現上基于Java的反射機制,屬于面向切面編程(AOP)的一種運用。由于攔截器是基于web框架的調用,因此可以使用Spring的依賴(lài)注入(DI)進(jìn)行一些業(yè)務(wù)操作,同時(shí)一個(gè)攔截器實(shí)例在一個(gè)controller生命周期之內可以多次調用。但是缺點(diǎn)是只能對controller請求進(jìn)行攔截,對其他的一些比如直接訪(fǎng)問(wèn)靜態(tài)資源的請求則沒(méi)辦法進(jìn)行攔截處理

      3.兩者的區別:

      ①攔截器是基于java的反射機制的,而過(guò)濾器是基于函數回調。

      ②攔截器不依賴(lài)與servlet容器,過(guò)濾器依賴(lài)與servlet容器。

      ③攔截器只能對action請求起作用,而過(guò)濾器則可以對幾乎所有的請求起作用。

      ④攔截器可以訪(fǎng)問(wèn)action上下文、值棧里的對象,而過(guò)濾器不能訪(fǎng)問(wèn)。

      ⑤在action的生命周期中,攔截器可以多次被調用,而過(guò)濾器只能在容器初始化時(shí)被調用一次。

      ⑥攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調用業(yè)務(wù)邏輯。

      4、使用Filter實(shí)現用戶(hù)自動(dòng)登陸

      自動(dòng)登錄,第一次訪(fǎng)問(wèn)Servlet1,服務(wù)器會(huì )發(fā)送一個(gè)包含用戶(hù)信息的Cookie,之后當客戶(hù)端再次訪(fǎng)問(wèn)服務(wù)器時(shí),會(huì )向服務(wù)器回送Cookie,服務(wù)器就可以從Cookie中獲取用戶(hù)信息實(shí)現自動(dòng)登錄。

      問(wèn)題:所有的Servlet都要對用于的Cookie信息進(jìn)行校驗,導致Serlvet2\Servlet3等出現大量冗余代碼。

      解決:用Filter實(shí)現Cookie校驗用戶(hù)信息。

      登錄表單

      <%@ 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)) {
                      //實(shí)際中應當對密碼進(jìn)行加密!
                      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","用戶(hù)名或者密碼錯誤!");
                  req.getRequestDispatcher("/login.jsp").forward(req,resp);
              }
          }
      }
      

      過(guò)濾器實(shí)現自動(dòng)登錄

      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>顯示登錄的用戶(hù)信息</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" >用戶(hù)登錄</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>
          <!-- 攔截所有用戶(hù)請求 -->
          <url-pattern>/*</url-pattern>
        </filter-mapping>
      </web-app>
      

      5、測試

      輸入http://localhost/Project01/login.jsp

      關(guān)閉瀏覽器后,再次打開(kāi)瀏覽器輸入http://localhost/Project01/index.jsp

      以上就是Java 使用Filter實(shí)現用戶(hù)自動(dòng)登陸的詳細內容,更多關(guān)于Java 用Filter實(shí)現自動(dòng)登陸的資料請關(guān)注腳本之家其它相關(guān)文章!

      免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

      少妇人妻88久久中文字幕| 最近免费观看高清韩国日本大全| 国产乱妇无码大黄AA片| 粗大猛烈进出高潮视频免费看| 精品少妇人妻AV无码久久| 国产三级精品三级在线专1 |