cookies session filter 自动登录
webxml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name></display-name>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.itheima.web.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<display-name>CharacterEncodingFilter</display-name>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.itheima.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<display-name>AutoLoginFilter</display-name>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>com.itheima.web.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> </web-app>
domain 实体
package com.itheima.domain;
import java.io.Serializable;
public class User implements Serializable {
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
super();
}
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;
}
}
模仿的数据库连接
package com.itheima.domain; import java.util.ArrayList;
import java.util.List; public class UserDB {
private static List<User> users = new ArrayList<User>();
static{
users.add(new User("陈尧","123"));
users.add(new User("李春鹏","123"));
users.add(new User("凤姐","123"));
} public static User findUser(String username,String password){
for(User u:users){
if(username.equals(u.getUsername())&&password.equals(u.getPassword())){
return u;
}
}
return null;
} public static User findUser(String username){
for(User u:users){
if(username.equals(u.getUsername())){
return u;
}
}
return null;
} }
工具类
package com.itheima.utils; import java.io.IOException; import org.junit.Test; import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; public class Base64Util { //编码 中文 -------------5Lit5paH
public static String encode(String str){
BASE64Encoder b64= new BASE64Encoder();
return b64.encode(str.getBytes());
} //解码 5Lit5paH----中文
public static String decode(String str){
try {
BASE64Decoder b64decoder = new BASE64Decoder();
byte [] afterStr = b64decoder.decodeBuffer(str);
return new String(afterStr);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} @Test
public void testEncode(){
String str = Base64Util.encode("中文");
System.out.println(str); String newString = Base64Util.decode(str); System.out.println(newString);
}
}
md5
package com.itheima.utils; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class Md5Util { //md5加密的方法
public static String encode(String old){
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
byte newStr[] = md5.digest(old.getBytes()); BASE64Encoder b64= new BASE64Encoder();
return b64.encode(newStr);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
filter
package com.itheima.web.filter; 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; import com.itheima.domain.User;
import com.itheima.domain.UserDB;
import com.itheima.utils.Base64Util;
import com.itheima.utils.Md5Util; /**
*过滤器,用于实现自动登录过滤
*/
public class AutoLoginFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//1.如果是进行登录操作,直接放行
String resource = request.getRequestURI();//得到资源名
boolean isLogin = resource.endsWith("login.jsp");//判断是否想进行登录操作
if(!isLogin){
//不是登录才处理
//2.不是做登录操作,是否已登录过???
User user= (User)request.getSession().getAttribute("user");
if(user==null){
// 说明之前也没有登录过 //3.就要读取Cookie并进行用户名密码的验证
//3.1如何读cookie
Cookie []cookies = request.getCookies();
if(cookies==null || cookies.length==0){
response.sendRedirect(request.getContextPath()+"/login.jsp");//cookie中没有保存之前的登录信息,就要重新登录
return;
} Cookie myCookie =null;
for (int i = 0; i < cookies.length; i++) {
Cookie c = cookies[i];//找一个cookie
if("loginedUser".equals(c.getName())){
//找到你想要的登录信息的cookie
myCookie = c;
break;
}
} //判断myCookie是否为空,如果不为空,说明找到登录过的用户信息的Cookie
if(myCookie!=null){
String usernameAndpassword = myCookie.getValue();//base64username_md5password
String username = usernameAndpassword.split("_")[0];//得到用户名
String password= usernameAndpassword.split("_")[1];//得到密码 //得到解码后用户名
username = Base64Util.decode(username); //根据用户名,判断该用户在数据库中是否存在
User u = UserDB.findUser(username);
if(u!=null && password.equals(Md5Util.encode(u.getPassword()))){
//你没登录,我自动给你登录了
request.getSession().setAttribute("user", u);
}
} }
} chain.doFilter(request, response);
} public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }
编码filter
package com.itheima.web.filter; 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; /**
* Servlet Filter implementation class CharacterEncodingFilter
*/
public class CharacterEncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");//post乱码
response.setContentType("text/html;charset=UTF-8");//响应时没有乱码 chain.doFilter(request, response);
} public void init(FilterConfig fConfig) throws ServletException { } }
sevlet
package com.itheima.web.servlet; 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; import com.itheima.domain.User;
import com.itheima.domain.UserDB;
import com.itheima.utils.Base64Util;
import com.itheima.utils.Md5Util;
/**
* 登录
* @author wangli
*
*/
public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.可能有乱码(不关注 ,因为过滤器已解决了)
//2.获取参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String expires = request.getParameter("expires");
//3.判断用户名密码有效性
User u = UserDB.findUser(username, password); if(u==null){
//登录失败
response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp");
response.getWriter().write("对不起,登录失败,2秒后跳到登录页");
return ;
}
//4.如果正确,将用户信息存入Session
request.getSession().setAttribute("user", u);
//5.判断是否要保存一段 时间,如果是要存储 (存什么? 用户名(编码)_密码(加密))
Cookie c = new Cookie("loginedUser",Base64Util.encode(username)+"_"+Md5Util.encode(password));//数据库UserDb中有中文 ,而cookie文件中不能有中文
//中文 可以先进行编码 ,当要使用中文时,又进行解码
//6.设置cookie的有效期
if("never".equals(expires)){
c.setMaxAge(0);
}else if("month".equals(expires)){
c.setMaxAge(30*24*60*60); //cookie存活时间 的单位:秒
}else if("year".equals(expires)){
c.setMaxAge(365*24*60*60);
}else if("forever".equals(expires)){
c.setMaxAge(Integer.MAX_VALUE);
} c.setPath(request.getContextPath()); //7.将cookie信息发送给浏览器
response.addCookie(c);
//8.进入主页面
response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/index.jsp");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response); } }
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//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>XX网站</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> <%
//读取cookie
%>
</head> <body>
<c:if test="${sessionScope.user==null}">
<a href="${pageContext.request.contextPath}/login.jsp">登录</a>
</c:if>
<c:if test="${sessionScope.user!=null}">
欢迎您:${user.username}<a href="#">注销</a>
</c:if>
<hr/>
XX网站
<a href="${pageContext.request.contextPath}/bbs.jsp">帖子</a>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title></title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> </head> <body>
<form action="${pageContext.request.contextPath}/servlet/LoginServlet" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
登录有效期:<input type="radio" name="expires" value="never" checked="checked">无
<input type="radio" name="expires" value="month">一个月
<input type="radio" name="expires" value="year">一年
<input type="radio" name="expires" value="forever">永久<br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title></title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> <%
//读取cookie
%>
</head> <body>
${sessionScope.user.username}
</body>
</html>
cookies session filter 自动登录的更多相关文章
- Filter自动登录
Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾 ...
- 二十 Filter&自动登录功能
Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...
- JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码
一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...
- Filter实现session超时自动跳转到login页,超过试用期不许登录
新建一个过滤器 package com.autumn.filter; import com.autumn.pojo.Users; import javax.servlet.*; import java ...
- 实现自动登录:Filter 实现思路和方式
当你勾选(记住登录状态),用cookie保存用户名和密码.不勾选,cookie失效. 所有的页面都要经过autoLoginFilter.java 的过滤器,在这类中,必须要判断cookies不为nul ...
- 自动登录(过滤器filter的应用)
//反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...
- Filter应用之-自动登录
自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录. 是指用户将用户的登录信息,人,保存到本地的文件中Cookie中. Name,value – 声明时 new Cooki ...
- JavaWeb 使用Filter实现自动登录
思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期设置为0即可. 浏览器可以查看Cookie,不 ...
随机推荐
- HBase-1.2.1和Phoenix-4.7.0分布式安装指南
目录 目录 1 1. 前言 2 2. 概念 2 2.1. Region name 2 3. 约定 2 4. 相关端口 3 5. 下载HBase 3 6. 安装步骤 3 6.1. 修改conf/regi ...
- 深入浅出 MappedByteBuffer
前言 java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操 ...
- 寻找最大的K个数(下)
接着昨天的写,里面的代码包含昨天的 #include <iostream> using namespace std; #define N 50 //初始化数组 , , , , , , , ...
- Spring 之 IOC
IoC的全称是Inversion of Control,中文称为控制反转, Martin Flower由根据它创造了一个新词:Dependency Injection,中文称为依赖注入.这两个词讲的是 ...
- linux常见命令-查看磁盘空间
linux查看磁盘使用情况命令 1. 统一每个目录下磁盘的整体情况: df -h 2. 查看指定目录,在命令后直接放目录名,比如查看“usr”目录使用情况:df -h /usr/ 3. 查看当前目录 ...
- 如何注册GitHub
一.个人介绍 姓名:张志龙 学号:1413042026 班级:网工141 爱好:宅物 能力:c++编程 二.注册 注册GitHub其实很简单 首先我们要做的是打开官网 www.github.com(如 ...
- 常用脚本--Kill所有连接到指定数据库上的回话
USE [master] GO /****** Object: StoredProcedure [dbo].[Sp_KillAllProcessInDB] Script Date: 02/07/201 ...
- 使用Hbuilder将自己app发布到App Store(一)
1.如果你有mac系统那请看第二步. 首先需要一台虚拟机,还需要个插件要不没法装,都在这链接里面了 链接:https://pan.baidu.com/s/1N_pWJWFk-EJILTXuFr6w5g ...
- JAVA异常的最佳工程学实践探索
此文已由作者占金武授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 先说明一下背景: 项目日志中的Exception会被哨兵统一监控并报警 比较多的项目基于dubbo在做服务化 ...
- Vue前端数据采集 埋点 追踪用户系列行为
什么是埋点? 综合 vue埋点 埋点分析,是网站分析的一种常用的数据采集方法.数据埋点分为初级.中级.高级三种方式.数据埋点是一种良好的私有化部署数据采集方式. 埋点技术如何采集数据,有何优缺 ...