最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

使用Filter實現(xiàn)用戶自動登陸

2021-05-08 11:31 作者:匯智知了堂  | 我要投稿

前言

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

1、什么是Filter

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

2、過濾器實現(xiàn)攔截過程

  1. 當客戶端向服務器發(fā)送請求后,在HttpServletRequest到達Servlet之前,過濾器對HTTPServletRequest進行攔截

  2. 根據(jù)web.xml里的配置對請求攔截檢查,也可以修改請求頭和數(shù)據(jù);

  3. 在過濾器中調(diào)用doFilter()方法,對請求放行(==注意==:必須調(diào)用doFilter方法,否則不往下執(zhí)行)。

  4. 請求到達Servlet后,對請求進行處理并產(chǎn)生HttpServletResponse發(fā)送給客戶端。

  5. 在HttpServletResponse到達客戶端之前,過濾器也可以攔截響應;

  6. 根據(jù)需要檢查HttpServletResponse,同樣可以修改;

  7. 最后,HttpServletResponse到達客戶端。


3、過濾器與攔截器的不同之處

1.過濾器:

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

2.攔截器:

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

3.兩者的區(qū)別:

①攔截器是基于java的反射機制的,而過濾器是基于函數(shù)回調(diào)。

②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。

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

④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。

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

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

4、使用Filter實現(xiàn)用戶自動登陸

自動登錄,第一次訪問Servlet1,服務器會發(fā)送一個包含用戶信息的Cookie,之后當客戶端再次訪問服務器時,會向服務器回送Cookie,服務器就可以從Cookie中獲取用戶信息實現(xiàn)自動登錄。

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

解決:用Filter實現(xiàn)Cookie校驗用戶信息。

  • 登錄表單

<%@ page contentType="text/html;charset=UTF-8" language="java" %>?

<html>?

<head> ? ?

<title>登錄表單</title> </head> <body style="text-align: center;">?

<h3>用戶登錄</h3>?

<form method="post" action="${pageContext.request.contextPath}/LoginServlet3">?

<table> ? ?

<tr> ? ? ? ?

<td height="30" align="center">用戶名:</td> ? ? ? ?

<td>&nbsp;&nbsp;<input type="text" name="username"/>${errorMsg}</td> ? </tr> ? ?

<tr> ? ? ? ?

<td height="30" align="center">密 碼</td> ? ? ? ?

<td>&nbsp;&nbsp;<input type="password" name="password"/></td> ? ?

</tr> ? ?<tr> ? ? ? ?

<td height="30" align="center">自動登錄時間</td> ? ? ? ?

<td>&nbsp;&nbsp; ? ? ? ? ? ?

<input type="radio" name="autoLogin" value="${60*60*24*31}"/>一個月 ? ? ? ? <input type="radio" name="autoLogin" value="${60*60*24*31*3}"/>三個月 ? ? ? <input type="radio" name="autoLogin" value="${60*60*24*31*12}"/>半年 ? ? ? <input type="radio" name="autoLogin" value="${60*60*24*31*24}"/>一年 ? ? ? ?</td> ? ?</tr> ? ?<tr> ? ? ? ?

<td height="30" colspan="2" align="center"> ? ? ? ? ? ?

<input type="submit" value="登錄"/> ? ? ? ? ? ?

<input type="reset" value="重置"/> ? ? ? ?

</td> ? ?

</tr>?

</table>?

</form>?

</body>?

</html>

登錄控制器

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); ? ? ? ?

} ? ?

} }


過濾器實現(xiàn)自動登錄

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">用戶登錄</a> ? ? ? ?</c:when> ? ? ? ?

<c:otherwise> ? ? ?歡迎你,${sessionScope.user.username } ? ? ? ? ??

<a href="${pageContext.request.contextPath }/LogoutServlet">退出</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、測試

輸入localhost/Project01/log

關(guān)閉瀏覽器后,再次打開瀏覽器輸入localhost/Project01/ind


使用Filter實現(xiàn)用戶自動登陸的評論 (共 條)

分享到微博請遵守國家法律
通榆县| 吐鲁番市| 隆回县| 元朗区| 天镇县| 遵义市| 来凤县| 和政县| 皮山县| 乌什县| 尤溪县| 高唐县| 兴国县| 新巴尔虎左旗| 杭锦旗| 云林县| 望奎县| 广安市| 马龙县| 奉贤区| 泽州县| 桂林市| 夹江县| 墨江| 永仁县| 息烽县| 香格里拉县| 定西市| 仙桃市| 西和县| 南昌市| 平远县| 海淀区| 巫溪县| 密云县| 刚察县| 固阳县| 措美县| 高尔夫| 靖边县| 遵义县|