struts2的URL自定义 根据用户使用不同的URL

         项目遇到了这样一个问题,我们一个系统要给多个客户同时使用,但是可以要求访问的URL要有他们的名称,于是就产生了一个重定向url的需求

         说到url重定向,我想很多人都不陌生,而且有现成的工具包 urlrewirter 但是好像并满足不了我们按客户定制url的的需求,于是产生了自己定义url格式的想法

         思路是这样的,重写struts过滤器:struts的过滤器直接决定了一个url是否被struts所接受并交由那个action和那个方法处理,于是我将struts的默认过滤器源代码复制下来并自行定义过滤方法,按照我定义的url格式 客户名称\action名称\方法名称 struts是无法识别的,因为struts定义的uri后缀是.do 但是这个url依然是到了过滤器,只是被过滤掉了而已,在过滤器中的实际表现是组装出来的ActionMapping对象为空,于是我就在这里增加代码,当过滤器产生的ActionMapping对象是空的时候,根据uri自己组装一个ActionMapping对象,代码如下

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		String uri = getUri(request);
		try {
			prepare.setEncodingAndLocale(request, response);
			prepare.createActionContext(request, response);
			prepare.assignDispatcherToThread();
			if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
				chain.doFilter(request, response);
			} else {
				request = prepare.wrapRequest(request);
				ActionMapping mapping = prepare.findActionMapping(request, response, true);
				if (mapping == null && !uri.contains(".")) {
					mapping = URLRewrite.getActionMapping(uri, request, response);
					execute.executeAction(request, response, mapping);
				} else if (mapping != null) {
					mapping.setName(mapping.getName().toLowerCase());
					mapping.setNamespace("/");
					execute.executeAction(request, response, mapping);
				} else {
					boolean handled = execute.executeStaticResourceRequest(request, response);
					if (!handled) {
						chain.doFilter(request, response);
					}
				}
			}
		} finally {
			prepare.cleanupRequest(request);
		}
	}


 

             怎么重写的就不细说了,按照自定义的格式去解析uri并分装ActionMapping对象,然后交由struts的正常处理流程去处理即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值