Java 使用Filter实现用户自动登陆
作者:知了堂 发布时间:2022-10-13 13:32:47
目录
前言
1、什么是Filter
2、过滤器实现拦截过程
3、过滤器与 * 的不同之处
1.过滤器:
2. * :
3.两者的区别:
4、使用Filter实现用户自动登陆
5、测试
前言
安全,是如今互联网行业特别注重的一个话题。在大家学习了JavaWeb之后呢,发现一个网站应该有安全限制,例如:如果用户未登录,则不允许相关CRUD操作,而如果我们在后台的每一个Servlet都进行判断,将降低系统效率,也会出现大量代码冗余。因此,就有了Filter过滤器。
1、什么是Filter
Filter,过滤器,是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
2、过滤器实现拦截过程
当客户端向服务器发送请求后,在HttpServletRequest到达Servlet之前,过滤器对HTTPServletRequest进行拦截
根据web.xml里的配置对请求拦截检查,也可以修改请求头和数据;
在过滤器中调用doFilter()方法,对请求放行(==注意==:必须调用doFilter方法,否则不往下执行)。
请求到达Servlet后,对请求进行处理并产生HttpServletResponse发送给客户端。
在HttpServletResponse到达客户端之前,过滤器也可以拦截响应;
根据需要检查HttpServletResponse,同样可以修改;
最后,HttpServletResponse到达客户端。
3、过滤器与 * 的不同之处
1.过滤器:
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
2. * :
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于 * 是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个 * 实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
3.两者的区别:
① * 是基于java的反射机制的,而过滤器是基于函数回调。
② * 不依赖与servlet容器,过滤器依赖与servlet容器。
③ * 只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④ * 可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中, * 可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥ * 可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在 * 里注入一个service,可以调用业务逻辑。
4、使用Filter实现用户自动登陆
自动登录,第一次访问Servlet1,服务器会发送一个包含用户信息的Cookie,之后当客户端再次访问服务器时,会向服务器回送Cookie,服务器就可以从Cookie中获取用户信息实现自动登录。
问题:所有的Servlet都要对用于的Cookie信息进行校验,导致Serlvet2\Servlet3等出现大量冗余代码。
解决:用Filter实现Cookie校验用户信息。
登录表单
<%@ 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
来源:https://juejin.cn/post/6959762032715366408
猜你喜欢
- 前言:在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程
- MyBatis-plus模糊查询在使用MyBatis-plus的时候,一些基础的增删改查可以不用再自己写sql了:public interf
- 使用抽象类应该注意的几个要点:包含一个或者多个抽象方法的类必须被声明为抽象类. 将类声明为抽象类,不一定含有抽象方法.通常认为,在抽象类中不
- 1.Java Io流的概念,分类,类图。1.1 Java Io流的概念java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操
- Android 自定义View实现抽屉效果说明这个自定义View,没有处理好多点触摸问题View跟着手指移动,没有采用传统的scrollBy
- 在没讲.net如何随机生成汉字之前先给大家讲下汉字编码组成及原理。1、汉字编码原理到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个
- 本文实例讲述了Android编程中context及全局变量的用法。分享给大家供大家参考,具体如下:今天在研究context的时候,对appl
- 微信红包的使用已经很广泛,本篇文章介绍了微信发红包的实例,需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红包的权限即可。http
- 上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待!这次我们说说垃圾收集器,又名gc,顾名思义,就是收集
- 在Java的逻辑运算符中,有这么四类:&&(短路与),&,|,||(短路或)。&&和&都是表
- 一:背景1. 讲故事昨天在 StackOverflow 上看到一个很有趣的问题,说: 你会几种遍历字典的方式,然后跟帖就是各种奇葩的回答,挺
- 前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- Android 4.0 系统定义了一系列的高效导航方式 (Effective Navigation), 主要包括标签、下拉列表、以及向上和返
- 效果图白话分析:多线程:肯定是多个线程咯断点:线程停止下载的位置续传:线程从停止下载的位置上继续下载,直到完成任务为止。核心分析:断点:当前
- 这几天谷歌推出了as3.0的正式版,相信大家都进行更新了,然后对3.0的新特性也有过一些了解,最后磨刀霍霍开始宰杀,然鹅却一不小心就开始了排
- C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建的对象需要手动回收(有时不手动回收,可能出现内存溢出的问题)。C#调用C+
- 问题springboot 集成springcloud时常常由于版本问题而报错,如下:com.sun.jersey.api.client.Cl
- 本文实例展示了C#基于TimeSpan实现倒计时效果的方法,比较实用的功能,对于初学者来说有一定的学习参考价值。具体实现方法如下:示例代码如
- DAO模式是接口的一个典型应用。1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同
- SpringBoot打jar包遇到的xml文件丢失在pom.xml的build标签中添加如下内容指定资源路径<resources>