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