3

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

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2012-06-24T07:43:35.213 回答
1

//这是为了授权

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>
于 2012-06-24T08:06:52.080 回答