当前位置: 首页 > 知识库问答 >
问题:

会话属性在筛选器中为空

朱通
2023-03-14
public class ServletResponseMocker implements Filter {

    private ServletContext context;
    private ConcurrentHashMap<String,String> hmURI_FileNameMap=new ConcurrentHashMap<String, String>();
    private ConcurrentHashMap<String,List<String>> hmURI_SessionAttrLMap=new ConcurrentHashMap<String, List<String>>();

    private String rootPath;

    public void init(FilterConfig fConfig) throws ServletException {
        this.context = fConfig.getServletContext();         
        rootPath=System.getProperty("WAR_ROOT_PATH");
    }

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

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

    String uri = req.getRequestURI();
    boolean bToBeProcessed = false;

    if (uri.startsWith("some/pattern"))
        bToBeProcessed = true;

    if (bToBeProcessed) {

        res.setCharacterEncoding(System.getProperty("CHARSETTYPE"));
        OutputStream out = res.getOutputStream();
        byte responseContent[] = null;
        String filename = null;
        if (hmURI_FileNameMap.containsKey(uri)) {
            filename = hmURI_FileNameMap.get(uri);

            responseContent = Utils.readBytesFromFile(rootPath + "\\somefolder\\"
                    + filename);
            res.setContentType("text/html;charset=UTF-8");
            res.setContentLength(responseContent.length);
            HttpSession session = req.getSession(false);
            if (session != null) {

                if (hmURI_SessionAttrLMap.get(uri) != null)
                    session.setAttribute("ClientXSL",
                            hmURI_SessionAttrLMap.get(uri));

            }

            res.setHeader("X-FRAME-OPTIONS", "SAMEORIGIN");
        } else {

            filename = uri.substring(uri.lastIndexOf("/") + 1) + ".vdb";
            hmURI_FileNameMap.put(uri, filename);

            ResponseWrapper wrapper = new ResponseWrapper(res);

            chain.doFilter(request, wrapper);
            HttpSession session = req.getSession(false);
            // This session attribute is set by some filter in chain and is
            // always not null here.
            List<String> clientXSLList = (List) session
                    .getAttribute("ClientXSL");
            if (clientXSLList != null) {

                hmURI_SessionAttrLMap.put(uri, clientXSLList);
            }

            responseContent = wrapper.getData();
            /*Writing data to text file*/

        }
        out.write(responseContent);
        out.flush();
        out.close();
    } else {

        // To identify the 2nd servlet of the screen which is same for all
        // screens
        if(uri.startsWith("/someother/pattern/com.second.servlet.fetchXSL")){

        HttpSession session = req.getSession(false);
        if (session != null) {
            // Below session attributes always comes as not null during
            // fisrst time screen loading. However, comes as null when
            // static response is sent for subsequent servlet hit.
            List<String> clientXSLList = (List) session
                    .getAttribute("ClientXSL");
            if (clientXSLList != null)
                this.context.log("Getting clientXSL list from session:"
                        + Arrays.toString(clientXSLList.toArray()));
        }
    }
    chain.doFilter(request, response);
}

    public void destroy() {
    }


}

共有1个答案

仇经武
2023-03-14

Ok发现了问题。

对于ques1:我忽略了第二个servlet中的代码。每当它被击中时,它就清除会话属性。因此,当我捕获第二次命中的第一个servlet的http响应时,会话属性已经为NULL。因此,它们在第二个servlet中是空的。

对于ques2:问题是我在过滤器中的代码。

List<String> clientXSLList = (List) session
                    .getAttribute("ClientXSL");
            if (clientXSLList != null) {

                hmURI_SessionAttrLMap.put(uri, clientXSLList);
            }
ArrayList<String> clientXSLList = (ArrayList<String>) session
                    .getAttribute("ClientXSL");
            if (clientXSLList != null) {

                hmURI_SessionAttrLMap.put(uri, clientXSLList.clone());
            }
 类似资料:
  • 在Elasticsearch中,是否可以在嵌套筛选器中引用顶级(非嵌套)属性? 我有一种情况,我需要一个条件在全局级别或在任何数量的关联嵌套对象中的一个中为真。在嵌套筛选器内部,我有一个或筛选器来检查其中一个或另一个,但似乎忽略了外部属性。这里有一个例子。 我有一种感觉,我需要的东西不受支持,嵌套筛选器内部的所有内容都必须在指定的路径上或以下应用(从文档开始,“对嵌套对象/文档执行查询,就像它们被

  • 我有这个问题,我不确定这是否是“预期”行为,但我的问题是: 我有一个Http筛选器: UserInfo和ActivationInfo都是@SessionScope,如下所示: 和 当我尝试访问调用过滤器的页面时,我在控制台上看到以下内容: 如果我转到不同的浏览器并输入“坏”校验码,用户信息/激活信息永远不会重新注入。IE,与不同的会话,我没有看到一个新的UserInfo/ActivationInf

  • 我正在寻找一个干净的方式来完成这一点使用Es6,所以扩展操作符对我可用。

  • 本文向大家介绍jQuery选择器之属性筛选选择器用法详解,包括了jQuery选择器之属性筛选选择器用法详解的使用技巧和注意事项,需要的朋友参考一下 在这么多属性选择器中[attr="value"]和[attr*="value"]是最实用的 [attr="value"]能帮我们定位不同类型的元素,特别是表单form元素的操作,比如说input[type="text"],input[type="che

  • 我使用Spring Security和spring MVC。Am在未经身份验证的请求中保留会话中的数据属性(安全性:spring security中无)。我尝试打印会话id。之后,我登录到应用程序。在此创建新会话。我尝试打印会话id。两者都不同。但是当我访问会话属性中的数据时。它是存在的。在我的理解中,由于新会话是在登录后创建的,数据应该丢失,还是spring正在共享会话属性?下面是代码。 在sp

  • 我的目标是用过滤器截获ServletResponse,并在其显示在网页上之前向其添加一些自定义html。我还想做一些计算,并将结果添加到会话变量HashMap中,以便在后续调用中访问。 我不知道如何从doFilter方法中的ServletRequest获取会话。这是我的代码: getSession的行抛出 JAVAlang.IllegalStateException:在提交响应后无法创建会话 如果