zoukankan      html  css  js  c++  java
  • cookies session filter 自动登录

    webxml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
      <display-name></display-name>
      <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.itheima.web.servlet.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/LoginServlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <filter>
        <display-name>CharacterEncodingFilter</display-name>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.itheima.web.filter.CharacterEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <filter>
        <display-name>AutoLoginFilter</display-name>
        <filter-name>AutoLoginFilter</filter-name>
        <filter-class>com.itheima.web.filter.AutoLoginFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>AutoLoginFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
      </filter-mapping>
     
    </web-app>

    domain 实体

    package com.itheima.domain;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        private String username;
        private String password;
        
        public User(String username, String password) {
            super();
            this.username = username;
            this.password = password;
        }
        
        public User() {
            super();
        }
    
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
    }

    模仿的数据库连接

    package com.itheima.domain;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class UserDB {
        private static List<User> users = new ArrayList<User>();
        static{
            users.add(new User("陈尧","123"));
            users.add(new User("李春鹏","123"));
            users.add(new User("凤姐","123"));
        }
        
        public static User findUser(String username,String password){
            for(User u:users){
                if(username.equals(u.getUsername())&&password.equals(u.getPassword())){
                    return u;
                }
            }
            return null;
        }
        
        public static User findUser(String username){
            for(User u:users){
                if(username.equals(u.getUsername())){
                    return u;
                }
            }
            return null;
        }
        
    }

    工具类

    package com.itheima.utils;
    
    import java.io.IOException;
    
    import org.junit.Test;
    
    import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    public class Base64Util {
    
        //编码    中文 -------------5Lit5paH
        public static String encode(String str){
            BASE64Encoder b64= new BASE64Encoder();
            return b64.encode(str.getBytes());
        }
        
        //解码   5Lit5paH----中文 
        public static String decode(String str){
            try {
                BASE64Decoder b64decoder = new BASE64Decoder();
                byte [] afterStr = b64decoder.decodeBuffer(str);
                return new String(afterStr);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        @Test
        public void testEncode(){
            String str = Base64Util.encode("中文");
            System.out.println(str);
            
            
            String newString = Base64Util.decode(str);
            
            System.out.println(newString);
        }
    }

    md5

    package com.itheima.utils;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import sun.misc.BASE64Encoder;
    
    public class Md5Util {
    
        //md5加密的方法
        public static String encode(String old){
            try {
                MessageDigest md5 = MessageDigest.getInstance("md5");
                byte newStr[] = md5.digest(old.getBytes());
                
                BASE64Encoder b64= new BASE64Encoder();
                return b64.encode(newStr);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

    filter

    package com.itheima.web.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.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.itheima.domain.User;
    import com.itheima.domain.UserDB;
    import com.itheima.utils.Base64Util;
    import com.itheima.utils.Md5Util;
    
    /**
     *过滤器,用于实现自动登录过滤
     */
    public class AutoLoginFilter implements Filter {
    
       
        public void destroy() {
            
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            //1.如果是进行登录操作,直接放行
            String resource = request.getRequestURI();//得到资源名
            boolean isLogin = resource.endsWith("login.jsp");//判断是否想进行登录操作
            if(!isLogin){
                //不是登录才处理
                //2.不是做登录操作,是否已登录过???
                User user= (User)request.getSession().getAttribute("user");
                if(user==null){
                    // 说明之前也没有登录过
                    
                    //3.就要读取Cookie并进行用户名密码的验证
                    //3.1如何读cookie
                    Cookie []cookies = request.getCookies();
                    if(cookies==null || cookies.length==0){
                        response.sendRedirect(request.getContextPath()+"/login.jsp");//cookie中没有保存之前的登录信息,就要重新登录
                        return;
                    }
                    
                    Cookie myCookie =null;
                    for (int i = 0; i < cookies.length; i++) {
                        Cookie c = cookies[i];//找一个cookie
                        if("loginedUser".equals(c.getName())){
                            //找到你想要的登录信息的cookie
                            myCookie = c;
                            break;
                        }
                    }
                    
                    //判断myCookie是否为空,如果不为空,说明找到登录过的用户信息的Cookie
                    if(myCookie!=null){
                        String usernameAndpassword = myCookie.getValue();//base64username_md5password
                        String username = usernameAndpassword.split("_")[0];//得到用户名
                        String password= usernameAndpassword.split("_")[1];//得到密码
                        
                        //得到解码后用户名
                        username = Base64Util.decode(username);
                        
                        //根据用户名,判断该用户在数据库中是否存在
                        User u = UserDB.findUser(username);
                        if(u!=null  && password.equals(Md5Util.encode(u.getPassword()))){
                            //你没登录,我自动给你登录了
                            request.getSession().setAttribute("user", u);
                        }
                    }
                    
                }
            }
            
            
            
            chain.doFilter(request, response);
        }
    
        
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    
    }

    编码filter

    package com.itheima.web.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;
    
    /**
     * Servlet Filter implementation class CharacterEncodingFilter
     */
    public class CharacterEncodingFilter implements Filter {
    
        
        public void destroy() {
            
        }
    
        
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");//post乱码
            response.setContentType("text/html;charset=UTF-8");//响应时没有乱码
            
            
            chain.doFilter(request, response);
        }
    
        
        public void init(FilterConfig fConfig) throws ServletException {
            
        }
    
    }

    sevlet

    package com.itheima.web.servlet;
    
    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;
    
    import com.itheima.domain.User;
    import com.itheima.domain.UserDB;
    import com.itheima.utils.Base64Util;
    import com.itheima.utils.Md5Util;
    /**
     * 登录 
     * @author wangli
     *
     */
    public class LoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.可能有乱码(不关注 ,因为过滤器已解决了)
            //2.获取参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String expires = request.getParameter("expires");
            //3.判断用户名密码有效性
            User u = UserDB.findUser(username, password);
            
            if(u==null){
                //登录失败
                response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp");
                response.getWriter().write("对不起,登录失败,2秒后跳到登录页");
                return ;
            }
            //4.如果正确,将用户信息存入Session
            request.getSession().setAttribute("user", u);
            //5.判断是否要保存一段 时间,如果是要存储  (存什么?   用户名(编码)_密码(加密))
            Cookie c  = new Cookie("loginedUser",Base64Util.encode(username)+"_"+Md5Util.encode(password));//数据库UserDb中有中文 ,而cookie文件中不能有中文
            //中文 可以先进行编码   ,当要使用中文时,又进行解码
            //6.设置cookie的有效期
            if("never".equals(expires)){
                c.setMaxAge(0);
            }else if("month".equals(expires)){
                c.setMaxAge(30*24*60*60);  //cookie存活时间 的单位:秒
            }else if("year".equals(expires)){
                c.setMaxAge(365*24*60*60);
            }else if("forever".equals(expires)){
                c.setMaxAge(Integer.MAX_VALUE);
            }
            
            c.setPath(request.getContextPath());
            
            //7.将cookie信息发送给浏览器
            response.addCookie(c);
            //8.进入主页面
            response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/index.jsp");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doGet(request, response);
    
        }
    
    }

    jsp

    <%@ 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>
        
        <title>XX网站</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
        
        <%
                //读取cookie
         %>
      </head>
      
      <body>
              <c:if test="${sessionScope.user==null}">
                  <a href="${pageContext.request.contextPath}/login.jsp">登录</a>
              </c:if>
              <c:if test="${sessionScope.user!=null}">
                  欢迎您:${user.username}<a href="#">注销</a>
              </c:if>
              <hr/>
              XX网站
              <a href="${pageContext.request.contextPath}/bbs.jsp">帖子</a>
      </body>
    </html>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title></title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
    
      </head>
      
      <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="expires" value="never" checked="checked"><input type="radio" name="expires" value="month">一个月
                    <input type="radio" name="expires" value="year">一年
                    <input type="radio" name="expires" value="forever">永久<br/>
            <input type="submit" value="登录"/>
        </form>
      </body>
    </html>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        
        <title></title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
    
        <%
                //读取cookie
         %>
      </head>
      
      <body>
        ${sessionScope.user.username}
      </body>
    </html>
  • 相关阅读:
    实际项目管理-1
    arcengine 错误
    一些视频技术类网站
    winform 组件之dotnetbar10.5.3
    winform 弹框的组件
    一个好的开源网站
    写webservice 注意点
    ww
    js
    瀑布流
  • 原文地址:https://www.cnblogs.com/baijin05/p/5087806.html
Copyright © 2011-2022 走看看