web(23)过滤器Filter

案例一:自动登录案例(过滤器Filter版)
1.需求:
  在各式网站上的对某个访问链接在上传请求到后台时,先对信息进行过滤,如果符合就放行,不符合就不放行。   
2.分析:
2.1技术分析
[Cookie技术]
可以用来存储你的用户名和密码
*利用Cookie记住用户的用户名额密码
[Filter:过滤器的概述]
>什么是过滤器:Filter:可以过滤从客户端向服务器发送的请求:
>过滤器的使用:
   *进行IP的过滤,脏话过滤,自动登录,响应压缩...
   地铁站安检机:发现问题就扣下,没有问题就放行
   过滤器:在请求到达目标资源之前,过滤器实施拦截,进行处理。功能强势
   过滤器存在于服务器中


方法:
destory()
init()
doFilter()
只要是客户端向服务器发送的请求均可拦截
编写过滤器的两个步骤:

1.写一个Java类 实现 过滤器接口

2.在web.xml配置过滤器的方法和Servlet一样,只不过名字或称Filter放行的方法:

chain.doFilter()
过滤器的使用:
在web.xml的url-pattern标签中。
写要拦截的jsp链接地址
3.过滤器的生命周期
》创建:服务器启动的时候就船舰了filter
》销毁;服务器关闭的时候
【FilterConfig的对象】
4.过滤器链
F1,F2,F3三个过滤器 会通过过滤器链会执行过滤器链
5.FilterConfig的配置对象
String getFilterName()
获得过滤器的名字
getInitParamter();
获得初始化参数
5.过滤器的执行顺序:
跟<filter-mapping >
的前后顺序有关。
6.自动登录:
虽然可以用java代码,但是jsp里面写Java代码不好
使用过滤器自动登录验证的思路:
一、先完成用户登录功能:
1.建立一个index.jsp:一开始index.jsp:如果用户没有登录,显示请先登录,有登录链接login.jsp;如果有登录,显示
"您好,"+nickname.
2.开始实现session利用过滤器实现自动登录
1)首先,当用户勾选自动登录复选框,并且登录成功后,要将用户名和密码存放在cookie中
登陆成功,将用户实体存放在session中。
2)设置一个过滤器 ,url-pattern指向login.jsp..这里注意了,过滤器Filter没有执行放行的时候,login.jsp是访问不到Servlet的
在过滤器中:

有登录的核心在于session中有实体类existUser


【案例1:使用过滤器Filter实现自动登录】代码

一、前端JSP层:

首先做一个首页index.jsp当用户没有登陆时候,会提示用户请先登录,跳转到登录页面login.jsp;当用户有登录,会显示用户的名称

1.index.jsp:

	<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
	<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
	<!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>Insert title here</title>
	</head>
	<body>
		<h1>用户首页</h1>
		<c:if test="${not empty existUser}">
			<!-- 显示昵称, -->
			<h2>您好,${existUser.nickname},<a href="#">退出</a></h2>
		</c:if>
		<c:if test="${empty existUser }">
			<h2>
				请先<a href="/day0613/demo/login.jsp">登录</a>
			</h2>
		</c:if>
	</body>
	</html>

2.login.jsp

<%@ page language="java" 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>Insert title here</title>
</head>
<body>
	<form action="/day0613/LoginServlet" method="post">
		用户名:<input type="text" id="username" name="username" /><br />
		密 码:<input type="password" id="password" name="password" /><br />
		<input type="checkbox" name="rm" value="1" />记住密码<br /> <input
			type="submit" value="登录" />
	</form>
</body>
</html>

二、后台代码

【servlet层】

1.LoginServlet.java

使用BeanUtils封装用户发送的请求数据,封装成一个实体类。到数据库中进行查询。存在该用户。就先存在session中,再存在cookie中。最后返回登录页面

package com.web.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Map;

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 org.apache.commons.beanutils.BeanUtils;

import com.web.bean.User;
import com.web.service.LoginService;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 * 1.接收参数: 2.封装数据: 3.调用业务层处理数据: 4.页面跳转
		 * 
		 */
		System.out.println("访问到了吗");
		response.setCharacterEncoding("UTF-8");
		// String username = request.getParameter("username");
		// String password = request.getParameter("password");
		// String remember = request.getParameter("rm");

		Map<String, String[]> parampterMap = request.getParameterMap();

		// 使用Bean封装
		User user = new User();
		try {
			BeanUtils.populate(user, parampterMap);
		} catch (Exception e) {
			e.printStackTrace();
		}

		User existUser = null;
		try {
			existUser = LoginService.findUser(user);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (existUser == null) {
			System.out.println("登录失败了");
			// 登录失败
			request.setAttribute("msg", "登录失败");
			request.getRequestDispatcher("/demo/login.jsp").forward(request, response);

		} else {
			// 登录成功
			// 如果记住:
			// 存储实体类到cookie中
			// 注意要写在前面 ,不然会报空指针
			String remember = request.getParameter("rm");
			if ("1".equals(remember)) {
				// 记住了
				Cookie cookie = new Cookie("autoLogin", user.getUsername() + "#" + user.getPassword());
				cookie.setPath("/day0613");
				cookie.setMaxAge(60 * 60 * 24 * 7);
				response.addCookie(cookie);

			}
			request.getSession().setAttribute("existUser", existUser);
			response.setHeader("text/html", "charset=UTF-8");
			response.sendRedirect("/day0613/demo/index.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

【Service层】

package com.web.service;


import java.sql.SQLException;


import com.web.bean.User;
import com.web.dao.LoginDao;


public class LoginService {


	public static User findUser(User user) throws SQLException {
		return LoginDao.findUser(user);
	}
}

【DAO层】

LoginDao.java:

public class LoginDao {

	public static User findUser(User user) throws SQLException {
		QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
		String sql = "select * from users where username=? and password=?";
		User existUser = (User) queryRunner.query(sql , new BeanHandler<User>(User.class),user.getUsername(),user.getPassword());
		return existUser;
	}
}

【Bean层】

User.java

package com.web.bean;

public class User {
	private String username;
	private String password;
	private String nickname;

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String username, String password, String nickname) {
		super();
		this.username = username;
		this.password = password;
		this.nickname = nickname;
	}

	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;
	}

	public String getNickname() {
		return nickname;
	}

	public void setNickname(String nickname) {
		this.nickname = nickname;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", nickname=" + nickname + "]";
	}

}

【Filter层】

存放过滤器的层 ,这里存放的是一个处理自动登录过滤的Filter

AutoLoginFilter.java

package com.web.filter;

import java.io.IOException;
import java.sql.SQLException;
import java.util.jar.JarInputStream;

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 com.web.bean.User;
import com.web.dao.LoginDao;
import com.web.utils.CookieUtils;


public class AutoLoginFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {

		// 先判断session有没有
		// 因为服务器如果没有关了,如果关闭浏览器,再打开浏览器就找不到SessionID
		// 如果有:放行
		// 如果没有:
		// 从cookie获取
		// cookie中没有:放行
		// 获取cookie中存的用户名和密码到数据库查询
		// 没有查询到:放行到首页
		HttpServletRequest request = (HttpServletRequest) req;
		User existUser = (User) request.getSession().getAttribute("existUser");

		if (existUser != null) {
			chain.doFilter(request, resp);
			// session中存在User。有登录成功.有两种情况:
			// 1.没有记住密码的登录成功,没有cookie;
			// 2.有记住密码的登录成功,有cookie;

		} else {
			Cookie[] cookies = request.getCookies();
			Cookie cookie = CookieUtils.findCookie(cookies, "autoLogin");
			if (cookie != null)
			{
				// 存在实体
				// 进一步判断这个cookie有没有被篡改
				// 到数据库中去验证。
				String userStr = cookie.getValue();
				String username = userStr.split("#")[0];
				String password = userStr.split("#")[1];
				User cookieUser = new User();
				cookieUser.setUsername(username);
				cookieUser.setPassword(password);
				User isUser = null;
				try {
					isUser = LoginDao.findUser(cookieUser);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if (isUser != null) {
					// 说明存在,将用户存到session中。
					request.getSession().setAttribute("existUser", existUser);
					chain.doFilter(request, resp);
					
				} else {
					//用户名或密码错误:cookie被篡改
					chain.doFilter(request, resp);
				}
			}else
			{
				//没有携带cookie的信息
				chain.doFilter(request, resp);
			}

		}
		chain.doFilter(request, resp);

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

}

【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"
	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>day0613</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	
	<!-- 自动登录的过滤器 -->
	<filter>
		<filter-name>AutoLoginFilter</filter-name>
		<filter-class>com.web.filter.AutoLoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AutoLoginFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.web.servlet.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/LoginServlet</url-pattern>
	</servlet-mapping>
</web-app>
【案例2:利用过滤器处理一个增强request类型的中文编码处理器】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值