【问题标题】:Java servlet redirecting using filtersJava servlet 使用过滤器重定向
【发布时间】:2015-04-22 20:22:27
【问题描述】:

我有以下问题:

我有一个带有登录表单的index.html 页面:

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link href="css/css.css" type="text/css" rel="stylesheet"/>
    </head>
    <body>
        <nav>
            <form action="">
                <label for="username">User: </label><input name ="username" type="text">
                <label for="password">Password: </label><input name ="password" type="password">
                <input type="submit" value="Vai">
            </form>
        </nav>

        <section id ="page">

        </section>
    </body>
</html>

我创建了一个名为f2 的过滤器,它应该检查用户名是否为“admin”,如果是,则将用户重定向到页面payroll/private/stipendi.html,或者如果不是页面payroll/public/dipendenti.html。

这是我的项目的层次结构(使用 netbeans 8.02 制作):

这是我的web.xml 文件:

<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <filter>
        <filter-name>f2</filter-name>
        <filter-class>f2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

这是f2 过滤器:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        if (debug) {
            log("f2:doFilter()");
        }

        doBeforeProcessing(request, response);
        HttpServletRequest req = (HttpServletRequest) request;
        if(req.getSession().getAttribute("username") == null)
            System.out.println("Attributo username = NULL");
        if(!req.getParameter("username").equals("admin")){
            System.out.println("Username is not ADMIN");
            req.getRequestDispatcher("/payroll/public/dipendenti.html").forward(request, response);
        }
        else{
            System.out.println("Username is ADMIN");
            req.getRequestDispatcher("/payroll/private/stipendi.html").forward(request, response);
        }
        Throwable problem = null;
        try {
            chain.doFilter(request, response); return;
        } catch (Throwable t) {
        // If an exception is thrown somewhere down the filter chain,
            // we still want to execute our after processing, and then
            // rethrow the problem after that.
            problem = t;
            t.printStackTrace();
        }

        doAfterProcessing(request, response);

    // If there was a problem, we want to rethrow it if it is
        // a known type, otherwise log it.
        if (problem != null) {
            if (problem instanceof ServletException) {
                throw (ServletException) problem;
            }
            if (problem instanceof IOException) {
                throw (IOException) problem;
            }
            sendProcessingError(problem, response);
        }
    }

我已经了解了一些事情:

我有一个无限循环,因为我的过滤器f2 具有url-pattern = /*,因此它会捕获每个请求,详细说明,发送它并重新捕获刚刚发送的相同请求。一遍又一遍地。

这个人我必须把我的url-pattern 改成别的东西。但是什么?如果我创建一个名为...的 servlet,比如 myRedirectServlet.java、index.html:action = "myRedirectServlet" 或只是 action = "/payroll/",而不创建任何 servlet,该怎么办? 我很抱歉,但我很困惑。

请帮帮我

【问题讨论】:

  • 编辑:我总是被重定向到/payroll/public/dipendenti.html,即使我的用户名不是“admin”并且我不知道为什么

标签: java servlets servlet-filters


【解决方案1】:

您的所作所为不符合安全利益。您应该使用principals 的概念 - 但让我们将其留到另一天。

  1. 您在 HTML 中的表单操作丢失 - 因此当您点击提交时,浏览器将尝试重定向到同一 HTML 页面。
  2. 假设您认为这很好 - 将过滤器映射更改为仅映射到那个 HTML 页面。
  3. 在过滤器内部 - 如果用户 ID 为 EMPTY - 只需 doChain(不要重定向),如果用户 ID 是必要的管理员重定向,因为您的过滤器现在是特定的 - 您不会进入无限循环.

【讨论】:

  • 嗨,我刚开始学习它,所以此时我并没有真正关心安全性。顺便说一句,在我的表单中添加 action 字段我想要到达的页面的路径:/payroll/private/stipendi.html 并放入 else 声明 chain.doFilter(request, response); 但我总是被重定向到 /payroll/private/stipendi.html... canno'不明白为什么
猜你喜欢
  • 2011-01-12
  • 2015-11-16
  • 2015-05-02
  • 2011-07-15
  • 2017-01-02
  • 2013-09-02
  • 2014-06-19
  • 2014-08-13
相关资源
最近更新 更多