Filter应用之-自动登录
自动登录,是为了帮助用户多次使用这个网页时,不用再次输入用户名和密码就可以登录。
是指用户将用户的登录信息,人,保存到本地的文件中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为;
对于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.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应用之-自动登录的更多相关文章
- JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码
一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...
- 实现自动登录:Filter 实现思路和方式
当你勾选(记住登录状态),用cookie保存用户名和密码.不勾选,cookie失效. 所有的页面都要经过autoLoginFilter.java 的过滤器,在这类中,必须要判断cookies不为nul ...
- Filter自动登录
Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾 ...
- JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器
一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤
- 自动登录(过滤器filter的应用)
//反复实验的时候注意数据库数据的更新 //将数据存储到cookie里面 protected void doGet(HttpServletRequest request, HttpServletRes ...
- cookies session filter 自动登录
webxml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...
- JavaWeb 使用Filter实现自动登录
思路 使用cookie存储账号.密码,使用Filter拦截,从cookie中取出账号.密码.若用户要注销|登出.不再想使用自动登录,将cookie的有效期设置为0即可. 浏览器可以查看Cookie,不 ...
- 二十 Filter&自动登录功能
Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...
- java 自动登录代码
javaBean的代码 package bean; import java.io.Serializable; public class Admin implements Serial ...
随机推荐
- CDialog
对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...
- hdu 4981
中位数是否大于平均数 水题 #include <cstdio> #include <cstdlib> #include <cmath> #include <c ...
- Java中对比两个对象中属性值[反射、注解]
在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...
- CentOS搭建NFS服务
系统结构 ----------------------------------------------------------------------------------------------- ...
- linux系统编程之错误处理:perror,strerror和errno
1,在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述. errno这个全局变量在<errno.h>头文件中声明如下:extern int errno; errno是 ...
- java spring boot 开启监控信息
效果: 配置 // pom <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- 【 PLSQL Developer安装、tnsnames.ora配置 解答】
使用plsql远程连接数据库需要安装plsql工具+ oracle的远程客户端 在不登录的状态打开plsql: 点击工具---首选项:指定oracle客户端的安装路径: C:\javaSoft\PLS ...
- .NET 日志工具 log4net使用
1.NuGet安装log4net. 2.修改配置文件 <?xml version="1.0"?> <configuration> <configSec ...
- MSSQL数据表生成模型
MSSQL数据表生成模型 http://pan.baidu.com/s/1mhBAapy
- CefSharp禁止弹出新窗体,在同一窗口打开链接,并且支持带type="POST" target="_blank"的链接
1.实现ILifeSpanHandler接口,代码如下: using CefSharp; using CefSharp.WinForms; using System; using System.Col ...