2014-09-24 53 views
0

我设置在JSP页面中的会话对象的属性,如下图所示:在jsp和Servlet Filter中获取相同的会话对象?

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"); 
} 

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

+0

你确定'request.getRemoteAddr()'不首先给你一个空值吗? – Illidanek 2014-09-24 13:12:48

回答

1

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

如果制作的是虚假的,该请求没有有效的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); 
}