Spring Security集成Cas后页面跳转问题
问题描述:在集成cas后,如果在A应用里面直接调用B应用的某个页面,第一次点击的时候总是会跳转到B应用设置的默认页面,然后再点击的时候,才能跳转到正确的页面。
后来通过查看源码,发现
类:org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandlerprotected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) { if (isAlwaysUseDefaultTargetUrl()) { return defaultTargetUrl; } // Check for the parameter and use that if available String targetUrl = request.getParameter(targetUrlParameter); ......}<!-- cas 认证成功控制器 --><beans:bean id="authenticationSuccessHandler"value="false" /><beans:property name="defaultTargetUrl" value="/index.htm" /></beans:bean>
类:org.springframework.security.cas.web.CasAuthenticationEntryPoint public final void commence(final HttpServletRequest servletRequest, final HttpServletResponse response,final AuthenticationException authenticationException) throws IOException, ServletException {final String urlEncodedService = createServiceUrl(servletRequest, response);final String redirectUrl = createRedirectUrl(urlEncodedService);preCommence(servletRequest, response);response.sendRedirect(redirectUrl);}protected String createServiceUrl(final HttpServletRequest request, final HttpServletResponse response) {return CommonUtils.constructServiceUrl(null, response, this.serviceProperties.getService(), null, this.serviceProperties.getArtifactParameter(), this.encodeServiceUrlWithSessionId);}自定义类:CasAuthenticationRedirectpublic class CasAuthenticationRedirect extends CasAuthenticationEntryPoint{private String serviceUrlBak=null;@Overrideprotected String createServiceUrl(final HttpServletRequest request, final HttpServletResponse response) {if(serviceUrlBak==null)serviceUrlBak=getServiceProperties().getService();if(serviceUrlBak!=null){String ctx=request.getContextPath();String queryString=request.getQueryString();String requestURI=request.getRequestURI();requestURI=requestURI.substring(requestURI.indexOf(ctx)+ctx.length(),requestURI.length());String serviceUrl="";if(!requestURI.equals("/") && requestURI.length()>0){serviceUrl="?"+AbstractAuthenticationTargetUrlRequestHandler.DEFAULT_TARGET_PARAMETER;serviceUrl+="="+requestURI;if(StringUtils.isNotBlank(queryString)){serviceUrl+="?"+queryString;}}getServiceProperties().setService(serviceUrlBak+serviceUrl);}return super.createServiceUrl(request, response); }}<beans:bean id="casEntryPoint" class="net.assertion.CasAuthenticationRedirect"> ......</beans:bean>