禁止浏览器缓存所有动态页面
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //让Web资源不缓存,很简单,设置http中response的请求头即可了! //我们使用的是http协议,ServletResponse并没有能够设置请求头的方法,所以要强转成HttpServletRequest //一般我们写Filter都会把他俩强转成Http类型的 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); //放行目标资源的response已经设置成不缓存的了 chain.doFilter(request, response); }
没有过滤之前,响应头是这样的:
过滤之后,响应头是这样的:
实现自动登陆
开发实体、集合模拟数据库、Dao
- 实体:
private String username ; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } //各种setter和getter
集合模拟数据库
public class UserDB { private static List<User> users = new ArrayList<>(); static { users.add(new User("aaa", "123")); users.add(new User("bbb", "123")); users.add(new User("ccc", "123")); } public static List<User> getUsers() { return users; } public static void setUsers(List<User> users) { UserDB.users = users; } }
开发dao
public User find(String username, String password) { List<User> userList = UserDB.getUsers(); //遍历List集合,看看有没有对应的username和password for (User user : userList) { if (user.getUsername().equals(username) && user.getPassword().equals(password)) { return user; } } return null; }
登陆界面
<form action="${pageContext.request.contextPath}/LoginServlet"> 用户名<input type="text" name="username"> <br> 密码<input type="password" name="password"> <br> <input type="radio" name="time" value="10">10分钟 <input type="radio" name="time" value="30">30分钟 <input type="radio" name="time" value="60">1小时 <br> <input type="submit" value="登陆"> </form>
处理登陆的Servlet
//得到客户端发送过来的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); UserDao userDao = new UserDao(); User user = userDao.find(username, password); if (user == null) { request.setAttribute("message", "用户名或密码是错的!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } //如果不是为空,那么在session中保存一个属性 request.getSession().setAttribute("user", user); request.setAttribute("message", "恭喜你,已经登陆了!"); //如果想要用户关闭了浏览器,还能登陆,就必须要用到Cookie技术了 Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + user.getPassword()); //设置Cookie的最大声明周期为用户指定的 cookie.setMaxAge(Integer.parseInt(request.getParameter("time")) * 60); //把Cookie返回给浏览器 response.addCookie(cookie); //跳转到提示页面 request.getRequestDispatcher("/message.jsp").forward(request, response);
过滤器
HttpServletResponse response = (HttpServletResponse) resp; HttpServletRequest request = (HttpServletRequest) req; //如果用户没有关闭浏览器,就不需要Cookie做拼接登陆了 if (request.getSession().getAttribute("user") != null) { chain.doFilter(request, response); return; } //用户关闭了浏览器,session的值就获取不到了。所以要通过Cookie来自动登陆 Cookie[] cookies = request.getCookies(); String value = null; for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("autoLogin")) { value = cookies[i].getValue(); } } //得到Cookie的用户名和密码 if (value != null) { String username = value.split("\\.")[0]; String password = value.split("\\.")[1]; UserDao userDao = new UserDao(); User user = userDao.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); } } chain.doFilter(request, response);
效果:
改良
我们直接把用户名和密码都放在了Cookie中,这是明文的。懂点编程的人就会知道你的账号了。
于是乎,我们要对密码进行加密!
Cookiecookie=newCookie("autoLogin",user.getUsername()+"."+md5.md5(user.getPassword()));
- 在过滤器中,加密后的密码就不是数据库中的密码的。所以,我们得在Dao添加一个功能【根据用户名,找到用户】
public User find(String username) { List<User> userList = UserDB.getUsers(); //遍历List集合,看看有没有对应的username和password for (User user : userList) { if (user.getUsername().equals(username)) { return user; } } return null; }
在过滤器中,比较Cookie带过来的md5密码和在数据库中获得的密码(也经过md5)是否相同
//得到Cookie的用户名和密码 if (value != null) { String username = value.split("\\.")[0]; String password = value.split("\\.")[1]; //在Cookie拿到的密码是md5加密过的,不能直接与数据库中的密码比较 UserDao userDao = new UserDao(); User user = userDao.find(username); //通过用户名获得用户信息,得到用户的密码,用户的密码也md5一把 String dbPassword = md5.md5(user.getPassword()); //如果两个密码匹配了,就是正确的密码了 if (password.equals(dbPassword)) { request.getSession().setAttribute("user", user); } }
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y