JSP 页面访问用户验证

4 篇文章 0 订阅
1 篇文章 0 订阅

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. <filter-mapping>
  6. <filter-name>LoginFilter</filter-name>
  7. <url-pattern>/page222.jsp</url-pattern>
  8. </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. @Override
  6. public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
  7. HttpServletRequest request = (HttpServletRequest)arg0;
  8. HttpServletResponse response = (HttpServletResponse)arg1;
  9. HttpSession session = request.getSession();
  10. if(session.getAttribute("userinfo") == null) {
  11. response.setCharacterEncoding("utf-8");
  12. PrintWriter out = response.getWriter();
  13. out.print("<script>alert('您还没有登录,请登录...'); window.location='userlogin.html' </script>");
  14. out.flush();
  15. out.close();
  16. // request.setAttribute("loginError", "您还没有登录,请登录...");
  17. // request.getRequestDispatcher("userlogin.html").forward(request, response);
  18. } else {
  19. arg2.doFilter(request, response);
  20. }
  21. }
  22. @Override
  23. public void destroy() {
  24. }
  25. }
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. request.setCharacterEncoding("utf8");
  5. String userName = request.getParameter("username").trim();
  6. String userPwd = request.getParameter("userpwd").trim();
  7. if(userName == null || userPwd == null){
  8. response.sendRedirect("userlogin.html");
  9. return;
  10. }
  11. if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {
  12. session.setMaxInactiveInterval(30*60); // 设置session失效时间(timeout),单位为秒
  13. session.setAttribute("userinfo", USERNAME); // 用户名和密码正确,保存登录信息
  14. response.sendRedirect("page111.jsp");
  15. } else {
  16. response.sendRedirect("userlogin.html"); // 用户名和密码错误,跳转到登录界面
  17. }
  18. %>
<%
	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. private final static String USERNAME = "admin";
  4. private final static String USERPWD = "123456";
  5. @Override
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) {
  7. }
  8. @Override
  9. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10. request.setCharacterEncoding("utf-8");
  11. String userName = request.getParameter("username").trim();
  12. String userPwd = request.getParameter("userpwd").trim();
  13. if(userName == null || userPwd == null) {
  14. response.sendRedirect("userlogin.html");
  15. }
  16. if(userName.equals(USERNAME) && userPwd.equals(USERPWD)) {
  17. request.getSession().setMaxInactiveInterval(30*60); // 设置session失效时间(timeout),单位为秒
  18. request.getSession().setAttribute("userinfo", USERNAME); // 用户名和密码正确,保存登录信息(获得session与jsp网页稍有不同)
  19. response.sendRedirect("page111.jsp");
  20. } else {
  21. response.sendRedirect("userlogin.html"); // 用户名和密码错误,跳转到登录界面
  22. }
  23. }
  24. }
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. <servlet-mapping>
  8. <servlet-name>Login</servlet-name>
  9. <url-pattern>/login</url-pattern>
  10. </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. <body>
  8. <center>
  9. <form method="POST" name="form1" action="login">
  10. <table>
  11. <tr>
  12. <td>UserName : </td>
  13. <td><input type="text" name="username" /></td>
  14. </tr>
  15. <tr>
  16. <td>UserPwd : </td>
  17. <td><input type="text" name="userpwd" /></td>
  18. </tr>
  19. <tr>
  20. <td colspan="2" align="center">
  21. <input type="submit" name="btnSubmit" value="login"/>
  22. </td>
  23. </tr>
  24. </table>
  25. </form>
  26. </center>
  27. </body>
  28. </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页面
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值