实现30天自动登录功能的思路(以原始servlet开发为例):
一、在LoginServlet中获取jsp页面提交过来的用户名和密码、
String name = request.getParameter("name");
String password = MD5Utils.md5Encrypt(request.getParameter("password"));
校验用户名和密码(判断用户名和密码是否在数据库中存在)、
String sql = "select * from user where name=? and password=?";
User user = null;
try{
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class), name, password);
}catch (Exception e) {
e.printStackTrace();
}
if(user == null){
response.getWriter().write("用户名或密码不存在!");
return;
}
如果数据库中存在该用户名和密码,则将用户名和密码保存到session中。如果勾选了“30天自动登录”,则新建一个Cookie,名称为autologin,将用户名和密码保存到cookie中,设置cookie的path为request.getContextPath(),保存时间为30天
request.getSession().setAttribute("user", user);
//如果用户勾选过30天内自动登录,则发送自动登录cookie
if("true".equals(request.getParameter("autologin"))){
Cookie autologinC = new Cookie("autologin", user.getName() + ":" + user.getPassword());
autologinC.setPath(request.getContextPath());
//设置cookie保存时间为30天
autologinC.setMaxAge(3600*24*30);
response.addCookie(autologinC);
}
二、在AutoLoginFilter过滤器中处理浏览器发送过来的cookie。步骤如下:
1、先判断是否已经登录,只有未登录的用户才能自动登录
if(req.getSession(false) == null || req.getSession().getAttribute("user") == null)
2、只有带了自动登录cookie的用户才能自动登录,读取浏览器发送过来的cookie
Cookie[] cs = req.getCookies();
Cookie findC = null;
if(cs != null){
for(Cookie c : cs){
if("autologin".equals(c.getName())){
findC = c;
break;
}
}
}
3、如果findC不为null。自动登录cookie中保存的用户名和密码都需要正确才能自动登录
String name = findC.getValue().split(":")[0];
String password = findC.getValue().split(":")[1];
String sql = "select * from user where name=? and password=?";
User user = null;
try{
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class),name, password);
}catch (Exception e) {
e.printStackTrace();
}
//user不等于null说明自动登录cookie中保存的用户名和密码都正确
if(user != null){
//将user保存到session中,下面执行chain.doFilter(request, response);代码后,将会首先跳转到index.jsp页面
req.getSession().setAttribute("user", user);
}
4、//无论是否自动登录,都放行资源
chain.doFilter(request, response);
三、将应用设为缺省web应用。有三种方式。
1、在tomcat的con文件夹的server.xml中修改(红色部分)
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="autoLogin" reloadable="false"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2、在workspace中的项目名下面workspace\autoLogin\.settings的org.eclipse.wst.common.component中修改
将<property name="context-root" value="autoLogin"/>该为<property name="context-root" value=""/>
3、将tomcat的webapps文件夹下面的应用名autologin改为ROOT
可是问题来了,当我把应用设为缺省web应用后。
LoginServlet中的autologinC.setPath(request.getContextPath())中request.getContextPath()的值为“”。导致每次访问主页都要重新登录(原因很简单,因为request.getContextPath()的值为“”的话,cookie根本就没有发送过来)
解决方法:
将LoginServlet中的autologinC.setPath(request.getContextPath())改为LoginServlet中的autologinC.setPath(“/”)