我正在完成一个 Cattle Drive 作业,其中一个小型 Java 网络应用程序为客户管理一个电影库。任务是使用 cookie 为应用程序提供一些安全性,这样“黑客”就不能仅仅猜测将导致应用程序另一部分的 URL 之一。用户将被引导登录该站点,并且在登录之前不允许查看其他页面。
网络应用的组成部分是:
1. index.html
2. VideoServlet
3. listvideos.jsp
4. addvideo.jsp
5. videologin,jsp
入口点是请求URL http://localhost:8080/videos ,加载 index.html 文件。此页面只有一个链接,可将用户重定向到 VideoServlet。从那里,servlet 将 HTTP 请求和响应转发到 listvideos.jsp,如果用户想要这样做,它有一个添加视频的链接。
我无法理解如何使用 cookie 实现安全性,同时将所有内容保持在 MVC2 模式中(servlet 是 Controller ,jsp 是 View )。
这是我想出的程序流程,但我想我在某处遗漏了要点:
用户输入 URL http://localhost:8080/videos ,它默认拉取 index.html 文件。
index.html 文件主要是向 VideoServlet 发送 HTTP Get。 servlet 以某种方式知道用户尚未登录,因此将请求/响应转发给 videologin.jsp。
出现一个登录名并要求用户输入密码(这是一个标准的 html 表单)。用户输入密码并单击提交。这会向 servlet 发送一个 HTTP Post。
servlet 检查密码,如果正确,则用户登录,servlet 转发到 listvideos.jsp。
我不明白 cookie 是从哪里来的,也不知道它们如何帮助防止黑客猜测 URL 并直接访问 addvideos.jsp。是否使用 cookie 来验证用户是否已经登录?
最佳答案
Cookie 是一些纯文本值(通常存储在浏览器缓存中的文本文件中),您可以使用它们在客户端存储数据。当用户向特定 URL 发出请求时,存储在该服务器(域)上的所有 cookie 都会随之传递,以便服务器可以读取这些值。
在 Java 中,您可以在您的 servlet 中设置这样的 cookie(在您的情况下,当用户登录时,创建一个 cookie 并在其中存储一个值(例如 username=josh)。您可以在登录时执行此操作成功登录后的 servlet。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Verify login, and get the username. Assume it's josh
Cookie cookie = new Cookie("username", "josh");
cookie.setMaxAge(60*60*24); // 24 hours for expiry
response.addCookie(cookie);
}
稍后,您可以检查 cookie 是否存在,如果存在,则用户已登录。如果不存在,您可以发送重定向到登录页面。
您可以在您的 servlet 中检查这样的 cookie。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
String username = null;
for (Cookie c : cookies) {
if ("_username".equals(c.getName())) {
username = c.getValue();
break;
}
}
if (username == null) {
// Not Logged in. Redirect to Login
}
// User Logged In. Proceed
}
无需将此代码放入所有 Servlets + JSP 中,您可以轻松地将其放入 Servlet Filter 类中。您可以在此处阅读更多相关信息:http://javaboutique.internet.com/tutorials/Servlet_Filters/
理想情况下,您还可以提供注销功能,这将通过将其替换为 null 来删除分配给用户名 cookie 的值。
我展示了上面的例子,因为你提到你需要使用 cookies 来完成你的作业。但是,如果可以,请尝试使用 session (大部分时间又使用 cookie)来存储登录的用户详细信息。对于 session ,您可以使用 session 超时来确保空闲用户在一段时间后自动注销等等。
关于使用 Cookie 的 Java Web App 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6158772/