JSP 页面访问用户验证
jsp安全性问题,当别人知道某个jsp文件的网址后就可以跳过登陆页面直接访问该jsp文件了,这样无法禁止外部无权限用户的访问。本文讨论内容是通过权限验证的用户,才可以访问特定的页面。
JSP 页面验证,涉及到的知识有Session, 网页权限, 用户验证等。
session对象
session对象用来存储有关用户会话的所有信息,一个会话就是浏览器与服务器之间的一次通话,它包含浏览器与服务器之间的多次请求、响应过程。session是JSP内置对象,与浏览器一一对应,允许用户存储和提取会话状态的信息,信息保存在服务器端。
代码语言:javascript复制session信息获取代码语言:javascript复制1) JSP代码语言:javascript复制session.setAttribute("userinfo", USERNAME); // session保存登录信息和用户名代码语言:javascript复制代码语言:javascript复制2) Java(Servlet)代码语言:javascript复制request.getSession().setAttribute("userinfo", USERNAME); // session保存登录信息和用户名
其中,request为HttpServletRequest对象,在doPost(HttpServletRequest request, HttpServletResponse response){...}引用代码语言:javascript复制代码语言:javascript复制session超时设置
1) web.xml代码语言:javascript复制
...
代码语言:javascript复制代码语言:javascript复制代码语言:javascript复制2) Java代码语言:javascript复制request.getSession().setMaxInactiveInterval(30*60); // 设置session失效时间(timeout),单位为秒代码语言:javascript复制注: setMaxInactiveInterval() 比 web.xml 优先级高,如果两者同时设置则采用 setMaxInactiveInterval()代码语言:javascript复制代码语言:javascript复制代码语言:javascript复制JSP 网页权限代码语言:javascript复制JSP 网页权限,有两种配置方式: 代码语言:javascript复制1) include 文件代码语言:javascript复制如: 验证文件 logincheck.jsp代码语言:javascript复制代码语言:javascript复制<%
if(session.getAttribute("userinfo") == null) {
%>
alert("您还没有登录,请登录...");
window.document.location.href="userlogin.html";
<%
}
%>
在需要验证的jsp网页起始位置,包含 logincheck.jsp , 例如在需要验证的jsp网页 page111.jsp 中添加
代码语言:javascript复制 <%@ include file="logincheck.jsp" %>代码语言:javascript复制代码语言:javascript复制2) filter 过滤代码语言:javascript复制首先,在web.xml配置文件中设置过滤页代码语言:javascript复制代码语言:javascript复制
注: 目前配置方式仅仅是在用户访问page222.jsp的时候才走过滤器,也可以配置/*, /user/*等目录进行批量网页过滤
代码语言:javascript复制然后,在 LoginFilter.java(web.xml配置文件中的com.homer.LoginFilter)文件中, 进行过滤验证:代码语言:javascript复制代码语言:javascript复制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("");
out.flush();
out.close();
// request.setAttribute("loginError", "您还没有登录,请登录...");
// request.getRequestDispatcher("userlogin.html").forward(request, response);
} else {
arg2.doFilter(request, response);
}
}
@Override
public void destroy() {
}
}代码语言:javascript复制代码语言:javascript复制用户登录验证代码语言:javascript复制用户登录验证,有两种方式:JSP网页前端和Java(Serlvet)后台代码语言:javascript复制1) JSP网页前端验证(login.jsp)代码语言:javascript复制代码语言:javascript复制<%
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"); // 用户名和密码错误,跳转到登录界面
}
%>代码语言:javascript复制2) Java(Serlvet)后台验证(Login.java)代码语言:javascript复制代码语言:javascript复制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映射关系:
代码语言:javascript复制代码语言:javascript复制
注: Login.java映射成对样网页为/login,login可以在网页(html和jsp)form中指定,如 action="login"
用户登录界面
代码语言:javascript复制用户登录界面,是用户在访问整个网站之前需要访问的,因此最好制作成静态页面HTML,本例如:userlogin.html代码语言:javascript复制
代码语言:javascript复制注: 此时 action="login" 默认对应Java(Servlet)中对应的 Login.java 进行验证解析代码语言:javascript复制userlogin.html 针对上述两种 用户登录验证 方式,分别提供了两种POST方式:代码语言:javascript复制1) 针对JSP方式代码语言:javascript复制