本文共 6622 字,大约阅读时间需要 22 分钟。
SysUserMapper.java:
package com.ycy.mapper;import java.util.List;import com.ycy.model.SysUser;import org.apache.ibatis.annotations.Param;public interface SysUserMapper { /** * 根据用户查询用户系统信息 * @param usercode * @return */ ListgetSysUserByUserCode(String usercode);}
id, usercode, username, password, salt, locked
package com.ycy.service;import com.ycy.model.ActiveUser;import java.util.List;/** * *Title: SysService
*Description: 认证授权服务接口
*/public interface SysService { //根据用户的身份和密码 进行认证,如果认证通过,返回用户身份信息 public ActiveUser authenticat(String userCode, String password) throws Exception; }
package com.ycy.service.impl;import java.util.List;import com.ycy.Exception.CustomException;import com.ycy.mapper.SysUserMapper;import com.ycy.model.ActiveUser;import com.ycy.model.SysUser;import com.ycy.service.SysService;import com.ycy.util.MD5;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/** * *Title: SysServiceImpl
*Description:认证和授权的服务接口
*/@Servicepublic class SysServiceImpl implements SysService { @Autowired private SysUserMapper sysUserMapper; @Override public ActiveUser authenticat(String userCode, String password) throws Exception { /** 认证过程: 根据用户身份(账号)查询数据库,如果查询不到用户不存在 对输入的密码 和数据库密码 进行比对,如果一致,认证通过 */ //根据用户账号查询数据库 SysUser sysUser = this.findSysUserByUserCode(userCode); if(sysUser == null){ //抛出异常 throw new CustomException("用户账号不存在"); } //数据库密码 (md5密码 ) String password_db = sysUser.getPassword(); //对输入的密码 和数据库密码 进行比对,如果一致,认证通过 //对页面输入的密码 进行md5加密 String password_input_md5 = new MD5().getMD5ofStr(password); if(!password_input_md5.equalsIgnoreCase(password_db)){ //抛出异常 throw new CustomException("用户名或密码 错误"); } //得到用户id String userid = sysUser.getId(); //认证通过,返回用户身份信息 ActiveUser activeUser = new ActiveUser(); activeUser.setUserid(sysUser.getId()); activeUser.setUsercode(userCode); activeUser.setUsername(sysUser.getUsername());//用户名称 return activeUser; } //根据用户账号查询用户信息 private SysUser findSysUserByUserCode(String userCode)throws Exception{ Listlist = sysUserMapper.getSysUserByUserCode(userCode); if(list!=null && list.size()==1){ return list.get(0); } return null; }}
LoginController.java:
package com.ycy.controller;import javax.servlet.http.HttpSession;import com.ycy.Exception.CustomException;import com.ycy.model.ActiveUser;import com.ycy.service.SysService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** * *Title: LoginController
*Description: 登陆和退出
*/@Controllerpublic class LoginController { @Autowired private SysService sysService; //用户登陆提交方法 @RequestMapping("/login") public String login(HttpSession session,String usercode,String password,String randomcode)throws Exception{ //校验验证码 //从session获取正确的验证码 String validateCode = (String)session.getAttribute("validateCode"); if(!randomcode.equals(validateCode)){ //抛出异常:验证码错误 throw new CustomException("验证码 错误 !"); } //用户身份认证 ActiveUser activeUser = sysService.authenticat(usercode, password); //记录session session.setAttribute("activeUser", activeUser); //重定向到商品查询页面 return "redirect:/first"; } //用户退出 @RequestMapping("/logout") public String logout(HttpSession session)throws Exception{ //session失效 session.invalidate(); //重定向到商品查询页面 return "redirect:/items/queryItems"; } }
package com.ycy.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.ycy.model.ActiveUser;import com.ycy.util.ResourcesUtil;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import java.util.List;/** * *Title: HandlerInterceptor1
*Description: 用户身份认证拦截器
*/public class LoginInterceptor implements HandlerInterceptor { //在执行handler之前来执行的 //用于用户认证校验、用户权限校验 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //得到请求的url String url = request.getRequestURI(); //判断是否是公开 地址 //实际开发中需要公开 地址配置在配置文件中 //从配置中取逆名访问url Listopen_urls = ResourcesUtil.gekeyList("config/anonymousURL"); //遍历公开 地址,如果是公开 地址则放行 for(String open_url:open_urls){ if(url.indexOf(open_url)>=0){ //如果是公开 地址则放行 return true; } } //判断用户身份在session中是否存在 HttpSession session = request.getSession(); ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser"); //如果用户身份在session中存在放行 if(activeUser!=null){ return true; } //执行到这里拦截,跳转到登陆页面,用户进行身份认证 request.getRequestDispatcher("/pages/jsp/login.jsp").forward(request, response); //如果返回false表示拦截不继续执行handler,如果返回true表示放行 return false; } //在执行handler返回modelAndView之前来执行 //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1...postHandle"); } //执行handler之后执行此方法 //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长 //实现 系统 统一日志记录 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1...afterCompletion"); }}