Jsp 如何使用筛选器限制来自地址栏的所有请求

Jsp 如何使用筛选器限制来自地址栏的所有请求,jsp,struts2,servlet-filters,Jsp,Struts2,Servlet Filters,我正在使用struts 2和hibernate开发一个java web应用程序。我想通过直接在地址栏上键入来限制用户调用任何struts操作。相反,用户应该使用JSP页面本身提供的链接,因为在我的应用程序中有许多访问级别,所以现在用户通过直接在地址栏上键入操作名称来进行未经授权的访问。在返回成功之前,我已经检查了每个功能上登录用户的访问级别。但这并不是一个到处检查的好做法。我搜索过如何使用java过滤器来实现这一点,但没有成功 我用于实现过滤器的内容如下:- xml Security是我的包名,

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

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

xml Security是我的包名,SessionFilter是servlet类


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

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


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

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

但是因为你使用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>

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

我所实施的内容如下:-

web.xml

我使用了字符串referer=request.getHeaderreferer;在doFilter方法中。这将区分请求是通过在地址栏上键入还是通过单击某个链接生成的。如果请求是通过地址栏键入生成的,referer的值将为空


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

我想通过直接在地址栏上键入来限制用户调用任何struts操作,然后我只想通过在地址栏上键入而不允许直接访问此页面。相互矛盾。我认为不可能通过直接在地址栏中键入或单击链接来检查用户是否访问特定页面。您应该在服务器端实现适当的安全性,例如存储一些会话变量etcQuestion确实很奇怪,因为您没有在筛选器中检查登录用户,但只有在创建HTTP会话或没有会话的情况下!=已登录用户!。至少,这是否提供了洞察力?我已经完成了访问级别的服务器端身份验证。实际上,我不想让用户通过直接在地址栏上键入操作名来访问任何页面。事实上,用户可以使用提供的链接。这是一个糟糕的方法。原因如下:换句话说:不要依赖于控制器/业务逻辑的引用。最终用户可以完全控制其值。如果用户键入任何操作名称,则上述代码将不受限制。它只会限制最终具有.jsp扩展名的地址。
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.
}
        <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>
<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>
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;
    }
}