java面试题——项目常见面试题(单点登录、购物车)

1、说一下单点登录?

SSO 原理(单点登录的过程)

(结合示例说明)

    当⽤户第⼀次访问淘宝的时候,因为还没有登录,会被引导到认证中⼼进⾏登录。
    根据⽤户提供的登录信息,认证系统进⾏身份验证,如果通过,则登录成功,并返回给⽤户⼀个认证的凭据(JWT token)。
    当⽤户访问天猫时,就会将这个 JWT token 带上,作为⾃⼰认证的凭据。
    应⽤系统接收到请求后会把 JWT token 送到认证中⼼进⾏校验。
    如果通过校验,⽤户就可以在不⽤再次登录的情况下访问天猫了。

补充:token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 token 给前端。前端可以在每次请求的时候带上 token 证明自己的合法地位。如果这个 token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

2、单点登录系统,如果cookie禁用,你们怎么解决?

如果禁用cookie可以使用url中带参数,把token传递给服务端。当然此方法涉及安全性问题,其实在cookie中保存token同样存在安全性问题。推荐使用sso框架CAS实现单点登录。

3、你们做移动端没有,如果没有移动端,你们为什么做单点登录?

单点登录并不是为移动端准备的,移动端有自己的登录方式。单点登录是解决在同一个公司内部多个互信网站之间进行跳转时不需要多次登录,多个系统统一登录入口。

4、单点登录的核心是什么?

单点登录的核心是如何在多个系统之间共享身份信息。

5、除了单点登陆,还做过什么登陆的方式?

这是什么狗屁问题?除了单点登录那就是普通登录方式,用户在同一个公司的多个系统之间跳转时需要多次登录。


6、单点登录,http无状态的,别人模仿如何在后端处理

http是无状态的,如果别人模仿浏览器发送http请求,一般后台是无法识别的。如果对安全要求高的情况下应该是https协议。可以保证在通信过程中无法窃取通信内容。


7、说一下购物车?

一、购物车和用户之间的关系

    一个用户必须对应一个购物车【一个用户不管买多少商品,都会存在属于自己的购物车中】
    单点登录一定要在购物车之前。

二、和购物车有关的操作都有哪些?
a)用户添加购物车

①用户未登录状态
1.添加到什么地方?未登录将数据保存到什么地方?
a)Redis?—比如京东
b)Cookie?—自己开发项目的时候【如果浏览器禁用cookie】
②用户登录状态
1.Redis缓存中【读写速度快】存放方式为HashSet
a)Hash:hset(key,field,value)
Key:user:userId:cart
Hset(key,skuId,value)
2.存在数据库中【Oracle,MySQL】
b)展示购物车数据

①未登录状态展示
1.直接从cookie中取得添加的数据展示即可
②登录状态
1.用户一旦登录:就必须显示数据库【Redis】+Cookie中的购物车的数据。
例如:
a)如果Cookie中有三条数据
b)如果Redis中有五条数据
c)那么真正展示的时候应该是Redis中的数据加上Cookie中的数据共八条数据。
 

8、你购物车存cookie里边 可以实现不登录就可以使用购物车 那么我现在没有登录把商品存购物车了 然后登录了 然后我换台电脑并且登录了还能不能看见我购物车的信息?如果看不到怎么做到cookie同步,就是在另外一台电脑上可以看到购物车信息

商城现阶段使用的仅仅是把购物车的商品写入cookie中,这样服务端基本上么有存储的压力。但是弊端就是用户更换电脑后购物车不能同步。打算下一步这么实现:当用户没有登录时向购物车添加商品是添加到cookie中,当用户登录后购物车的信息是存储在redis中的并且是跟用户id向关联的,此时你更换电脑后使用同一账号登录购物车的信息就会展示出来。


9、如果用户一直添加购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?

当前我们使用cookie的方式来保存购物车的数据,所以当用户往购物车中添加商品时,并不对数据库进行操作。将来把购物车商品放入redis中,redis是可以持久化的可以永久保存,此时就算是频繁的往购物车中添加数据也没用什么问题。
 

  • 10
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
后端单个删除购物车商品,需要先确定购物车的数据存储方式,例如可以使用数据库表来存储购物车数据。 假设你使用 MySQL 数据库,购物车数据存储在 `shopping_cart` 表中,表结构如下: ```sql CREATE TABLE `shopping_cart` ( `id` int(11) NOT NULL AUTO_INCREMENT, `item_id` int(11) NOT NULL, `item_name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 其中,`id` 是购物车项的唯一标识符,`item_id` 和 `item_name` 分别表示商品的 ID 和名称。 现在,如果要实现后端单个删除购物车商品,可以编写一个处理 HTTP DELETE 请求的控制器方法,根据请求参数中的购物车项 ID,从数据库中删除对应的购物车项。 示例代码如下: ```java @RestController public class ShoppingCartController { @Autowired private JdbcTemplate jdbcTemplate; @DeleteMapping("/shopping-cart/{id}") public void removeItem(@PathVariable("id") int itemId) { String sql = "DELETE FROM shopping_cart WHERE id = ?"; jdbcTemplate.update(sql, itemId); } } ``` 在上面的代码中,`ShoppingCartController` 类是一个 Spring Boot 控制器,使用 `@DeleteMapping` 注解标记处理 HTTP DELETE 请求的方法。该方法的参数 `@PathVariable("id") int itemId` 表示从 URL 路径中获取购物车项的 ID。 在方法体中,使用 `JdbcTemplate` 对象执行 SQL 语句 `"DELETE FROM shopping_cart WHERE id = ?"` 删除对应的购物车项。其中,`?` 是一个占位符,用来接收 `itemId` 参数的值。使用 `jdbcTemplate.update` 方法执行 SQL 语句并将占位符替换为参数值。 使用示例: ```java // 发送 HTTP DELETE 请求删除购物车项 RestTemplate restTemplate = new RestTemplate(); restTemplate.delete("http://localhost:8080/shopping-cart/1"); ``` 在上面的代码中,使用 `RestTemplate` 对象发送 HTTP DELETE 请求到 URL `"http://localhost:8080/shopping-cart/1"`,其中 `1` 是购物车项的 ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

91科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值