案例练习:自动登陆
需求:点开网页时自动登陆
一:
//粗略版代码
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//1.将请求和响应强转
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//2.获取指定的cookie
Cookie c = GetCookie.getCookieByName(request.getCookies(),"autologin");
//能获取指定的cookie 就完成登陆
if(c!=null){
System.out.println("1自动登陆!!");
String name = c.getValue().split("-")[0];
String password = c.getValue().split("-")[1];
User user=null;
try {
user = new LoginService().LoginByName_Pword(name,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user!=null){
//保存到session 中
request.getSession().setAttribute("user",user);
//给出登陆成功的提示
//response.sendRedirect("/success1.jsp"); 跳转页面在当前filter 过滤的范围内,会变成死循环
}
}
System.out.println("1 filter 执行");
//3.放行
filterChain.doFilter(request,response);
}
执行细节分析
粗略版:filter 的配置为/* 过滤所有的访问
初次登录并且访问,并且选择自动登陆
执行后的输出:
filter执行
回写cookie
登录成功
自动登录
filter执行
分析执行细节:(过滤所有的请求)
1.访问login :被过滤,并没有获取指定的cookie,放行
2.在servlet 中完成登录,判断勾选自动登陆,回写Cookie
3.在servlet 中页面跳转到提示登录页面,被过滤,到filter 中执行。最后放行到提示登录成功的页面(这个请求为jsp 页面,并不是servlet 所以最后放行的页面是jsp 登录成功的提示页面)
二:改良版
1.针对过滤的请求的范围做出判断和修改,总不能是个请求都被过滤,然后在后台都实现了自动登录
2.当登陆第二个用户时,无法正常登录(一般登录,登录的是上一个登录的用户,只有记住密码才能完成登陆)
1.自动登陆是需要一次,就是没有登录时--session中没有user 时
2.在过滤的时候不需要过滤所有访问,不是所有请求都需要自动登陆(访问登录或者是注册页面的时候不需要纳入过滤范围-不需要自动登陆)