自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录。

是指用户将用户的登录信息,人,保存到本地的文件中Cookie中。

Name,value – 声明时 new Cookie(key,value);

Path        - 默认值,即为当前保存cookie的这个serlvet所在的路径。

如果Cookie在这样的路径:http://loclhost:8080/project/abc/AServlet

则Cookie的路径为: http://loclhost/project/abc

则说明:

所在在http://loclhost/project/abc目录下的servlet才可以读取这个cookie的值。

如果:

保存Cookie类:http://loclhost:8080/project/a/b/AServlet

则Cookie的默认path为;

http://loclhost/project/a/b

对于path这个值可以手工设置:

如果设置为: http://loclhost/project/ 即到项目名。

则所有这个项目中的所有Serlvet|jsp都可以读取到这个 cookie.

Cookie.setPath(requst.getContextPath());

如果将path设置为   /

即:cookie.setpath(“/”); - http://localhost/

则所有在tomcat中运行的项目都可以读取这个到cookie.

如果path设置为/必须要与domain共同使用才有意义。

Age        - 默认值-1,在浏览器中存在。 0:删除文件中的cookie和浏览器中的cookie。

Domain     - 域 -

www.sina.com - login

www.bbs.sina.com

www.news.sina.com

删除时,必须要设置的与之前设置的信息完全一样:

Name

  Age = 0(文件和缓存),-1(只删除文件)

  Path 一样。

  Domain :null

下一次用户再打开这个网页时,应该读取cookie中的信息,实现自动登录。



思路:登录时用户勾选了记住密码几天,登录Servlet 里返回给浏览器一个Cookie,name是autoLogin,value是:(编码)用户名_(加密)密码,用户再次进来时,过滤器遍历所有的Cookie,看是否有一个叫autoLgin的Cookie。如果有,解析用户名密码。自动登录。其中加密部分借鉴了别人的文章感觉不错。连接

代码L:

User类:

package com.lhy.domain;

public class User {

  private String username;
private String password;
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;
}
}

LoginServlet:

@WebServlet(name="LoginServlet",urlPatterns="/LoginServlet")
public class LoginServlet extends HttpServlet{ @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.err.println("---------->LoginServlet");
req.setCharacterEncoding("UTF-8");
//
String username = req.getParameter("username");
String password = req.getParameter("password");
//是否自动登录
String auto = req.getParameter("auto");
if("lhy".equals(username) && "123".equals(password)){ //登录成功,将用户信息放session
User user = new User();
user.setUsername(username);
req.getSession().setAttribute("user", user); if(!"-1".equals(auto)){
//勾选了自动登录
int day = Integer.parseInt(auto);//1|7
int seconds = 60 * 60 * 24 * day;//cookie存活时间 单位:秒
//声明cookie
// 用户名(编码)_密码(加密))
//cookie不能存中文,用户名有中文编码后可以转为字母
Cookie c = new Cookie("autoLogin",Base64Util.encode(username)+"_"+Md5Util.encode(password));
c.setMaxAge(seconds);
c.setPath(req.getContextPath());
//保存cookie
resp.addCookie(c);
resp.sendRedirect(req.getContextPath()+"/jsps/main.jsp");
}
}else{
//登录失败
req.getSession().setAttribute("msg", "用户名或密码错误");
resp.sendRedirect(req.getContextPath()+"/index.jsp");
}
} }

LogoutServlet:

@WebServlet(name="LogoutServlet",urlPatterns="/LogoutServlet")
public class LogoutServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.err.println("用户退出");
//删除整个session
req.getSession().invalidate();
Cookie c = new Cookie("autoLogin","ddd");
c.setMaxAge(0);
c.setPath(req.getContextPath());
resp.addCookie(c);
//用户退出动作的标识
req.getSession().setAttribute("exit",true);
resp.sendRedirect(req.getContextPath()+"/index.jsp");
} }

过滤器:

public class AutoLoginFilter implements Filter{

  @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 在这儿读取cookie
HttpServletRequest req = (HttpServletRequest)request;
// 获取用户请求的uri
String uri = req.getRequestURI();//AutoLogin/index.jsp //1.对于登录、退出,直接放行
if(req.getSession().getAttribute("exit")==null){ //退出过来的
if(req.getSession().getAttribute("user")==null){
if(!uri.endsWith("index.jsp")){
//获取所有的cookie
Cookie[] cookies = req.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("autoLogin")){//如果存在自动登录的cookie
String usernameAndPassword = cookie.getValue();//用户名密码 base64username_md5password
String username = usernameAndPassword.split("_")[0];//base64用户名
String password = usernameAndPassword.split("_")[1];//md5密码 //解码用户名
username = Base64Util.decode(username);
//根据用户名查询,这里模拟。123的md5:ICy5YqxZB1uWSwcVLSNLcA==
if("lhy".equals(username) && "ICy5YqxZB1uWSwcVLSNLcA==".equals(password)){
//登录成功
User u = new User();
u.setUsername(username);
req.getSession().setAttribute("user", u);
break ;
}
}
}
}
}
}
}else{
//退出过来的,清除session里exit
req.getSession().removeAttribute("exit");
}
//不管是否自动登录成
chain.doFilter(request, response);
} @Override
public void destroy() {
} }

编码加密工具类:

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);
}
} public void testEncode(){ }
public static void main(String[] args) {
String str = Base64Util.encode("中文");
System.out.println(str); String newString = Base64Util.decode(str); System.out.println(newString);
}
}
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);
}
}
public static void main(String[] args) {
String s = Md5Util.encode("123");
System.err.println(s);//ICy5YqxZB1uWSwcVLSNLcA==
}
}

用到了 jar包:sun.misc.BASE64Decoder.jar

过滤器配置:

 <filter>
<filter-name>autoLogin</filter-name>
<filter-class>com.lhy.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>autoLogin</filter-name>
<!-- <url-pattern>*.jsp</url-pattern> -->
<url-pattern>/*</url-pattern>
</filter-mapping>

登录表单:

<body>
<c:if test="${not empty sessionScope.msg}">
<font color="red">
${sessionScope.msg}
</font>
<c:remove var="msg" scope="session"/>
</c:if>
<form name="x" method="post" action="<c:url value='/LoginServlet'/>">
Name:<input type="text" name="username"/><br/>
Password:<input type="password" name="password"/><br/>
auto:<input type="radio" name="auto" value="-1">不自动登录
<br/>
<input type="radio" name="auto" value="1">1天<br/>
<input type="radio" name="auto" value="7">1周<br/>
<input type="submit"/>
</form>
</body>

main.jsp:

<body>
这是首页,欢迎你:${user.username} | <a href="LogoutServlet">退出</a>
</body>

只是记录下学习到这个知识点,解决这个问题的思路,肯定还不完善,有错误清指出!谢谢!

Filter应用之-自动登录的更多相关文章

  1. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  2. 实现自动登录:Filter 实现思路和方式

    当你勾选(记住登录状态),用cookie保存用户名和密码.不勾选,cookie失效. 所有的页面都要经过autoLoginFilter.java 的过滤器,在这类中,必须要判断cookies不为nul ...

  3. Filter自动登录

    Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾 ...

  4. JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

    一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤

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

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

  6. cookies session filter 自动登录

    webxml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  7. JavaWeb 使用Filter实现自动登录

    思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期设置为0即可. 浏览器可以查看Cookie,不 ...

  8. 二十 Filter&自动登录功能

    Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...

  9. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

随机推荐

  1. js动态添加删除行,兼容ie和火狐

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Servlet从浅入深

    Servlet是什么 servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序). servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端 ...

  3. OpenGl 绘制一个立方体

    OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...

  4. mySQl数据库中不能插入中文的处理办法

    1. 修改MySQL安装目录下(C:\Program Files\MySQL\MySQL Server 5.5)的my.ini文件 设置: default-character-set=utf8 cha ...

  5. java socket编程(也是学习多线程的例子)详细版----转

    7.2 面向套接字编程    我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式 7.2.1使用套接字实现基于TCP协议的服务器和客户机程序  ...

  6. Delphi XE4 For IOS中程序的调试(虚拟机,真实机和win32)

    安装完之后,大家可以看一下XE4可以新建的工程类型: File->New: 是不是多出了FireMonkey Mobile Application这一个选项呀! 然后你再点击这个菜单项,弹出Fi ...

  7. what is HTTP OPTIONS verb

    The options verb is sent by browser to see if server accept cross origin request or not, this proces ...

  8. TFS 2015 生成不输出任何结果

    这是一台用于测试的TFS 2015服务器,其中的数据是通过备份和还原,在使用应用层专用的方式配置出来的. 在配置完成代理服务器以后,运行生成,发现在获取代码之前就停止失败了,并且在生成过程中没有任何结 ...

  9. Gzip压缩和解压

    /// <summary> /// 将传入字符串以GZip算法压缩后,返回Base64编码字符 /// </summary> /// <param name=" ...

  10. reids 安装

    第一步:在VMware中安装CentOS(参考Linux教程中的安装虚拟机) 第二步:在Linux下安装gcc环境 [root@hadoop ~]#yum install gcc-c++ 第三步:将下 ...