jsp验证用户名和密码

来源:互联网 发布:c语言指针头文件 编辑:程序博客网 时间:2024/05/16 00:27

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
[html] view plain copy
print?
  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配置文件中设置过滤页
[html] view plain copy
print?
  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)文件中, 进行过滤验证:
[java] view plain copy
print?
  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
[html] view plain copy
print?
  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
[java] view plain copy
print?
  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映射关系:
[html] view plain copy
print?
  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
[html] view plain copy
print?
  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页面
源码下载
参考推荐:
跳过登陆页面直接访问该jsp文件
如何实现JSP页面的访问控制
session 保存登录信息
Application Session Cookie区别

原创粉丝点击