您的位置:首页 > 其它

过滤器Filter的案例2——自动登录

2017-10-19 09:54 393 查看
过滤器Filter的案例2——自动登录

4、案例四: 自动登录的案例

(1)说明:

实现用户自动登陆的过滤器

在用户登陆成功后,以cookie形式发送用户名、密码给客户端

编写一个过滤器,filter方法中检查cookie中是否带有用户名、密码信息,如果存在则调用业务层登陆方法,登陆成功后则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

(2)实现思路:

重点:弄清楚的一点是,对于一个网站,曾经登录过,下次再登录时,可以自动登录
结论:就是第二次或者第二次以上使用该网站,处于未登录状态时,准备自动登录这样一个时刻

总的思路:【3步分析】
1.是否已经登录,如果登录,直接放行;如果没有登录,则进入2
2.获得带过来的cookie,如果没有找到,则直接放行;如果找到了,则进入3
3.获得cookie里的信息:用户名和密码,进行登录,如果登录失败,则直接放行,如果登录成功,则存入session中

(3)代码实现:



【1】页面:登录页面:login.jsp +登录信息页面: loginMessage.jsp

1.1登录页面:login.jsp

<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<form action="/filter/login" method="post">
用户名:<input type="text" name="name"><br/>
密     码:<input type="password" name="password"><br/>
自动登录<input type="checkbox" name="aotoLogin"  value="on"><br/>
<input type="submit" value="登录">    <input type="reset" value="重置">
</form>
</body>
</html>


1.2登录信息页面: loginMessage.jsp

<%@ page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
${msg }<br/>
<c:if test="${not empty user }">
欢迎你,${user.name}
</c:if>
</body>
</html>


【2】核心代码:

代码组成:User+ LoginServlet + UserDao + UserService + AutoLoginFilter过滤器

2.1User

package com.zhku.jsj144.zk.filter.aotoLogin;
public class User {
private String name;//用户名
private String password;//密码
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}


2.2LoginServlet

package com.zhku.jsj144.zk.filter.aotoLogin;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取登录信息
String name = request.getParameter("name");
String password = request.getParameter("password");
String aotoLogin = request.getParameter("aotoLogin");//选中为:on,未选中为:null
System.out.println("autoLogin:"+aotoLogin);

UserService userservice=new UserService();
User user=userservice.login(name,password);//进行登录判断
if(user==null){//登录失败
request.setAttribute("msg","登录失败,用户名或者密码错误");
request.getRequestDispatcher("/loginMessage.jsp").forward(request,response);
}
else{//登录成功

//选中自动登录,才进行设置cookie信息
if("on".equals(aotoLogin)){
//设置登录成功的cookie
Cookie cookie=new Cookie("user",name+"---"+password);//将用户名,密码保存到

//name="张三"+password="123"---失败
//抛出异常:Controlcharacter in cookie value or attribute.
//原因是有关中文编码的问题,中文采用的是unicode编码,而英文采用的是ASCII编码,
//所以当COOkie保存中文的时候需要对中文进行编码,而且从Cookie中取出内容的时候也要进行解码,编码和解码可以使用
//URLEncoder.encode(name,"utf-8");
//URLDecoder.decode(cookies[i].getName(),"utf-8")

cookie.setMaxAge(60*60*24);//一天
cookie.setPath("/");//路径?????
response.addCookie(cookie);//服务器恢复给浏览器信息的时候,把cookie带过去
}

//设置登录成功的session
request.getSession().setAttribute("user",user);
//设置成功信息
request.setAttribute("msg","登录成功");
request.getRequestDispatcher("/loginMessage.jsp").forward(request,response);
}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request,response);

}

}


2.3UserDao

package com.zhku.jsj144.zk.filter.aotoLogin;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

//持久层
public class UserDao {
public User login(String name, String password) {
QueryRunner qr=new QueryRunner(JdbcUtils.getDatasourse());

try{
User user=qr.query("select * from user where name=? and password=?",newBeanHandler(User.class),name,password);
return user;
}catch (SQLException e) {
throw new RuntimeException(e);
}
}

}


