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

是指用户将用户的登录信息,人,保存到本地的文件中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. CDialog

    对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...

  2. hdu 4981

    中位数是否大于平均数 水题 #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...

  3. Java中对比两个对象中属性值[反射、注解]

    在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...

  4. CentOS搭建NFS服务

    系统结构 ----------------------------------------------------------------------------------------------- ...

  5. linux系统编程之错误处理:perror,strerror和errno

    1,在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述. errno这个全局变量在<errno.h>头文件中声明如下:extern int errno; errno是 ...

  6. java spring boot 开启监控信息

    效果: 配置 // pom <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  7. 【 PLSQL Developer安装、tnsnames.ora配置 解答】

    使用plsql远程连接数据库需要安装plsql工具+ oracle的远程客户端 在不登录的状态打开plsql: 点击工具---首选项:指定oracle客户端的安装路径: C:\javaSoft\PLS ...

  8. .NET 日志工具 log4net使用

    1.NuGet安装log4net. 2.修改配置文件 <?xml version="1.0"?> <configuration> <configSec ...

  9. MSSQL数据表生成模型

    MSSQL数据表生成模型 http://pan.baidu.com/s/1mhBAapy

  10. CefSharp禁止弹出新窗体,在同一窗口打开链接,并且支持带type="POST" target="_blank"的链接

    1.实现ILifeSpanHandler接口,代码如下: using CefSharp; using CefSharp.WinForms; using System; using System.Col ...