给Spring MVC增加一个referer View

开发中很常见的一个用例,操作完成后返回操作页面。

用代码表示就是:

response.sendRedirect(request.getHeader("referer"));

spring MVC里有RedirectView,如果能够把referer带上就更方便了。好在spring很灵活,自己增加这个功能吧。

实现一个View接口:

public class RefererRedirectView implements View{
	
	protected static final Log logger = LogFactory.getLog(RefererRedirectView.class);

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.View#getContentType()
	 */
	public String getContentType() {
		return null;
	}

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.View#render(java.util.Map, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public void render(Map model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		String returnUrl = request.getHeader("referer");
		if(returnUrl==null || returnUrl.trim().equals("")){
			returnUrl = "/";
		}
		logger.debug("referer url["+returnUrl+"]");
		response.sendRedirect(returnUrl);
	}

}

 

ViewResolver 这个接口的实例可以在spring容器里有多个,组成一个链式结构,第一个如果无法处理转交下一个,直到被处理或全部失败。

再实现一个ViewResolver接口:

public class RefererViewResolver implements ViewResolver,Ordered {
	
	protected Log logger = LogFactory.getLog(getClass());
	//以referer:起始的viewName,将被此ViewResolver处理
	public static final String REFERER_PROFIX = "referer:";

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.ViewResolver#resolveViewName(java.lang.String, java.util.Locale)
	 */
	public View resolveViewName(String viewName, Locale locale)
			throws Exception {
				if (!viewName.startsWith(REFERER_PROFIX)) {
						return null;
		}
		logger.debug("this is referer view.");
		return new RefererRedirectView();
	}

	/* (non-Javadoc)
	 * @see org.springframework.core.Ordered#getOrder()
	 */
	public int getOrder() {
		return Integer.MAX_VALUE-1;//这个ViewResolver排在UrlBasedViewResolver前一个的位置
	}

}

 最后,在配置文件中声明这个viewResolver:

<bean class="com.........RefererViewResolver"/>

 这样,凡是以referer:起始的viewName,都会被redirect到请求发起的页面。

附测试类:

@Controller
public class SomeController {

	@RequestMapping("/test_referer.do")
	public String referer(){
		System.out.println("do some thing ,then return to referer.");
		return "referer:";
	}
	
	@RequestMapping("/test_test1.do")
	public String test1(){
		return "front/user/test1";
	}
	
	@RequestMapping("/test_test2.do")
	public String test2(){
		return "front/user/test2";
	}
}

 

 

Spring框架中,可以使用拦截器或过滤器来验证请求的Referer字段。下面是一些基本的代码步骤来实现Referer验证: 1. 创建一个拦截器或过滤器类,实现HandlerInterceptor接口(如果使用拦截器)或javax.servlet.Filter接口(如果使用过滤器)。 2. 在拦截器或过滤器的实现类中,重写preHandle方法(拦截器)或doFilter方法(过滤器)。 3. 在preHandle方法或doFilter方法中,获取请求的Referer字段值。可以通过HttpServletRequest对象来获取Referer值,例如:`String referer = request.getHeader("Referer");`。 4. 对获取到的Referer值进行验证。可以使用正则表达式、字符串匹配或其他验证方式,根据您的需求来判断Referer是否是预期的合法来源。 5. 如果验证失败,您可以根据需要采取适当的措施,例如拒绝请求、重定向到错误页面或记录日志。 6. 在Spring配置文件中注册您创建的拦截器或过滤器,将其应用到相应的URL路径上。 下面是一个简单的示例代码,演示如何在Spring中使用拦截器来验证请求的Referer字段: ```java public class RefererInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String referer = request.getHeader("Referer"); // 进行Referer验证 if (referer == null || !referer.contains("example.com")) { // 验证失败,可以采取相应的措施,例如拒绝请求或重定向到错误页面 response.sendRedirect("/error"); return false; } // 验证通过,继续处理请求 return true; } // 其他方法:postHandle、afterCompletion等 } ``` 在Spring配置文件中注册拦截器: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有请求 --> <bean class="com.example.RefererInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 请注意,以上代码只是一个简单示例,您可能需要根据您的具体需求和业务逻辑来进行更详细的实现和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值