Springboot过滤器


 代码

一:编写mapper
	@Repository
	public class UserMapper {
	
	    private static Map userMap = new HashMap<>();
	
	    //初始化数据 模拟数据库
	
	    static {
	        userMap.put("张三", new User(1, "张三", "123"));
	        userMap.put("jhclass-vx", new User(2, "jhclass-vx", "123456"));
	        userMap.put("李四", new User(3, "李四", "123678"));
	    }
	
	    public User loginUser(String username, String pwd) {
	        //根据传入的用户名称查找map值 模拟数据库查询操作
	        User user = userMap.get(username);
	        //判断用户是否为空
	        if (user == null) {
	            return null;
	        }
	        //再次判断用户密码和传入的用户密码是否一致
	        if (user.getPwd().equals(pwd)) {
	            return user;
	        }
	        return null;
	    }
	
	}
	
二:编写UserService
	public interface UserService {
	
	    /**
	     * 用户登录
	     *
	     * @param username
	     * @param pwd
	     * @return
	     */
	    String loginUser(String username, String pwd);  
	}
	
三:编写UserServiceImpl实现类
	@Service
	public class UserServiceImpl implements UserService {
	
	    public static Map sessionMap = new HashMap<>();
	
	    @Autowired
	    UserMapper userMapper;
	
	    @Override
	    public String loginUser(String username, String pwd) {
	    	//调用mapper登陆方法 传入用户名称及密码参数
	        User user = userMapper.loginUser(username, pwd);
	        if (user == null) {
	            return null;
	        } else {
	            //生成用户token
	            String token = UUID.randomUUID().toString();
	            System.out.println(token);
	            //模拟用户信息存入缓存数据库
	            sessionMap.put(token, user);
	            return token;
	        }
	
	    }
	
	}
	
	
四:UserController登陆控制层
	/**
	 * 用户控制层
	 */
	@RestController
	@RequestMapping("api/v1/pub/user")
	public class UserController {
	
	    @Autowired
	    private UserService userService;
	
	    /**
	     * 用户登录
	     *
	     * @param user
	     * @return
	     */
	
	    @PostMapping("loginuser")
	    //@RequestBody:前端开发一般不是form表单形式 而是json形式提过来的
	    public JsonData loginUser(@RequestBody User user) {
		
		 System.out.println("user=" + user.toString());
	
	           String token = userService.loginUser(user.getUsername(), user.getPassword());
	
	
	           return token !=null ? JsonData.buildSuccess(token) : JsonData.buildError("账号密码错误");
	    }
	
	
	}
		
六:编写过滤器
	/**
	 * 登陆过滤器
	 */
	@WebFilter(urlPatterns = "/api/v1/pri/*",filterName = "loginFilter")//需要拦截的路径
	public class LoginFilter implements Filter {
	
	    /**
	     * 容器加载初始化
	     * @param filterConfig
	     * @throws ServletException
	     */
	    @Override
	    public void init(FilterConfig filterConfig) throws ServletException {
	        System.out.println("int LoginFilter========");
	    }
	
	    /**
	     * 核心业务逻辑
	          */
	    @Override
	    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	
	        System.out.println("doFilter LoginFilter============");
	
	        //转成对应的HttpServletRequest   拿到对应参数值 判断对应token等
	        HttpServletRequest request = (HttpServletRequest) servletRequest;
	
	        //转成对应的HttpServletResponse
	        HttpServletResponse response = (HttpServletResponse) servletResponse;
	
		
	 //先从请求头里拿token,没有的话就从请求参数里面拿
	        String token = request.getHeader("token");
	        
	if(StringUtils.isEmpty(token)){
	            token = req.getParameter("token");
	        }
	
	
	        if(!StringUtils.isEmpty(token)){
	
	            //判断token是否合法
	            User user = UserServiceImpl.sessionMap.get(token);
	            if(user!=null){
	                filterChain.doFilter(servletRequest,servletResponse);
	            }else {
	
	               JsonData jsonData =  JsonData.buildError("登录失败,token无效",-2);
	                String jsonStr = objectMapper.writeValueAsString(jsonData);
	                renderJson(resp,jsonStr);
	
	            }
	
	        }else {
	
	            JsonData jsonData =  JsonData.buildError("未登录",-3);
	            String jsonStr = objectMapper.writeValueAsString(jsonData);
	            renderJson(resp,jsonStr);
	        }
	
	    /**
	     * 容器销毁
	     */
	    @Override
	    public void destroy() {
	
	    }
	}
	
七:下单接口
	@RestController
	@RequestMapping("api/v1/pri/order")
	public class VideoOrderController {
	
	
	    @RequestMapping("save")
	    public JsonData saveOrder(){
	
	        return JsonData.buildSuccess("下单成功");
	
	    }
	
	}