免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1101 | 回复: 0
打印 上一主题 下一主题

java—验证用户是否已经登录与实现自动登录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-02 09:16 |只看该作者 |倒序浏览
转载自:郑宏鑫erke
验证用户是否已经登录
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;
  1. public class LoginFilter implements Filter{

  2.     public void init(FilterConfig filterConfig) throws ServletException {

  3.     }

  4.     public void doFilter(ServletRequest request, ServletResponse response,

  5.            FilterChain chain) throws IOException, ServletException {

  6.        //将request强转成htt...

  7.        HttpServletRequest req = (HttpServletRequest) request;

  8.        //获取session

  9.        HttpSession ss = req.getSession();

  10.        //从session中获取user

  11.        if(ss.getAttribute("user")==null){

  12.            System.err.println("你还没有登录");

  13.            req.getSession().setAttribute("msg", "请你先登录");

  14.            //重定向到登录

  15.            HttpServletResponse resp = (HttpServletResponse) response;

  16.            resp.sendRedirect(req.getContextPath()+"/index.jsp");[W2]

  17.        }else{

  18.            //放行

  19.            chain.doFilter(request, response);

  20.        }

  21.     }

  22.     public void destroy() {

  23.     }

  24. }
复制代码
配置到web.xml中且对jsps/*进行过虑:
  1. <filter>

  2.     <filter-name>login</filter-name>

  3.     <filter-class>cn.itcast.filter.LoginFilter</filter-class>

  4.   </filter>

  5.   <filter-mapping>

  6.     <filter-name>login</filter-name>

  7.     <url-pattern>/jsps/*</url-pattern>

  8.     <url-pattern>/views/*</url-pattern>

  9.   </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

第一步:开发一个登录页面
  1. <c:choose>

  2.     <c:when test="${empty sessionScope.name}">

  3.         <form name="x" method="post" action="<c:url value='/LoginServlet'/>">

  4.             Name:<input type="text" name="name"/><br/>

  5.             auto:

  6.             <input type="radio" name="auto" value="-1">不自动登录

  7.             <br/>

  8.             <input type="radio" name="auto" value="1">1天<br/>

  9.             <input type="radio" name="auto" value="7">1周<br/>

  10.             <input type="submit"/>

  11.         </form>

  12.     </c:when>

  13.     <c:otherwise>

  14.         你已经登录了:${name}<br/>

  15.         <a href="<c:url value='/LoginServlet'/>">退出</a>

  16.     </c:otherwise>

  17. </c:choose>
复制代码
第二步:成功保存cookie
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)

  2.            throws ServletException, IOException {

  3.        //接收用户姓名

  4.        String name = request.getParameter("name");

  5.        String auto = request.getParameter("auto");

  6.        //将用户信息放到session

  7.        request.getSession().setAttribute("name",name);

  8.        //判断auto是否是-1

  9.        if(!auto.equals("-1")){

  10.            int day = Integer.parseInt(auto);//1|7

  11.            int seconds = 60*60*24*day;

  12.            //声明cookie

  13.            Cookie c = new Cookie("autoLogin",name);

  14.            c.setMaxAge(seconds);

  15.            c.setPath(request.getContextPath());

  16.            //保存cookie

  17.            response.addCookie(c);

  18.          

  19.        }

  20.     }
复制代码
第三步:要求访问本网点中任何一个页面都应该实现自动登录

    写一个过虑器,对所有url=/*进行过虑。在doFilter中读取所有cookie。是否存在名称为autoLogin的名称cookie。

    永远都放行。
  1. public void doFilter(ServletRequest request, ServletResponse response,

  2.            FilterChain chain) throws IOException, ServletException {

  3.        //在这儿读取cookie

  4.        HttpServletRequest req = (HttpServletRequest) request;

  5.        //获取所的有cookie

  6.        Cookie[] cs = req.getCookies();

  7.        if(cs!=null){

  8.            for(Cookie c:cs){

  9.               if(c.getName().equals("autoLogin")){//如果存在自动登录的cookie

  10.                   String value = c.getValue();//用户名称

  11.                   //登录成功是指

  12.                   req.getSession().setAttribute("name", value);

  13.                   break;

  14.               }

  15.            }

  16.        }

  17.        //不管是否自动登录成

  18.        chain.doFilter(request, response);

  19.     }
复制代码
第四涉:配置到web.xml中对所有url=/*
  1. <filter>

  2.     <filter-name>auto</filter-name>

  3.     <filter-class>cn.itcast.filter.AutoFilter</filter-class>

  4. </filter>

  5. <filter-mapping>

  6.     <filter-name>auto</filter-name>

  7.     <url-pattern>/*</url-pattern>

  8. </filter-mapping>
复制代码
第五步:开发退出
  1. System.err.println("用户退出");

  2.        //删除整个session

  3.        request.getSession().invalidate();

  4.        Cookie c = new Cookie("autoLogin", "ddd");

  5.        c.setMaxAge(0);

  6.        c.setPath(request.getContextPath());

  7.        response.addCookie(c);

  8. //     request.getSession().removeAttribute("name");

  9.        response.sendRedirect(request.getContextPath()+"/index.jsp");
复制代码
第六步:优化代码
  1. 由于用户在做手工登录时,也会进入AutoFiilter的doFilter方法,且读取所有Cookie遍历一次。而这次遍历对用户来说是多余。

  2.     所以应该将LoginServet这个url在doFiler中不过过虑。

  3.     且对退出也不能自动登录。

  4. 代码下载:http://pan.baidu.com/s/1mgnAfLQ
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP