cookie、session和java過濾器結(jié)合實(shí)現(xiàn)登陸程序
cookie、session和過濾器通常都是用在web應(yīng)用中,cookie和session用來保存一定的數(shù)據(jù),過濾器Filter則是在瀏覽器發(fā)出請求之后,而后臺執(zhí)行特定的請求之前發(fā)生一定的作用。之所以把這三個放一起,是因?yàn)橛泻芏鄷r候都會是把他們結(jié)合在一起使用,例如有些登陸程序。
cookie是瀏覽器的機(jī)制,session是服務(wù)器的機(jī)制,但是實(shí)際上cookie也是由服務(wù)器生成的,之后返回給瀏覽器的,并不是瀏覽器本身生成。當(dāng)瀏覽器發(fā)送某個請求時,如果擁有有效的cookie則會把這個cookie帶在一起。
之所有會有cookie的使用,是因?yàn)閔ttp協(xié)議原本是無狀態(tài)協(xié)議,也就是說通過http協(xié)議本身,服務(wù)器不能判斷瀏覽器是否之前訪問過。
Filter和servlet的寫法相似,編寫相關(guān)代碼的時候需要實(shí)現(xiàn)Filter接口并重寫相關(guān)的方法,通常更改較多的是doFilter方法。Filter代碼寫好以后如果需要發(fā)生效用,需要像配置servlet一樣在web.xml中 進(jìn)行一定的配置。
以下是一個簡單的結(jié)合cookie、session、Servlet和Filter的登陸示例代碼:
定義一個用戶實(shí)體類,充當(dāng)數(shù)據(jù)庫數(shù)據(jù),這里使用單例模式,保證只存在一個實(shí)例對象:
package models;
/**
* 用戶信息實(shí)體類
*
* @author tuzongxun123
*
*/
public class UserModel {
private String userName;
private String password;
// 單例模式,保證只有一個用戶對象實(shí)例
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界面,在form表單的action中使用jsp的特性獲得項(xiàng)目路徑:
<%@ 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>
對應(yīng)的后臺servlet:
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");
// 模擬數(shù)據(jù)庫數(shù)據(jù)
UserModel user = UserModel.getInstance();
String dbUserName = user.getUserName();
String dbPassword = user.getPassword();
if (dbUserName.equals(userName) && dbPassword.equals(password)) {
// 用戶名和密碼都匹配,證明登陸成功,設(shè)置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);
// 設(shè)置cookie的存儲時長
cookie.setMaxAge(60);
cookie2.setMaxAge(60);
// 把cookie發(fā)送給瀏覽器
resp.addCookie(cookie);
resp.addCookie(cookie2);
// 轉(zhuǎn)發(fā)請求到用戶列表
req.getRequestDispatcher("/userList").forward(req, resp);
} else {
// 轉(zhuǎn)發(fā)請求到登陸頁面
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
;
}
}
上邊登陸后跳轉(zhuǎn)的請求:
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();
//在瀏覽器中打印出用戶列表書數(shù)據(jù)
resp.getWriter().write(
"userName:" + user.getUserName() + "," + "password:"
+ user.getPassword());
}
}
項(xiàng)目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"> <!-- 訪問時的項(xiàng)目名稱 --> <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> <!-- 過濾器設(shè)置,瀏覽其發(fā)送請求后首先會走這里 --> <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> <!-- 輸入項(xiàng)目名訪問的默認(rèn)頁面 --> <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中的用戶名和密碼是否和數(shù)據(jù)庫中的一致,如果一致則放行,否則轉(zhuǎn)發(fā)請求到登陸頁面
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 {
}
}
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Sentinel熱門詞匯限流的實(shí)現(xiàn)詳解
這篇文章主要介紹了使用Sentinel對熱門詞匯進(jìn)行限流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java與Spring?boot后端項(xiàng)目Bug超全總結(jié)
Spring Boot是一個開源的 Java 開發(fā)框架,它的目的是簡化Spring應(yīng)用程序的開發(fā)和部署,下面這篇文章主要給大家介紹了關(guān)于Java與Spring?boot后端項(xiàng)目Bug的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
springboot項(xiàng)目接入第三方qq郵箱驗(yàn)證登錄的全過程
互聯(lián)網(wǎng)發(fā)展到現(xiàn)在,相必大家都知道發(fā)送郵件應(yīng)該是網(wǎng)站的必備功能之一,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目接入第三方qq郵箱驗(yàn)證登錄的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
MyBatis-Plus多數(shù)據(jù)源的示例代碼
本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價值,感興趣的可以了解一下2024-05-05
SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能
Milvus?是一種高性能、高擴(kuò)展性的向量數(shù)據(jù)庫,可在從筆記本電腦到大型分布式系統(tǒng)等各種環(huán)境中高效運(yùn)行,Deeplearning4j(DL4J)是一個開源的深度學(xué)習(xí)框架,專門為Java和Scala開發(fā),本文給大家介紹了SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能2024-10-10

