-
- 静态资源配置
- 用户注册页面
- 用户登录页面
- 门户工程整合单点登录系统
- 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。
- 未登录时首页为显示登录按钮。

- 点击商品详情页,拦截器拦截强制跳转到登录界面。

- 登录之后显示欢迎。
