spring+springmvc+mybaitis+redis方式
CookieUtils工具类
/**
*
* Cookie 工具类
*
*/
public final class CookieUtils {
protected static final Logger logger = LoggerFactory.getLogger(CookieUtils.class);
/**
* 得到Cookie的值, 不编码
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName) {
return getCookieValue(request, cookieName, false);
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
if (isDecoder) {
retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
} else {
retValue = cookieList[i].getValue();
}
break;
}
}
} catch (UnsupportedEncodingException e) {
logger.error("Cookie Decode Error.", e);
}
return retValue;
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
break;
}
}
} catch (UnsupportedEncodingException e) {
logger.error("Cookie Decode Error.", e);
}
return retValue;
}
/**
* 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue) {
setCookie(request, response, cookieName, cookieValue, -1);
}
/**
* 设置Cookie的值 在指定时间内生效,但不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage) {
setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
}
/**
* 设置Cookie的值 不设置生效时间,但编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, boolean isEncode) {
setCookie(request, response, cookieName, cookieValue, -1, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, boolean isEncode) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数(指定编码)
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, String encodeString) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
}
/**
* 删除Cookie带cookie域名
*/
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName) {
doSetCookie(request, response, cookieName, "", -1, false);
}
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
try {
if (cookieValue == null) {
cookieValue = "";
} else if (isEncode) {
cookieValue = URLEncoder.encode(cookieValue, "utf-8");
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request)// 设置域名的cookie
//cookie.setDomain(getDomainName(request)); 引发无法设置cookie
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
logger.error("Cookie Encode Error.", e);
}
}
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
try {
if (cookieValue == null) {
cookieValue = "";
} else {
cookieValue = URLEncoder.encode(cookieValue, encodeString);
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request)// 设置域名的cookie
cookie.setDomain(getDomainName(request));
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
logger.error("Cookie Encode Error.", e);
}
}
/**
* 得到cookie的域名
*/
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
final String[] domains = serverName.split("\\.");
int len = domains.length;
if (len > 3) {
// www.xxx.com.cn
domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len <= 3 && len > 1) {
// xxx.com or xxx.cn
domainName = "." + domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
if (domainName != null && domainName.indexOf(":") > 0) {
String[] ary = domainName.split("\\:");
domainName = ary[0];
}
return domainName;
}
}
controller类中的登录方法
@RequestMapping("/doLogin")
@ResponseBody
public SysResult doLogin(String username,String password,
HttpServletRequest request,HttpServletResponse response){
//判断用户名和密码是否为null
if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
return SysResult.build(201, "用户名密码不能为空");
}
//当前输入的用户名是正确的
try {
//获取用户的ticket
String ticket =
userService.findUserByUP(username,password);
//ticket不为空
if(!StringUtils.isEmpty(ticket)){
//如果ticket数据不为空 则写入cookie
//Cookie[] cookies = request.getCookies();
//Cookie的名称必须为 JT_TICKET
CookieUtils.setCookie(request, response, "JT_TICKET", ticket);
try {
String userJSON = objectMapper.writeValueAsString(user);
//将数据存入redis中
jedisCluster.set(ticket, userJSON);
return SysResult.oK(ticket);
}
} catch (Exception e) {
e.printStackTrace();
}
return SysResult.build(201, "用户登陆失败");
}
拦截器拦截其余的接口路径进行验证是否登录
//用来获取用户信息 HandlerInterceptor是SpringMVC中拦截器的接口
public class UserInterceptor implements HandlerInterceptor{
@Autowired
private JedisCluster jedisCluster;
private static ObjectMapper objectMapper = new ObjectMapper();
/***
* preHandle Controller方法执行之前
* postHandle COntroller方法执行之后
* afterCompletion 最终执行的方法
* 由于业务逻辑,拦截器应该在用户用户点击购车按钮时生效.
* 这样请求还没有转向. 应该使用preHandle
*
* 如何获取用户信息:???
* 1.先通过request获取Cookie
* 2.获取ticket信息
* 3.查询缓存操作
* 4.判断数据有效性,如果含有用户信息,则直接转向目标页面
* 如果用户信息为null.则重定向到登陆页面
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//1.获取Cookie
String ticket = CookieUtils.getCookieValue(request, "JT_TICKET");
//2.判断cookie中是否有值
if(!StringUtils.isEmpty(ticket)){
//3.如果ticket不为null,通过缓存查询用户信息
String userJSON = jedisCluster.get(ticket);
/**
* 4.判断缓存数据是否为null
* 原因: 浏览器一直保存着cookie,redis中有缓存策略,
* 可能会删除过期的key.所以需要判断
*/
if(!StringUtils.isEmpty(userJSON)){
//5.表示含有数据 不为null
User user =
objectMapper.readValue(userJSON, User.class);
//6.USER对象如何存储,才能在Cart中获取user信息
//通过ThreadLocal实现数据的传递
UserThreadLocal.setUser(user);
//放行转向
return true;
}
}
//用户没有登陆 进行页面转向SSO的登陆页面
response.sendRedirect("/user/login.html");
return false; //false表示拦截,不会放行目标页面
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
配置xml中的拦截器
<!--配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/cart/**"/>
<mvc:mapping path="/order/**"/>
<bean class="com.jt.web.interceptor.UserInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
springboot验证cookie
serviceImpl类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public Result login(User user, HttpServletRequest request, HttpServletResponse response) {
Result result=new Result();
try {
if(user.getUsername()!=null&&user.getPassword()!=null&&user.getUsername()!=""&&user.getPassword()!=""){
String pwd= MD5Util.string2MD5(user.getPassword());
User user1=userDao.login(user.getUsername(),pwd);
if(user1==null){
result.setMsg("用户名或密码错误");
}else{
User user2=new User();
user2.setUsername(user.getUsername());
user2.setPassword(pwd);
result.setMsg("登录成功");
result.setSuccess(true);
result.setDetail(user2);
CookieUtils.setCookie(request, response, "JT_TICKET4", user2.getUsername(),300);
}
}else {
result.setMsg("用户名密码不能为空");
}
} catch (Exception e) {
// result.setMsg(e.getMessage());
e.printStackTrace();
}
return result;
}
Controller类
@RestController
@RequestMapping("/user")
public class UserControoler {
@Autowired
private UserService userService;
@RequestMapping("/login")
public Result login(User user, HttpServletRequest request, HttpServletResponse response) {
return userService.login(user, request, response);
}
@RequestMapping("/getcookie")
public String getCookie(HttpServletRequest request){
return CookieUtils.getCookieValue(request,"JT_TICKET4");
}
@RequestMapping("/gettext")
public String getCookie2(){
return "查看是否有拦截";
}
@RequestMapping("/gettext1")
public String getCookie3(){
return "路径拦截";
}
@RequestMapping("/getuser")
public User getUser(User user){
return userService.login1(user);
}
@RequestMapping("/delete")
public void delete(HttpServletRequest request, HttpServletResponse response){
CookieUtils.deleteCookie(request,response,"JT_TICKET4");
}
//设置相同名称到
@RequestMapping("/delete1")
public void delete1(HttpServletRequest request,HttpServletResponse response){
CookieUtils.setCookie(request, response, "JT_TICKET4", "",1);
}
}
CookieUtils类
/**
*
* Cookie 工具类
*
*/
public final class CookieUtils {
protected static final Logger logger = LoggerFactory.getLogger(CookieUtils.class);
/**
* 得到Cookie的值, 不编码
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName) {
return getCookieValue(request, cookieName, false);
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
if (isDecoder) {
retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
} else {
retValue = cookieList[i].getValue();
}
break;
}
}
} catch (UnsupportedEncodingException e) {
logger.error("Cookie Decode Error.", e);
}
return retValue;
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
break;
}
}
} catch (UnsupportedEncodingException e) {
logger.error("Cookie Decode Error.", e);
}
return retValue;
}
/**
* 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue) {
setCookie(request, response, cookieName, cookieValue, -1);
}
/**
* 设置Cookie的值 在指定时间内生效,但不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage) {
setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
}
/**
* 设置Cookie的值 不设置生效时间,但编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, boolean isEncode) {
setCookie(request, response, cookieName, cookieValue, -1, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, boolean isEncode) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数(指定编码)
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, String encodeString) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
}
/**
* 删除Cookie带cookie域名
*/
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName) {
doSetCookie(request, response, cookieName, "", 1, false);
}
/**
* 删除Cookie带cookie域名
*/
// public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
// String cookieName) {
// doSetCookie(request, response, cookieName, "", -1, false);
// }
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
try {
if (cookieValue == null) {
cookieValue = "";
} else if (isEncode) {
cookieValue = URLEncoder.encode(cookieValue, "utf-8");
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request)// 设置域名的cookie
//cookie.setDomain(getDomainName(request)); 引发无法设置cookie
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
logger.error("Cookie Encode Error.", e);
}
}
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
try {
if (cookieValue == null) {
cookieValue = "";
} else {
cookieValue = URLEncoder.encode(cookieValue, encodeString);
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request)// 设置域名的cookie
cookie.setDomain(getDomainName(request));
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
logger.error("Cookie Encode Error.", e);
}
}
/**
* 得到cookie的域名
*/
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
final String[] domains = serverName.split("\\.");
int len = domains.length;
if (len > 3) {
// www.xxx.com.cn
domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len <= 3 && len > 1) {
// xxx.com or xxx.cn
domainName = "." + domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
if (domainName != null && domainName.indexOf(":") > 0) {
String[] ary = domainName.split("\\:");
domainName = ary[0];
}
return domainName;
}
}
InterceptorConfiguration拦截路径相当于在ssm框架的xml中配置拦截哪些路径
@Component
public class InterceptorConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器
InterceptorRegistration ir = registry.addInterceptor(new LoginInterceptor());
// 配置拦截的路径
ir.addPathPatterns("/user/gettext","/user/gettext1"
);
// 配置不拦截的路径
ir.excludePathPatterns("/user/login");
}
}
配置拦截的判断条件满足就放行不满足就提示不满足
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
boolean flag = false;
String userName = "";
// IOUtils.printDeBug("有用户进行访问");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; ++i) {
Cookie cookie = cookies[i];
// IOUtils.printDeBug(cookie.getName() + ":" + cookie.getValue());
if (cookie.getName().equals("JT_TICKET4")&&cookie.getValue()!=null&&cookie.getValue()!="") {
userName = cookie.getValue();
// IOUtils.printDeBug("当前登录的用户为:" + userName);
//将生成的cookie存入到session
request.getSession().setAttribute("JT_TICKET4", userName);
return true;
}
}
}
//else{
// IOUtils.printDeBug("当前用户状态:用户未登录");
PrintWriter printWriter = response.getWriter();
printWriter.write("{code:0,message:\"not login!\"}");
// System.out.println("不存在cookie");
return false;
// }
//return flag;
}
/**
* 当前请求进行处理之后,也就是Controller 方法调用之后执行,
* 但是它会在DispatcherServlet 进行视图返回渲染之前被调用。
* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
* 这个方法的主要作用是用于进行资源清理工作的。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}