【问题标题】:How to validate a request to a JSP page in Struts2如何在 Struts2 中验证对 JSP 页面的请求
【发布时间】:2012-06-24 06:18:34
【问题描述】:

可以使用拦截器验证对操作的请求。此外,可以使用空操作声明来避免对 JSP 页面的直接请求。是这样的;

<action name="home" >
        <result>home.jsp</result>
</action>  

我想验证对 JSP 页面的调用。因为我觉得一个简单的方法可以添加一个带有Interceptor 的动作(ActionSupport),它检查动作名称(并使用会话等进行一些验证)。但我怀疑它是否会降低性能,因为动作类什么都不做,只执行它的execute()(无用的任务......),并且应该有一个 empty Action .(但是:正如我在 Struts2 上阅读的一些文档一样,据说即使我们不添加 Action 类,框架本身也会添加一个返回“成功”的动作类,因此添加一个动作类或不是我们自己,不影响新)

无论如何,我想知道您最好的方法是验证或授权访问某些 JSP 页面。(页面数可以很多.. 不仅仅是一个 jsp 页面)

添加: 示例:
可以这么说,有一些限制页面,所有用户都无法访问,例如用户的帐户页面只能访问登录用户。可以有更多此类页面。如果请求到达此类页面,则必须验证用户。然后,如果请求来自空/匿名操作(如上面的代码片段 - 仅操作名称 - 没有真实类中所述),如何验证此类请求以JSP 页面?是否应该为此使用操作类?

【问题讨论】:

  • 一些JSP页面是什么意思?调用 S2 操作以准备值堆栈并使 S2 特定数据准备好使用,其中包括 S2 标记和任何其他 S2 特定功能。我不确定您想在 JSP 页面中进行哪些确切的验证
  • 您可以通过拦截器进行验证,对于授权,您可以定义自定义拦截器。您认为导致性能问题的原因是什么?
  • @Umesh Awasthi。感谢您的关注,我解释了更多。
  • @Mohana Rao SV,感谢您的建议。你能解释一下我如何在拦截器的intercept() 中处理它吗? .我知道如何验证具有真实类的动作,而不是没有真实类的 JSP。我们应该为此添加一个类吗?
  • @AashMaharoon:详情见我的回答

标签: java jsp jakarta-ee struts2


【解决方案1】:

如果您的注意力是保护应用程序的某些部分,以便只有经过身份验证和授权使用才能访问该部分,那么您有两种选择

  1. 使用基于拦截器的身份验证
  2. 使用像 Spring -security 这样的安全 API

基于拦截器的身份验证非常简单。 here 是一个如何做到这一点的示例,但不建议将这种身份验证用于基于生产和现实生活的应用程序,因为它确实是一个非常简单的案例。

如果你正在寻找一个完整的身份验证系统,我建议你看一下 Spring security。它非常简单和可配置,你只需要告诉底层的 spring 机制,所有区域和安全标签下的 Spring security 将拦截它们在您的操作被调用之前,只有成功和授权操作才会被 Spring Security 调用。

【讨论】:

  • 谢谢。我对Spring还不熟悉。无论如何,我查看了您的链接(谢谢)。我已经实现了这种方式。它接受的答案使用动作类演示。我的问题是,我们是否应该使用这样的操作类并使用拦截器进行验证,或者是否有任何方法可以在没有操作类的情况下使用匿名/空操作名称并使用 Intercepots ow 什么?
  • 你需要某种类,如果你需要实现你想要的方式,我强烈建议你使用 Spring-security 或 Apache Shiro 让生活更简单。IMO 不是建议使用拦截器进行身份验证。this 和所有此类示例只是一个用例,展示了所有拦截器的使用方式和位置,但从不推荐用于生产
【解决方案2】:

//这是为了授权

package com.kogent.action;

import java.io.IOException;
import java.util.List;
import java.util.regex.Pattern;

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

import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class SessionController extends StrutsPrepareAndExecuteFilter {
    protected PrepareOperations prepare;
    protected ExecuteOperations execute;
    protected List<Pattern> excludedPatterns = null;

public void init(FilterConfig filterConfig) throws ServletException {
    InitOperations init = new InitOperations();
    try {
        FilterHostConfig config = new FilterHostConfig(filterConfig);
        init.initLogging(config);
        Dispatcher dispatcher = init.initDispatcher(config);
        init.initStaticContentLoader(config, dispatcher);

        prepare = new PrepareOperations(filterConfig.getServletContext(),
                dispatcher);
        execute = new ExecuteOperations(filterConfig.getServletContext(),
                dispatcher);
        this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

        postInit(dispatcher, filterConfig);
    } finally {
        init.cleanup();
    }

}

/**
 * Callback for post initialization
 */
protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig) {
}

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

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    try {
        prepare.setEncodingAndLocale(request, response);
        prepare.createActionContext(request, response);
        prepare.assignDispatcherToThread();
        if (excludedPatterns != null
                && prepare.isUrlExcluded(request, excludedPatterns)) {
            chain.doFilter(request, response);
        } else {
            request = prepare.wrapRequest(request);
            ActionMapping mapping = prepare.findActionMapping(request,
                    response, true);
            if (mapping == null) {
                boolean handled = execute.executeStaticResourceRequest(
                        request, response);
                if (!handled) {
                    chain.doFilter(request, response);
                }
            } else {
                //here you have to identify the whether the user have access to requested resource or not 
                //allow him if he was access.
                //if(someCondition)
                execute.executeAction(request, response, mapping);
                //else{
                //redirect the user how do you want it to be.
                ActionMapping modfiedActionMapping = new ActionMapping();
                modfiedActionMapping.setName("someActionName");
                modfiedActionMapping.setNamespace("someNameSpace");
                execute.executeAction(request, response, modfiedActionMapping);

            //}

            }
        }
    } finally {
        prepare.cleanupRequest(request);
    }
}

public void destroy() {
    prepare.cleanupDispatcher();
}

}

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>Point to your customized filter</filter-class>
</filter>

【讨论】:

  • 非常感谢您的回答。一件事:如果我使用拦截器和使用动作类做同样的事情怎么办?不同之处 ?因为拦截器可以做过滤器也可以做的事情。我是 S2 的初学者。
  • StrtusPrepareAndExecuteFilter 是集中式请求处理器,所有请求都通过此过滤器,当然您可以在拦截器中执行此操作,但在框架之间会创建更多对象以处理请求(帮助 gc())因此最好在过滤器中确定请求是否已被处理以获得更好的性能。
猜你喜欢
  • 2012-09-05
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多