利用过滤器实现免登陆功能版本1

来源:互联网 发布:csol死神辅助源码 编辑:程序博客网 时间:2024/06/03 23:49

1 实现免登陆的思想:
当用户第一次登录的时候,如果用户设定了保存了密码,就把用户的信息 set到cookie文件里面
第二次利用过滤器 查看是否有相应的cookie文件,如果有执行相应的操作(类似与servlet)
具体的代码:
web.xml

  <filter>  <filter-name>AotoFilter</filter-name>  <filter-class>Filter.AotoFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>AotoFilter</filter-name>  <url-pattern>/login.jsp</url-pattern>  </filter-mapping>

login.jsp 进行登录的页面

<body><form action="${pageContext.request.contextPath}/servlet/loginservlet" method="post">用户名:<input type="text " name="username"><br>密码:<input type="password" name="password"><br>记住密码:<input type="radio" name="aoto" value="OK"><br><input type="submit" value="登录"></form>${msg }</body>

LoginServlet.java 控制器

public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String username = request.getParameter("username");        String password = request.getParameter("password");        String aoto = request.getParameter("aoto");        UserService us=new UserService();        User user=us.findUser(username,password);        //判断是否登录成功        if(user!=null){            //cookie存储的也是key  value类型            Cookie cookie = new Cookie("user", user.getUsername()+"&"+user.getPassword());            cookie.setPath("/");//当前应用 可以享用            if(aoto.equals("OK")){如果设置了 记住密码                cookie.setMaxAge(60*60*24*7);//设定7天有效            }            response.addCookie(cookie);//把cookie对象保存到客户端            request.setAttribute("user", user);            request.getRequestDispatcher("/home.jsp").forward(request, response);        }else{            request.setAttribute("msg", "用户名或密码错误,请重新登录");               //重新登录            request.getRequestDispatcher("/login.jsp").forward(request, response);        }    }

AotoFilter 过滤器 其实执行的程序和 servlet差不多

    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain filterchain) throws IOException, ServletException {        //1 转换两个对象HttpServletRequest,HttpServletResponse        HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse resp = (HttpServletResponse) response;        //2 处理业务逻辑          Cookie[] cookies = req.getCookies();  //得到带过来的cookie          //用户请求是带着 客户端里面的cookie文件的          String username=null;          String password=null;          //遍历需要的cookie文件          for(int i=0;cookies!=null&&i<cookies.length;i++){              if("user".equals(cookies[i].getName())){                  String[] strings = cookies[i].getValue().split("&");                  username=strings[0];                  password=strings[1];              }          }          //进行和servlet一样的操作             UserService us=new UserService();            User user=us.findUser(username, password);            if(user!=null){                req.getSession().setAttribute("user", user);                request.getRequestDispatcher("/home.jsp").forward(request, response);            }            //3放行            filterchain.doFilter(request, response);    }

对于 请求转发 和重定向的一些说明:
说明:
1 请求重定向的 路径规则 response.sendRedirect(“/AotoLogin/home.jsp”);规则: /项目名字/资源名字
2 请求重定向中 session里面set的东西 可以取出来,requestset的东西取不出,因为 request只是对一次请求内有效 ,也就是说 只要地址栏 不变化 就可以有效,重定向 发生了地址栏的变化
3如果是请求转发 那么session 和request 都可以set 地址栏不发生变化,可以取到
4 请求转发 可以直接写/ 资源名字
request.getRequestDispatcher(“/home.jsp”).forward(request, response);
5 重定向的 / 表示:http://服务器ip:端口
请求转发的 / 表示:http://服务器ip:端口/项目名
java.lang.IllegalStateException 遇到的情况
就是在本次的请求转发之前 已经把该请求转发出去了

原创粉丝点击