2.4UserService

package com.zhku.jsj144.zk.filter.aotoLogin;
//业务层
public class UserService {
public User login(String name, String password) {
UserDao userDao=new UserDao();
return userDao.login(name,password);
}

}


2.5AutoLoginFilter过滤器

package com.zhku.jsj144.zk.filter.aotoLogin;

import java.io.IOException;

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 javax.servlet.http.HttpServletResponse;
//自动登录过滤器
//弄清楚的一点是:对于一个网站,曾经登录过,下次再登录时,可以自动登录
//结论:就是第二次或者第二次以上使用该网站,处于未登录状态时,准备自动登录这样一个时刻
public class AutoLoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//总的思路:3步分析
//1.是否已经登录,如果登录,直接放行;如果没有登录,则进入2
//2.获得带过来的cookie,如果没有找到,则直接放行;如果找到了,则进入3
//3.获得cookie里的信息:用户名和密码,进行登录,如果登录失败,则直接放行,如果登录成功,则存入session中

//代码实现

HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse  resp=(HttpServletResponse)response;

//1.是否已经登录,如果登录,直接放行;如果没有登录,则进入2
User user=(User) req.getSession().getAttribute("user");
if(user!=null){
chain.doFilter(req,resp);//放行
}
else{
//2.获得带过来的cookie,如果没有找到,则直接放行;如果找到了,则进入3
Cookie[] cookies = req.getCookies();
for(Cookie cookie : cookies) {
if(!cookie.getName().equals("user")){
chain.doFilter(req,resp);//放行
}
else{
//3.获得cookie里的信息:用户名和密码,进行登录,如果登录失败,则直接放行,如果登录成功,则存入session中
String value = cookie.getValue();
//                                             Cookie("user",name+"---"+password)   //user: name+"---"+password
String[] split = value.split("---");
String name=split[0];
String password=split[1];
UserService userService=new UserService();
User  loginUser=userService.login(name, password);
if(loginUser==null){//登录失败
chain.doFilter(req,resp);//放行
}
else{//登录成功
//登录并保存session信息
req.getSession().setAttribute("user",loginUser);
req.getRequestDispatcher("/loginMessage.jsp").forward(req,resp);
chain.doFilter(req,resp);//放行
}
}
}
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
@Override
public void destroy() {}
}


【3】工具类:JdbcUtils.java + 配置文件:c3p0-config.xml

3.1 JdbcUtils.java

package com.zhku.jsj144.zk.filter.aotoLogin;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/*
* 工具类
* 1、获得数据源【c3p0】
* 2、获得c3p0连接池中的一个连接
*/
public class JdbcUtils {

private static DataSource ds=new ComboPooledDataSource();//数据库连接池的数据源

public static DataSource getDatasourse(){
returnds;//返回数据库连接池的数据源
}
public Connection getConnection() throws SQLException{
return ds.getConnection();//从数据库连接池中获取一个连接
}
}


3.2配置文件:c3p0-config.xml

<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost/filter?useSSL=false</property>
<property name="user">root</property>
<property name="password">1234</property>
</default-config>

<!-- This app is massive! -->
<named-config name="intergalactoApp">
<property name="maxPoolSize">1000</property>
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>

</named-config>
</c3p0-config>


【4】jar包:

c3p0连接池jar包:c3p0-0.9.1.2.jar

mysql数据库驱动:mysql-connector-java-5.0.8-bin.jar

数据库操作框架(dbuitls):commons-dbutils-1.4.jar

【5】web.xml文件配置

<!--  自动登录过滤器 -->

<filter>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>com.zhku.jsj144.zk.filter.aotoLogin.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


【6】数据库情况介绍

--数据库及其数据表的相关创建语句
 create databasefilter;
 use filter;
 create table user(
   id int,
   name varchar(30),
   password varchar(30)
 );
insert into user values(1,'张三','123');
insert into user values(1,'zk','123');
insert into user values(1,'123','123');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: