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
...
30
2) Java request.getSession().setMaxInactiveInterval(30*60); // 设置session失效时间(timeout),单位为秒
注: setMaxInactiveInterval() 比 web.xml 优先级高,如果两者同时设置则采用 setMaxInactiveInterval()
JSP 网页权限 JSP 网页权限,有两种配置方式: 1) include 文件 如: 验证文件 logincheck.jsp - <%
- if(session.getAttribute("userinfo") == null) {
- %>
- ");
- 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) - <%
- 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) - 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映射关系:
-
- Login
- Login
- Login
- com.homer.Login
-
-
-
- Login
- /login
-
注: Login.java映射成对样网页为/login,login可以在网页(html和jsp)form中指定,如 action="login"
用户登录界面
用户登录界面,是用户在访问整个网站之前需要访问的,因此最好制作成静态页面HTML,本例如:userlogin.html
注: 此时 action="login" 默认对应Java(Servlet)中对应的 Login.java 进行验证解析
userlogin.html 针对上述两种 用户登录验证 方式,分别提供了两种POST方式: 1) 针对JSP方式
2) 针对Java(Servlet)方式
本示例代码说明 本示例主要代码结构图如下:
1) head.jsp 和 foot.jsp 统一控制jsp页面的上,下部内容,类似ASP.NET的模板
2) index.jsp 网站默认的登录页面,本示例主要用作跳转到登录页面 userlogin.html :
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页面
|