Filter 过滤器 自动登录
Filter
过滤器 : 其实就是对客户端发出来的请求进行过滤。 浏览器发出, 然后服务器派servlet处理。 在中间就可以过滤, 其实过滤器起到的是拦截的作用。
作用:
- 对一些敏感词汇进行过滤
- 统一设置编码
- 自动登录
如何使用Filter:
1. 定义一个类, 实现Filter
/*** 过滤器简单测试*/
public class FilterDemo implements Filter {//销毁方法public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//客户端请求过来走这块System.out.println("过滤了");//放行方法chain.doFilter(request, response);//服务器回去走这块}//初始化方法public void init(FilterConfig fConfig) throws ServletException {}
}
2. 注册过滤器
在web.xml里面注册,注册的手法与servlet基本一样
<filter><display-name>FilterDemo</display-name><filter-name>FilterDemo</filter-name><filter-class>it.cast.filter.FilterDemo</filter-class></filter><filter-mapping><filter-name>FilterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Filter的生命周期
过滤器生命周期:
Filter执行顺序 :
- 创建: 服务器加载这个项目的时候创建实例
- 销毁: 关闭服务器或者从服务器中移除项目的时候
1. 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
2. 如果有多个过滤器, 那么他们会按照注册的映射顺序【<filter-mapping>】 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。
Filter细节:
1. init方法的参数 FilterConfig , 可以用于获取filter在注册的名字 以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的。
2. 如果想放行,那么在doFilter 方法里面操作,使用参数 chain
chain.doFilter(request, response); 放行, 让请求到达下一个目标。
3. <url-pattern>/*</url-pattern> 写法格式与servlet一样。
1. 全路径匹配 以 / 开始
/LoginServlet
2. 以目录匹配 以 / 开始 以 * 结束
/demo01/*
3. 以后缀名匹配 以 * 开始 以后缀名结束
*.jsp *.html *.do
4. 针对 dispatcher 设置【<filter-mapping>里面】
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。
ERROR : 页面出错发生跳转 拦截
INCLUDE : 包含页面的时候就拦截。
自动登录
项目名:AutoLoginDemo
需求:
1.用户第一次访问登录页面,服务器处理请求,检验用户名和密码。校验失败跳转到登录页;校验成功,完成登录,存储账号和密码到cookie,发送cookie到客户端,使用session来存储用户信息,页面跳转到主页,显示【您好,欢迎您登录,用户名】。
2.当用户直接访问主页时,过滤器分为2种处理情况:
- 本次会话的session还存在,表明还在当前登录状态,放行,直接跳转主页,显示【您好,欢迎您登录,用户名】;
- 本次会话的session失效,检查浏览器访问请求带来的cookie。若有cookie,则帮助用户完成登录,使用session来存储用户信息,放行,跳转主页,显示【您好,欢迎您登录,用户名】。没有cookie则表示没有登录,放行,跳转到主页,显示【请您去登录!】
代码:
数据库:
登录页面:login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="LoginServlet" method="post">用户名:<input type="text" name="username"><br>密码: <input type="password" name="password"><br><input type="checkbox" name="anto_login">自动登录<br><input type="submit" value="登录"></form></body>
</html>
首页:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>这是首页,<c:if test="${not empty userBean }">您好,欢迎您登录:${userBean.username }</c:if><c:if test="${empty userBean }">请您去登录!</c:if></body>
</html>
bean:UserBean
public class UserBean {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
UserDao:
public interface UserDao {/*** 用户登录* @param user 登录的用户信息* @return 用户的数据*/UserBean login(UserBean user)throws SQLException ;
}
UserDaoImpl:
public class UserDaoImpl implements UserDao {public UserBean login(UserBean user) throws SQLException {QueryRunner runner=new QueryRunner(JDBCUtil.getDataSource());String sql="select * from t_suer where username=? and password=?";return runner.query(sql, new BeanHandler<UserBean>(UserBean.class),user.getUsername(),user.getPassword() );}
}
负责处理登录页面的Servlet:
public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {//1.取值String username = request.getParameter("username");String password = request.getParameter("password");String anto_login = request.getParameter("anto_login");//2.把值封装成Userbean对象UserBean user=new UserBean();user.setUsername(username);user.setPassword(password);//3.数据库查询UserDao dao=new UserDaoImpl();UserBean userBean = dao.login(user);//判断if(userBean!=null) {//说明用户名和密码正确if("on".equals(anto_login)) {//勾选了自动登录Cookie cookie=new Cookie("anto_login", username+"#"+password);cookie.setMaxAge(60*60*24*7);//设置生存期限为1天cookie.setPath("/AutoLoginDemo");response.addCookie(cookie);}//保存到session里面,并且跳转到首页index.jsprequest.getSession().setAttribute("userBean", userBean);response.sendRedirect("index.jsp");}else {//用户名或密码错误,跳转到登录页request.getRequestDispatcher("login.jsp").forward(request, response);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
过滤器:AutoFilter
public class AutoFilter implements Filter {public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {try {HttpServletRequest request=(HttpServletRequest) req;//1.获取sessionUserBean userBean=(UserBean) request.getSession().getAttribute("userBean");if (userBean!=null) {//userBean还存在,说明本次会话还没结束,用户还在登录状态,直接放行chain.doFilter(request, response);} else {//2.会话结束,session失效了,获取Cookie里面的值Cookie[] cookies = request.getCookies();//从一堆的cookie里面找出我们以前给浏览器发的那个cookieCookie cookie = CookieUtil.findCookie(cookies, "anto_login");if (cookie==null) {//说明是第一次登录,直接放行chain.doFilter(request, response);}else {//3.说明不是第一次登录,设置自动登录String username = cookie.getValue().split("#")[0];String password = cookie.getValue().split("#")[1];//封装值到bean里面UserBean user=new UserBean();user.setUsername(username);user.setPassword(password);//查询数据库UserDao dao=new UserDaoImpl();userBean = dao.login(user);//把bean存到session中,方便下一次未过期前还可以用。request.getSession().setAttribute("userBean", userBean);chain.doFilter(req, response);}}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();chain.doFilter(req, response);}}public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}
}
过滤器配置文件:
<filter><display-name>AutoFilter</display-name><filter-name>AutoFilter</filter-name><filter-class>it.cast.filter.AutoFilter</filter-class></filter><filter-mapping><filter-name>AutoFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
工具类:
用于获取特定cookie的工具类:
public class CookieUtil {public static Cookie findCookie(Cookie[]cookies,String key ) {if (cookies!=null) {for (Cookie cookie : cookies) {if(key.equals(cookie.getName()))return cookie;}}return null;}
}
数据库的工具类:
/*** 使用C3P0改写的JDBCUtil工具类*/
public class JDBCUtil {static ComboPooledDataSource dataSource=null;static {dataSource=new ComboPooledDataSource();}/*** 因为要使用dbutil,所以要获取DataSource对象* @return DataSource对象*/public static DataSource getDataSource() {return dataSource;}/** jabc的连接 */public static Connection jdbcConn() throws SQLException {return dataSource.getConnection();}/** 关闭数据库的方法,释放资源*/public static void resease(ResultSet rs,Statement st,Connection conn) {rsclose(rs);stclose(st);connclose(conn);}public static void resease(Statement st,Connection conn) {stclose(st);connclose(conn);}private static void rsclose(ResultSet rs) {try {if(rs!=null)rs.close();} catch (SQLException e) {e.printStackTrace();}}private static void stclose(Statement st) {try {if(st!=null)st.close();} catch (SQLException e) {e.printStackTrace();}}private static void connclose(Connection conn) {try {if(conn!=null)conn.close();} catch (SQLException e) {e.printStackTrace();}}
}
c3p0配置:
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8"?><c3p0-config><default-config><property name="jdbcUrl">jdbc:mysql://localhost/stus</property><property name="user">root</property><property name="password">19930903</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="initialPoolSize">10</property><property name="maxIdleTime">30</property><property name="maxPoolSize">100</property><property name="minPoolSize">10</property><property name="maxStatements">200</property></default-config>
</c3p0-config>
Filter 过滤器 自动登录相关推荐
- 使用Filter过滤器自动登录功能
实现思路 1.首先判断是否勾选了自动登录按钮(LoginServlet文件中进行判断) 2.在LoginServlet 创建一个cookie 将用户的登录账号与密码保存到其中 ,存到客户端 3.返回到 ...
- java拦截到登陆界面,JavaWeb 使用Filter实现自动登录
JavaWeb 使用Filter实现自动登录 思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期 ...
- Spring Boot Filter过滤器 实现登录
Spring Boot Filter过滤器 实现登录 Filter类 package com.citi.test;import java.io.IOException;import javax.ser ...
- filter 过滤器用户登录并判断是否属于电脑端或者手机端访问
package com.probiz.estorepf.authorityInterceptor; import javax.servlet.http.HttpServletRequest; publ ...
- Filter过滤器实现登录验证
对该项目进行补充,当客户端发送请求时,验证用户是否登录 需求: 未登录状态下请求服务器端,请求将被拦截,跳转至登录页面,并提示账户未登录 对登录请求以及页面资源加载请求进行放行 实现: 使用注解拦截所 ...
- java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密
自动登录问题和MD5加密 前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截.这肯定不合适 ...
- Filter: 过滤器、装饰者设计模式解决乱码、自动登录
一.Filter: 过滤器: 步骤: 1.自定义类, 实现Filter接口 2.重点实现doFilter方法 3.注册Filter @WebFilter web.xml-配置] 4.doFilter中 ...
- 使用过滤器实现自动登录(过滤器filter)
自动登录 1. 创建实体类entity新建user类 package entity;public class User {private String username;private String ...
- 自动登录(过滤器filter的应用)
//反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...
最新文章
- 电脑html按键侧滑广告,HTML5侧滑聊天面板
- java游戏一开始去山上打狐狸_。。。这才是Java的第一个程序------HelloWorld
- linux系统调用函数(C语言):open,close函数和文件描述符
- 关于Zend framework 里一段代码的疑问
- 各种推荐资料汇总。。。
- 02-合并frame
- 发年终奖了,创了新高
- 编写bat脚本指定jdk路径运行jar包
- 自定义键盘组件_WEB组件终极开发手册:让玩家没了鼠标也能操作
- 基于卷积神经网络与迁移学习的油茶病害图像识别
- Java计算机毕业设计树木交易平台源码+系统+数据库+lw文档
- as 贪食蛇小游戏(一)
- 基本算法4.1堆积木详细题解
- Apache的Order Allow,Deny 规则
- 自学前端开发,现在手握大厂offer,我的故事还在继续
- Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)...
- Jackson 解析j@JsonIgnorePropertiesson数据之忽略解析字段注解
- 巧用搜狗输入法输入英文单词
- PowerBuilder8.0和SQL Server2008稳定升级到PowerBuilder11.5和SQL Server2016源码无报错
- 解决 iBooks 无法显示 epub 电子书本身的 thumbnail
热门文章
- 解决windows10出现相机无法使用的问题,0xA00F4292<PhotoCaptureStartTimeout>
- html5实现简单表格
- 在c 语言中怎么建立文件,c语言——文件的创建与建立
- 2019首届武汉市网络安全技能大赛筹备会顺利召开
- 韦东山第10课—内核编译
- Qt源码重新编译QtMultimedia模块解决XP播放视频问题
- DB2可用于清空大量数据表的not logged initially
- Linux的adduser和useradd
- android培训教程Flutter尽然还能有这种操作!震撼来袭免费下载!
- python colorbar范围_python – 设置matplotlib colorbar范围