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种处理情况:

  1. 本次会话的session还存在,表明还在当前登录状态,放行,直接跳转主页,显示【您好,欢迎您登录,用户名】;
  2. 本次会话的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 过滤器 自动登录相关推荐

  1. 使用Filter过滤器自动登录功能

    实现思路 1.首先判断是否勾选了自动登录按钮(LoginServlet文件中进行判断) 2.在LoginServlet 创建一个cookie 将用户的登录账号与密码保存到其中 ,存到客户端 3.返回到 ...

  2. java拦截到登陆界面,JavaWeb 使用Filter实现自动登录

    JavaWeb 使用Filter实现自动登录 思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期 ...

  3. Spring Boot Filter过滤器 实现登录

    Spring Boot Filter过滤器 实现登录 Filter类 package com.citi.test;import java.io.IOException;import javax.ser ...

  4. filter 过滤器用户登录并判断是否属于电脑端或者手机端访问

    package com.probiz.estorepf.authorityInterceptor; import javax.servlet.http.HttpServletRequest; publ ...

  5. Filter过滤器实现登录验证

    对该项目进行补充,当客户端发送请求时,验证用户是否登录 需求: 未登录状态下请求服务器端,请求将被拦截,跳转至登录页面,并提示账户未登录 对登录请求以及页面资源加载请求进行放行 实现: 使用注解拦截所 ...

  6. java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

    自动登录问题和MD5加密 前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截.这肯定不合适 ...

  7. Filter: 过滤器、装饰者设计模式解决乱码、自动登录

    一.Filter: 过滤器: 步骤: 1.自定义类, 实现Filter接口 2.重点实现doFilter方法 3.注册Filter @WebFilter web.xml-配置] 4.doFilter中 ...

  8. 使用过滤器实现自动登录(过滤器filter)

    自动登录 1. 创建实体类entity新建user类 package entity;public class User {private String username;private String ...

  9. 自动登录(过滤器filter的应用)

    //反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...

最新文章

  1. 电脑html按键侧滑广告,HTML5侧滑聊天面板
  2. java游戏一开始去山上打狐狸_。。。这才是Java的第一个程序------HelloWorld
  3. linux系统调用函数(C语言):open,close函数和文件描述符
  4. 关于Zend framework 里一段代码的疑问
  5. 各种推荐资料汇总。。。
  6. 02-合并frame
  7. 发年终奖了,创了新高
  8. 编写bat脚本指定jdk路径运行jar包
  9. 自定义键盘组件_WEB组件终极开发手册:让玩家没了鼠标也能操作
  10. 基于卷积神经网络与迁移学习的油茶病害图像识别
  11. Java计算机毕业设计树木交易平台源码+系统+数据库+lw文档
  12. as 贪食蛇小游戏(一)
  13. 基本算法4.1堆积木详细题解
  14. Apache的Order Allow,Deny 规则
  15. 自学前端开发,现在手握大厂offer,我的故事还在继续
  16. Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)...
  17. Jackson 解析j@JsonIgnorePropertiesson数据之忽略解析字段注解
  18. 巧用搜狗输入法输入英文单词
  19. PowerBuilder8.0和SQL Server2008稳定升级到PowerBuilder11.5和SQL Server2016源码无报错
  20. 解决 iBooks 无法显示 epub 电子书本身的 thumbnail

热门文章

  1. 解决windows10出现相机无法使用的问题,0xA00F4292<PhotoCaptureStartTimeout>
  2. html5实现简单表格
  3. 在c 语言中怎么建立文件,c语言——文件的创建与建立
  4. 2019首届武汉市网络安全技能大赛筹备会顺利召开
  5. 韦东山第10课—内核编译
  6. Qt源码重新编译QtMultimedia模块解决XP播放视频问题
  7. DB2可用于清空大量数据表的not logged initially
  8. Linux的adduser和useradd
  9. android培训教程Flutter尽然还能有这种操作!震撼来袭免费下载!
  10. python colorbar范围_python – 设置matplotlib colorbar范围