zoukankan      html  css  js  c++  java
  • (十四)用session和过滤器方法检验用户是否登录

    一、session方法

      1.1  编写登录页面文件(index.html)

    <!doctype html>
    <html>
    	<head>
    		<title>测试style标签中的media属性</title>
    		<meta http-equiv="content-type" content="text/html;charset=UTF-8">
    	
    		</style>
    	</head>
    	<body>
    		<form action="servlet/login" method="post">
    			用户名:<input type="text" name="userName" ><br/>
    			密 码:<input type="password" name="passWd" /><br/>
    			<input type="submit" />
    		</form>
    	</body>
    </html>
    

      1.2  表单提交之后,验证是否登陆正确,如果正确则记住登陆成功状态并跳转到主页。(LoginServlet.java《urlpattin=servlet/login》)

    package servlet;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.util.Properties;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class LoginServlet
     */
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public LoginServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		this.doPost(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out=response.getWriter();
    		Properties pro=new Properties();
    		InputStream in=this.getClass().getResourceAsStream("userInfo/userInfo.properties");		//从配置文件中取出配置文件的输入流
    		pro.load(in);                    //把输入流加载到Pro对象中,pro对象就可以操作流的数据。这里的userInfo.properties里的userName=admin passWd=123520
    		
    		//拿到注册用户帐号密码 进行对比
    		String userName=pro.getProperty("userName");	
    		String passWd=pro.getProperty("passWd");
    		
    		if(userName.equals(request.getParameter("userName"))){ //用户名正确
    			
    			if(passWd.equals(request.getParameter("passWd"))){ //验证密码
    				
    				//记录登录成功状态
    				request.getSession().setAttribute("login", "ok");
    				out.println("登录成功<br/>");
    				out.print("<a href='./main'>点我去主页</a>");   //如果信息正确,跳转到servlet,在这个servlet里检验login属性,如果是登录的loing=ok,
                                                //  如果是直接输入url没有登陆过的loing=null
                                                     }else{ out.println("密码错误<br/>"); out.print("<a href='../index.html'>点我返回</a>"); } }else{ out.println("用户名错误<br/>"); out.print("<a href='../index.html'>点我返回</a>"); } } }

     解析: 当用户提交表单后需要验证用户信息是否正确,如果正确则添加登录成功状态并跳转到主页,如果不正确则返回重新输入信息。

      1.3  当用户输入信息正确后,跳转到servlet,然后在servlet里检验是否已经登录过,即检查session里有没有登录成功的属性值。

    •       编写MainServlet.java文件(urlpatting=servlet/main)
    package servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class MainServlet
     */
    public class MainServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public MainServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		this.doPost(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		              //拿到serssion中的login值
    		String loginStatues=(String) request.getSession().getAttribute("login");
    		
    
    		if("ok".equals(loginStatues)){	    //登录过
    			
    			request.getRequestDispatcher("../html/main.html").forward(request, response);      //
    	
    		}
    		if(loginStatues==null){
    			response.sendRedirect("../index.html");
    		}
    	
    	}
    }
    
    • 主页(main.html)
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	主页
    </body>
    </html>
    

     结果:

     

    • 总结:用session记住登录状态来验证是否登录过的问题,但用户填好用户名密码发送到LoginServlet的时候,这个loginServlet主要用于检验用户输入的帐号密码是否正确,如果正确则说明登录成功此时需要记住登陆成功状态,即在session的attribute里设置login=ok,说明登录过,然后在跳转到MainServlet,MainServlet用于检验登录状态,即login是否等于ok,如果有则说明登录过那么直接跳转到主页即可,如果没有就跳转到登录页面重新登录即可。 这样就可以防止用户越过登陆页面访问主页。



    二、利用过滤器技术实现验证用户是否登录

      2.1  编写登录页面(index.html)

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="servlet/login" method="post" >
    	用户名:<input type="text" name="userName" /><br/>
    	密 码:<input type="password" name="passWd" /><br/>
    	<input type="submit" /></form>
    </body>
    </html>
    

      2.2  编写LoginServlet.java ,这个servlet用于验证用户输入的用户名密码是否正确,如果正确则添加登陆成功状态。(urlpatting=servlet/login)

    package servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class LoginServlet
     */
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public LoginServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		this.doPost(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    		String userName=request.getParameter("userName");
    		String passWd=request.getParameter("passWd");
    		
    		
    		if("admin".equals(userName)){	//检查用户名
    			if("123520".equals(passWd)){	//检查密码
    				
    				request.getSession().setAttribute("login", "ok");	//添加登陆成功状态的标识
    				request.getRequestDispatcher("/main").forward(request, response);	//跳转到主页
    				
    				
    			}else{
    				System.out.println("密码错误");
    			}
    	
    		}else{
    			response.sendRedirect("../index.html");	//
    		}	
    	}
    }
    

      2.3  编写主页页面(MainServlet.java)

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out=response.getWriter();
    		
    		out.print("欢迎登录主页");
    	}
    

      2.4  编写过滤器(LoginFilter.java)

    package 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;
    
    /**
     * Servlet Filter implementation class LoginFilter
     */
    public class LoginFilter implements Filter {
    
        /**
         * Default constructor. 
         */
        public LoginFilter() {
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see Filter#destroy()
    	 */
    	public void destroy() {
    		// TODO Auto-generated method stub
    	}
    
    	/**
    	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
    	 */
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest req=(HttpServletRequest)request;	//如果不转为HttpServletRequest则无法使用getsession()方法得到session里值。
    		HttpServletResponse res=(HttpServletResponse)response;
    		
    		Object login=req.getSession().getAttribute("login");
    		
    		if(!req.getRequestURI().endsWith("index.html") && !req.getRequestURI().endsWith("servlet/login") ){	//如果用户访问的是登录页面(index)或者填好表单正要发送到servlet/login里验证登录(此时等待验证所以没有login=ok的属性值),则直接放行。
    														//如果访问的不是这两种,那么需要对用户进行检验是否登陆过。
    			
    			if(login==null || !(login.equals("ok"))){
    				res.sendRedirect("index.html");
    				return;
    			}
    			
    		}
    		
    		chain.doFilter(request, response);	//如果用户访问的是index.html和servlet/login,直接放行。
    	}
    
    	public void init(FilterConfig fConfig) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    }
    

      注意:req.getRequestURI().endsWith("servlet/login") 获取用户request请求的URL中以servlet/login结尾的页面,其结尾是指项目名后面的路径,即本例中URL为“localhost:8080/text1/servlet/login” 故结尾为“servlet/login”。

  • 相关阅读:
    pyton 类(4) 静态方法
    python 类(3) property
    python 类(2)
    python 类(1)
    python 文件写入
    python 文件读取
    python 高阶函数 lamdad reduce map
    python 时间转换
    GDI+_从Bitmap里得到的Color数组值解决方案
    32位机,CPU是如何利用段寄存器寻址的
  • 原文地址:https://www.cnblogs.com/shyroke/p/6503263.html
Copyright © 2011-2022 走看看