【问题标题】:get same session object in jsp and Servlet Filter?在 jsp 和 Servlet 过滤器中获取相同的会话对象?
【发布时间】:2014-09-24 13:07:25
【问题描述】:

我在jsp页面中给session对象设置了一个属性,如下图:

String remoteAddr = request.getRemoteAddr();
session.setAttribute("remoteAddr",remoteAddr);

然后,我尝试在 servlet 过滤器中检索该会话属性:

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

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String remoteIP = httpServletRequest.getSession(false).getAttribute("remoteAddr");
}

但是我在这里得到了会话对象的空值。在这里获取相同会话对象的正确方法是什么?

【问题讨论】:

  • 你确定request.getRemoteAddr() 没有给你一个空值吗?

标签: java jsp jakarta-ee servlets


【解决方案1】:

方法HttpServletRequest.html#getSession(boolean)可能返回null

如果create为false且请求没有有效的HttpSession,则该方法返回null。

Filter 可以在请求资源之前或之后调用,具体取决于您执行 chain.doFilter(request, response); 的时间

在您的情况下,您似乎在执行 jsp 之前查询会话,即执行以下操作:

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String remoteIP = (String) httpServletRequest.getSession(false).getAttribute("remoteAddr");

// pass the request along the filter chain
chain.doFilter(request, response);

改成

// pass the request along the filter chain
chain.doFilter(request, response);

HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String remoteIP = (String) httpServletRequest.getSession(false).getAttribute("remoteAddr");

会让它工作,但我怀疑这是你打算做的,因为你可能想要检查远程 IP 并决定是允许访问还是拒绝访问请求的资源,在这种情况下你可能想要做这样的事情:

String remoteIP= request.getRemoteAddr();

if(remoteIP.matches("some pattern")) {
    ((HttpServletResponse)response).setStatus(HttpServletResponse.SC_FORBIDDEN);
} else {
    // pass the request along the filter chain
    chain.doFilter(request, response);  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2011-11-13
    • 1970-01-01
    • 2013-03-08
    • 2011-02-27
    • 2017-04-05
    相关资源
    最近更新 更多