java 验证用户是否已经登录与实现自动登录方法详解
这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
本文主要介绍了 java 验证用户是否已经登录与实现自动登录的方法具有一定的参考价值, 下面跟着小编一起来看下吧
验证用户是否已经登录
- package cn.hongxin.filter;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class LoginFilter implements Filter {
- public void init(FilterConfig filterConfig) throws ServletException {}
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
- ServletException {
- // 将 request 强转成 htt...
- HttpServletRequest req = (HttpServletRequest) request;
- // 获取 session
- HttpSession ss = req.getSession();
- // 从 session 中获取 user
- if (ss.getAttribute("user") == null) {
- System.err.println("你还没有登录");
- req.getSession().setAttribute("msg", "请你先登录");
- // 重定向到登录
- HttpServletResponse resp = (HttpServletResponse) response;
- resp.sendRedirect(req.getContextPath() + "/index.jsp"); [W2]
- } else {
- // 放行
- chain.doFilter(request, response);
- }
- }
- public void destroy() {}
- }
配置到 web.xml 中且对 jsps/* 进行过虑:
- <filter>
- <filter-name>login</filter-name>
- <filter-class>cn.itcast.filter.LoginFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>login</filter-name>
- <url-pattern>/jsps/*</url-pattern>
- <url-pattern>/views/*</url-pattern>
- </filter-mapping>
实现自动登录
自动登录, 是为了帮助用户多次使用这个网页时, 不用再次输入用户名和密码就可以登录
是指用户将用户的登录信息, 人, 保存到本地的文件中 Cookie 中
Name,value 声明时 new Cookie(key,value);
Path - 默认值, 即为当前保存 cookie 的这个 serlvet 所在的路径
如果 Cookie 在这样的路径: http://loclhost:8080/project/abc/AServlet
则 Cookie 的路径为: http://loclhost/project/abc
则说明:
所在在 http://loclhost/project/abc 目录下的 servlet 才可以读取这个 cookie 的值
如果:
保存 Cookie 类: http://loclhost:8080/project/a/b/AServlet
则 Cookie 的默认 path 为;
http://loclhost/project/a/b
第一步: 开发一个登录页面
- <c:choose>
- <c:when test="${empty sessionScope.name}">
- <form name="x" method="post" action="<c:url value='/LoginServlet'/>">
- Name:<input type="text" name="name"/><br/>
- auto:
<input type="radio" name="auto" value="-1">不自动登录
<br/>
<input type="radio" name="auto" value="1">1 天 < br/>
<input type="radio" name="auto" value="7">1 周 < br/>
- <input type="submit" />
- </form>
- </c:when>
- <c:otherwise>
你已经登录了:${name}<br/>
- <a href="<c:url value='/LoginServlet'/>">退出</a>
- </c:otherwise>
- </c:choose>
第二步: 成功保存 cookie
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException {
- // 接收用户姓名
- String name = request.getParameter("name");
- String auto = request.getParameter("auto");
- // 将用户信息放到 session
- request.getSession().setAttribute("name", name);
- // 判断 auto 是否是 - 1
- if (!auto.equals("-1")) {
- int day = Integer.parseInt(auto); //1|7
- int seconds = 60 * 60 * 24 * day;
- // 声明 cookie
- Cookie c = new Cookie("autoLogin", name);
- c.setMaxAge(seconds);
- c.setPath(request.getContextPath());
- // 保存 cookie
- response.addCookie(c);
- }
- }
第三步: 要求访问本网点中任何一个页面都应该实现自动登录
写一个过虑器, 对所有 url=/* 进行过虑在 doFilter 中读取所有 cookie 是否存在名称为 autoLogin 的名称 cookie
永远都放行
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
- ServletException {
- // 在这儿读取 cookie
- HttpServletRequest req = (HttpServletRequest) request;
- // 获取所的有 cookie
- Cookie[] cs = req.getCookies();
- if (cs != null) {
- for (Cookie c: cs) {
- if (c.getName().equals("autoLogin")) { // 如果存在自动登录的 cookie
- String value = c.getValue(); // 用户名称
- // 登录成功是指
- req.getSession().setAttribute("name", value);
- break;
- }
- }
- }
- // 不管是否自动登录成
- chain.doFilter(request, response);
- }
第四涉: 配置到 web.xml 中对所有 url=/*
- <filter>
- <filter-name>auto</filter-name>
- <filter-class>cn.itcast.filter.AutoFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>auto</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
第五步: 开发退出
- System.err.println("用户退出");
- // 删除整个 session
- request.getSession().invalidate();
- Cookie c = new Cookie("autoLogin", "ddd");
- c.setMaxAge(0);
- c.setPath(request.getContextPath());
- response.addCookie(c);
- // request.getSession().removeAttribute("name");
- response.sendRedirect(request.getContextPath() + "/index.jsp");
第六步: 优化代码
由于用户在做手工登录时, 也会进入 AutoFiilter 的 doFilter 方法, 且读取所有 Cookie 遍历一次而这次遍历对用户来说是多余
所以应该将 LoginServet 这个 url 在 doFiler 中不过过虑
且对退出也不能自动登录
以上就是本文的全部内容, 希望本文的内容对大家的学习或者工作能带来一定的帮助, 同时也希望多多支持 PHPERZ!
来源: http://www.phperz.com/article/18/0212/358726.html