美好时光。
假设一个应用程序中有8个Web服务。其中5个需要授权(客户端必须提供JSESSIONID cookie并且相应的会话不能无效),可以在没有jsessionid cookie的情况下调用其他3个。我天真的解决方案是编写一个servlet过滤器,它拦截请求并检索它们的pathInfos(所有服务都具有相同的url结构:/ service / serviceSuffix )。有一个枚举,其中包含需要授权的每个Web服务的 serviceSuffix 。检索请求时,收集pathInfo;如果此路径信息包含在枚举中并且存在相应的有效会话,则请求将提前发送到过滤器链。否则,将错误发送回客户端。过了一会儿,我意识到需要增加检索具体服务的wsdl和xsds的可能性。所以,又增加了两张支票。
public class SecurityFilter implements Filter {
public static final String WSDL = "wsdl";
public static final String XSD = "xsd=";
/**
* Wittingly left empty
*/
public void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse)response;
String pathInfo = servletRequest.getPathInfo();
String queryString = servletRequest.getQueryString();
if (pathInfo != null && SecureWebServices.contains(pathInfo)) {
if (queryString != null && (queryString.equals(WSDL) || queryString.startsWith(XSD))) {
// wsdl or xsd is requested
chain.doFilter(request, response);
} else {
// a web service's method is called
HttpSession requestSession = servletRequest.getSession(false);
if (requestSession != null) { // the session is valid
chain.doFilter(request, response);
} else {
servletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
}
} else {
chain.doFilter(request, response);
}
}
/**
* Wittingly left empty
*/
public void destroy() {}
}
它似乎不是很安全,因为如果请求的pathInfo不在枚举中,则传递此请求(仅在发生一些意外的系统调用时)。
请您提出建议,如何提高安全级别。我想构建一个可配置的系统(这就是为什么我有枚举。可以在那里添加一个路径来保护Web服务,并且不需要在每个Web服务中复制安全代码)。如何增加
答案 0 :(得分:0)
也许我不明白,但是。
jsessionid并没有与安全有关。你只是得到它。
接下来我不确定您是否需要身份验证或授权。提供的代码不会为您提供安全功能。
我想你无论如何都对身份验证感兴趣。可以为安全逻辑提供标准Web容器功能。只需在请求标头中发送身份验证数据即可完成。 Web容器可以配置为仅保护选定的资源(URL)