从JavaSpring过滤器中重定向浏览器中的Angular js页面

问题描述

我在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的请求。

角度拦截代码

$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;
          }
    };
}]);

解决方法

在其他人可能遇到相同问题的情况下,将解决方案发布到此处

Filter.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元素下

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...