静态资源配置 用户注册页面 用户登录页面 门户工程整合单点登录系统 cookie的读写 注册、登录、退出页面的跳转 拦截器强制登录 运行工程
静态资源配置
taotao-sso的WEB-INF下添加静态资源。 springmvc-config.xml中配置静态资源映射。
<mvc:resources mapping ="/css/**" location ="/WEB-INF/css/" /> <mvc:resources mapping ="/js/**" location ="/WEB-INF/js/" /> <mvc:resources mapping ="/images/**" location ="/WEB-INF/images/" />
用户注册页面
需求
分析
在register.jsp页面,对注册进行处理,包括对数据进行有效性校验和检查用户名、手机号是否可用。 如果通过校验和并且用户名和手机号可用,执行注册,返回注册是否成功。
总结
在taotao-sso中开发,由于注册相关接口已经在sso工程中实现,只需开发controller控制跳转到注册页面。 请求url:/page/register 响应:register视图
Controller层
controller包下创建PageController,返回注册视图。
@Controller
@RequestMapping ("/page" )
public class PageController {@RequestMapping ("/register" )public String showRegister () {return "register" ;}}
用户登录页面
需求
分析
在login.jsp页面,校验登录信息的输入之后,执行登录。 登录成功之后,如果回调参数,跳转到回调url,否则跳转到商城首页。
总结
在taotao-sso中开发,由于注册相关接口已经在sso工程中实现,只需开发controller控制跳转到登录页面。 请求url:/page/login 请求参数:redirect,回调url。 响应:login视图,包含回调url。
Controller层
PageController中开发接口,跳转到登录页面。
@RequestMapping ("/login" )public String showLogin (String redirect, Model model) {model.addAttribute("redirect" , redirect);return "login" ;}
门户工程整合单点登录系统
cookie的读写
需求
在taotao-sso中开发。 登录过程需要向cookie中写入用户信息,用以表示身份。 在登录首页时,需要查询cookie,以判断用户是否登录,从而显示不同的欢迎页面。页面中已实现。 用户退出时,需要将用户的cookie删除。
开发
UserServiceImpl登录方法中添加写cookie的逻辑。 需要在方法中添加HttpServletRequest,HttpServletResponse参数。
CookieUtils.setCookie(request, response, TT_TOKEN, token);
UserServiceImpl退出方法中添加删除cookie的逻辑。 需要在方法中添加HttpServletRequest,HttpServletResponse参数。
CookieUtils.deleteCookie(request, response, TT_TOKEN);
在UserController登录和退出接口中添加添加HttpServletRequest,HttpServletResponse参数。
注册、登录、退出页面的跳转
需求
在portal中首页登录、注册需要调用对应的js,从而转到对应的页面。 退出按钮则在登录之后才会显示。
开发
需要在sso的UserController中添加对这三个功能跳转的控制。
@RequestMapping ("/showLogin" )public String showLogin () {return "redirect:/page/login" ;}@RequestMapping ("/showRegister" )public String showRegister () {return "redirect:/page/register" ;}@RequestMapping ("/showLogout/{token}" )public String showLogout (@PathVariable String token, String callback) {String url = "/user/logout/" + token + (callback == null ? "" : "?callback=" + callback);LOGGER.debug("logout url: {}" , url);return "redirect:" + url;}
拦截器强制登录
需求
由于在业务中添加验证是否登录的操作比较麻烦,特别是多个业务地点需要同一个操作的时候。可以使用springmvc的拦截器实现登录的验证,强制访问某些页面之前必须登录。 拦截器使用了 AOP 思想,拦截器介绍。
Service层
在taotao-portal中创建sso.properties,配置sso的信息。
#sso系统登录url
SSO_BASE_URL=http:
#获取用户token的url
SSO_USER_TOKEN=/user/token/
#登录页面Url
SSO_PAGE_LOGIN=/page/login
在taotao-portal中创建UserService,根据token,调用sso系统的服务,返回用户信息。以此判断用户是否登录。
@Service
public class UserServiceImpl implements UserService {private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);@Value ("${SSO_BASE_URL}" )private String SSO_BASE_URL;@Value ("${SSO_USER_TOKEN}" )private String SSO_USER_TOKEN;@Override public TbUser getUser (String token) {try {String json = HttpClientUtil.doGet(SSO_BASE_URL + SSO_USER_TOKEN + token);if (!StringUtils.isBlank(json)) {TaotaoResult result = TaotaoResult.formatToPojo(json, TbUser.class);if (result.getStatus() == 200 ) {TbUser user = (TbUser) result.getData();return user;}}LOGGER.debug("get json from sso: {}" , json);} catch (Exception e) {e.printStackTrace();}return null ;}
}
拦截器
在intercepter包下实现拦截器,在跳转到指定url之前,对用户是否登录做校验。如果登录则继续访问,否则跳转到登录页面。
public class LoginInterceptor implements HandlerInterceptor {private static final Logger LOGGER = LoggerFactory.getLogger(LoginInterceptor.class);@Autowired private UserService userService;@Value ("${TT_TOKEN}" )private String TT_TOKEN;@Value ("${SSO_BASE_URL}" )private String SSO_BASE_URL;@Value ("${SSO_PAGE_LOGIN}" )private String SSO_PAGE_LOGIN;/*** @return 是否放行*/ @Override public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object o)throws Exception {String token = CookieUtils.getCookieValue(request, "TT_TOKEN" );TbUser user = userService.getUser(token);if (user == null ) {String redirectUrl = SSO_BASE_URL + SSO_PAGE_LOGIN+ "?redirect=" + request.getRequestURL();LOGGER.debug("redirect: {}" , redirectUrl);response.sendRedirect(redirectUrl);return false ;}return true ;}@Override public void postHandle (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,ModelAndView modelAndView) throws Exception {}@Override public void afterCompletion (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,Object o, Exception e) throws Exception {}
}
在springmvc-config.xml中配置拦截器,暂定访问商品详情页需要登录。 注意,需要加载properties里的配置,因为LoginInterceptor属于springmvc容器,相对于spring来说是子容器,无法使用@Value访问spring加载的全局资源。 详细分析。
<context:property-placeholder location ="classpath:resource/*.properties" /> <mvc:interceptors > <mvc:interceptor > <mvc:mapping path ="/item/**" /> <bean class ="com.taotao.portal.interceptor.LoginInterceptor" /> </mvc:interceptor > </mvc:interceptors >
运行工程
运行rest,sso,protal,search,redis。 未登录时首页为显示登录按钮。 点击商品详情页,拦截器拦截强制跳转到登录界面。 登录之后显示欢迎。