700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 用户注册登录退出功能的实现——淘淘商城(二十五)

用户注册登录退出功能的实现——淘淘商城(二十五)

时间:2020-05-23 21:55:54

相关推荐

用户注册登录退出功能的实现——淘淘商城(二十五)

静态资源配置用户注册页面需求分析总结 Controller层 用户登录页面需求分析总结 Controller层 门户工程整合单点登录系统cookie的读写需求开发 注册、登录、退出页面的跳转需求开发 拦截器强制登录需求Service层拦截器 运行工程

静态资源配置

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参数。

//添加写cookie的逻辑,默认有效期为浏览器关闭CookieUtils.setCookie(request, response, TT_TOKEN, token);

UserServiceImpl退出方法中添加删除cookie的逻辑。

需要在方法中添加HttpServletRequest,HttpServletResponse参数。

//删除cookieCookieUtils.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系统登录urlSSO_BASE_URL=http://localhost:8084#获取用户token的urlSSO_USER_TOKEN=/user/token/#登录页面UrlSSO_PAGE_LOGIN=/page/login

在taotao-portal中创建UserService,根据token,调用sso系统的服务,返回用户信息。以此判断用户是否登录。

@Servicepublic 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;@Overridepublic 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);@Autowiredprivate 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 是否放行*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o)throws Exception {//从cookie中取token,根据token取得用户信息String token = CookieUtils.getCookieValue(request, "TT_TOKEN");TbUser user = userService.getUser(token);//取不到用户信息if (user == null) {//跳转到登录页面,把用户请求的url作为参数传递给登录页面。String redirectUrl = SSO_BASE_URL + SSO_PAGE_LOGIN+ "?redirect=" + request.getRequestURL();LOGGER.debug("redirect: {}", redirectUrl);response.sendRedirect(redirectUrl);return false;}return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,ModelAndView modelAndView) throws Exception {}@Overridepublic 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。未登录时首页为显示登录按钮。

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

登录之后显示欢迎。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。