实现30天自动登录功能的那些坑

实现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 &quot;%r&quot; %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(“/”)

猜你喜欢

转载自blog.csdn.net/wang1171405487/article/details/80219920