前言
大家好 我是歌谣 今天继续进行前后端的一个学习 目前进入的是javaweb部分 今天来聊聊登录部分和JWT验证部分的书写
用户登录loginController
package com.itheima.controller;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
public class LoginConroller {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp)
{log.info("员工登录:{}");
log.info("登录");
Emp e=empService.login(emp);
//登录成功
if(e!=null){
Map<String, Object> claims=new HashMap<>();
claims.put("id",e.getId());
claims.put("name",e.getName());
claims.put("username",e.getUsername());
String jwt= JwtUtils.generateJwt(claims);
return Result.success(jwt);
}
return e!=null?Result.success():Result.error("用户名和密码错误");
}
}
EmpService
package com.itheima.service;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageBean;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
public interface EmpService {
PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin,LocalDate end);
void delete(List<Integer> ids);
void save(Emp emp);
Emp getById(Integer id);
void update(Emp emp);
Emp login(Emp emp);
}
EmpServiceImpl实现类
package com.itheima.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Emp;
import com.itheima.pojo.PageBean;
import com.itheima.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
//@Service
//public class EmpServiceImpl implements EmpService {
// @Autowired
// private EmpMapper empMapper;
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// Long count= empMapper.count();
// Integer start=(page-1)*pageSize;
// empMapper.page(start,pageSize);
// List<Emp> empList=empMapper.page(start,pageSize);
// PageBean pageBean=new PageBean(count,empList);
// return pageBean;
// }
//}
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {
PageHelper.startPage(page,pageSize);
List<Emp> empList = empMapper.list(name,gender,begin,end);
Page<Emp> p= (Page<Emp>) empList;
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
}
@Override
public void delete(List<Integer> ids){
empMapper.delete(ids);
}
@Override
public void save(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.insert(emp);
}
@Override
public Emp getById(Integer id) {
return empMapper.getById(id);
}
@Override
public void update(Emp emp) {
emp.setUpdateTime(LocalDateTime.now());
empMapper.update(emp);
}
@Override
public Emp login(Emp emp) {
return empMapper.getByUsernameAndPassword(emp);
}
}
EmpMapper
package com.itheima.mapper;
import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDate;
import java.util.List;
/**
* 员工管理
*/
//@Mapper
//public interface EmpMapper {
// @Select("select count(*) from emp")
// public Long count();
//@Select("select * from emp limit #{start},#{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);
//}
@Mapper
public interface EmpMapper {
// @Select("select * from emp")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
void delete(List<Integer> ids);
@Insert("insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time)"+
"values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
void insert(Emp emp);
@Select("select * from emp where id=#{id}")
Emp getById(Integer id);
void update(Emp emp);
@Select("select * from emp where username=#{username} and password=#{password}"
)
Emp getByUsernameAndPassword(Emp emp);
@Delete("delete from emp where dept_id=#{deptId}")
void deleteByDeptId(Integer deptId);
}
JWTutils工具类
package com.itheima.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey="itheima";
private static long expire=0L;
public static String generateJwt(Map<String,Object> claims){
String jwt= Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256,signKey)
.setExpiration(new Date(System.currentTimeMillis()+expire)).compact();
return jwt;
}
public static Claims parseJWT(String jwt){
Claims claims=Jwts.parser().setSigningKey(signKey).parseClaimsJwt(jwt).getBody();
return claims;
}
}
拦截器
package com.itheima.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.itheima.utils.JwtUtils;
import com.itheima.pojo.Result;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
System.out.println("preHandle");
String url=req.getRequestURL().toString();
log.info("请求url",url);
if(url.contains("login")){
return true;
}
String jwt=req.getHeader("token");
log.info("jwt",jwt);
try {
JwtUtils.parseJWT(jwt);
}catch (Exception e){
if(!StringUtils.hasLength(jwt)){
Result error=Result.error("NOT_LOGIN");
String notLogin= JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return false;
}
}
log.info("放行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
配置webconfig
package com.itheima.config;
import com.itheima.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class webConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").
excludePathPatterns("/login");
}
}