/** * Find the registered {@link RequestDataValueProcessor}, if any, and allow * it to update the redirect target URL. * @param targetUrl the given redirect URL * @return the updated URL or the same as URL as the one passed in */ protected String updateTargetUrl(String targetUrl, Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) { WebApplicationContext wac = getWebApplicationContext(); if (wac == null) { wac = RequestContextUtils.findWebApplicationContext(request, getServletContext()); } if (wac != null && wac.containsBean(RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME)) { RequestDataValueProcessor processor = wac.getBean( RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME, RequestDataValueProcessor.class); return processor.processUrl(request, targetUrl); } return targetUrl; }
@Override public int doEndTag() throws JspException { String url = createUrl(); RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor(); ServletRequest request = this.pageContext.getRequest(); if ((processor != null) && (request instanceof HttpServletRequest)) { url = processor.processUrl((HttpServletRequest) request, url); } if (this.var == null) { // print the url to the writer try { pageContext.getOut().print(url); } catch (IOException e) { throw new JspException(e); } } else { // store the url as a variable pageContext.setAttribute(var, url, scope); } return EVAL_PAGE; }
@Test public void updateTargetUrl() throws Exception { StaticWebApplicationContext wac = new StaticWebApplicationContext(); wac.registerSingleton("requestDataValueProcessor", RequestDataValueProcessorWrapper.class); wac.setServletContext(new MockServletContext()); wac.refresh(); RequestDataValueProcessor mockProcessor = mock(RequestDataValueProcessor.class); wac.getBean(RequestDataValueProcessorWrapper.class).setRequestDataValueProcessor(mockProcessor); RedirectView rv = new RedirectView(); rv.setApplicationContext(wac); // Init RedirectView with WebAppCxt rv.setUrl("/path"); MockHttpServletRequest request = createRequest(); request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac); HttpServletResponse response = new MockHttpServletResponse(); given(mockProcessor.processUrl(request, "/path")).willReturn("/path?key=123"); rv.render(new ModelMap(), request, response); verify(mockProcessor).processUrl(request, "/path"); }
@Test public void requestDataValueProcessorHooks() throws Exception { String action = "/my/form?foo=bar"; RequestDataValueProcessor processor = getMockRequestDataValueProcessor(); given(processor.processAction(this.request, action, "post")).willReturn(action); given(processor.getExtraHiddenFields(this.request)).willReturn(Collections.singletonMap("key", "value")); this.tag.doStartTag(); this.tag.doEndTag(); this.tag.doFinally(); String output = getOutput(); assertEquals("<div>\n<input type=\"hidden\" name=\"key\" value=\"value\" />\n</div>", getInputTag(output)); assertFormTagOpened(output); assertFormTagClosed(output); }
public void testRequestDataValueProcessorHooks() throws Exception { String action = "/my/form?foo=bar"; RequestDataValueProcessor processor = getMockRequestDataValueProcessor(); given(processor.processAction(this.request, action)).willReturn(action); given(processor.getExtraHiddenFields(this.request)).willReturn(Collections.singletonMap("key", "value")); this.tag.doStartTag(); this.tag.doEndTag(); this.tag.doFinally(); String output = getOutput(); assertEquals("<input type=\"hidden\" name=\"key\" value=\"value\" />", getInputTag(output)); assertFormTagOpened(output); assertFormTagClosed(output); }
/** * Process the action through a {@link RequestDataValueProcessor} instance * if one is configured or otherwise returns the action unmodified. */ private String processAction(String action) { RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor(); ServletRequest request = this.pageContext.getRequest(); if (processor != null && request instanceof HttpServletRequest) { action = processor.processAction((HttpServletRequest) request, action, getHttpMethod()); } return action; }
/** * Closes the '{@code form}' block tag and removes the form object name * from the {@link javax.servlet.jsp.PageContext}. */ @Override public int doEndTag() throws JspException { RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor(); ServletRequest request = this.pageContext.getRequest(); if ((processor != null) && (request instanceof HttpServletRequest)) { writeHiddenFields(processor.getExtraHiddenFields((HttpServletRequest) request)); } this.tagWriter.endTag(); return EVAL_PAGE; }
/** * Process the given form field through a {@link RequestDataValueProcessor} * instance if one is configured or otherwise returns the same value. */ protected final String processFieldValue(String name, String value, String type) { RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor(); ServletRequest request = this.pageContext.getRequest(); if (processor != null && (request instanceof HttpServletRequest)) { value = processor.processFormFieldValue((HttpServletRequest) request, name, value, type); } return value; }
@Test public void updateTargetUrlWithContextLoader() throws Exception { StaticWebApplicationContext wac = new StaticWebApplicationContext(); wac.registerSingleton("requestDataValueProcessor", RequestDataValueProcessorWrapper.class); MockServletContext servletContext = new MockServletContext(); ContextLoader contextLoader = new ContextLoader(wac); contextLoader.initWebApplicationContext(servletContext); try { RequestDataValueProcessor mockProcessor = mock(RequestDataValueProcessor.class); wac.getBean(RequestDataValueProcessorWrapper.class).setRequestDataValueProcessor(mockProcessor); RedirectView rv = new RedirectView(); rv.setUrl("/path"); MockHttpServletRequest request = createRequest(); HttpServletResponse response = new MockHttpServletResponse(); given(mockProcessor.processUrl(request, "/path")).willReturn("/path?key=123"); rv.render(new ModelMap(), request, response); verify(mockProcessor).processUrl(request, "/path"); } finally { contextLoader.closeWebApplicationContext(servletContext); } }
@SuppressWarnings("deprecation") protected RequestDataValueProcessor getMockRequestDataValueProcessor() { RequestDataValueProcessor mockProcessor = mock(RequestDataValueProcessor.class); ServletRequest request = getPageContext().getRequest(); StaticWebApplicationContext wac = (StaticWebApplicationContext) RequestContextUtils.getWebApplicationContext(request); wac.getBean(RequestDataValueProcessorWrapper.class).setRequestDataValueProcessor(mockProcessor); return mockProcessor; }
/** * Process the action through a {@link RequestDataValueProcessor} instance * if one is configured or otherwise returns the action unmodified. */ private String processAction(String action) { RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor(); ServletRequest request = this.pageContext.getRequest(); if (processor != null && request instanceof HttpServletRequest) { action = processor.processAction((HttpServletRequest) request, action); } return action; }
protected RequestDataValueProcessor getMockRequestDataValueProcessor() { RequestDataValueProcessor mockProcessor = mock(RequestDataValueProcessor.class); ServletRequest request = getPageContext().getRequest(); StaticWebApplicationContext wac = (StaticWebApplicationContext) RequestContextUtils.getWebApplicationContext(request); wac.getBean(RequestDataValueProcessorWrapper.class).setRequestDataValueProcessor(mockProcessor); return mockProcessor; }
/** * <p> * {@code Spring MVC} のパス修飾機構によって指定されたURLパスを修飾します。<br/> * </p> * @param action パス * @param requestContext {@link RequestContext} インスタンス * @param pageContext {@link PageContext} インスタンス * @return 修飾されたパス */ public static String processAction(String action, RequestContext requestContext, PageContext pageContext) { RequestDataValueProcessor processor = requestContext.getRequestDataValueProcessor(); ServletRequest request = pageContext.getRequest(); if ((processor != null) && (request instanceof HttpServletRequest)) { // return processor.processAction((HttpServletRequest) request, action); return processor.processAction((HttpServletRequest) request, action, ((HttpServletRequest) request).getMethod()); } return action; }
/** * {@inheritDoc} */ @Override public Map<String, String> getExtraHiddenFields(HttpServletRequest request) { Map<String, String> extraHiddenFields = new HashMap<String, String>(); for (RequestDataValueProcessor requestDataValueProcessor : requestDataValueProcessors) { Map<String, String> m = requestDataValueProcessor.getExtraHiddenFields(request); if (m != null) { extraHiddenFields.putAll(m); } } return extraHiddenFields; }
/** * {@inheritDoc} */ @Override public String processUrl(HttpServletRequest request, String url) { for (RequestDataValueProcessor requestDataValueProcessor : requestDataValueProcessors) { url = requestDataValueProcessor.processUrl(request, url); } return url; }
/** * @param mergeTemplateFailureException may be null in which case mergeTemplate override will succeed. * If it's non null it will be checked */ private void testValidTemplateName(final Exception mergeTemplateFailureException) throws Exception { Map<String, Object> model = new HashMap<String, Object>(); model.put("foo", "bar"); final String templateName = "test.vm"; WebApplicationContext wac = mock(WebApplicationContext.class); MockServletContext sc = new MockServletContext(); sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac); final Template expectedTemplate = new Template(); VelocityConfig vc = new VelocityConfig() { @Override public VelocityEngine getVelocityEngine() { return new TestVelocityEngine(templateName, expectedTemplate); } }; Map<String, VelocityConfig> configurers = new HashMap<String, VelocityConfig>(); configurers.put("velocityConfigurer", vc); given(wac.getBeansOfType(VelocityConfig.class, true, false)).willReturn(configurers); given(wac.getServletContext()).willReturn(sc); given(wac.getBean("requestDataValueProcessor", RequestDataValueProcessor.class)).willReturn(null); HttpServletRequest request = new MockHttpServletRequest(); final HttpServletResponse expectedResponse = new MockHttpServletResponse(); VelocityView vv = new VelocityView() { @Override protected void mergeTemplate(Template template, Context context, HttpServletResponse response) throws Exception { assertTrue(template == expectedTemplate); assertTrue(context.getKeys().length >= 1); assertTrue(context.get("foo").equals("bar")); assertTrue(response == expectedResponse); if (mergeTemplateFailureException != null) { throw mergeTemplateFailureException; } } }; vv.setUrl(templateName); vv.setApplicationContext(wac); try { vv.render(model, request, expectedResponse); if (mergeTemplateFailureException != null) { fail(); } } catch (Exception ex) { assertNotNull(mergeTemplateFailureException); assertEquals(ex, mergeTemplateFailureException); } }
@Bean public RequestDataValueProcessor requestDataValueProcessor() { return new CsrfRequestDataValueProcessor(); }
public void setRequestDataValueProcessor(RequestDataValueProcessor processor) { this.processor = processor; }
/** * <p> * {@code Spring MVC} のパス修飾機構によって指定されたURLパスを修飾します。<br/> * </p> * @param url パス * @param requestContext {@link RequestContext} インスタンス * @param pageContext {@link PageContext} インスタンス * @return 修飾されたパス */ public static String processUrl(String url, RequestContext requestContext, PageContext pageContext) { RequestDataValueProcessor processor = requestContext.getRequestDataValueProcessor(); ServletRequest request = pageContext.getRequest(); if ((processor != null) && (request instanceof HttpServletRequest)) { return processor.processUrl((HttpServletRequest) request, url); } return url; }
/** * {@link RequestDataValueProcesso} インスタンスのリストを設定します。 * @param requestDataValueProcessors {@link RequestDataValueProcesso} インスタンスのリスト */ public void setRequestDataValueProcessors(List<RequestDataValueProcessor> requestDataValueProcessors) { this.requestDataValueProcessors = requestDataValueProcessors; }
/** * {@link RequestDataValueProcesso} インスタンスのリストを返却します。 * @return {@link RequestDataValueProcesso} インスタンスのリスト */ protected List<RequestDataValueProcessor> getDefaultRequestDataValueProcessors() { return requestDataValueProcessors; }