Controller类
import java.lang.reflect.Constructor; import java.util.List; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import javax.validation.constraints.NotNull; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.validator.constraints.NotEmpty; import org.jasig.cas.CentralAuthenticationService; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.authentication.principal.SimpleWebApplicationServiceImpl; import org.jasig.cas.authentication.principal.UsernamePasswordCredentials; import org.jasig.cas.authentication.principal.Response.ResponseType; import org.jasig.cas.ticket.TicketException; import org.jasig.cas.util.HttpClient; import org.jasig.cas.web.support.ArgumentExtractor; import org.jasig.cas.web.support.CookieRetrievingCookieGenerator; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PropertiesLoaderUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; import org.springframework.web.servlet.view.RedirectView; public class SSOController extends AbstractController{ private static final Log log = LogFactory.getLog(SSOController.class); public static final String CAS_OA_HOMPAGE_URL = "cas.oa.hompage.url"; @NotNull private CentralAuthenticationService centralAuthenticationService; @NotNull private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator; @NotNull private CookieRetrievingCookieGenerator warnCookieGenerator; @NotEmpty private List<ArgumentExtractor> argumentExtractors; @NotNull private DataSource dataSource; @NotNull private PlatformTransactionManager txManager; private boolean pathPopulated; @Override protected ModelAndView handleRequestInternal(HttpServletRequest req,HttpServletResponse resp) throws Exception { resp.addHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""); final String token = req.getParameter("token"); String value=null; //获取验证码信息 final JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource); String querySql = "SELECT VAL FROM CAS_VALIDATOR_CODE WHERE ROUND(TO_NUMBER(SYSDATE - EXPIRE_TIME) * 24 * 60*60)<=60 AND TOKEN=? AND STATUS=0"; try { value = jdbcTemplate.queryForObject(querySql, String.class,token); } catch (Exception e) { e.printStackTrace(); log.error("验证码已超时", e); } //不存在,跳到提示页面 if(org.apache.commons.lang.StringUtils.isBlank(value)){ return new ModelAndView("overtimeView"); } String[] values = value.split(":"); if (!this.pathPopulated) { final String contextPath = req.getContextPath(); final String cookiePath = StringUtils.hasText(contextPath) ? contextPath + "/" : "/"; logger.info("Setting path for cookies to: "+ cookiePath); this.warnCookieGenerator.setCookiePath(cookiePath); this.ticketGrantingTicketCookieGenerator.setCookiePath(cookiePath); this.pathPopulated = true; } UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(); credentials.setUsername(values[0]); credentials.setPassword(values[1]); String ticketGrantingTicketId=""; String serviceTicket = ""; String url =null; try { //读取资源配置文件 Resource resource = new ClassPathResource("/application.properties"); Properties props = PropertiesLoaderUtils.loadProperties(resource); url= props.getProperty(CAS_OA_HOMPAGE_URL); Constructor<SimpleWebApplicationServiceImpl> constructor = SimpleWebApplicationServiceImpl.class .getDeclaredConstructor(String.class, String.class, String.class, ResponseType.class,HttpClient.class); ReflectionUtils.makeAccessible(constructor); Service service = constructor.newInstance(url, url,null, ResponseType.REDIRECT,null); ticketGrantingTicketId = this.centralAuthenticationService.createTicketGrantingTicket(credentials); /*** * 产生新的票据,并将票据及服务记录在缓存中 */ serviceTicket= this.centralAuthenticationService.grantServiceTicket(ticketGrantingTicketId,service); this.ticketGrantingTicketCookieGenerator.removeCookie(resp); this.warnCookieGenerator.removeCookie(resp); this.ticketGrantingTicketCookieGenerator.addCookie(req, resp, ticketGrantingTicketId); this.warnCookieGenerator.addCookie(req, resp, "true"); //更新验证码状态 final String updateSql ="UPDATE CAS_VALIDATOR_CODE SET STATUS=1 WHERE TOKEN=?"; TransactionTemplate tt =new TransactionTemplate(this.getTxManager()); tt.execute(new TransactionCallback<Object>() { @Override public Object doInTransaction(TransactionStatus arg0) { jdbcTemplate.update(updateSql,token); return null; } }); } catch (TicketException e) { e.printStackTrace(); log.error("请求登录失败", e); return new ModelAndView("oa-errorView"); } return new ModelAndView(new RedirectView(url+"&ticket="+serviceTicket+"<="+System.currentTimeMillis())); } public CentralAuthenticationService getCentralAuthenticationService() { return centralAuthenticationService; } public void setCentralAuthenticationService( CentralAuthenticationService centralAuthenticationService) { this.centralAuthenticationService = centralAuthenticationService; } public CookieRetrievingCookieGenerator getTicketGrantingTicketCookieGenerator() { return ticketGrantingTicketCookieGenerator; } public void setTicketGrantingTicketCookieGenerator( CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) { this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator; } public CookieRetrievingCookieGenerator getWarnCookieGenerator() { return warnCookieGenerator; } public void setWarnCookieGenerator( CookieRetrievingCookieGenerator warnCookieGenerator) { this.warnCookieGenerator = warnCookieGenerator; } public List<ArgumentExtractor> getArgumentExtractors() { return argumentExtractors; } public void setArgumentExtractors(List<ArgumentExtractor> argumentExtractors) { this.argumentExtractors = argumentExtractors; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public PlatformTransactionManager getTxManager() { return txManager; } public void setTxManager(PlatformTransactionManager txManager) { this.txManager = txManager; }
as-servlet.xml
<bean id="ssocontroller" class="xxx.web.SSOController" p:argumentExtractors-ref="argumentExtractors" p:warnCookieGenerator-ref="warnCookieGenerator" p:centralAuthenticationService-ref="centralAuthenticationService" p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" p:dataSource-ref="dataSource" p:txManager-ref="txManager" />