Ram*_*u4u 10 authentication jsp servlets login servlet-filters
以下是使用过滤器的Java代码片段,如果用户名和密码也正确,则每次都会显示错误页面.请帮帮我,我对这个概念知之甚少.
String sql="select * from reg where username='"+user+"' and pass='"+pwd+"'";
rs=st.executeQuery(sql);
if(rs.next())
{
chain.doFilter(request,response);
}
else
sc.getRequestDispatcher("/error.html").forward(request,response);
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 31
String sql ="select*from reg where username ='"+ user +"'and pass ='"+ pwd +"'";
这是一个非常糟糕的做法.这种方法要求用户名和密码都通过请求传递普通香草.而且,你有一个SQL注入攻击漏洞.
利用会话,在JSP/Servlet中就可以了HttpSession.实际上也没有必要在使用a的每个请求上一次又一次地击中DB Filter.这是不必要的昂贵.只需User使用a进行会话,Servlet并使用它Filter来检查每个请求的存在.
从以下开始/login.jsp:
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit"> ${error}
</form>
Run Code Online (Sandbox Code Playgroud)
然后,创建一个LoginServlet映射的url-pattern,/login并doPost()实现如下:
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Put user in session.
response.sendRedirect("/secured/home.jsp"); // Go to some start page.
} else {
request.setAttribute("error", "Unknown login, try again"); // Set error msg for ${error}
request.getRequestDispatcher("/login.jsp").forward(request, response); // Go back to login page.
}
Run Code Online (Sandbox Code Playgroud)
然后,创建一个LoginFilter这是在映射url-pattern的/secured/*(你可以选择你自己不过,如/protected/*,/restricted/*,/users/*,等,但必须至少覆盖所有受保护的页面,你也需要把JSP的在的WebContent相应的文件夹),并有doFilter()实施如下:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login.jsp";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response); // User is logged in, just continue request.
} else {
response.sendRedirect(loginURI); // Not logged in, show login page.
}
Run Code Online (Sandbox Code Playgroud)
那应该是它.希望这可以帮助.
为了了解它的UserDAO外观,您可能会发现本文很有用.它还介绍了如何使用PreparedStatement从SQL注入攻击中保存Web应用程序.
Connection con = getMyConnection();
try {
//no string concatenation, we use ? instead:
PreparedStatement ps = con.prepareStatement("select * from reg where username=? and pass=?");
try {
//actual value for parameters are set here:
ps.setString(1, user);
ps.setString(2, pwd);
ResultSet rs = ps.executeQuery();
if(rs.next()) {
chain.doFilter(request,response);
} else {
sc.getRequestDispatcher("/error.html").forward(request,response);
}
} finally {
ps.close();
}
} finally {
con.close();
}
Run Code Online (Sandbox Code Playgroud)
现在针对您的问题,请检查:
| 归档时间: |
|
| 查看次数: |
20009 次 |
| 最近记录: |