1.目标:用户登录后,再次登录无需输入用户名和密码
2.思路:将用户的信息保存为cookie
每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接跳过登录页面,如果没有找到,那么切换到登录页面
3.具体代码
3.1登录界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html"> </head> <body> <p>主页 <p> <c:choose> <c:when test="${empty sessionScope.name}"> <form name="x" action="<c:url value='/LoginServlet' />" method="post"> name:<input type="text" name="name" /> auto: <input type="radio"name="auto" value="-1" checked="checked">不自动登陆 <input type="radio" name="auto" value="1">1天 <input type="radio" name="auto" value="7">7天 <input type="submit" value="提交"> </form> </c:when> <c:otherwise> 欢迎你:${name }<br> <a href="<c:url value='/LoginServlet'/>">退出</a> </c:otherwise> </c:choose> </body> </html>
3.2filter过滤器
package s051301; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; public class Filter implements javax.servlet.Filter{ private String encoding; public void init(FilterConfig con) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { System.err.println("dofilter service()"); req.setCharacterEncoding("UTF-8"); res.setContentType("text/html;charset=" + "UTF-8"); HttpServletRequest request=(HttpServletRequest)req; Cookie[] cs=request.getCookies(); if(cs!=null) { for(Cookie c:cs) { if(c.getName().equals("log")); //cookie怎么存的就怎么取 { String value=c.getValue(); //存放cookie中的值,就是用户的名称 request.getSession().setAttribute("name", value); break; } } } chain.doFilter(req, res); } public void destroy() { } }
3.3Servlet
package s051301; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String name=request.getParameter("name"); String auto=request.getParameter("auto"); System.err.println(name); System.err.println(auto); if(!auto.equals("-1")) { request.getSession().setAttribute("name", name); int day=Integer.parseInt(auto); int seconds=60*60*24*day; //声明cookie Cookie c=new Cookie("log",name); c.setMaxAge(seconds); c.setPath(request.getContextPath()); response.addCookie(c); } //重定向到主页 response.sendRedirect(request.getContextPath()+"/index.jsp"); } }
3.4web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <filter> <filter-name>filter</filter-name> <filter-class>s051301.Filter</filter-class> </filter> <filter-mapping> <filter-name>filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>s051301.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app>