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

静态资源配置

  • taotao-sso的WEB-INF下添加静态资源。
    11.ssostatic.png
  • 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页面,对注册进行处理,包括对数据进行有效性校验和检查用户名、手机号是否可用。
    11.registerdiv.png
    11.registerreg.png
    11.regcheck.png
    11.regbeforesubmit.png
  • 如果通过校验和并且用户名和手机号可用,执行注册,返回注册是否成功。
    11.regdosubmit.png
总结
  • 在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页面,校验登录信息的输入之后,执行登录。
    11.loginid.png
    11.longin.png
    11.dolongin.png
  • 登录成功之后,如果回调参数,跳转到回调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,以判断用户是否登录,从而显示不同的欢迎页面。页面中已实现。
    11.footerstart.png
    11.taotaojs.png
    11.checklogin.png
  • 用户退出时,需要将用户的cookie删除。
开发
  • UserServiceImpl登录方法中添加写cookie的逻辑。
    • 需要在方法中添加HttpServletRequest,HttpServletResponse参数。
        //添加写cookie的逻辑,默认有效期为浏览器关闭
        CookieUtils.setCookie(request, response, TT_TOKEN, token);
  • UserServiceImpl退出方法中添加删除cookie的逻辑。
    • 需要在方法中添加HttpServletRequest,HttpServletResponse参数。
        //删除cookie
        CookieUtils.deleteCookie(request, response, TT_TOKEN);
  • 在UserController登录和退出接口中添加添加HttpServletRequest,HttpServletResponse参数。

注册、登录、退出页面的跳转

需求
  • 在portal中首页登录、注册需要调用对应的js,从而转到对应的页面。
    11.shortcut.png
    11.shortcutjs.png
    11.inout.png
  • 退出按钮则在登录之后才会显示。
    11.out.png
开发
  • 需要在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://localhost:8084
#获取用户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 {
        //从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;

    }

    @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。
  • 未登录时首页为显示登录按钮。
    11.afterlogout.png
  • 点击商品详情页,拦截器拦截强制跳转到登录界面。
    11.httpredirect.png
  • 登录之后显示欢迎。
    11.afterlogin.png
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值