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 ...
随机推荐
- 类内初始值(c++11)
1.概念 1)可以为数据成员提供一个类内初始值,创建对象时,类内初始值用于初始化数据成员,没有初始值的成员将被默认初始化 2)类内初始值和赋值类似,或者放在花括号里(如数组),或者放在等号右边,不能使 ...
- Unit Testing of Spring MVC Controllers1
我们的pom.xml文件相关的部分看起来如下: <dependency> <groupId>com.fasterxml.jackson.core</groupId& ...
- HDU 3361 ASCII (水题,不说什么了)
题意:给你n个十进制数,让你输出相应的ASCII. 析:无,没说的,直接输出就好了. 代码如下: #include <iostream> #include <cstdio> # ...
- tomcat自动关闭了。
测试方法: 1.狂点抽取大量数据的接口 结果: jvm里面的现成崩溃.导致tomcat错误. 思路: 最近发现tomcat老是自动关闭,开始也发现了,不过没放在心上,直到今天,请求一提交到服务器,to ...
- 自定义方法实现strcpy,strlen, strcat, strcmp函数,了解及实现原理
位置计算字符串长度 //strlen()函数,当遇到'\0'时,计算结束,'\0'不计入长度之内 //字符串的拷贝 //strcpy(字符串1,字符串2); //把字符串2 ...
- Paper格式-国际会议版
Paper Title 论文题目 Authors Name/s per 1st Affiliation (Author) 作者名字/s 每第一作者 line 1 (of Affiliation): d ...
- About DNS
FQDN -- Fully Qualified Domain Name TTL -- Time To Live TLD -- Top Level Domain gTLD -- Generic Top ...
- Redis 慢查询
Redis 慢查询 许多存储系统提供慢查询日志帮助开发和运维人员定位系统的慢操作.慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值就将这条命令的相关信息记录下来Redis提供 ...
- saprk2 structed streaming
netcat (windows) >nc -L -p 9999 import java.sql.Timestamp import org.apache.spark.sql.SparkSessio ...
- html隐藏元素
<body> <div>display:元素的位置不被占用</div> <div id="div1" style="displa ...