JFinal在Websphere下的问题

发布于 2021-11-24 00:53:37 字数 2681 浏览 788 评论 2

@JFinal 虽然这个问题我认为和JFinal本身关系不大,但是这个是用JFinal的时候出现的问题。也顺便反馈一下吧。 

波波,最近在用WebSphere做服务器中间件,原本在Weblogic下正常的应用,到WebSphere下不正常了。体现为以下两点:
        1.web.xml下配置的Base Form认证失效
        2.进行render的时候,由于WebSphere下使用Filter做路径映射,而不是用Servlet,导致WebSphere认为应用没有返回页面,而会在request中添加几个attribute,其中包含com.ibm.ws.webcontainer.filter.filenotfound。在进行renderJson的时候,会出现OOM的错误。

Base Form认证如下:

<security-constraint>
<display-name>everyone</display-name>
<web-resource-collection>
  <web-resource-name>AdminPages</web-resource-name>
    <description>login user</description>
    <url-pattern>/admin/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
    <description>These are the roles who have access</description>
    <role-name>*</role-name>
  </auth-constraint>
  <user-data-constraint>
    <description>This is how the user data must be transmitted</description>
    <transport-guarantee>NONE</transport-guarantee>
  </user-data-constraint>
</security-constraint>

我的解决办法是增加一个Handler。

过滤掉包含(/j_security_check) || (/admin并且未登录)的URL,交由容器去处理。去掉WebSphere增加的几个request中的attribute。
代码如下:
 
/**
 * JFinal在WebSphere下,会拦截Base Form认证,导致无法登录。 使用该Handler过滤掉关于安全认证的请求
 * */
public class SecurityHandler extends Handler {

	private String[] filterUrls;

	public SecurityHandler(String... securityUrls) {
		filterUrls = securityUrls;
	}

	@Override
	public void handle(String target, HttpServletRequest request,
			HttpServletResponse response, boolean[] isHandled) {
		boolean shouldFilter = false;
		request.removeAttribute("com.ibm.ws.webcontainer.filter.filenotfound");
		request.removeAttribute("com.ibm.websphere.servlet.uri_non_decoded");
		if (target.indexOf("/j_security_check") != -1 && request.getRemoteUser() == null ) {
			shouldFilter = true;
		} else {
				for (String s : filterUrls) {
					if (target.startsWith(s) && request.getRemoteUser() == null) {
						shouldFilter = true;
						break;
					}
				}
		}

		if (shouldFilter) {
				for (boolean b : isHandled) {
					b = true;
				}
		} else {
			nextHandler.handle(target, request, response, isHandled);
		}
	}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

本宫微胖 2021-11-26 00:20:11

谢谢。认证配置去不掉。那个是我们公司的统一认证。

秋意浓 2021-11-25 23:34:11

    将 web.xml 中的认证配置去掉可否? 另外 isHandled 数组的长度只可能为 1 , 所以 isHnandled[0] = true 即可,而楼主在 for 循环中对 b 这个临时对象赋值其实改变不了 isHandled 中的值。感谢楼主分享 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文