2
回答
JFinal在Websphere下的问题
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   

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

}
举报
RobertCool
发帖于4年前 2回/391阅
顶部