如何使用过滤器限制来自地址栏的所有请求

时间:2016-02-13 12:11:21

标签: jsp struts2 servlet-filters

我正在使用 struts 2 hibernate 开发一个java Web应用程序。我想通过直接在地址栏上输入来限制用户调用任何struts操作。相反,用户应该使用JSP页面本身提供的链接,因为在我的应用程序中有许多访问级别,所以现在用户通过直接在地址栏上键入操作名称来进行未授权的访问。在返回成功之前,我已检查每个函数的登录用户的访问级别。但这不是一个好的做法,无处不在。我搜索过使用 java Filters 来执行此操作但未成功完成此操作。

我用于实现过滤器的内容如下: -

web.xml Security 是我的包名称, SessionFilter {{ 1}} 类)

servlet

<filter> <filter-name>SessionFilter</filter-name> <filter-class> Security.SessionFilter </filter-class> <init-param> <param-name>avoid-urls</param-name> <param-value>Index.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>SessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 是我的应用程序的入口点,因此我只想通过在地址栏上输入其他内容来直接访问此页面。如果用户在地址栏上键入任何其他操作名称,他/她应该再次重定向到登录页面,为什么在下面的代码中我写了 Index.jsp

SessionFilter.java

response.sendRedirect("Index.jsp");

3 个答案:

答案 0 :(得分:0)

首先,访问级别检查不应该在jsp页面上。此页面应该只显示视图。是否有权访问特定资源的用户应使用某种用户级别或角色级别的安全性在服务器端进行处理。为此,您可以实现自己的过滤器,也可以使用已经可用的安全库,如spring-security或shiro security。

但是,如果您不想这样做并希望坚持当前的方法,那么您可以检查每个请求的标头X-Requested-With。对于ajax请求,它包含XMLHttpRequest。但它不是标准标头,并且所有浏览器/用户代理都可能不会发送此标头。为了确保ajax请求,您可以为从页面发送的每个请求添加一些自定义标头。

但是再次使用这种方法,如果未经授权的用户想要访问某个操作,他/她可以通过手动将该标头添加到他们的请求中来实现。因此,在服务器端而非客户端检查授权是一个不错的选择。

答案 1 :(得分:0)

您可以通过将过滤器重定向到登录页面或索引页面来实现过滤器以检查授权访问并拒绝任何未经授权的访问。

但是因为你使用了struts2;您可以利用struts2拦截器:

定义struts2拦截器:

public class LogInInterceptor implements Interceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {

        Map<String, Object> sessionMap = ActionContext.getContext().getSession();

        if (sessionMap.get("urlList").contains(url)) {
            return invocation.invoke();
        } else {
            return "index-jsp-alias";
        }

    }

    // setters and getters.
}

在struts.xml文件中定义此拦截器:

        <interceptors>
            <interceptor name="mylogging" class="LogInInterceptor" />
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="mylogging" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="loggingStack" />
        <global-results>
        <result name="index-jsp-alias">Index.jsp</result>
    </global-results>

答案 2 :(得分:-2)

我得到了我的问题的解决方案,并在我的应用程序中成功实施。非常感谢所有有用的答案和建议。

无论我实施的是什么,如下: -

<强>的web.xml

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>
        Security.SessionFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<强> SessionFilter.java

package Security;

import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

        if (req instanceof HttpServletRequest) {
            req.setCharacterEncoding("UTF-8");
            HttpServletRequest request = (HttpServletRequest) req;
            String referrer = request.getHeader("referer");
            if (null == request.getSession(true).getAttribute("emp_id")) {
                if (referrer == null) {
                    if (isSessionExcluded(req)) {
                        req.setAttribute("isSessionExpire", "true");
                        RequestDispatcher reqDisp = req.getRequestDispatcher("/Index.jsp");
                        reqDisp.forward(req, resp);
                    }
                }
            } else {
                if (referrer == null) {
                    RequestDispatcher reqDisp = req.getRequestDispatcher("/Error.jsp");
                    reqDisp.forward(req, resp);
                }
            }
            chain.doFilter(req, resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {
    }

    private boolean isSessionExcluded(ServletRequest req) {
        if (req instanceof HttpServletRequest) {
            HttpServletRequest request = (HttpServletRequest) req;
            String contextPath = request.getContextPath();
            String reqUri = request.getRequestURI();
            if (!(contextPath + "/Index.jsp").equals(reqUri)) {
                return true;
            }
        }
        return false;
    }
}
  

我在 String referrer = request.getHeader("referer"); 方法中使用了 doFilter 。这将区分请求是通过在地址栏上键入还是通过单击某个链接生成的请求。如果通过地址栏输入生成请求,引荐来源的值将为 null

我希望这个解决方案对其他人也有帮助。