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" />