【问题标题】:Redirect angular js page in browser from Java (Spring) Filter从Java(Spring)过滤器重定向浏览器中的角度js页面
【发布时间】:2020-08-25 09:41:13
【问题描述】:

我在我的 Spring Boot 应用程序中创建了一个 SQL 注入过滤器,它拦截每个请求并验证可能的 SQL 注入的输入。如果输入无效,那么我想将用户重定向回登录页面。使用我的代码,我可以看到正在通过 DevTools 进行内部调用,但浏览器没有重定向到指定页面。

过滤器

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

HttpServletRequest req = (HttpServletRequest) request;
String url = req.getRequestURL().toString();

Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
    String paramName = enumeration.nextElement();
    String value = request.getParameter(paramName);
    String sqlRegex =
                    "\\b(ALTER\\s+TABLE{0,1}|CREATE\\s+TABLE{0,1}|DELETE\\s+FROM{0,1}|DROP\\s+TABLE{0,1}|EXEC(UTE){0,1}|INSERT\\s+INTO{0,1}|MERGE\\s+INTO{0,1}|SELECT\\s[0-9a-zA-Z_*]*\\s+FROM{0,1}|UPDATE\\s[0-9a-zA-Z_]*\\s+SET{0,1}|UNION\\n+ALL{0,1})\\b";
    int bufferOverflowLength = 4000;
    if (value != null && (Pattern.compile(sqlRegex).matcher(value.toUpperCase()).find()) || value.length() >= bufferOverflowLength) {
        HttpServletResponse resp = (HttpServletResponse) response;
        String redirectUrl = req.getContextPath() + "/logout";
        resp.setStatus(403);
        resp.sendRedirect(redirectUrl);
        return;
    }
}

}

如何强制浏览器重定向到注销页面?

更新: 根据@buettner123 的评论,我已经在 Angular 中实现了一个 httpInterceptor,但这仍然无法拦截我来自 Filter 的请求。

Angular 拦截器代码

$httpProvider.interceptors.push(['$location', '$injector', '$q', function ($location, $injector, $q) {
    return {
        'request': function (config) {
            console.log("Request intercepted");
            return config;
        },
        'responseError': function (rejection) {
            console.log("Response Error Intercepted");
            return $q.reject(rejection);
        },
        'response': function(response) {
            // do something on success
            console.log('I am done');
            var status = response.status;
            console.log(status);
            return response;
          }
    };
}]);

【问题讨论】:

  • AngularJs 是一个单页应用程序。按照您使用过滤器的方法,我将使用相应的 http 代码(例如 400)回答请求,并在 AngularJs 部分使用错误拦截器进行重定向,使用 AngularJs 路由
  • 我在 AngularJS 中添加了一个 httpInterceptor,它可以很好地处理其他请求,但无法拦截从我的过滤器发起的请求。
  • 请尝试使用resp.sendError(HttpServletResponse.SC_FORBIDDEN); 而不是sendRedirect
  • 成功了。非常感谢您的帮助。

标签: java angularjs spring-boot servlet-filters


【解决方案1】:

在此处发布解决方案,以防其他人可能会遇到同样的问题

过滤器.java

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

    HttpServletRequest req = (HttpServletRequest) request;
    String url = req.getRequestURL().toString();
    System.out.println("url : " + url);

    Enumeration<String> enumeration = request.getParameterNames();
    while (enumeration.hasMoreElements()) {

        String paramName = enumeration.nextElement();
        String value = request.getParameter(paramName);
        String sqlRegex =
                        "\\b(ALTER\\s+TABLE{0,1}|CREATE\\s+TABLE{0,1}|DELETE\\s+FROM{0,1}|DROP\\s+TABLE{0,1}|EXEC(UTE){0,1}|INSERT\\s+INTO{0,1}|MERGE\\s+INTO{0,1}|SELECT\\s[0-9a-zA-Z_*]*\\s+FROM{0,1}|UPDATE\\s[0-9a-zA-Z_]*\\s+SET{0,1}|UNION\\n+ALL{0,1})\\b";

        if (value != null && (Pattern.compile(sqlRegex).matcher(value.toUpperCase()).find())) {
            HttpSession session = req.getSession(false);
            if (session != null)
                session.invalidate();
            HttpServletResponse resp = (HttpServletResponse) response;
            resp.sendError(HttpServletResponse.SC_FORBIDDEN, "SQL injection detected");
            return;
        }
    }

}

main.js

$httpProvider.interceptors.push(['$location', '$injector', '$q', function ($location, $injector, $q) {
return {
    'request': function (config) {
        return config;
    },
    'responseError': function (rejection) {
        if (rejection.status == 403 && rejection.data.includes("SQL injection")) {
            console.log("Forbidden Resource");
            window.location.href="redirect url";
        }

        return $q.reject(rejection);
    },
    'response': function(response) {
        return response;
      }
};}]);

确保 js 代码在 config 元素下

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 2018-08-20
    • 1970-01-01
    • 2013-09-17
    • 2016-10-18
    • 2020-03-31
    • 2023-04-05
    • 2016-05-01
    • 2012-03-14
    相关资源
    最近更新 更多