使用 Cookie 的 Java Web App 安全性

标签 java security http cookies

我正在完成一个 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 )。

这是我想出的程序流程,但我想我在某处遗漏了要点:

  1. 用户输入 URL http://localhost:8080/videos ,它默认拉取 index.html 文件。

  2. index.html 文件主要是向 VideoServlet 发送 HTTP Get。 servlet 以某种方式知道用户尚未登录,因此将请求/响应转发给 videologin.jsp。

  3. 出现一个登录名并要求用户输入密码(这是一个标准的 html 表单)。用户输入密码并单击提交。这会向 servlet 发送一个 HTTP Post。

  4. 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/

相关文章:

java - 如何在 spring hibernate 中加入表

java - Spring注解MVC返回404

PHP 安全 : how can encoding be misused?

php - Internet Explorer 无法设置同名的 cookie

java - 对 URL 上的 GET 参数进行编码

Angular : TypeError: Cannot read property 'length' of null when subscribe()

java - 为什么 'bodyPart.isMimeType("text/plain“)' give the error ' 无法加载 bodystructure”?

java - 根据 Wicket 中的复选框隐藏/显示面板

Javascript Angular 6 通过浏览器开发工具改变安全性

javascript - 基于 Rails 的 javascript 应用程序的安全性 : How do you verify permissions on a user within rendered javascript?