zoukankan      html  css  js  c++  java
  • 登录验证

    jsp安全性问题,当别人知道某个jsp文件的网址后就可以跳过登陆页面直接访问该jsp文件了,这样无法禁止外部无权限用户的访问。本文讨论内容是通过权限验证的用户,才可以访问特定的页面。

    JSP 页面验证,涉及到的知识有Session, 网页权限, 用户验证等。

    session对象

    session对象用来存储有关用户会话的所有信息,一个会话就是浏览器与服务器之间的一次通话,它包含浏览器与服务器之间的多次请求、响应过程。session是JSP内置对象,与浏览器一一对应,允许用户存储和提取会话状态的信息,信息保存在服务器端。

    
    
    
    
    session信息获取
    1) JSP
    session.setAttribute("userinfo", USERNAME);// session保存登录信息和用户名
    
    
    
    2) Java(Servlet)
    request.getSession().setAttribute("userinfo", USERNAME);   // session保存登录信息和用户名
    其中,request为HttpServletRequest对象,在doPost(HttpServletRequest request, HttpServletResponse response){...}引用
    
    
    session超时设置
    1) web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
        ...
        <session-config>
            <session-timeout>30</session-timeout>           <!-- 单位为分钟,例如30分钟 -->
        </session-config>
    </web-app>
    2) Java
    request.getSession().setMaxInactiveInterval(30*60);// 设置session失效时间(timeout),单位为秒
    
    注: setMaxInactiveInterval() 比 web.xml 优先级高,如果两者同时设置则采用 setMaxInactiveInterval()
    
    
    
    
    JSP 网页权限
    JSP 网页权限,有两种配置方式: 
    1) include 文件
    如: 验证文件 logincheck.jsp
    1. <%  
    2.     if(session.getAttribute("userinfo") == null) {  
    3. %>  
    4.         <script type="text/javascript" language="javascript">  
    5.             alert("您还没有登录,请登录...");  
    6.             window.document.location.href="userlogin.html";  
    7.         </script>   
    8. <%  
    9.     }  
    10. %>  
    <%
    	if(session.getAttribute("userinfo") == null) {
    %>
    		<script type="text/javascript" language="javascript">
    			alert("您还没有登录,请登录...");
    			window.document.location.href="userlogin.html";
    		</script>	
    <%
    	}
    %>
    在需要验证的jsp网页起始位置,包含logincheck.jsp , 例如在需要验证的jsp网页 page111.jsp 中添加
     <%@ include file="logincheck.jsp" %>
    
    
    2) filter 过滤
    首先,在web.xml配置文件中设置过滤页
    1. <filter>  
    2.     <filter-name>LoginFilter</filter-name>  
    3.     <filter-class>com.homer.LoginFilter</filter-class>    
    4. </filter>  
    5.   
    6. <filter-mapping>  
    7.     <filter-name>LoginFilter</filter-name>  
    8.     <url-pattern>/page222.jsp</url-pattern>  
    9. </filter-mapping>  
        <filter>
            <filter-name>LoginFilter</filter-name>
            <filter-class>com.homer.LoginFilter</filter-class>  
        </filter>
    
        <filter-mapping>
            <filter-name>LoginFilter</filter-name>
            <url-pattern>/page222.jsp</url-pattern>
        </filter-mapping>
    注: 目前配置方式仅仅是在用户访问page222.jsp的时候才走过滤器,也可以配置/*, /user/*等目录进行批量网页过滤

    然后,在 LoginFilter.java(web.xml配置文件中的com.homer.LoginFilter)文件中, 进行过滤验证:
    1. public class LoginFilter implements Filter {  
    2.     @Override  
    3.     public void init(FilterConfig arg0) throws ServletException {  
    4.     }  
    5.   
    6.     @Override  
    7.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {  
    8.         HttpServletRequest request = (HttpServletRequest)arg0;  
    9.         HttpServletResponse response = (HttpServletResponse)arg1;  
    10.           
    11.         HttpSession session = request.getSession();  
    12.         if(session.getAttribute("userinfo") == null) {  
    13.             response.setCharacterEncoding("utf-8");  
    14.             PrintWriter out = response.getWriter();  
    15.             out.print("<script>alert('您还没有登录,请登录...'); window.location='userlogin.html' </script>");  
    16.             out.flush();  
    17.             out.close();  
    18.   
    19. //          request.setAttribute("loginError", "您还没有登录,请登录...");   
    20. //          request.getRequestDispatcher("userlogin.html").forward(request, response);   
    21.         } else {  
    22.             arg2.doFilter(request, response);  
    23.         }  
    24.     }  
    25.   
    26.     @Override  
    27.     public void destroy() {  
    28.     }  
    29. }  
    public class LoginFilter implements Filter {
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
    	}
    
    	@Override
    	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
    		HttpServletRequest request = (HttpServletRequest)arg0;
    		HttpServletResponse response = (HttpServletResponse)arg1;
    		
    		HttpSession session = request.getSession();
    		if(session.getAttribute("userinfo") == null) {
    			response.setCharacterEncoding("utf-8");
    			PrintWriter out = response.getWriter();
    			out.print("<script>alert('您还没有登录,请登录...'); window.location='userlogin.html' </script>");
    			out.flush();
    			out.close();
    
    //			request.setAttribute("loginError", "您还没有登录,请登录...");
    //			request.getRequestDispatcher("userlogin.html").forward(request, response);
    		} else {
    			arg2.doFilter(request, response);
    		}
    	}
    
    	@Override
    	public void destroy() {
    	}
    }

    
    
    用户登录验证
    用户登录验证,有两种方式:JSP网页前端和Java(Serlvet)后台
    1) JSP网页前端验证(login.jsp
    1. <%  
    2.     String USERNAME = "admin";  
    3.     String USERPWD = "123456";  
    4.       
    5.     request.setCharacterEncoding("utf8");  
    6.   
    7.     String userName = request.getParameter("username").trim();  
    8.     String userPwd = request.getParameter("userpwd").trim();  
    9.       
    10.     if(userName == null || userPwd == null){  
    11.         response.sendRedirect("userlogin.html");  
    12.         return;  
    13.     }  
    14.       
    15.     if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {  
    16.         session.setMaxInactiveInterval(30*60);          // 设置session失效时间(timeout),单位为秒  
    17.         session.setAttribute("userinfo", USERNAME);     // 用户名和密码正确,保存登录信息  
    18.         response.sendRedirect("page111.jsp");  
    19.     } else {  
    20.         response.sendRedirect("userlogin.html");        // 用户名和密码错误,跳转到登录界面  
    21.     }  
    22. %>  
    <%
    	String USERNAME = "admin";
    	String USERPWD = "123456";
    	
    	request.setCharacterEncoding("utf8");
    
    	String userName = request.getParameter("username").trim();
    	String userPwd = request.getParameter("userpwd").trim();
    	
    	if(userName == null || userPwd == null){
    		response.sendRedirect("userlogin.html");
    		return;
    	}
    	
    	if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {
    		session.setMaxInactiveInterval(30*60);			// 设置session失效时间(timeout),单位为秒
    		session.setAttribute("userinfo", USERNAME);		// 用户名和密码正确,保存登录信息
    		response.sendRedirect("page111.jsp");
    	} else {
    		response.sendRedirect("userlogin.html");		// 用户名和密码错误,跳转到登录界面
    	}
    %>

    2) Java(Serlvet)后台验证(Login.java
    1. public class Login extends HttpServlet {  
    2.     private static final long serialVersionUID = 1L;  
    3.       
    4.     private final static String USERNAME = "admin";  
    5.     private final static String USERPWD = "123456";  
    6.       
    7.     @Override  
    8.     protected void doGet(HttpServletRequest request, HttpServletResponse response) {  
    9.     }  
    10.   
    11.     @Override  
    12.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    13.         request.setCharacterEncoding("utf-8");  
    14.           
    15.         String userName = request.getParameter("username").trim();  
    16.         String userPwd = request.getParameter("userpwd").trim();  
    17.           
    18.         if(userName == null || userPwd == null) {  
    19.             response.sendRedirect("userlogin.html");  
    20.         }  
    21.           
    22.         if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {  
    23.             request.getSession().setMaxInactiveInterval(30*60);     // 设置session失效时间(timeout),单位为秒   
    24.             request.getSession().setAttribute("userinfo", USERNAME);        // 用户名和密码正确,保存登录信息(获得session与jsp网页稍有不同)   
    25.             response.sendRedirect("page111.jsp");  
    26.         } else {  
    27.             response.sendRedirect("userlogin.html");            // 用户名和密码错误,跳转到登录界面   
    28.         }  
    29.     }  
    30. }  
    public class Login extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	
    	private final static String USERNAME = "admin";
    	private final static String USERPWD = "123456";
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		
    		String userName = request.getParameter("username").trim();
    		String userPwd = request.getParameter("userpwd").trim();
    		
    		if(userName == null || userPwd == null) {
    			response.sendRedirect("userlogin.html");
    		}
    		
    		if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {
    			request.getSession().setMaxInactiveInterval(30*60);		// 设置session失效时间(timeout),单位为秒
    			request.getSession().setAttribute("userinfo", USERNAME);		// 用户名和密码正确,保存登录信息(获得session与jsp网页稍有不同)
    			response.sendRedirect("page111.jsp");
    		} else {
    			response.sendRedirect("userlogin.html");			// 用户名和密码错误,跳转到登录界面
    		}
    	}
    }
    其中,需要在web.xml配置Servlet映射关系:
    1. <servlet>  
    2.     <description>Login</description>  
    3.     <display-name>Login</display-name>  
    4.     <servlet-name>Login</servlet-name>  
    5.     <servlet-class>com.homer.Login</servlet-class>  
    6. </servlet>  
    7.   
    8. <servlet-mapping>  
    9.     <servlet-name>Login</servlet-name>  
    10.     <url-pattern>/login</url-pattern>  
    11. </servlet-mapping>  
        <servlet>
            <description>Login</description>
            <display-name>Login</display-name>
            <servlet-name>Login</servlet-name>
            <servlet-class>com.homer.Login</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>Login</servlet-name>
            <url-pattern>/login</url-pattern>
        </servlet-mapping>
    注: Login.java映射成对样网页为/login,login可以在网页(html和jsp)form中指定,如 action="login"


    用户登录界面
    用户登录界面,是用户在访问整个网站之前需要访问的,因此最好制作成静态页面HTML,本例如:userlogin.html
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    2. <html>  
    3. <head>  
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    5. <title>userlogin.html</title>  
    6. </head>  
    7.   
    8. <body>  
    9. <center>  
    10.   
    11. <form method="POST" name="form1" action="login">  
    12. <table>  
    13.     <tr>  
    14.         <td>UserName : </td>  
    15.         <td><input type="text" name="username" /></td>  
    16.     </tr>  
    17.     <tr>  
    18.         <td>UserPwd : </td>  
    19.         <td><input type="text" name="userpwd" /></td>  
    20.     </tr>  
    21.     <tr>  
    22.         <td colspan="2" align="center">  
    23.             <input type="submit" name="btnSubmit" value="login"/>  
    24.         </td>  
    25.     </tr>  
    26. </table>  
    27. </form>  
    28.   
    29. </center>  
    30. </body>  
    31.   
    32. </html>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>userlogin.html</title>
    </head>
    
    <body>
    <center>
    
    <form method="POST" name="form1" action="login">
    <table>
    	<tr>
    		<td>UserName : </td>
    		<td><input type="text" name="username" /></td>
    	</tr>
    	<tr>
    		<td>UserPwd : </td>
    		<td><input type="text" name="userpwd" /></td>
    	</tr>
    	<tr>
    		<td colspan="2" align="center">
    			<input type="submit" name="btnSubmit" value="login"/>
    		</td>
    	</tr>
    </table>
    </form>
    
    </center>
    </body>
    
    </html>
    注: 此时 action="login" 默认对应Java(Servlet)中对应的 Login.java 进行验证解析
     
    
    
    userlogin.html 针对上述两种 用户登录验证 方式,分别提供了两种POST方式:
    1) 针对JSP方式
    <form method="POST" name="form1" action="login.jsp">
    
    
    
    
    
    2) 针对Java(Servlet)方式
    <form method="POST" name="form1" action="login">
    
    
    
    
    本示例代码说明
    本示例主要代码结构图如下:
    
    
    1) head.jsp 和 foot.jsp 
    统一控制jsp页面的上,下部内容,类似ASP.NET的模板
    
    
    2) index.jsp
    网站默认的登录页面,本示例主要用作跳转到登录页面  userlogin.html 
    <script type="text/javascript" language="javascript">
    window.location="userlogin.html";</script>
    
    
    
    3)userlogin.html
    静态登录页面,见上面 用户登录界面 的所示
    
    
    4) login.jsp 和 Login.java
    login.jsp 网页验证用户登录信息(用户名和密码),见上面的 用户登录验证 方式1
    Login.java 后台验证用户登录信息(用户名和密码),见上面的 用户登录验证 方式2
    5) logincheck.jsp 和 LoginFilter.java 
    logincheck.jsp 网页验证用户是否已登录,见上面的 JSP 网页权限方式1
    LoginFilter.java 后台验证用户是否已登录,见上面的 JSP 网页权限方式2
    6) page111.jsp, page222.jsp, page333.jsp
    (1) page111.jsp 
    采用  logincheck.jsp 网页权限验证,其代码内容为:
    <%@ include file="logincheck.jsp" %>
    <%@ include file="head.jsp" %>
    I am page111.jsp
    <%@ include file="foot.jsp" %>
    
    
    
    (2) page222.jsp 
    采用  logincheck.jsp 网页权限验证,其代码内容为:
    <%@ include file="head.jsp" %>
    I am page222.jsp
    <%@ include file="foot.jsp" %>
    注:采用filter过滤方式,在web.xml配置文件中设置了哪些jsp网页需要过滤,见上面JSP 网页权限 ---》2) filter 过滤
    
    
    (3) page333.jsp 
    采用  logincheck.jsp 网页权限验证,其代码内容为:
    <%@ include file="head.jsp" %>
    I am page333.jsp
    <%@ include file="foot.jsp" %>
    注: 没有任何验证,用户可以直接输入网址进行访问
    
    
    7) logout.jsp
    用户退出时,注销session中的登录信息
    <%
    session.invalidate();response.sendRedirect("http://blog.csdn.net/sunboy_2050/article/details/8032693");
    %>
    
    
    
    
    
    本示例运行界面:
    1) 登录界面
     userlogin.html 
    
    
    
    
    2) JSP 页面验证
    logincheck.jsp (或LoginFilter.java)页面访问前进行登录验证
    
    
    
    
    3) 验证通过访问JSP页面
    login.jsp(或Login.java)用户登录后才可以正常访问JSP页面
    
    
  • 相关阅读:
    HTML基础
    Java基础05-计算机单位
    Java基础04-运算符
    Java基础03-数据类型
    Java基础02-变量
    Java基础01-HelloWorld
    MarkDown基本使用
    短视频学习
    c# as 总结
    在C#中使用Nullable类型和 tuple类
  • 原文地址:https://www.cnblogs.com/LLLONG/p/2847833.html
Copyright © 2011-2022 走看看